searchproviders.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from importlib import import_module
  2. from django.core.exceptions import PermissionDenied
  3. from misago.conf import settings
  4. class SearchProviders(object):
  5. def __init__(self, search_providers):
  6. self._initialized = False
  7. self._providers = []
  8. self.providers = search_providers
  9. def initialize_providers(self):
  10. if self._initialized:
  11. return
  12. self._initialized = True
  13. for modulename in self.providers:
  14. classname = modulename.split('.')[-1]
  15. module_path = '.'.join(modulename.split('.')[:-1])
  16. try:
  17. module = import_module(module_path)
  18. except ImportError:
  19. raise ImportError(
  20. 'search module %s could not be imported' % modulename)
  21. try:
  22. classdef = getattr(module, classname)
  23. self._providers.append(classdef)
  24. except AttributeError:
  25. raise ImportError(
  26. 'search module %s could not be imported' % modulename)
  27. def get_providers(self, request):
  28. if not self._initialized:
  29. self.initialize_providers()
  30. providers = []
  31. for provider in self._providers:
  32. providers.append(provider(request))
  33. return providers
  34. def get_allowed_providers(self, request):
  35. allowed_providers = []
  36. for provider in self.get_providers(request):
  37. try:
  38. provider.allow_search()
  39. allowed_providers.append(provider)
  40. except PermissionDenied:
  41. pass
  42. return allowed_providers
  43. searchproviders = SearchProviders(settings.MISAGO_SEARCH_EXTENSIONS)