106 lines
3.4 KiB
Python
106 lines
3.4 KiB
Python
from django.views.generic import DetailView, ListView, TemplateView
|
|
|
|
from c3nav.mesh.messages import MeshMessageType
|
|
from c3nav.mesh.models import FirmwareBuild, FirmwareVersion, MeshNode
|
|
from c3nav.mesh.views.base import MeshControlMixin
|
|
|
|
|
|
class FirmwaresListView(MeshControlMixin, ListView):
|
|
model = FirmwareVersion
|
|
template_name = "mesh/firmwares.html"
|
|
ordering = "-created"
|
|
context_object_name = "firmwares"
|
|
paginate_by = 20
|
|
|
|
|
|
class FirmwaresCurrentListView(MeshControlMixin, TemplateView):
|
|
template_name = "mesh/firmwares_current.html"
|
|
|
|
def get_context_data(self, **kwargs):
|
|
nodes = list(MeshNode.objects.all().prefetch_firmwares())
|
|
|
|
firmwares = {}
|
|
for node in nodes:
|
|
firmwares.setdefault(node.firmware_desc.get_lookup(), (node.firmware_desc, []))[1].append(node)
|
|
|
|
firmwares = sorted(firmwares.values(), key=lambda k: k[0].created, reverse=True)
|
|
|
|
print(firmwares)
|
|
|
|
return {
|
|
**super().get_context_data(),
|
|
"firmwares": firmwares,
|
|
}
|
|
|
|
|
|
class FirmwareDetailView(MeshControlMixin, DetailView):
|
|
model = FirmwareVersion
|
|
template_name = "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 FirmwareBuildDetailView(MeshControlMixin, DetailView):
|
|
model = FirmwareBuild
|
|
template_name = "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
|