File: mixins.py

package info (click to toggle)
python-django-waffle 4.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 684 kB
  • sloc: python: 3,266; makefile: 139; sh: 39; javascript: 34
file content (72 lines) | stat: -rw-r--r-- 1,820 bytes parent folder | download
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from __future__ import annotations

from functools import partial

from django.http import Http404

from waffle import switch_is_active, flag_is_active, sample_is_active


class BaseWaffleMixin:

    def validate_waffle(self, waffle, func):
        if waffle.startswith('!'):
            active = not func(waffle[1:])
        else:
            active = func(waffle)
        return active

    def invalid_waffle(self):
        raise Http404('Inactive waffle')


class WaffleFlagMixin(BaseWaffleMixin):
    """
    Checks that as flag is active, or 404. Operates like the FBV decorator
    waffle_flag
    """

    waffle_flag: str | None = None

    def dispatch(self, request, *args, **kwargs):
        func = partial(flag_is_active, request)
        active = self.validate_waffle(self.waffle_flag, func)

        if not active:
            return self.invalid_waffle()

        return super().dispatch(request, *args, **kwargs)


class WaffleSampleMixin(BaseWaffleMixin):
    """
    Checks that as switch is active, or 404. Operates like the FBV decorator
    waffle_sample.
    """

    waffle_sample: str | None = None

    def dispatch(self, request, *args, **kwargs):
        active = self.validate_waffle(self.waffle_sample, sample_is_active)

        if not active:
            return self.invalid_waffle()

        return super().dispatch(request, *args, **kwargs)


class WaffleSwitchMixin(BaseWaffleMixin):
    """
    Checks that as switch is active, or 404. Operates like the FBV decorator
    waffle_switch.
    """

    waffle_switch: str | None = None

    def dispatch(self, request, *args, **kwargs):
        active = self.validate_waffle(self.waffle_switch, switch_is_active)

        if not active:
            return self.invalid_waffle()

        return super().dispatch(request, *args, **kwargs)