migrate message_type database field
This commit is contained in:
parent
7f7ea64fd3
commit
9bee0bf774
2 changed files with 155 additions and 4 deletions
151
src/c3nav/mesh/migrations/0007_nodemessage_message_type_new.py
Normal file
151
src/c3nav/mesh/migrations/0007_nodemessage_message_type_new.py
Normal 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",
|
||||
),
|
||||
]
|
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue