firmware and firmware build details

This commit is contained in:
Laura Klünder 2023-11-06 19:22:23 +01:00
parent c872b97fa3
commit 386bd3c888
7 changed files with 284 additions and 11 deletions

View file

@ -14,7 +14,7 @@ from c3nav.control.forms import MeshMessageFilterForm
from c3nav.control.views.base import ControlPanelMixin
from c3nav.mesh.forms import MeshMessageForm, MeshNodeForm
from c3nav.mesh.messages import MeshMessage, MeshMessageType
from c3nav.mesh.models import FirmwareVersion, MeshNode, NodeMessage
from c3nav.mesh.models import FirmwareBuild, FirmwareVersion, MeshNode, NodeMessage
from c3nav.mesh.utils import get_node_names, group_msg_type_choices
@ -215,3 +215,76 @@ class MeshFirmwaresCurrentListView(ControlPanelMixin, TemplateView):
**super().get_context_data(),
"firmwares": firmwares,
}
class MeshFirmwareDetailView(ControlPanelMixin, DetailView):
model = FirmwareVersion
template_name = "control/mesh_firmware_detail.html"
context_object_name = "firmware"
def get_queryset(self):
return super().get_queryset().prefetch_related('builds', 'builds__firmwarebuildboard_set')
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
nodes = list(MeshNode.objects.all().prefetch_firmwares().prefetch_last_messages(
MeshMessageType.CONFIG_BOARD,
))
builds = self.get_object().builds.all()
build_lookups = set(build.get_firmware_description().get_lookup() for build in builds)
installed_nodes = []
compatible_nodes = []
for node in nodes:
if node.firmware_desc.get_lookup() in build_lookups:
installed_nodes.append(node)
else:
node.compatible_builds = []
for build in builds:
if node.board in build.boards:
node.compatible_builds.append(build)
if node.compatible_builds:
compatible_nodes.append(node)
ctx.update({
'builds': builds,
'installed_nodes': installed_nodes,
'compatible_nodes': compatible_nodes,
})
return ctx
class MeshFirmwareBuildDetailView(ControlPanelMixin, DetailView):
model = FirmwareBuild
template_name = "control/mesh_firmware_build_detail.html"
context_object_name = "build"
def get_queryset(self):
return super().get_queryset().prefetch_related('firmwarebuildboard_set')
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
nodes = list(MeshNode.objects.all().prefetch_firmwares().prefetch_last_messages(
MeshMessageType.CONFIG_BOARD,
))
build_lookup = self.get_object().get_firmware_description().get_lookup()
build_boards = self.get_object().boards
installed_nodes = []
compatible_nodes = []
for node in nodes:
if node.firmware_desc.get_lookup() == build_lookup:
installed_nodes.append(node)
else:
if node.board in build_boards:
compatible_nodes.append(node)
ctx.update({
'installed_nodes': installed_nodes,
'compatible_nodes': compatible_nodes,
})
return ctx