When daterange is 1 day, show hourly data in chart

This commit is contained in:
CasperVerswijvelt 2021-04-25 22:54:06 +02:00
parent 9cb030ecbd
commit 2221a99662
4 changed files with 39 additions and 15 deletions

View File

@ -7,7 +7,7 @@ from django.apps import apps
from django.contrib.auth.models import AbstractUser
from django.core.exceptions import ValidationError
from django.db import models
from django.db.models.functions import TruncDate
from django.db.models.functions import TruncDate, TruncHour
from django.db.utils import NotSupportedError
from django.shortcuts import reverse
from django.utils import timezone
@ -119,8 +119,10 @@ class Service(models.Model):
Session = apps.get_model("analytics", "Session")
Hit = apps.get_model("analytics", "Hit")
tz_now = timezone.now()
currently_online = Session.objects.filter(
service=self, last_seen__gt=timezone.now() - timezone.timedelta(seconds=10)
service=self, last_seen__gt=tz_now - timezone.timedelta(seconds=10)
).count()
sessions = Session.objects.filter(
@ -202,17 +204,32 @@ class Service(models.Model):
if session_count == 0:
avg_session_duration = None
session_chart_data = {
k["date"]: k["count"]
for k in sessions.annotate(date=TruncDate("start_time"))
.values("date")
.annotate(count=models.Count("uuid"))
.order_by("date")
}
for day_offset in range((end_time - start_time).days + 1):
day = (start_time + timezone.timedelta(days=day_offset)).date()
if day not in session_chart_data:
session_chart_data[day] = 0
if end_time.day == start_time.day:
session_chart_tooltip_format = "MM/dd HH:mm"
session_chart_data = {
k["hour"]: k["count"]
for k in sessions.annotate(hour=TruncHour("start_time"))
.values("hour")
.annotate(count=models.Count("uuid"))
.order_by("hour")
}
for hour_offset in range(int((end_time - start_time).seconds / 3600) + 1):
hour = (start_time + timezone.timedelta(hours=hour_offset))
if hour not in session_chart_data:
session_chart_data[hour] = 0 if hour < tz_now else None
else:
session_chart_tooltip_format = "MMM d"
session_chart_data = {
k["date"]: k["count"]
for k in sessions.annotate(date=TruncDate("start_time"))
.values("date")
.annotate(count=models.Count("uuid"))
.order_by("date")
}
for day_offset in range((end_time - start_time).days + 1):
day = (start_time + timezone.timedelta(days=day_offset)).date()
if day not in session_chart_data:
session_chart_data[day] = 0 if day < tz_now.date() else None
return {
"currently_online": currently_online,
@ -240,6 +257,7 @@ class Service(models.Model):
)
]
),
"session_chart_tooltip_format": session_chart_tooltip_format,
"online": True,
}

View File

@ -51,7 +51,7 @@
</div>
<hr class="sep h-4">
<div style="bottom: -1px;">
{% include 'dashboard/includes/time_chart.html' with data=stats.session_chart_data sparkline=True height=100 name=object.uuid %}
{% include 'dashboard/includes/time_chart.html' with data=stats.session_chart_data sparkline=True height=100 name=object.uuid tooltip_format=stats.session_chart_tooltip_format %}
</div>
{% endwith %}
</a>

View File

@ -6,6 +6,9 @@
},
tooltip: {
shared: false,
x: {
format: '{{tooltip_format|default:"MMM d"}}',
},
},
colors: ["#805AD5"],
chart: {
@ -63,6 +66,9 @@
},
xaxis: {
type: "datetime",
labels: {
datetimeUTC: false
},
},
stroke: {
width: 1.5,

View File

@ -86,7 +86,7 @@
{% endwith %}
</div>
<div class="card ~neutral !low py-0 mb-6">
{% include 'dashboard/includes/time_chart.html' with data=stats.session_chart_data %}
{% include 'dashboard/includes/time_chart.html' with data=stats.session_chart_data tooltip_format=stats.session_chart_tooltip_format %}
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
<div class="card ~neutral !low limited-height py-2">