Skip to content

Commit 3d061c7

Browse files
committed
update device detail
1 parent 220e54d commit 3d061c7

File tree

5 files changed

+274
-74
lines changed

5 files changed

+274
-74
lines changed

app/devices/templatetags/__init__.py

Whitespace-only changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# devices/templatetags/custom_tags.py
2+
from django import template
3+
4+
register = template.Library()
5+
6+
@register.filter
7+
def get(dictionary, key):
8+
return dictionary.get(key)

app/devices/views.py

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
from django.views.generic.edit import UpdateView
44
from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin
55
from django.urls import reverse_lazy, reverse
6+
from django.utils import timezone
7+
from django.core.serializers.json import DjangoJSONEncoder
8+
from django.core.paginator import Paginator
9+
import json
610

7-
8-
from .models import Device, DeviceStatus
11+
from .models import Device, DeviceStatus, DeviceLogs
912
from .forms import DeviceForm, DeviceNotesForm
1013

1114
class DeviceListView(UserPassesTestMixin, ListView):
@@ -21,18 +24,67 @@ def get_queryset(self):
2124
return Device.objects.all().order_by('id')
2225

2326

24-
class DeviceDetailView(UserPassesTestMixin, DetailView):
27+
class DeviceDetailView(LoginRequiredMixin, UserPassesTestMixin, DetailView):
2528
model = Device
2629
context_object_name = 'device'
2730
template_name = 'devices/detail.html'
2831

2932
def test_func(self):
33+
# Only superusers can access this view
3034
return self.request.user.is_authenticated and self.request.user.is_superuser
3135

3236
def get_context_data(self, **kwargs):
3337
context = super().get_context_data(**kwargs)
34-
# Fetch all DeviceStatus entries related to this Device, ordered by most recent
35-
context['device_statuses'] = DeviceStatus.objects.filter(device=self.object).order_by('-time_received')
38+
device = self.object
39+
40+
# Fetch all DeviceStatus entries related to this Device, ordered by time_received ascendingly
41+
device_status_qs = DeviceStatus.objects.filter(device=device).order_by('time_received')
42+
context['battery_status'] = device_status_qs.exists()
43+
44+
if context['battery_status']:
45+
# Prepare data for Chart.js
46+
battery_times = [
47+
status.time_received.strftime('%Y-%m-%d %H:%M')
48+
for status in device_status_qs
49+
if status.battery_soc is not None and status.battery_voltage is not None
50+
]
51+
battery_charges = [
52+
min(max(status.battery_soc, 0), 100)
53+
for status in device_status_qs
54+
if status.battery_soc is not None and status.battery_voltage is not None
55+
]
56+
battery_voltages = [
57+
round(status.battery_voltage, 2)
58+
for status in device_status_qs
59+
if status.battery_soc is not None and status.battery_voltage is not None
60+
]
61+
62+
# Serialize data to JSON format
63+
context['battery_times'] = json.dumps(battery_times, cls=DjangoJSONEncoder)
64+
context['battery_charges'] = json.dumps(battery_charges, cls=DjangoJSONEncoder)
65+
context['battery_voltages'] = json.dumps(battery_voltages, cls=DjangoJSONEncoder)
66+
67+
# Fetch all DeviceLogs entries related to this Device, ordered by timestamp descendingly
68+
device_logs_qs = DeviceLogs.objects.filter(device=device).order_by('-timestamp')
69+
70+
# Implement pagination (10 logs per page)
71+
paginator = Paginator(device_logs_qs, 10)
72+
page_number = self.request.GET.get('page')
73+
page_obj = paginator.get_page(page_number)
74+
75+
context['device_logs'] = page_obj
76+
context['paginator'] = paginator
77+
context['page_obj'] = page_obj
78+
79+
# Define a level to badge class mapping
80+
context['level_badge_map'] = {
81+
10: 'bg-secondary', # DEBUG
82+
20: 'bg-info', # INFO
83+
30: 'bg-warning', # WARNING
84+
40: 'bg-danger', # ERROR
85+
50: 'bg-dark', # CRITICAL
86+
}
87+
3688
return context
3789

3890

app/main/settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@
4949
'django.contrib.admin',
5050
'django.contrib.auth',
5151
'django.contrib.contenttypes',
52-
'django.contrib.sessions',
52+
'django.contrib.humanize',
5353
'django.contrib.messages',
54+
'django.contrib.sessions',
5455
'django.contrib.staticfiles',
5556
'django.contrib.sites',
5657
# Third-party

0 commit comments

Comments
 (0)