Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

context_managers.py 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # -*- coding: utf-8 -*-
  2. from django import template
  3. from django.conf import settings
  4. try:
  5. Engine = None
  6. builtins = template.base.builtins
  7. except AttributeError:
  8. from django.template.engine import Engine
  9. builtins = Engine.get_default().template_builtins
  10. class NULL:
  11. pass
  12. class SettingsOverride(object): # pragma: no cover
  13. """
  14. Overrides Django settings within a context and resets them to their inital
  15. values on exit.
  16. Example:
  17. with SettingsOverride(DEBUG=True):
  18. # do something
  19. """
  20. def __init__(self, **overrides):
  21. self.overrides = overrides
  22. def __enter__(self):
  23. self.old = {}
  24. for key, value in self.overrides.items():
  25. self.old[key] = getattr(settings, key, NULL)
  26. setattr(settings, key, value)
  27. def __exit__(self, type, value, traceback):
  28. for key, value in self.old.items():
  29. if value is not NULL:
  30. setattr(settings, key, value)
  31. else:
  32. delattr(settings, key) # do not pollute the context!
  33. class TemplateTags(object): # pragma: no cover
  34. def __init__(self, *tags):
  35. self.lib = template.Library()
  36. for tag in tags:
  37. self.lib.tag(tag)
  38. def __enter__(self):
  39. self.old = list(builtins)
  40. builtins.insert(0, self.lib)
  41. def __exit__(self, type, value, traceback):
  42. builtins[:] = self.old