make linter happy

This commit is contained in:
Laura Klünder 2023-10-06 02:46:43 +02:00
parent 79cde0f78c
commit b732d52f65
21 changed files with 82 additions and 75 deletions

5
loadproduction.old.sh Executable file
View file

@ -0,0 +1,5 @@
#!/bin/sh
export C3NAV_CONFIG=/home/laura/Projekte/c3nav/data/c3nav.cfg
ssh root@34c3.c3nav.de "c3nav-manage 34c3 dumpdata mapdata --format json | gzip" | gunzip > production.json
python src/manage.py loaddata --app mapdata production.json
# rm production.json

View file

@ -9,8 +9,8 @@ from itertools import chain
import pytz
from django.contrib.auth.models import User
from django.db.models import Prefetch
from django.forms import ChoiceField, Form, IntegerField, ModelForm, Select, MultipleChoiceField, \
ModelMultipleChoiceField
from django.forms import (ChoiceField, Form, IntegerField, ModelForm, ModelMultipleChoiceField, MultipleChoiceField,
Select)
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.utils.translation import ngettext_lazy

View file

@ -24,7 +24,7 @@
{% if request.user_permissions.manage_map_updates %}
<a href="{% url 'control.map_updates' %}">{% trans 'Map Updates' %}</a> &middot;
{% endif %}
<a href="{% url 'control.mesh_nodes' %}">{% trans 'Mesh' %}</a> &middot;
<a href="{% url 'control.mesh.nodes' %}">{% trans 'Mesh' %}</a> &middot;
<a href="{% url 'control.users.detail' user=request.user.pk %}">{{ request.user.username }}</a>
</p>
</nav>

View file

@ -10,7 +10,7 @@
{% block subcontent %}
<p><a class="button" href="{{ success_url }}">Go back</a></p>
{% if msg_type == "MESH_ROUTE_REQUEST" %}
<p>Route to <a href="{% url "control.mesh_node.detail" pk=msg_data.address %}">{{ msg_data.address }} {% if node_name %} ({{ node_name }}){% endif %}</a></p>
<p>Route to <a href="{% url "control.mesh.node.detail" pk=msg_data.address %}">{{ msg_data.address }} {% if node_name %} ({{ node_name }}){% endif %}</a></p>
{% endif %}
<div class="columns">
<div>
@ -23,7 +23,7 @@
{% for address, name in recipients %}
<tr>
<td>
{% if address != "ff:ff:ff:ff:ff:ff" %}<a href="{% url "control.mesh_node.detail" pk=address %}">{% endif %}
{% if address != "ff:ff:ff:ff:ff:ff" %}<a href="{% url "control.mesh.node.detail" pk=address %}">{% endif %}
{{ address }}{% if name %} ({{ name }}){% endif %}
{% if address != "ff:ff:ff:ff:ff:ff" %}</a>{% endif %}
</td>

View file

@ -31,7 +31,7 @@
{% for msg in mesh_messages %}
<tr>
<td>{{ msg.datetime.date }} {{ msg.datetime.time|date:"H:i:s" }}</td>
<td><a href="{% url "control.mesh_node.detail" pk=msg.src_node.address %}">{{ msg.src_node }}</a></td>
<td><a href="{% url "control.mesh.node.detail" pk=msg.src_node.address %}">{{ msg.src_node }}</a></td>
<td>{{ msg.get_message_type_display }}</td>
<td>
{% if msg.get_message_type_display == "CONFIG_FIRMWARE" %}
@ -76,7 +76,7 @@
{% endfor %}
{% endif %}
</td>
<td><a href="{% url "control.mesh_node.detail" pk=msg.uplink_node.address %}">{{ msg.uplink_node }}</a></td>
<td><a href="{% url "control.mesh.node.detail" pk=msg.uplink_node.address %}">{{ msg.uplink_node }}</a></td>
</tr>
{% endfor %}
</table>

View file

@ -12,7 +12,7 @@
<strong>Name:</strong> {% if node.name %}{{ node.name }}{% else %}<em>{% trans '(no name)' %}</em>{% endif %}
</p>
<p>
<strong>Uplink:</strong> <a href="{% url "control.mesh_node.detail" pk=node.uplink.address %}">{{ node.uplink }}</a><br>
<strong>Uplink:</strong> <a href="{% url "control.mesh.node.detail" pk=node.uplink.address %}">{{ node.uplink }}</a><br>
<strong>Last signin:</strong>
{{ node.last_signin.date }} {{ node.last_signin.time|date:"H:i:s" }}
@ -29,10 +29,10 @@
<br>
</p>
<p>
<a class="button" href="{% url "control.mesh_node.edit" pk=node.pk %}">
<a class="button" href="{% url "control.mesh.node.edit" pk=node.pk %}">
{% trans 'Edit' %}
</a>
<a class="button" href="{% url "control.mesh_messages" %}?src_nodes={{ node.address }}">
<a class="button" href="{% url "control.mesh.messages" %}?src_nodes={{ node.address }}">
{% trans 'View messages' %}
</a>
</p>
@ -61,7 +61,7 @@
<strong>SSL:</strong> {{ node.last_messages.CONFIG_UPLINK.parsed.ssl }}<br>
</p>
<p>
<a class="button" href="{% url "control.mesh_message.send" recipient=node.address msg_type="CONFIG_UPLINK" %}">
<a class="button" href="{% url "control.mesh.send" recipient=node.address msg_type="CONFIG_UPLINK" %}">
{% trans 'Change' %}
</a>
</p>
@ -71,7 +71,7 @@
<strong>X=</strong>{{ node.last_messages.CONFIG_POSITION.parsed.x_pos }}, <strong>Y=</strong>{{ node.last_messages.CONFIG_POSITION.parsed.y_pos }}, <strong>Z=</strong>{{ node.last_messages.CONFIG_POSITION.parsed.z_pos }}
</p>
<p>
<a class="button" href="{% url "control.mesh_message.send" recipient=node.address msg_type="CONFIG_POSITION" %}">
<a class="button" href="{% url "control.mesh.send" recipient=node.address msg_type="CONFIG_POSITION" %}">
{% trans 'Change' %}
</a>
</p>
@ -81,7 +81,7 @@
{{ node.last_messages.CONFIG_LED.parsed.led_config }}
</p>
<p>
<a class="button" href="{% url "control.mesh_message.send" recipient=node.address msg_type="CONFIG_LED" %}">
<a class="button" href="{% url "control.mesh.send" recipient=node.address msg_type="CONFIG_LED" %}">
{% trans 'Change' %}
</a>
</p>

View file

@ -7,7 +7,7 @@
<div class="columns">
<div>
<h4>View messages</h4>
<a class="button" href="{% url "control.mesh_messages" %}">
<a class="button" href="{% url "control.mesh.messages" %}">
{% trans 'View received messages' %}
</a>
</div>
@ -26,7 +26,7 @@
</div>
<div>
<h4>Logs</h4>
<a class="button" href="{% url "control.mesh_log" %}">
<a class="button" href="{% url "control.mesh.log" %}">
{% trans 'View log' %}
</a>
</div>
@ -43,7 +43,7 @@
</tr>
{% for node in nodes %}
<tr>
<td><a href="{% url "control.mesh_node.detail" pk=node.address %}">{{ node }}</a></td>
<td><a href="{% url "control.mesh.node.detail" pk=node.address %}">{{ node }}</a></td>
<td>
{{ node.last_messages.CONFIG_FIRMWARE.parsed.get_chip_display }}
<small>rev{{ node.last_messages.CONFIG_FIRMWARE.parsed.revision_major }}.{{ node.last_messages.CONFIG_FIRMWARE.parsed.revision_minor }}</small>
@ -62,7 +62,7 @@
{{ timesince }} ago
{% endblocktrans %}
</td>
<td><a href="{% url "control.mesh_node.detail" pk=node.uplink.address %}">{{ node.uplink }}</a></td>
<td><a href="{% url "control.mesh.node.detail" pk=node.uplink.address %}">{{ node.uplink }}</a></td>
</tr>
{% endfor %}
</table>

View file

@ -1,12 +1,12 @@
from django.urls import path
from c3nav.control.views.mesh import MeshNodeListView, MeshMessageListView, MeshNodeDetailView, MeshMessageSendView, \
MeshNodeEditView, MeshLogView, MeshMessageSendingView
from c3nav.control.views.mapupdates import map_updates
from c3nav.control.views.announcements import announcement_list, announcement_detail
from c3nav.control.views.access import grant_access, grant_access_qr
from c3nav.control.views.users import UserListView, user_detail
from c3nav.control.views.announcements import announcement_detail, announcement_list
from c3nav.control.views.base import ControlPanelIndexView
from c3nav.control.views.mapupdates import map_updates
from c3nav.control.views.mesh import (MeshLogView, MeshMessageListView, MeshMessageSendingView, MeshMessageSendView,
MeshNodeDetailView, MeshNodeEditView, MeshNodeListView)
from c3nav.control.views.users import UserListView, user_detail
urlpatterns = [
path('users/', UserListView.as_view(), name='control.users'),
@ -16,13 +16,13 @@ urlpatterns = [
path('announcements/', announcement_list, name='control.announcements'),
path('announcements/<int:annoucement>/', announcement_detail, name='control.announcements.detail'),
path('mapupdates/', map_updates, name='control.map_updates'),
path('mesh/', MeshNodeListView.as_view(), name='control.mesh_nodes'),
path('mesh/logs/', MeshLogView.as_view(), name='control.mesh_log'),
path('mesh/messages/', MeshMessageListView.as_view(), name='control.mesh_messages'),
path('mesh/<str:pk>/', MeshNodeDetailView.as_view(), name='control.mesh_node.detail'),
path('mesh/<str:pk>/edit/', MeshNodeEditView.as_view(), name='control.mesh_node.edit'),
path('mesh/message/sending/<uuid:uuid>/', MeshMessageSendingView.as_view(), name='control.mesh_message.sending'),
path('mesh/message/<str:recipient>/<str:msg_type>/', MeshMessageSendView.as_view(), name='control.mesh_message.send'),
path('mesh/message/<str:msg_type>/', MeshMessageSendView.as_view(), name='control.mesh_message.send'),
path('mesh/', MeshNodeListView.as_view(), name='control.mesh.nodes'),
path('mesh/logs/', MeshLogView.as_view(), name='control.mesh.log'),
path('mesh/messages/', MeshMessageListView.as_view(), name='control.mesh.messages'),
path('mesh/<str:pk>/', MeshNodeDetailView.as_view(), name='control.mesh.node.detail'),
path('mesh/<str:pk>/edit/', MeshNodeEditView.as_view(), name='control.mesh.node.edit'),
path('mesh/message/sending/<uuid:uuid>/', MeshMessageSendingView.as_view(), name='control.mesh.sending'),
path('mesh/message/<str:recipient>/<str:msg_type>/', MeshMessageSendView.as_view(), name='control.mesh.send'),
path('mesh/message/<str:msg_type>/', MeshMessageSendView.as_view(), name='control.mesh.send'),
path('', ControlPanelIndexView.as_view(), name='control.index'),
]

View file

@ -1,6 +1,6 @@
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.shortcuts import redirect, render, get_object_or_404
from django.shortcuts import get_object_or_404, redirect, render
from c3nav.control.forms import AnnouncementForm
from c3nav.control.views.base import control_panel_view

View file

@ -1,7 +1,7 @@
from functools import wraps
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.core.exceptions import PermissionDenied
from django.views.generic import TemplateView

View file

@ -10,7 +10,7 @@ from django.shortcuts import redirect, render
from django.utils.timezone import make_aware
from django.utils.translation import gettext_lazy as _
from c3nav.control.forms import MapUpdateForm, MapUpdateFilterForm
from c3nav.control.forms import MapUpdateFilterForm, MapUpdateForm
from c3nav.control.views.base import control_panel_view
from c3nav.mapdata.models import MapUpdate
from c3nav.mapdata.tasks import process_map_updates

View file

@ -8,12 +8,12 @@ from django.http import Http404
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic import ListView, DetailView, FormView, UpdateView, TemplateView
from django.views.generic import DetailView, FormView, ListView, TemplateView, UpdateView
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 MeshMessageType, MeshMessage
from c3nav.mesh.messages import MeshMessage, MeshMessageType
from c3nav.mesh.models import MeshNode, NodeMessage
from c3nav.mesh.utils import get_node_names
@ -35,7 +35,7 @@ class MeshNodeListView(ControlPanelMixin, ListView):
def post(self, request):
return redirect(
reverse("control.mesh_message.send", kwargs={"msg_type": request.POST.get("send_msg_type", "")})
reverse("control.mesh.send", kwargs={"msg_type": request.POST.get("send_msg_type", "")})
)
@ -62,7 +62,7 @@ class MeshNodeEditView(ControlPanelMixin, SuccessMessageMixin, UpdateView):
}
def get_success_url(self):
return reverse('control.mesh_node.detail', kwargs={'pk': self.get_object().pk})
return reverse('control.mesh.node.detail', kwargs={'pk': self.get_object().pk})
class MeshMessageListView(ControlPanelMixin, ListView):
@ -130,7 +130,7 @@ class MeshMessageSendView(ControlPanelMixin, FormView):
def get_success_url(self):
if 'recipient' in self.kwargs and False:
return reverse('control.mesh_node.detail', kwargs={'pk': self.kwargs['recipient']})
return reverse('control.mesh.node.detail', kwargs={'pk': self.kwargs['recipient']})
else:
return self.request.path
@ -145,7 +145,7 @@ class MeshMessageSendView(ControlPanelMixin, FormView):
"recipients": form.get_recipients(),
"msg_data": form.get_msg_data(),
}
return redirect(reverse('control.mesh_message.sending', kwargs={'uuid': uuid}))
return redirect(reverse('control.mesh.sending', kwargs={'uuid': uuid}))
class MeshMessageSendingView(ControlPanelMixin, TemplateView):

View file

@ -3,7 +3,7 @@ import string
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.db import transaction, IntegrityError
from django.db import IntegrityError, transaction
from django.db.models import Prefetch
from django.shortcuts import get_object_or_404, redirect, render
from django.utils import timezone
@ -11,8 +11,8 @@ from django.utils.crypto import get_random_string
from django.utils.translation import gettext_lazy as _
from django.views.generic import ListView
from c3nav.control.forms import UserPermissionsForm, AccessPermissionForm, UserSpaceAccessForm
from c3nav.control.models import UserSpaceAccess, UserPermissions
from c3nav.control.forms import AccessPermissionForm, UserPermissionsForm, UserSpaceAccessForm
from c3nav.control.models import UserPermissions, UserSpaceAccess
from c3nav.control.views.base import ControlPanelMixin, control_panel_view
from c3nav.mapdata.models import AccessRestriction
from c3nav.mapdata.models.access import AccessPermission
@ -35,7 +35,7 @@ class UserListView(ControlPanelMixin, ListView):
@login_required(login_url='site.login')
@control_panel_view
def user_detail(request, user): # todo: make class based view
def user_detail(request, user): # todo: make class based view
qs = User.objects.select_related(
'permissions',
).prefetch_related(

View file

@ -1,2 +0,0 @@
def editor_get_object_or_404(model, *q):
return get_object_or_404()

View file

@ -1,8 +1,8 @@
import re
import struct
from abc import ABC, abstractmethod
from dataclasses import dataclass, fields, field, Field
from typing import Any, Sequence, Self
from dataclasses import Field, dataclass, fields
from typing import Any, Self, Sequence
from c3nav.mesh.utils import indent_c

View file

@ -1,15 +1,15 @@
import traceback
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer, JsonWebsocketConsumer
from channels.generic.websocket import JsonWebsocketConsumer, WebsocketConsumer
from django.utils import timezone
from c3nav.mesh.utils import get_mesh_comm_group
from c3nav.mesh import messages
from c3nav.mesh.messages import MeshMessage, MESH_BROADCAST_ADDRESS, MeshMessageType, MESH_ROOT_ADDRESS, \
MESH_NONE_ADDRESS
from c3nav.mesh.messages import (MESH_BROADCAST_ADDRESS, MESH_NONE_ADDRESS, MESH_ROOT_ADDRESS, MeshMessage,
MeshMessageType)
from c3nav.mesh.models import MeshNode, NodeMessage
from c3nav.mesh.tasks import send_channel_msg
from c3nav.mesh.utils import get_mesh_comm_group
# noinspection PyAttributeOutsideInit
@ -34,8 +34,8 @@ class MeshConsumer(WebsocketConsumer):
self.remove_dst_nodes(self.dst_nodes)
def send_msg(self, msg, sender=None, exclude_uplink_address=None):
#print("sending", msg, MeshMessage.encode(msg).hex(' ', 1))
#self.log_text(msg.dst, "sending %s" % msg)
# print("sending", msg, MeshMessage.encode(msg).hex(' ', 1))
# self.log_text(msg.dst, "sending %s" % msg)
self.send(bytes_data=MeshMessage.encode(msg))
async_to_sync(self.channel_layer.group_send)("mesh_msg_sent", {
"type": "mesh.msg_sent",
@ -44,7 +44,7 @@ class MeshConsumer(WebsocketConsumer):
"sender": sender,
"uplink": self.uplink_node.address if self.uplink_node else None,
"recipient": msg.dst,
#"msg": msg.tojson(), # not doing this part for privacy reasons
# "msg": msg.tojson(), # not doing this part for privacy reasons
})
def receive(self, text_data=None, bytes_data=None):
@ -81,7 +81,7 @@ class MeshConsumer(WebsocketConsumer):
print('it\'s a broadcast so it\'s also for us')
self.log_text(MESH_ROOT_ADDRESS, "received broadcast message, forwarding and handling...")
#print('Received message:', msg)
# print('Received message:', msg)
src_node, created = MeshNode.objects.get_or_create(address=msg.src)

View file

@ -1,7 +1,7 @@
from dataclasses import dataclass, field
from enum import IntEnum, unique
from c3nav.mesh.baseformats import FixedHexFormat, VarArrayFormat, StructType, SimpleFormat, FixedStrFormat
from c3nav.mesh.baseformats import FixedHexFormat, FixedStrFormat, SimpleFormat, StructType, VarArrayFormat
class MacAddressFormat(FixedHexFormat):
@ -14,7 +14,6 @@ class MacAddressesListFormat(VarArrayFormat):
super().__init__(child_type=MacAddressFormat())
@unique
class LedType(IntEnum):
SERIAL = 1
@ -56,4 +55,4 @@ class FirmwareAppDescription(StructType, no_c_type=True):
compile_date: str = field(metadata={"format": FixedStrFormat(16)})
idf_version: str = field(metadata={"format": FixedStrFormat(32)})
app_elf_sha256: str = field(metadata={"format": FixedHexFormat(32)})
reserv2: list[int] = field(metadata={"format": SimpleFormat('20I')}, repr=False)
reserv2: list[int] = field(metadata={"format": SimpleFormat('20I')}, repr=False)

View file

@ -7,7 +7,7 @@ from django.http import Http404
from django.utils.translation import gettext_lazy as _
from c3nav.mesh.dataformats import LedConfig
from c3nav.mesh.messages import MeshMessageType, MeshMessage, MESH_ROOT_ADDRESS, MESH_BROADCAST_ADDRESS
from c3nav.mesh.messages import MESH_BROADCAST_ADDRESS, MESH_ROOT_ADDRESS, MeshMessage, MeshMessageType
from c3nav.mesh.models import MeshNode
@ -197,4 +197,4 @@ class ConfigPositionMessageForm(MeshMessageForm):
class MeshNodeForm(forms.ModelForm):
class Meta:
model = MeshNode
fields = ["name"]
fields = ["name"]

View file

@ -2,9 +2,8 @@ from dataclasses import fields
from django.core.management.base import BaseCommand
from c3nav.mesh.dataformats import LedConfig
from c3nav.mesh.baseformats import normalize_name
from c3nav.mesh.messages import MeshMessage, MeshMessageType
from c3nav.mesh.messages import MeshMessage
from c3nav.mesh.utils import indent_c
@ -43,7 +42,8 @@ class Command(BaseCommand):
struct_lines[base_name] = "%s %s;" % (name, base_name.replace('_announce', ''))
struct_sizes.append(size)
print(code)
print("static_assert(sizeof(%s) == %d, \"size of generated message structs is calculated wrong\");" % (name, size))
print("static_assert(sizeof(%s) == %d, \"size of generated message structs is calculated wrong\");" %
(name, size))
print()
else:
nodata.add(msg_type)
@ -53,7 +53,10 @@ class Command(BaseCommand):
for line in struct_lines.values():
print(indent_c(line))
print("} mesh_msg_data_t; ")
print("static_assert(sizeof(mesh_msg_data_t) == %d, \"size of generated message structs is calculated wrong\");" % max(struct_sizes))
print(
"static_assert(sizeof(mesh_msg_data_t) == %d, \"size of generated message structs is calculated wrong\");"
% max(struct_sizes)
)
max_msg_type = max(MeshMessage.get_types().keys())
macro_data = []

View file

@ -1,17 +1,15 @@
import re
from dataclasses import asdict, dataclass, field, fields, is_dataclass
from dataclasses import dataclass, field
from enum import IntEnum, unique
from itertools import chain
from typing import TypeVar
import channels
from asgiref.sync import async_to_sync
from c3nav.mesh.utils import get_mesh_comm_group, indent_c
from c3nav.mesh.dataformats import (LedConfig, LedConfig,
MacAddressesListFormat, MacAddressFormat, RangeItemType, FirmwareAppDescription)
from c3nav.mesh.baseformats import SimpleFormat, BoolFormat, FixedStrFormat, FixedHexFormat, VarArrayFormat, \
VarStrFormat, StructType
from c3nav.mesh.baseformats import BoolFormat, FixedStrFormat, SimpleFormat, StructType, VarArrayFormat, VarStrFormat
from c3nav.mesh.dataformats import (FirmwareAppDescription, LedConfig, MacAddressesListFormat, MacAddressFormat,
RangeItemType)
from c3nav.mesh.utils import get_mesh_comm_group
MESH_ROOT_ADDRESS = '00:00:00:00:00:00'
MESH_NONE_ADDRESS = '00:00:00:00:00:00'
@ -20,6 +18,7 @@ MESH_CHILDREN_ADDRESS = '00:00:00:00:ff:ff'
MESH_BROADCAST_ADDRESS = 'ff:ff:ff:ff:ff:ff'
NO_LAYER = 0xFF
@unique
class MeshMessageType(IntEnum):
NOOP = 0x00
@ -273,4 +272,4 @@ class ConfigUplinkMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_UPLINK):
@dataclass
class LocateReportRangeMessage(MeshMessage, msg_id=MeshMessageType.LOCATE_REPORT_RANGE):
""" report distance to given nodes """
ranges: dict[str, int] = field(metadata={"format": VarArrayFormat(RangeItemType)})
ranges: dict[str, int] = field(metadata={"format": VarArrayFormat(RangeItemType)})

View file

@ -1,12 +1,14 @@
from collections import UserDict
from functools import cached_property
from operator import attrgetter
from typing import Mapping, Self, Any
from typing import Any, Mapping, Self
from django.db import models, NotSupportedError
from django.db import NotSupportedError, models
from django.utils.translation import gettext_lazy as _
from c3nav.mesh.messages import MeshMessageType, ChipType, MeshMessage as MeshMessage
from c3nav.mesh.messages import ChipType
from c3nav.mesh.messages import MeshMessage as MeshMessage
from c3nav.mesh.messages import MeshMessageType
class MeshNodeQuerySet(models.QuerySet):
@ -42,6 +44,7 @@ class MeshNodeQuerySet(models.QuerySet):
except NotSupportedError:
pass
class LastMessagesByTypeLookup(UserDict):
def __init__(self, node):
super().__init__()