providers.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from importlib import import_module
  2. from ..conf import settings
  3. _NOT_INITIALIZED_ERROR = (
  4. "PermissionProviders instance has to load providers with load() "
  5. "before get_obj_type_annotators(), get_user_acl_serializers(), "
  6. "list() or dict() methods will be available."
  7. )
  8. _ALREADY_INITIALIZED_ERROR = (
  9. "PermissionProviders instance has already loaded providers and "
  10. "acl_annotator or user_acl_serializer are no longer available."
  11. )
  12. class PermissionProviders:
  13. """manager for permission providers"""
  14. def __init__(self):
  15. self._initialized = False
  16. self._providers = []
  17. self._providers_dict = {}
  18. self._annotators = {}
  19. self._user_acl_serializers = []
  20. def load(self):
  21. if self._initialized:
  22. raise RuntimeError("providers are already loaded")
  23. self._register_providers()
  24. self._coerce_dict_values_to_tuples(self._annotators)
  25. self._user_acl_serializers = tuple(self._user_acl_serializers)
  26. self._initialized = True
  27. def _register_providers(self):
  28. for namespace in settings.MISAGO_ACL_EXTENSIONS:
  29. self._providers.append((namespace, import_module(namespace)))
  30. self._providers_dict[namespace] = import_module(namespace)
  31. if hasattr(self._providers_dict[namespace], "register_with"):
  32. self._providers_dict[namespace].register_with(self)
  33. def _coerce_dict_values_to_tuples(self, types_dict):
  34. for hashType in types_dict.keys():
  35. types_dict[hashType] = tuple(types_dict[hashType])
  36. def acl_annotator(self, hashable_type, func):
  37. """registers ACL annotator for specified types"""
  38. assert not self._initialized, _ALREADY_INITIALIZED_ERROR
  39. self._annotators.setdefault(hashable_type, []).append(func)
  40. def user_acl_serializer(self, func):
  41. """registers ACL serializer for specified types"""
  42. assert not self._initialized, _ALREADY_INITIALIZED_ERROR
  43. self._user_acl_serializers.append(func)
  44. def get_obj_type_annotators(self, obj):
  45. assert self._initialized, _NOT_INITIALIZED_ERROR
  46. return self._annotators.get(obj.__class__, [])
  47. def get_user_acl_serializers(self):
  48. assert self._initialized, _NOT_INITIALIZED_ERROR
  49. return self._user_acl_serializers
  50. def list(self):
  51. assert self._initialized, _NOT_INITIALIZED_ERROR
  52. return self._providers
  53. def dict(self):
  54. assert self._initialized, _NOT_INITIALIZED_ERROR
  55. return self._providers_dict
  56. providers = PermissionProviders()