builder.py 2.8 KB

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