Plain is headed towards 1.0! Subscribe for development updates →

 1from functools import cached_property
 2
 3from plain.admin.cards import Card
 4from plain.admin.views import (
 5    AdminModelDetailView,
 6    AdminModelListView,
 7    AdminModelUpdateView,
 8    AdminViewset,
 9    register_viewset,
10)
11from plain.models.forms import ModelForm
12
13from .models import Flag, FlagResult
14
15
16class UnusedFlagsCard(Card):
17    title = "Unused Flags"
18
19    @cached_property
20    def flag_errors(self):
21        return Flag.check(database=True)
22
23    def get_number(self):
24        return len(self.flag_errors)
25
26    def get_text(self):
27        return "\n".join(str(e.msg) for e in self.flag_errors)
28
29
30@register_viewset
31class FlagAdmin(AdminViewset):
32    class ListView(AdminModelListView):
33        model = Flag
34        fields = ["name", "enabled", "created_at__date", "used_at__date", "uuid"]
35        search_fields = ["name", "description"]
36        cards = [UnusedFlagsCard]
37        nav_section = "Feature flags"
38        nav_icon = "flag"
39
40    class DetailView(AdminModelDetailView):
41        model = Flag
42
43
44class FlagResultForm(ModelForm):
45    class Meta:
46        model = FlagResult
47        fields = ["key", "value"]
48
49
50@register_viewset
51class FlagResultAdmin(AdminViewset):
52    class ListView(AdminModelListView):
53        model = FlagResult
54        title = "Flag results"
55        fields = [
56            "flag",
57            "key",
58            "value",
59            "created_at__date",
60            "updated_at__date",
61            "uuid",
62        ]
63        search_fields = ["flag__name", "key"]
64        nav_section = "Feature flags"
65        nav_icon = "flag"
66
67        def get_initial_queryset(self):
68            return self.model.query.all().select_related("flag")
69
70    class DetailView(AdminModelDetailView):
71        model = FlagResult
72        title = "Flag result"
73
74    class UpdateView(AdminModelUpdateView):
75        model = FlagResult
76        title = "Update flag result"
77        form_class = FlagResultForm