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