diff --git a/src/c3nav/mesh/forms.py b/src/c3nav/mesh/forms.py
index 1a6692bd..3a661d76 100644
--- a/src/c3nav/mesh/forms.py
+++ b/src/c3nav/mesh/forms.py
@@ -289,12 +289,6 @@ class OTAApplyMessageForm(MeshMessageForm):
reboot = forms.BooleanField(required=False, label=_('reboot'))
-class MeshNodeForm(forms.ModelForm):
- class Meta:
- model = MeshNode
- fields = ["name"]
-
-
class RangingForm(forms.Form):
msg_types = {}
diff --git a/src/c3nav/mesh/migrations/0014_remove_meshnode_name.py b/src/c3nav/mesh/migrations/0014_remove_meshnode_name.py
new file mode 100644
index 00000000..8b6bfca7
--- /dev/null
+++ b/src/c3nav/mesh/migrations/0014_remove_meshnode_name.py
@@ -0,0 +1,17 @@
+# Generated by Django 5.0.1 on 2024-03-30 21:11
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('mesh', '0013_meshnode_upstream_alter_nodemessage_message_type'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='meshnode',
+ name='name',
+ ),
+ ]
diff --git a/src/c3nav/mesh/models.py b/src/c3nav/mesh/models.py
index 98404fd4..7ce3f9e1 100644
--- a/src/c3nav/mesh/models.py
+++ b/src/c3nav/mesh/models.py
@@ -256,7 +256,6 @@ class MeshNode(models.Model):
code='invalid_macaddress'
)])
- name = models.CharField(_('name'), max_length=32, null=True, blank=True)
first_seen = models.DateTimeField(_('first seen'), auto_now_add=True)
uplink = models.ForeignKey('MeshUplink', models.PROTECT, null=True,
related_name='routed_nodes', verbose_name=_('uplink'))
@@ -265,6 +264,12 @@ class MeshNode(models.Model):
last_signin = models.DateTimeField(_('last signin'), null=True)
objects = models.Manager.from_queryset(MeshNodeQuerySet)()
+ @property
+ def name(self):
+ node_message = self.last_messages[MeshMessageType.CONFIG_NODE]
+ if node_message:
+ return f"{node_message.parsed.content.number} {node_message.parsed.content.name}".strip()
+
def __str__(self):
if self.name:
return '%s (%s)' % (self.address, self.name)
diff --git a/src/c3nav/mesh/templates/mesh/node_detail.html b/src/c3nav/mesh/templates/mesh/node_detail.html
index adc3b79b..7dbbb886 100644
--- a/src/c3nav/mesh/templates/mesh/node_detail.html
+++ b/src/c3nav/mesh/templates/mesh/node_detail.html
@@ -45,9 +45,6 @@
-
- {% trans 'Edit' %}
-
{% trans 'View messages' %}
diff --git a/src/c3nav/mesh/urls.py b/src/c3nav/mesh/urls.py
index 9e6b1e23..85c7f9ac 100644
--- a/src/c3nav/mesh/urls.py
+++ b/src/c3nav/mesh/urls.py
@@ -5,7 +5,7 @@ from c3nav.mesh.views.firmware import (FirmwareBuildDetailView, FirmwareDetailVi
FirmwaresListView, OTADetailView, OTAListView)
from c3nav.mesh.views.messages import MeshMessageListView, MeshMessageSendingView, MeshMessageSendView
from c3nav.mesh.views.misc import MeshLogView, MeshRangingView
-from c3nav.mesh.views.nodes import NodeDetailView, NodeEditView, NodeListView
+from c3nav.mesh.views.nodes import NodeDetailView, NodeListView
urlpatterns = [
path('', NodeListView.as_view(), name='mesh.nodes'),
@@ -19,7 +19,6 @@ urlpatterns = [
path('ota/all/', OTAListView.as_view(all=True), name='mesh.ota.list.all'),
path('ota/