diff --git a/doorcontrol/views.py b/doorcontrol/views.py index 572cab2..b7293ba 100644 --- a/doorcontrol/views.py +++ b/doorcontrol/views.py @@ -12,6 +12,9 @@ from django.utils.formats import date_format from django.utils.text import slugify from django.utils.timezone import localtime from django.views.generic.list import ListView +from django.db.models import Window, F, FloatField +from django.db.models.functions import Lead + from .models import HIDEvent @@ -149,16 +152,45 @@ class AccessPerUnitTime(BaseAccessReport): .values(unit_time=Trunc("timestamp", unit_time)) .annotate( members=Count("cardholder_id", distinct=True), + members_delta=( + F("members") + / Window( + Lead("members"), + order_by="-unit_time", + output_field=FloatField(), + ) + * 100 + - 100 + ), access_count=Count("cardholder_id"), + access_count_delta=( + F("access_count") + / Window( + Lead("access_count"), + order_by="-unit_time", + output_field=FloatField(), + ) + * 100 + - 100 + ), ) .order_by("-unit_time") - .values("unit_time", "members", "access_count") ) return [ { unit_time: self._format_date(event["unit_time"]), "members": event["members"], + "Δ members": ( + f'{event["members_delta"]:.2f}%' + if event["members_delta"] is not None + else "" + ), "access count": event["access_count"], + "Δ access count": ( + f'{event["access_count_delta"]:.2f}%' + if event["access_count_delta"] is not None + else "" + ), } for event in events ]