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)
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'),
)

View file

@ -17,8 +17,12 @@
{% csrf_token %}
<select name="send_msg_type" style="display: inline-block; width: auto;" required>
<option value="">select type</option>
{% for msg_type in send_msg_types %}
<option value="{{ msg_type.name }}">{{ msg_type.pretty_name }}</option>
{% for category, msg_types in send_msg_types %}
<optgroup label="{{ category }}">
{% for value, label in msg_types %}
<option value="{{ value }}">{{ label }}</option>
{% endfor %}
</optgroup>
{% endfor %}
</select>
<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.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):

View file

@ -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())