diff --git a/src/c3nav/control/forms.py b/src/c3nav/control/forms.py
index 1b3a87f3..e57f34d3 100644
--- a/src/c3nav/control/forms.py
+++ b/src/c3nav/control/forms.py
@@ -22,6 +22,7 @@ from c3nav.mapdata.models.access import (AccessPermission, AccessPermissionToken
AccessRestriction, AccessRestrictionGroup)
from c3nav.mesh.messages import MeshMessageType
from c3nav.mesh.models import MeshNode
+from c3nav.mesh.utils import group_msg_type_choices
from c3nav.site.models import Announcement
@@ -302,7 +303,7 @@ class MapUpdateForm(ModelForm):
class MeshMessageFilterForm(Form):
message_types = MultipleChoiceField(
- choices=[(msgtype.value, msgtype.name) for msgtype in MeshMessageType],
+ choices=group_msg_type_choices(list(MeshMessageType)),
required=False,
label=_('message types'),
)
diff --git a/src/c3nav/control/templates/control/mesh_nodes.html b/src/c3nav/control/templates/control/mesh_nodes.html
index cc67c10f..31b4bda9 100644
--- a/src/c3nav/control/templates/control/mesh_nodes.html
+++ b/src/c3nav/control/templates/control/mesh_nodes.html
@@ -17,8 +17,12 @@
{% csrf_token %}
diff --git a/src/c3nav/control/views/mesh.py b/src/c3nav/control/views/mesh.py
index 76bbe5d9..2870085c 100644
--- a/src/c3nav/control/views/mesh.py
+++ b/src/c3nav/control/views/mesh.py
@@ -15,7 +15,7 @@ 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 MeshNode, NodeMessage
-from c3nav.mesh.utils import get_node_names
+from c3nav.mesh.utils import get_node_names, group_msg_type_choices
class MeshNodeListView(ControlPanelMixin, ListView):
@@ -30,7 +30,7 @@ class MeshNodeListView(ControlPanelMixin, ListView):
def get_context_data(self, *args, **kwargs):
return {
**super().get_context_data(*args, **kwargs),
- "send_msg_types": {msg_type for msg_type in MeshMessageForm.msg_types.keys()}
+ "send_msg_types": group_msg_type_choices({msg_type for msg_type in MeshMessageForm.msg_types.keys()})
}
def post(self, request):
diff --git a/src/c3nav/mesh/utils.py b/src/c3nav/mesh/utils.py
index 393561ed..a0784f98 100644
--- a/src/c3nav/mesh/utils.py
+++ b/src/c3nav/mesh/utils.py
@@ -1,3 +1,6 @@
+from operator import attrgetter
+
+
def get_mesh_comm_group(address):
return 'mesh_comm_%s' % address.replace(':', '-')
@@ -14,3 +17,13 @@ def get_node_names():
'00:00:00:ff:ff:ff': "direct parent",
'00:00:00:00:00:00': "root",
}
+
+
+def group_msg_type_choices(msg_types):
+ msg_types = sorted(msg_types, key=attrgetter('value'))
+ choices = {}
+ for msg_type in msg_types:
+ choices.setdefault(msg_type.name.split('_')[0].lower(), []).append(
+ (msg_type.name, msg_type.pretty_name)
+ )
+ return tuple(choices.items())