providers.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from importlib import import_module
  2. from django.conf import settings
  3. __ALL__ = ['providers', 'get_default_permissions',
  4. 'get_change_permissions_forms']
  5. # Manager for permission providers
  6. class PermissionProviders(object):
  7. def __init__(self):
  8. self._initialized = False
  9. self._providers = []
  10. self._providers_dict = {}
  11. def _assert_providers_imported(self):
  12. if not self._initialized:
  13. self._import_providers()
  14. self._initialized = True
  15. def _import_providers(self):
  16. for namespace in settings.MISAGO_PERMISSION_PROVIDERS:
  17. self._providers.append((namespace, import_module(namespace)))
  18. self._providers_dict[namespace] = import_module(namespace)
  19. def list(self):
  20. self._assert_providers_imported()
  21. return self._providers
  22. def dict(self):
  23. self._assert_providers_imported()
  24. return self._providers_dict
  25. providers = PermissionProviders()
  26. """
  27. Module functions for ACLS
  28. Workflow for ACLs in Misago is simple:
  29. First, you get user ACL. You can introspect it directory to find out user
  30. permissions, or if you have objects, you can use this acl to make those objects
  31. aware of their ACLs. This gives objects themselves special "acl" attribute with
  32. properties defined by ACL providers within their "add_acl_to_target"
  33. """
  34. def get_user_acl(user):
  35. """
  36. Get hydrated ACL for User
  37. """
  38. pass
  39. def _add_acl_to_target(acl, target):
  40. """
  41. Add valid ACL to single target
  42. """
  43. for provider, module in providers.list():
  44. module.add_acl_to_target(acl, target)
  45. def add_acl(acl, target):
  46. """
  47. Add valid ACL to target (iterable of objects or single object)
  48. """
  49. targets = []
  50. try:
  51. for item in target:
  52. targets.append(item)
  53. except TypeError:
  54. targets.append(target)
  55. for target in targets:
  56. _add_acl_to_target(acl, target)
  57. """
  58. Admin utils
  59. """
  60. def get_change_permissions_forms(role, data=None):
  61. """
  62. Utility function for building forms in admin
  63. """
  64. role_permissions = role.permissions
  65. forms = []
  66. for provider, module in providers.list():
  67. try:
  68. default_data = module.DEFAULT_PERMISSIONS
  69. except AttributeError:
  70. message = "'%s' object has no attribute '%s'"
  71. raise AttributeError(
  72. message % (provider, 'DEFAULT_PERMISSIONS'))
  73. try:
  74. module.change_permissions_form
  75. except AttributeError:
  76. message = "'%s' object has no attribute '%s'"
  77. raise AttributeError(
  78. message % (provider, 'change_permissions_form'))
  79. FormType = module.change_permissions_form(role)
  80. if FormType:
  81. if data:
  82. forms.append(FormType(data, prefix=provider))
  83. else:
  84. initial_data = role_permissions.get(provider, default_data)
  85. forms.append(FormType(initial=initial_data,
  86. prefix=provider))
  87. return forms