providers.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from importlib import import_module
  2. from django.conf import settings
  3. __ALL__ = ['providers']
  4. # Manager for permission providers
  5. class PermissionProviders(object):
  6. def __init__(self):
  7. self._initialized = False
  8. self._providers = []
  9. self._providers_dict = {}
  10. self._annotators = {}
  11. self._serializers = {}
  12. def _assert_providers_registered(self):
  13. if not self._initialized:
  14. self._register_providers()
  15. self._change_lists_to_tupes(self._annotators)
  16. self._change_lists_to_tupes(self._serializers)
  17. self._initialized = True
  18. def _register_providers(self):
  19. for namespace in settings.MISAGO_ACL_EXTENSIONS:
  20. self._providers.append((namespace, import_module(namespace)))
  21. self._providers_dict[namespace] = import_module(namespace)
  22. if hasattr(self._providers_dict[namespace], 'register_with'):
  23. self._providers_dict[namespace].register_with(self)
  24. def _change_lists_to_tupes(self, types_dict):
  25. for hashType in types_dict.keys():
  26. types_dict[hashType] = tuple(types_dict[hashType])
  27. def acl_annotator(self, hashable_type, func):
  28. """
  29. registers ACL annotator for specified types
  30. """
  31. self._annotators.setdefault(hashable_type, []).append(func)
  32. def acl_serializer(self, hashable_type, func):
  33. """
  34. registers ACL serializer for specified types
  35. """
  36. self._serializers.setdefault(hashable_type, []).append(func)
  37. def get_type_annotators(self, obj):
  38. self._assert_providers_registered()
  39. return self._annotators.get(obj.__class__, [])
  40. def get_type_serializers(self, obj):
  41. self._assert_providers_registered()
  42. return self._serializers.get(obj.__class__, [])
  43. def list(self):
  44. self._assert_providers_registered()
  45. return self._providers
  46. def dict(self):
  47. self._assert_providers_registered()
  48. return self._providers_dict
  49. providers = PermissionProviders()