grouping msg_type choices makes forms look so much better

This commit is contained in:
Laura Klünder 2023-10-20 18:04:22 +02:00
parent f98f5053ef
commit 1e2bd01aff
4 changed files with 23 additions and 5 deletions

View file

@ -22,6 +22,7 @@ from c3nav.mapdata.models.access import (AccessPermission, AccessPermissionToken
AccessRestriction, AccessRestrictionGroup) AccessRestriction, AccessRestrictionGroup)
from c3nav.mesh.messages import MeshMessageType from c3nav.mesh.messages import MeshMessageType
from c3nav.mesh.models import MeshNode from c3nav.mesh.models import MeshNode
from c3nav.mesh.utils import group_msg_type_choices
from c3nav.site.models import Announcement from c3nav.site.models import Announcement
@ -302,7 +303,7 @@ class MapUpdateForm(ModelForm):
class MeshMessageFilterForm(Form): class MeshMessageFilterForm(Form):
message_types = MultipleChoiceField( message_types = MultipleChoiceField(
choices=[(msgtype.value, msgtype.name) for msgtype in MeshMessageType], choices=group_msg_type_choices(list(MeshMessageType)),
required=False, required=False,
label=_('message types'), label=_('message types'),
) )

View file

@ -17,8 +17,12 @@
{% csrf_token %} {% csrf_token %}
<select name="send_msg_type" style="display: inline-block; width: auto;" required> <select name="send_msg_type" style="display: inline-block; width: auto;" required>
<option value="">select type</option> <option value="">select type</option>
{% for msg_type in send_msg_types %} {% for category, msg_types in send_msg_types %}
<option value="{{ msg_type.name }}">{{ msg_type.pretty_name }}</option> <optgroup label="{{ category }}">
{% for value, label in msg_types %}
<option value="{{ value }}">{{ label }}</option>
{% endfor %}
</optgroup>
{% endfor %} {% endfor %}
</select> </select>
<button type="submit">{% trans 'Send message' %}</button> <button type="submit">{% trans 'Send message' %}</button>

View file

@ -15,7 +15,7 @@ from c3nav.control.views.base import ControlPanelMixin
from c3nav.mesh.forms import MeshMessageForm, MeshNodeForm from c3nav.mesh.forms import MeshMessageForm, MeshNodeForm
from c3nav.mesh.messages import MeshMessage, MeshMessageType from c3nav.mesh.messages import MeshMessage, MeshMessageType
from c3nav.mesh.models import MeshNode, NodeMessage 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): class MeshNodeListView(ControlPanelMixin, ListView):
@ -30,7 +30,7 @@ class MeshNodeListView(ControlPanelMixin, ListView):
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
return { return {
**super().get_context_data(*args, **kwargs), **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): def post(self, request):

View file

@ -1,3 +1,6 @@
from operator import attrgetter
def get_mesh_comm_group(address): def get_mesh_comm_group(address):
return 'mesh_comm_%s' % address.replace(':', '-') 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:ff:ff:ff': "direct parent",
'00:00:00:00:00:00': "root", '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())