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(databases=["default"])
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
39    class DetailView(AdminModelDetailView):
40        model = Flag
41
42
43class FlagResultForm(ModelForm):
44    class Meta:
45        model = FlagResult
46        fields = ["key", "value"]
47
48
49@register_viewset
50class FlagResultAdmin(AdminViewset):
51    class ListView(AdminModelListView):
52        model = FlagResult
53        title = "Flag results"
54        fields = [
55            "flag",
56            "key",
57            "value",
58            "created_at__date",
59            "updated_at__date",
60            "uuid",
61        ]
62        search_fields = ["flag__name", "key"]
63        nav_section = "Feature flags"
64
65        def get_initial_queryset(self):
66            return self.model.objects.all().select_related("flag")
67
68    class DetailView(AdminModelDetailView):
69        model = FlagResult
70        title = "Flag result"
71
72    class UpdateView(AdminModelUpdateView):
73        model = FlagResult
74        title = "Update flag result"
75        form_class = FlagResultForm