builder.py 2.7 KB

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