diff --git a/src/c3nav/mesh/migrations/0007_nodemessage_message_type_new.py b/src/c3nav/mesh/migrations/0007_nodemessage_message_type_new.py new file mode 100644 index 00000000..8b3dd696 --- /dev/null +++ b/src/c3nav/mesh/migrations/0007_nodemessage_message_type_new.py @@ -0,0 +1,151 @@ +# Generated by Django 4.2.1 on 2023-10-20 13:10 + +from django.db import migrations, models + + +def forwards_func(apps, schema_editor): + NodeMessage = apps.get_model("mesh", "NodeMessage") + for msg in NodeMessage.objects.all(): + msg.message_type_new = msg.get_message_type_display() + msg.save() + + +def backwards_func(apps, schema_editor): + NodeMessage = apps.get_model("mesh", "NodeMessage") + choices_lookup = {name: value for value, name in NodeMessage._meta.get_field("message_type").choices} + for msg in NodeMessage.objects.all(): + msg.message_type = choices_lookup[msg.message_type_new] + msg.save() + + +class Migration(migrations.Migration): + dependencies = [ + ("mesh", "0006_rename_route_meshnode_uplink"), + ] + + operations = [ + migrations.AddField( + model_name="nodemessage", + name="message_type_new", + field=models.CharField( + choices=[ + ("NOOP", "Noop"), + ("ECHO_REQUEST", "Echo Request"), + ("ECHO_RESPONSE", "Echo Response"), + ("MESH_SIGNIN", "Mesh Signin"), + ("MESH_LAYER_ANNOUNCE", "Mesh Layer Announce"), + ("MESH_ADD_DESTINATIONS", "Mesh Add Destinations"), + ("MESH_REMOVE_DESTINATIONS", "Mesh Remove Destinations"), + ("MESH_ROUTE_REQUEST", "Mesh Route Request"), + ("MESH_ROUTE_RESPONSE", "Mesh Route Response"), + ("MESH_ROUTE_TRACE", "Mesh Route Trace"), + ("MESH_ROUTING_FAILED", "Mesh Routing Failed"), + ("CONFIG_DUMP", "Config Dump"), + ("CONFIG_HARDWARE", "Config Hardware"), + ("CONFIG_BOARD", "Config Board"), + ("CONFIG_FIRMWARE", "Config Firmware"), + ("CONFIG_UPLINK", "Config Uplink"), + ("CONFIG_POSITION", "Config Position"), + ("OTA_STATUS", "Ota Status"), + ("OTA_REQUEST_STATUS", "Ota Request Status"), + ("OTA_START", "Ota Start"), + ("OTA_URL", "Ota Url"), + ("OTA_FRAGMENT", "Ota Fragment"), + ("OTA_REQUEST_FRAGMENT", "Ota Request Fragment"), + ("OTA_APPLY", "Ota Apply"), + ("OTA_REBOOT", "Ota Reboot"), + ("LOCATE_REQUEST_RANGE", "Locate Request Range"), + ("LOCATE_RANGE_RESULTS", "Locate Range Results"), + ], + db_index=True, + max_length=24, + null=True, + verbose_name="message type", + ), + ), + migrations.AlterField( + model_name="nodemessage", + name="message_type", + field=models.SmallIntegerField( + choices=[ + (0, "NOOP"), + (1, "ECHO_REQUEST"), + (2, "ECHO_RESPONSE"), + (3, "MESH_SIGNIN"), + (4, "MESH_LAYER_ANNOUNCE"), + (5, "MESH_ADD_DESTINATIONS"), + (6, "MESH_REMOVE_DESTINATIONS"), + (7, "MESH_ROUTE_REQUEST"), + (8, "MESH_ROUTE_RESPONSE"), + (9, "MESH_ROUTE_TRACE"), + (10, "MESH_ROUTING_FAILED"), + (16, "CONFIG_DUMP"), + (17, "CONFIG_HARDWARE"), + (18, "CONFIG_BOARD"), + (19, "CONFIG_FIRMWARE"), + (20, "CONFIG_UPLINK"), + (21, "CONFIG_POSITION"), + (32, "OTA_STATUS"), + (33, "OTA_REQUEST_STATUS"), + (34, "OTA_START"), + (35, "OTA_URL"), + (36, "OTA_FRAGMENT"), + (37, "OTA_REQUEST_FRAGMENT"), + (38, "OTA_APPLY"), + (39, "OTA_REBOOT"), + (48, "LOCATE_REQUEST_RANGE"), + (49, "LOCATE_RANGE_RESULTS"), + ], + db_index=True, + verbose_name="message type", + ), + ), + migrations.RunPython(forwards_func, backwards_func), + migrations.RemoveField( + model_name="nodemessage", + name="message_type", + ), + migrations.AlterField( + model_name="nodemessage", + name="message_type_new", + field=models.CharField( + choices=[ + ("NOOP", "Noop"), + ("ECHO_REQUEST", "Echo Request"), + ("ECHO_RESPONSE", "Echo Response"), + ("MESH_SIGNIN", "Mesh Signin"), + ("MESH_LAYER_ANNOUNCE", "Mesh Layer Announce"), + ("MESH_ADD_DESTINATIONS", "Mesh Add Destinations"), + ("MESH_REMOVE_DESTINATIONS", "Mesh Remove Destinations"), + ("MESH_ROUTE_REQUEST", "Mesh Route Request"), + ("MESH_ROUTE_RESPONSE", "Mesh Route Response"), + ("MESH_ROUTE_TRACE", "Mesh Route Trace"), + ("MESH_ROUTING_FAILED", "Mesh Routing Failed"), + ("CONFIG_DUMP", "Config Dump"), + ("CONFIG_HARDWARE", "Config Hardware"), + ("CONFIG_BOARD", "Config Board"), + ("CONFIG_FIRMWARE", "Config Firmware"), + ("CONFIG_UPLINK", "Config Uplink"), + ("CONFIG_POSITION", "Config Position"), + ("OTA_STATUS", "Ota Status"), + ("OTA_REQUEST_STATUS", "Ota Request Status"), + ("OTA_START", "Ota Start"), + ("OTA_URL", "Ota Url"), + ("OTA_FRAGMENT", "Ota Fragment"), + ("OTA_REQUEST_FRAGMENT", "Ota Request Fragment"), + ("OTA_APPLY", "Ota Apply"), + ("OTA_REBOOT", "Ota Reboot"), + ("LOCATE_REQUEST_RANGE", "Locate Request Range"), + ("LOCATE_RANGE_RESULTS", "Locate Range Results"), + ], + db_index=True, + max_length=24, + verbose_name="message type", + ), + ), + migrations.RenameField( + model_name="nodemessage", + old_name="message_type_new", + new_name="message_type", + ), + ] diff --git a/src/c3nav/mesh/models.py b/src/c3nav/mesh/models.py index c8c08c55..a1697704 100644 --- a/src/c3nav/mesh/models.py +++ b/src/c3nav/mesh/models.py @@ -25,7 +25,7 @@ class MeshNodeQuerySet(models.QuerySet): def prefetch_last_messages(self, *types: MeshMessageType): clone = self._chain() clone._prefetch_last_messages |= ( - set(types) if types else set(msgtype.value for msgtype in MeshMessageType) + set(types) if types else set(msgtype for msgtype in MeshMessageType) ) return clone @@ -35,7 +35,7 @@ class MeshNodeQuerySet(models.QuerySet): nodes = {node.pk: node for node in self._result_cache} try: for message in NodeMessage.objects.order_by('message_type', 'src_node', '-datetime', '-pk').filter( - message_type__in=self._prefetch_last_messages, + message_type__in=(t.name for t in self._prefetch_last_messages), src_node__in=nodes.keys(), ).prefetch_related("uplink_node").distinct('message_type', 'src_node'): nodes[message.src_node_id].last_messages[message.message_type] = message @@ -101,13 +101,13 @@ class MeshNode(models.Model): class NodeMessage(models.Model): - MESSAGE_TYPES = [(msgtype.value, msgtype.name) for msgtype in MeshMessageType] + MESSAGE_TYPES = [(msgtype.name, msgtype.pretty_name) for msgtype in MeshMessageType] src_node = models.ForeignKey('MeshNode', models.PROTECT, related_name='received_messages', verbose_name=_('node')) uplink_node = models.ForeignKey('MeshNode', models.PROTECT, related_name='relayed_messages', verbose_name=_('uplink node')) datetime = models.DateTimeField(_('datetime'), db_index=True, auto_now_add=True) - message_type = models.SmallIntegerField(_('message type'), db_index=True, choices=MESSAGE_TYPES) + message_type = models.CharField(_('message type'), max_length=24, db_index=True, choices=MESSAGE_TYPES) data = models.JSONField(_('message data')) def __str__(self):