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