1# from plain.admin.cards import Card
 2from plain.admin.views import (
 3    AdminModelCreateView,
 4    AdminModelDeleteView,
 5    AdminModelDetailView,
 6    AdminModelListView,
 7    AdminModelUpdateView,
 8    AdminViewset,
 9    register_viewset,
10)
11from plain.models.forms import ModelForm
12
13from .models import NotFoundLog, Redirect, RedirectLog
14
15
16class RedirectForm(ModelForm):
17    class Meta:
18        model = Redirect
19        fields = [
20            "from_pattern",
21            "to_pattern",
22            "http_status",
23            "order",
24            "enabled",
25            "is_regex",
26        ]
27
28
29@register_viewset
30class RedirectAdmin(AdminViewset):
31    class ListView(AdminModelListView):
32        model = Redirect
33        nav_section = "Redirection"
34        nav_icon = "signpost-split"
35        title = "Redirects"
36        description = "URL redirect rules processed in order."
37        fields = ["from_pattern", "to_pattern", "http_status", "order", "enabled"]
38        search_fields = ["from_pattern", "to_pattern"]
39        allow_global_search = False
40
41    class DetailView(AdminModelDetailView):
42        model = Redirect
43
44    class CreateView(AdminModelCreateView):
45        model = Redirect
46        form_class = RedirectForm
47
48    class UpdateView(AdminModelUpdateView):
49        model = Redirect
50        form_class = RedirectForm
51
52    class DeleteView(AdminModelDeleteView):
53        model = Redirect
54
55
56@register_viewset
57class RedirectLogAdmin(AdminViewset):
58    class ListView(AdminModelListView):
59        model = RedirectLog
60        nav_section = "Redirection"
61        nav_icon = "arrow-repeat"
62        title = "Redirect logs"
63        fields = [
64            "created_at",
65            "from_url",
66            "to_url",
67            "http_status",
68            "user_agent",
69            "ip_address",
70            "referrer",
71        ]
72        search_fields = ["from_url", "to_url", "user_agent", "ip_address", "referrer"]
73        allow_global_search = False
74
75    class DetailView(AdminModelDetailView):
76        model = RedirectLog
77
78
79@register_viewset
80class NotFoundLogAdmin(AdminViewset):
81    class ListView(AdminModelListView):
82        model = NotFoundLog
83        nav_section = "Redirection"
84        nav_icon = "exclamation-circle"
85        title = "404 logs"
86        description = "URLs that returned 404 - useful for finding broken links."
87        fields = ["created_at", "url", "user_agent", "ip_address", "referrer"]
88        search_fields = ["url", "user_agent", "ip_address", "referrer"]
89        allow_global_search = False
90
91    class DetailView(AdminModelDetailView):
92        model = NotFoundLog