diff --git a/bookwyrm/templates/settings/dashboard/dashboard.html b/bookwyrm/templates/settings/dashboard/dashboard.html index fbf3ff72a..f320028b7 100644 --- a/bookwyrm/templates/settings/dashboard/dashboard.html +++ b/bookwyrm/templates/settings/dashboard/dashboard.html @@ -9,26 +9,26 @@ {% block panel %} -
-
+
+

{% trans "Total users" %}

{{ users|intcomma }}

-
+

{% trans "Active this month" %}

{{ active_users|intcomma }}

-
+

{% trans "Statuses" %}

{{ statuses|intcomma }}

-
+

{% trans "Works" %}

{{ works|intcomma }}

@@ -64,7 +64,7 @@

{% trans "Instance Activity" %}

-
+
-
-
-

{% trans "User signup activity" %}

+
+
+

{% trans "Total users" %}

-
+
+

{% trans "User signup activity" %}

+
+ +
+
+

{% trans "Status activity" %}

+
+

{% trans "Works created" %}

+
+ +
+
@@ -115,6 +127,8 @@ {% block scripts %} -{% include 'settings/dashboard/dashboard_user_chart.html' %} -{% include 'settings/dashboard/dashboard_status_chart.html' %} +{% include 'settings/dashboard/user_chart.html' %} +{% include 'settings/dashboard/status_chart.html' %} +{% include 'settings/dashboard/registration_chart.html' %} +{% include 'settings/dashboard/works_chart.html' %} {% endblock %} diff --git a/bookwyrm/templates/settings/dashboard/dashboard_status_chart.html b/bookwyrm/templates/settings/dashboard/dashboard_status_chart.html deleted file mode 100644 index bbacf3f46..000000000 --- a/bookwyrm/templates/settings/dashboard/dashboard_status_chart.html +++ /dev/null @@ -1,26 +0,0 @@ -{% load i18n %} - - diff --git a/bookwyrm/templates/settings/dashboard/dashboard_user_chart.html b/bookwyrm/templates/settings/dashboard/dashboard_user_chart.html deleted file mode 100644 index 33be28f7e..000000000 --- a/bookwyrm/templates/settings/dashboard/dashboard_user_chart.html +++ /dev/null @@ -1,29 +0,0 @@ -{% load i18n %} - diff --git a/bookwyrm/templates/settings/dashboard/registration_chart.html b/bookwyrm/templates/settings/dashboard/registration_chart.html new file mode 100644 index 000000000..3b258fec8 --- /dev/null +++ b/bookwyrm/templates/settings/dashboard/registration_chart.html @@ -0,0 +1,19 @@ +{% load i18n %} + diff --git a/bookwyrm/templates/settings/dashboard/status_chart.html b/bookwyrm/templates/settings/dashboard/status_chart.html new file mode 100644 index 000000000..a59036a51 --- /dev/null +++ b/bookwyrm/templates/settings/dashboard/status_chart.html @@ -0,0 +1,21 @@ +{% load i18n %} + + diff --git a/bookwyrm/templates/settings/dashboard/user_chart.html b/bookwyrm/templates/settings/dashboard/user_chart.html new file mode 100644 index 000000000..a8d356bb8 --- /dev/null +++ b/bookwyrm/templates/settings/dashboard/user_chart.html @@ -0,0 +1,25 @@ +{% load i18n %} + diff --git a/bookwyrm/templates/settings/dashboard/works_chart.html b/bookwyrm/templates/settings/dashboard/works_chart.html new file mode 100644 index 000000000..c65014e98 --- /dev/null +++ b/bookwyrm/templates/settings/dashboard/works_chart.html @@ -0,0 +1,21 @@ +{% load i18n %} + + diff --git a/bookwyrm/views/admin/dashboard.py b/bookwyrm/views/admin/dashboard.py index e02b9143e..2766eeebb 100644 --- a/bookwyrm/views/admin/dashboard.py +++ b/bookwyrm/views/admin/dashboard.py @@ -25,13 +25,6 @@ class Dashboard(View): """list of users""" interval = int(request.GET.get("days", 1)) now = timezone.now() - - user_queryset = models.User.objects.filter(local=True) - user_stats = {"labels": [], "total": [], "active": []} - - status_queryset = models.Status.objects.filter(user__local=True, deleted=False) - status_stats = {"labels": [], "total": []} - start = request.GET.get("start") if start: start = timezone.make_aware(parse(start)) @@ -42,31 +35,55 @@ class Dashboard(View): end = timezone.make_aware(parse(end)) if end else now start = start.replace(hour=0, minute=0, second=0) - interval_start = start - interval_end = interval_start + timedelta(days=interval) - while interval_start <= end: - print(interval_start, interval_end) - interval_queryset = user_queryset.filter( - Q(is_active=True) | Q(deactivation_date__gt=interval_end), - created_date__lte=interval_end, - ) - user_stats["total"].append(interval_queryset.filter().count()) - user_stats["active"].append( - interval_queryset.filter( - last_active_date__gt=interval_end - timedelta(days=31), - ).count() - ) - user_stats["labels"].append(interval_start.strftime("%b %d")) + user_queryset = models.User.objects.filter(local=True) + user_chart = Chart( + queryset=user_queryset, + queries={ + "total": lambda q, s, e: q.filter( + Q(is_active=True) | Q(deactivation_date__gt=e), + created_date__lte=e, + ).count(), + "active": lambda q, s, e: q.filter( + Q(is_active=True) | Q(deactivation_date__gt=e), + created_date__lte=e, + ) + .filter( + last_active_date__gt=e - timedelta(days=31), + ) + .count(), + }, + ) - status_stats["total"].append( - status_queryset.filter( - created_date__gt=interval_start, - created_date__lte=interval_end, + status_queryset = models.Status.objects.filter(user__local=True, deleted=False) + status_chart = Chart( + queryset=status_queryset, + queries={ + "total": lambda q, s, e: q.filter( + created_date__gt=s, + created_date__lte=e, ).count() - ) - status_stats["labels"].append(interval_start.strftime("%b %d")) - interval_start = interval_end - interval_end += timedelta(days=interval) + }, + ) + + register_chart = Chart( + queryset=user_queryset, + queries={ + "total": lambda q, s, e: q.filter( + created_date__gt=s, + created_date__lte=e, + ).count() + }, + ) + + works_chart = Chart( + queryset=models.Work.objects, + queries={ + "total": lambda q, s, e: q.filter( + created_date__gt=s, + created_date__lte=e, + ).count() + }, + ) data = { "start": start.strftime("%Y-%m-%d"), @@ -82,7 +99,34 @@ class Dashboard(View): "invite_requests": models.InviteRequest.objects.filter( ignored=False, invite_sent=False ).count(), - "user_stats": user_stats, - "status_stats": status_stats, + "user_stats": user_chart.get_chart(start, end, interval), + "status_stats": status_chart.get_chart(start, end, interval), + "register_stats": register_chart.get_chart(start, end, interval), + "works_stats": works_chart.get_chart(start, end, interval), } return TemplateResponse(request, "settings/dashboard/dashboard.html", data) + + +class Chart: + """Data for a chart""" + + def __init__(self, queryset, queries: dict): + self.queryset = queryset + self.queries = queries + + def get_chart(self, start, end, interval): + """load the data for the chart given a time scale and interval""" + interval_start = start + interval_end = interval_start + timedelta(days=interval) + + chart = {k: [] for k in self.queries.keys()} + chart["labels"] = [] + while interval_start <= end: + for (name, query) in self.queries.items(): + chart[name].append(query(self.queryset, interval_start, interval_end)) + chart["labels"].append(interval_start.strftime("%b %d")) + + interval_start = interval_end + interval_end += timedelta(days=interval) + + return chart