1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- from django.conf import settings
- from django.core.cache import cache, InvalidCacheBackendError
- from django.utils.importlib import import_module
- from misago.forms import Form
- from misago.forums.models import Forum
- from misago.forumroles.models import ForumRole
- def build_form(request, role):
- form_type = type('ACLForm', (Form,), dict(layout=[]))
- for provider in settings.PERMISSION_PROVIDERS:
- app_module = import_module(provider)
- try:
- app_module.make_form(request, role, form_type)
- except AttributeError:
- pass
- return form_type
- def build_forum_form(request, role):
- form_type = type('ACLForm', (Form,), dict(layout=[]))
- for provider in settings.PERMISSION_PROVIDERS:
- app_module = import_module(provider)
- try:
- app_module.make_forum_form(request, role, form_type)
- except AttributeError:
- pass
- return form_type
- class BaseACL(object):
- def __init__(self):
- self.acl = {}
- def __repr__(self):
- return '%s (%s)' % (self.__class__.__name__[0:-3],
- self.__class__.__module__)
- class ACL(object):
- def __init__(self, version):
- self.version = version
- self.team = False
- def __iter__(self):
- for attr in dir(self):
- if not attr.startswith("__") and attr not in ['team', 'version']:
- yield self.__dict__[attr]
- def get_acl(request, user):
- acl_key = user.make_acl_key()
- try:
- user_acl = cache.get(acl_key)
- if user_acl.version != request.monitor['acl_version']:
- raise InvalidCacheBackendError()
- except (AttributeError, InvalidCacheBackendError):
- user_acl = build_acl(request, request.user.get_roles())
- cache.set(acl_key, user_acl, 2592000)
- return user_acl
- def build_acl(request, roles):
- acl = ACL(request.monitor['acl_version'])
- forums = Forum.objects.get(token='root').get_descendants().order_by('lft')
- perms = []
- forum_roles = {}
- for role in roles:
- perms.append(role.get_permissions())
- for role in ForumRole.objects.all():
- forum_roles[role.pk] = role.get_permissions()
- for provider in settings.PERMISSION_PROVIDERS:
- app_module = import_module(provider)
- try:
- app_module.build(acl, perms)
- except AttributeError:
- pass
- try:
- app_module.build_forums(acl, perms, forums, forum_roles)
- except AttributeError:
- pass
- for provider in settings.PERMISSION_PROVIDERS:
- app_module = import_module(provider)
- try:
- app_module.cleanup(acl, perms, forums)
- except AttributeError:
- pass
- return acl
|