From e14f58769cd3ab9d027f1d953bc03f0a2d87b81b Mon Sep 17 00:00:00 2001 From: Samuel Zielke Date: Sat, 3 Oct 2026 20:39:09 +0200 Subject: [PATCH] Dashboard: Nutzer (installierte PWA) von reinen Aufrufern trennen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Geräte-Zahlen (heute/7 Tage/30 Tage/insgesamt) zählten bisher jedes Gerät, das die Seite auch nur im Browser-Tab geöffnet hat. Jetzt zählen sie nur Geräte, die PioMint mindestens einmal als installierte PWA (Standalone) geöffnet haben - echte Nutzer statt bloße Aufrufer. Deren Anzahl wird separat ausgewiesen. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01M8BG6rcfV94au1CrMNQq9E --- app/templates/app/dashboard.html | 30 ++++++++++++++++-------------- app/views.py | 21 ++++++++++++++------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/app/templates/app/dashboard.html b/app/templates/app/dashboard.html index cdd47b7..ce63289 100644 --- a/app/templates/app/dashboard.html +++ b/app/templates/app/dashboard.html @@ -50,8 +50,8 @@
-
{{ unique_devices_total }}
-
Geräte insgesamt (eindeutig)
+
{{ users_total }}
+
Nutzer insgesamt (als App installiert)
@@ -59,20 +59,20 @@
-
{{ devices_today }}
-
Geräte heute
+
{{ users_today }}
+
Nutzer heute
-
{{ devices_7d }}
-
Geräte (7 Tage)
+
{{ users_7d }}
+
Nutzer (7 Tage)
-
{{ devices_30d }}
-
Geräte (30 Tage)
+
{{ users_30d }}
+
Nutzer (30 Tage)
@@ -80,7 +80,7 @@
-
Plattform (eindeutige Geräte)
+
Plattform (eindeutige Nutzer)
    {% for row in by_platform %}
  • @@ -94,7 +94,7 @@
-
Browser (eindeutige Geräte)
+
Browser (eindeutige Nutzer)
    {% for row in by_browser %}
  • @@ -109,10 +109,12 @@
-
Als App installiert
+
Nutzer vs. Aufrufer

- {{ standalone_count }} von {{ unique_devices_total }} Geräten insgesamt haben - PioMint (mindestens einmal als) installierte PWA geöffnet statt im Browser-Tab. + {{ users_total }} Nutzer haben PioMint mindestens einmal als installierte PWA + (Standalone) geöffnet – das ist echte Nutzung. Weitere + {{ visitors_total }} Aufrufer haben die Seite nur im Browser-Tab geöffnet, + aber nie installiert; sie fließen oben nicht in die Nutzer-Zahlen ein.

@@ -126,7 +128,7 @@ Pings Erster Kontakt Letzter Kontakt - Standalone + Nutzer? diff --git a/app/views.py b/app/views.py index 324ae9f..38fc8fa 100644 --- a/app/views.py +++ b/app/views.py @@ -104,15 +104,22 @@ def usage_dashboard(request): events = UsageEvent.objects.all() + # "Nutzer" = Gerät hat PioMint mindestens einmal als installierte PWA + # (Standalone) geöffnet - nur das ist echte Nutzung. Ein Gerät, das die + # Seite nur im Browser-Tab geöffnet hat, ist ein "Aufrufer", kein Nutzer. + user_device_ids = events.filter(is_standalone=True).values_list("device_id", flat=True).distinct() + users = events.filter(device_id__in=user_device_ids) + visitors_total = events.exclude(device_id__in=user_device_ids).values("device_id").distinct().count() + context = { "total_connections": events.count(), - "unique_devices_total": events.values("device_id").distinct().count(), - "devices_today": events.filter(created_at__gte=today_start).values("device_id").distinct().count(), - "devices_7d": events.filter(created_at__gte=now - timedelta(days=7)).values("device_id").distinct().count(), - "devices_30d": events.filter(created_at__gte=now - timedelta(days=30)).values("device_id").distinct().count(), - "standalone_count": events.filter(is_standalone=True).values("device_id").distinct().count(), - "by_platform": events.values("platform").annotate(count=Count("device_id", distinct=True)).order_by("-count"), - "by_browser": events.values("browser").annotate(count=Count("device_id", distinct=True)).order_by("-count"), + "visitors_total": visitors_total, + "users_total": user_device_ids.count(), + "users_today": users.filter(created_at__gte=today_start).values("device_id").distinct().count(), + "users_7d": users.filter(created_at__gte=now - timedelta(days=7)).values("device_id").distinct().count(), + "users_30d": users.filter(created_at__gte=now - timedelta(days=30)).values("device_id").distinct().count(), + "by_platform": users.values("platform").annotate(count=Count("device_id", distinct=True)).order_by("-count"), + "by_browser": users.values("browser").annotate(count=Count("device_id", distinct=True)).order_by("-count"), "device_summary": ( events.values("device_id") .annotate(