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