providers.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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_change_permissions_forms(role, data=None):
  27. role_permissions = role.permissions
  28. forms = []
  29. for provider, module in providers.list():
  30. try:
  31. default_data = module.DEFAULT_PERMISSIONS
  32. except AttributeError:
  33. message = "'%s' object has no attribute '%s'"
  34. raise AttributeError(
  35. message % (provider, 'DEFAULT_PERMISSIONS'))
  36. try:
  37. module.change_permissions_form
  38. except AttributeError:
  39. message = "'%s' object has no attribute '%s'"
  40. raise AttributeError(
  41. message % (provider, 'change_permissions_form'))
  42. FormType = module.change_permissions_form(role)
  43. if FormType:
  44. if data:
  45. forms.append(FormType(data, prefix=provider))
  46. else:
  47. initial_data = role_permissions.get(provider, default_data)
  48. forms.append(FormType(initial=initial_data,
  49. prefix=provider))
  50. return forms