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

View File

@ -51,7 +51,7 @@
</div> </div>
<hr class="sep h-4"> <hr class="sep h-4">
<div style="bottom: -1px;"> <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> </div>
{% endwith %} {% endwith %}
</a> </a>

View File

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

View File

@ -86,7 +86,7 @@
{% endwith %} {% endwith %}
</div> </div>
<div class="card ~neutral !low py-0 mb-6"> <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>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6"> <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
<div class="card ~neutral !low limited-height py-2"> <div class="card ~neutral !low limited-height py-2">