plain-pageviews
Track pageviews from the client-side.
FAQs
Why not use server-side middleware?
Originally this was the idea. It turns out that tracking from the backend, while powerful, also means you have to identify all kinds of requests not to track (assets, files, API calls, etc.). In the end, a simple client-side tracking script naturally accomplishes what we're looking for in a more straightforward way.
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 title = "Pageviews"
25 fields = ["user_id", "url", "timestamp", "session_key"]
26 search_fields = ["pk", "user_id", "url", "session_key"]
27 cards = [PageviewsTrendCard]
28
29 class DetailView(AdminModelDetailView):
30 model = Pageview
31
32
33class UserPageviewsCard(Card):
34 title = "Recent pageviews"
35 template_name = "pageviews/card.html"
36
37 def get_template_context(self):
38 context = super().get_template_context()
39
40 context["pageviews"] = Pageview.objects.filter(
41 user_id=self.view.object.pk
42 ).order_by("-timestamp")[:50]
43
44 return context