migrate message_type database field

This commit is contained in:
Laura Klünder 2023-10-20 15:23:45 +02:00
parent 7f7ea64fd3
commit 9bee0bf774
2 changed files with 155 additions and 4 deletions

View file

@ -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",
),
]

View file

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