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