1from plain.admin.cards import Card, TrendCard
 2from plain.admin.views import (
 3    AdminModelDetailView,
 4    AdminModelListView,
 5    AdminViewset,
 6    register_viewset,
 7)
 8
 9from .models import Pageview
10
11
12class PageviewsTrendCard(TrendCard):
13    title = "Pageviews trend"
14    model = Pageview
15    datetime_field = "timestamp"
16    size = TrendCard.Sizes.FULL
17
18
19@register_viewset
20class PageviewAdmin(AdminViewset):
21    class ListView(AdminModelListView):
22        model = Pageview
23        nav_section = "Pageviews"
24        nav_icon = "eye"
25        title = "Pageviews"
26        description = "Page visits with UTM tracking and session attribution."
27        fields = ["user_id", "url", "source", "timestamp", "session_id"]
28        search_fields = ["id", "user_id", "url", "session_id", "source", "medium"]
29        cards = [PageviewsTrendCard]
30
31    class DetailView(AdminModelDetailView):
32        model = Pageview
33
34
35class UserPageviewsCard(Card):
36    title = "Recent pageviews"
37    template_name = "pageviews/card.html"
38
39    def get_template_context(self) -> dict:
40        context = super().get_template_context()
41
42        # self.view has an object attribute when used in DetailView context
43        context["pageviews"] = Pageview.query.filter(
44            user_id=self.view.object.id  # type: ignore[attr-defined]
45        ).order_by("-timestamp")[:50]
46
47        return context