File: context_managers.py

package info (click to toggle)
django-classy-tags 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 492 kB
  • sloc: python: 2,109; makefile: 98; sh: 6
file content (51 lines) | stat: -rw-r--r-- 1,297 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from django import template
from django.conf import settings
from django.template.engine import Engine


builtins = Engine.get_default().template_builtins


class NULL:
    pass


class SettingsOverride:  # pragma: no cover
    """
    Overrides Django settings within a context and resets them to their inital
    values on exit.

    Example:

        with SettingsOverride(DEBUG=True):
            # do something
    """
    def __init__(self, **overrides):
        self.overrides = overrides

    def __enter__(self):
        self.old = {}
        for key, value in self.overrides.items():
            self.old[key] = getattr(settings, key, NULL)
            setattr(settings, key, value)

    def __exit__(self, type, value, traceback):
        for key, value in self.old.items():
            if value is not NULL:
                setattr(settings, key, value)
            else:
                delattr(settings, key)  # do not pollute the context!


class TemplateTags:  # pragma: no cover
    def __init__(self, *tags):
        self.lib = template.Library()
        for tag in tags:
            self.lib.tag(tag)

    def __enter__(self):
        self.old = list(builtins)
        builtins.insert(0, self.lib)

    def __exit__(self, type, value, traceback):
        builtins[:] = self.old