|
a/Allura/allura/model/project.py |
|
b/Allura/allura/model/project.py |
|
... |
|
... |
78 |
g.publish(obj.exchange, obj.routing_key, getattr(obj, 'data', None))
|
78 |
g.publish(obj.exchange, obj.routing_key, getattr(obj, 'data', None))
|
79 |
obj.delete()
|
79 |
obj.delete()
|
80 |
except: # pragma no cover
|
80 |
except: # pragma no cover
|
81 |
log.exception('Error when firing %r', obj)
|
81 |
log.exception('Error when firing %r', obj)
|
82 |
|
82 |
|
83 |
class ProjectFile(File):
|
83 |
class ProjectFile(File):
|
84 |
class __mongometa__:
|
84 |
class __mongometa__:
|
85 |
session = main_orm_session
|
85 |
session = main_orm_session
|
86 |
|
86 |
|
87 |
project_id=FieldProperty(S.ObjectId)
|
87 |
project_id=FieldProperty(S.ObjectId)
|
88 |
category=FieldProperty(str)
|
88 |
category=FieldProperty(str)
|
|
... |
|
... |
259 |
return projects
|
259 |
return projects
|
260 |
|
260 |
|
261 |
@property
|
261 |
@property
|
262 |
def category(self):
|
262 |
def category(self):
|
263 |
return ProjectCategory.query.find(dict(_id=self.category_id)).first()
|
263 |
return ProjectCategory.query.find(dict(_id=self.category_id)).first()
|
264 |
|
264 |
|
265 |
def roleids_with_permission(self, name):
|
265 |
def roleids_with_permission(self, name):
|
266 |
roles = []
|
266 |
roles = []
|
267 |
for p in self.parent_iter():
|
267 |
for p in self.parent_iter():
|
268 |
for roleid in p.acl[name]:
|
268 |
for roleid in p.acl[name]:
|
269 |
roles.append(roleid)
|
269 |
roles.append(roleid)
|
|
... |
|
... |
327 |
|
327 |
|
328 |
def install_app(self, ep_name, mount_point=None, mount_label=None, ordinal=0, **override_options):
|
328 |
def install_app(self, ep_name, mount_point=None, mount_label=None, ordinal=0, **override_options):
|
329 |
for ep in pkg_resources.iter_entry_points('allura', ep_name):
|
329 |
for ep in pkg_resources.iter_entry_points('allura', ep_name):
|
330 |
App = ep.load()
|
330 |
App = ep.load()
|
331 |
break
|
331 |
break
|
332 |
else:
|
332 |
else:
|
333 |
# Try case-insensitive install
|
333 |
# Try case-insensitive install
|
334 |
for ep in pkg_resources.iter_entry_points('allura'):
|
334 |
for ep in pkg_resources.iter_entry_points('allura'):
|
335 |
if ep.name.lower() == ep_name:
|
335 |
if ep.name.lower() == ep_name:
|
336 |
App = ep.load()
|
336 |
App = ep.load()
|
337 |
break
|
337 |
break
|
|
... |
|
... |
482 |
for mc in MappedClass._registry.itervalues():
|
482 |
for mc in MappedClass._registry.itervalues():
|
483 |
if mc.__mongometa__.session == project_orm_session:
|
483 |
if mc.__mongometa__.session == project_orm_session:
|
484 |
project_orm_session.ensure_indexes(mc)
|
484 |
project_orm_session.ensure_indexes(mc)
|
485 |
|
485 |
|
486 |
class AppConfig(MappedClass):
|
486 |
class AppConfig(MappedClass):
|
|
|
487 |
"""
|
|
|
488 |
Configuration information for an instantiated :class:`Application <allura.app.Application>`
|
|
|
489 |
in a project
|
|
|
490 |
|
|
|
491 |
:var options: an object on which various options are stored. options.mount_point is the url component for this app instance
|
|
|
492 |
:var acl: a dict that maps permissions (strings) to lists of roles that have the permission
|
|
|
493 |
"""
|
|
|
494 |
|
487 |
class __mongometa__:
|
495 |
class __mongometa__:
|
488 |
session = project_orm_session
|
496 |
session = project_orm_session
|
489 |
name='config'
|
497 |
name='config'
|
490 |
|
498 |
|
491 |
# AppConfig schema
|
499 |
# AppConfig schema
|
|
... |
|
... |
497 |
options=FieldProperty(None)
|
505 |
options=FieldProperty(None)
|
498 |
project = RelationProperty(Project, via='project_id')
|
506 |
project = RelationProperty(Project, via='project_id')
|
499 |
discussion = RelationProperty('Discussion', via='discussion_id')
|
507 |
discussion = RelationProperty('Discussion', via='discussion_id')
|
500 |
|
508 |
|
501 |
# acl[permission] = [ role1, role2, ... ]
|
509 |
# acl[permission] = [ role1, role2, ... ]
|
502 |
acl = FieldProperty({str:[S.ObjectId]})
|
510 |
acl = FieldProperty({str:[S.ObjectId]})
|
503 |
|
511 |
|
504 |
def load(self):
|
512 |
def load(self):
|
|
|
513 |
"""
|
|
|
514 |
:returns: the related :class:`Application <allura.app.Application>` class
|
|
|
515 |
"""
|
505 |
try:
|
516 |
try:
|
506 |
result = self._loaded_ep
|
517 |
result = self._loaded_ep
|
507 |
except AttributeError:
|
518 |
except AttributeError:
|
508 |
for ep in pkg_resources.iter_entry_points(
|
519 |
for ep in pkg_resources.iter_entry_points(
|
509 |
'allura', self.tool_name):
|
520 |
'allura', self.tool_name):
|
|
... |
|
... |
520 |
return self.project.url() + self.options.mount_point + '/'
|
531 |
return self.project.url() + self.options.mount_point + '/'
|
521 |
|
532 |
|
522 |
def breadcrumbs(self):
|
533 |
def breadcrumbs(self):
|
523 |
return self.project.breadcrumbs() + [
|
534 |
return self.project.breadcrumbs() + [
|
524 |
(self.options.mount_point, self.url()) ]
|
535 |
(self.options.mount_point, self.url()) ]
|
525 |
|
536 |
|
526 |
def grant_permission(self, permission, role=None):
|
537 |
def grant_permission(self, permission, role=None):
|
527 |
from . import auth
|
538 |
from . import auth
|
528 |
if role is None: role = c.user
|
539 |
if role is None: role = c.user
|
529 |
if not isinstance(role, auth.ProjectRole):
|
540 |
if not isinstance(role, auth.ProjectRole):
|
530 |
role = role.project_role()
|
541 |
role = role.project_role()
|
|
... |
|
... |
536 |
if role is None: role = c.user
|
547 |
if role is None: role = c.user
|
537 |
if not isinstance(role, auth.ProjectRole):
|
548 |
if not isinstance(role, auth.ProjectRole):
|
538 |
role = role.project_role()
|
549 |
role = role.project_role()
|
539 |
if role._id in self.acl[permission]:
|
550 |
if role._id in self.acl[permission]:
|
540 |
self.acl[permission].remove(role._id)
|
551 |
self.acl[permission].remove(role._id)
|
541 |
|
|
|