providers.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. def get_default_permissions():
  27. default_permissions = {}
  28. for provider, module in providers.list():
  29. try:
  30. default_data = module.DEFAULT_PERMISSIONS
  31. except AttributeError:
  32. message = "'%s' object has no attribute '%s'"
  33. raise AttributeError(
  34. message % (provider, 'DEFAULT_PERMISSIONS'))
  35. default_permissions[provider] = default_data
  36. return default_permissions
  37. def get_change_permissions_forms(role, data=None):
  38. role_permissions = role.permissions
  39. forms = []
  40. for provider, module in providers.list():
  41. try:
  42. default_data = module.DEFAULT_PERMISSIONS
  43. except AttributeError:
  44. message = "'%s' object has no attribute '%s'"
  45. raise AttributeError(
  46. message % (provider, 'DEFAULT_PERMISSIONS'))
  47. try:
  48. module.change_permissions_form
  49. except AttributeError:
  50. message = "'%s' object has no attribute '%s'"
  51. raise AttributeError(
  52. message % (provider, 'change_permissions_form'))
  53. FormType = module.change_permissions_form(role)
  54. if FormType:
  55. if data:
  56. forms.append(FormType(data, prefix=provider))
  57. else:
  58. initial_data = role_permissions.get(provider, default_data)
  59. forms.append(FormType(initial=initial_data,
  60. prefix=provider))
  61. return forms