providers.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from importlib import import_module
  2. from misago.conf import settings
  3. _NOT_INITIALIZED_ERROR = (
  4. "PermissionProviders instance has to load providers with load() "
  5. "before get_obj_type_annotators(), get_obj_type_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 acl_serializer are no longer available."
  11. )
  12. class PermissionProviders(object):
  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._serializers = {}
  20. def load(self):
  21. if not self._initialized:
  22. self._register_providers()
  23. self._change_lists_to_tupes(self._annotators)
  24. self._change_lists_to_tupes(self._serializers)
  25. self._initialized = True
  26. def _register_providers(self):
  27. for namespace in settings.MISAGO_ACL_EXTENSIONS:
  28. self._providers.append((namespace, import_module(namespace)))
  29. self._providers_dict[namespace] = import_module(namespace)
  30. if hasattr(self._providers_dict[namespace], 'register_with'):
  31. self._providers_dict[namespace].register_with(self)
  32. def _change_lists_to_tupes(self, types_dict):
  33. for hashType in types_dict.keys():
  34. types_dict[hashType] = tuple(types_dict[hashType])
  35. def acl_annotator(self, hashable_type, func):
  36. """registers ACL annotator for specified types"""
  37. assert not self._initialized, _ALREADY_INITIALIZED_ERROR
  38. self._annotators.setdefault(hashable_type, []).append(func)
  39. def acl_serializer(self, hashable_type, func):
  40. """registers ACL serializer for specified types"""
  41. assert not self._initialized, _ALREADY_INITIALIZED_ERROR
  42. self._serializers.setdefault(hashable_type, []).append(func)
  43. def get_obj_type_annotators(self, obj):
  44. assert self._initialized, _NOT_INITIALIZED_ERROR
  45. return self._annotators.get(obj.__class__, [])
  46. def get_obj_type_serializers(self, obj):
  47. assert self._initialized, _NOT_INITIALIZED_ERROR
  48. return self._serializers.get(obj.__class__, [])
  49. def list(self):
  50. assert self._initialized, _NOT_INITIALIZED_ERROR
  51. return self._providers
  52. def dict(self):
  53. assert self._initialized, _NOT_INITIALIZED_ERROR
  54. return self._providers_dict
  55. providers = PermissionProviders()