middlewares.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from django.conf import settings
  2. from django.utils.importlib import import_module
  3. from misago.thread import local
  4. __all__ = ('merge_contexts', 'process_context', 'process_templates')
  5. def load_middlewares():
  6. """
  7. Populate _middlewares with list of template middlewares instances
  8. """
  9. middlewares = []
  10. for extension in settings.TEMPLATE_MIDDLEWARES:
  11. module = '.'.join(extension.split('.')[:-1])
  12. extension = extension.split('.')[-1]
  13. module = import_module(module)
  14. middleware = getattr(module, extension)
  15. middlewares += (middleware(), )
  16. return tuple(middlewares)
  17. _middlewares = load_middlewares()
  18. def merge_contexts(dictionary=None, context_instance=None):
  19. dictionary = dictionary or {}
  20. if not context_instance:
  21. return dictionary
  22. context_instance.update(dictionary)
  23. return context_instance
  24. _thread_local = local()
  25. def process_context(templates, dictionary=None, context_instance=None):
  26. context = merge_contexts(dictionary, context_instance)
  27. """
  28. Put template context trough template middlewares
  29. """
  30. if _thread_local.template_mutex:
  31. return context
  32. _thread_local.template_mutex = True
  33. for middleware in _middlewares:
  34. try:
  35. new_context = middleware.process_context(templates, context)
  36. if new_context:
  37. context = new_context
  38. except AttributeError:
  39. pass
  40. _thread_local.template_mutex = None
  41. return context
  42. def process_templates(templates, context):
  43. for middleware in _middlewares:
  44. try:
  45. new_templates = middleware.process_template(templates, context)
  46. if new_templates:
  47. return new_templates
  48. except AttributeError:
  49. pass
  50. return templates