When daterange is 1 day, show hourly data in chart
This commit is contained in:
parent
9cb030ecbd
commit
2221a99662
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>
|
@ -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,
|
||||||
|
@ -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">
|
||||||
|
Loading…
Reference in New Issue
Block a user