builder.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from django.conf import settings
  2. from django.core.cache import cache, InvalidCacheBackendError
  3. from django.utils.importlib import import_module
  4. from misago.forms import Form
  5. from misago.forums.models import Forum
  6. from misago.forumroles.models import ForumRole
  7. def build_form(request, role):
  8. form_type = type('ACLForm', (Form,), dict(layout=[]))
  9. for provider in settings.PERMISSION_PROVIDERS:
  10. app_module = import_module(provider)
  11. try:
  12. app_module.make_form(request, role, form_type)
  13. except AttributeError:
  14. pass
  15. return form_type
  16. def build_forum_form(request, role):
  17. form_type = type('ACLForm', (Form,), dict(layout=[]))
  18. for provider in settings.PERMISSION_PROVIDERS:
  19. app_module = import_module(provider)
  20. try:
  21. app_module.make_forum_form(request, role, form_type)
  22. except AttributeError:
  23. pass
  24. return form_type
  25. class BaseACL(object):
  26. def __init__(self):
  27. self.acl = {}
  28. def __repr__(self):
  29. return '%s (%s)' % (self.__class__.__name__[0:-3],
  30. self.__class__.__module__)
  31. class ACL(object):
  32. def __init__(self, version):
  33. self.version = version
  34. self.team = False
  35. def __iter__(self):
  36. for attr in dir(self):
  37. if not attr.startswith("__") and attr not in ['team', 'version']:
  38. yield self.__dict__[attr]
  39. def get_acl(request, user):
  40. acl_key = user.make_acl_key()
  41. try:
  42. user_acl = cache.get(acl_key)
  43. if user_acl.version != request.monitor['acl_version']:
  44. raise InvalidCacheBackendError()
  45. except (AttributeError, InvalidCacheBackendError):
  46. user_acl = build_acl(request, request.user.get_roles())
  47. cache.set(acl_key, user_acl, 2592000)
  48. return user_acl
  49. def build_acl(request, roles):
  50. acl = ACL(request.monitor['acl_version'])
  51. forums = Forum.objects.get(token='root').get_descendants().order_by('lft')
  52. perms = []
  53. forum_roles = {}
  54. for role in roles:
  55. perms.append(role.get_permissions())
  56. for role in ForumRole.objects.all():
  57. forum_roles[role.pk] = role.get_permissions()
  58. for provider in settings.PERMISSION_PROVIDERS:
  59. app_module = import_module(provider)
  60. try:
  61. app_module.build(acl, perms)
  62. except AttributeError:
  63. pass
  64. try:
  65. app_module.build_forums(acl, perms, forums, forum_roles)
  66. except AttributeError:
  67. pass
  68. for provider in settings.PERMISSION_PROVIDERS:
  69. app_module = import_module(provider)
  70. try:
  71. app_module.cleanup(acl, perms, forums)
  72. except AttributeError:
  73. pass
  74. return acl