mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-20 19:19:22 -06:00

* Initial work on ObjectChange data migrations * Fix migration bug * Add migrators for MAC address assignments * Update reverting kwarg; allow pop() to fail * Cross-reference MAC address migrators * Split migrator logic across migrations * Add missing migrator
81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
from django.contrib.contenttypes.models import ContentType
|
|
from django.db import migrations
|
|
from django.db.models import F
|
|
|
|
|
|
def populate_service_parent_gfk(apps, schema_editor):
|
|
Service = apps.get_model('ipam', 'Service')
|
|
ContentType = apps.get_model('contenttypes', 'ContentType')
|
|
Device = apps.get_model('dcim', 'device')
|
|
VirtualMachine = apps.get_model('virtualization', 'virtualmachine')
|
|
db_alias = schema_editor.connection.alias
|
|
|
|
Service.objects.using(db_alias).filter(device_id__isnull=False).update(
|
|
parent_object_type=ContentType.objects.get_for_model(Device),
|
|
parent_object_id=F('device_id'),
|
|
)
|
|
|
|
Service.objects.using(db_alias).filter(virtual_machine_id__isnull=False).update(
|
|
parent_object_type=ContentType.objects.get_for_model(VirtualMachine),
|
|
parent_object_id=F('virtual_machine_id'),
|
|
)
|
|
|
|
|
|
def repopulate_device_and_virtualmachine_relations(apps, schema_editor):
|
|
Service = apps.get_model('ipam', 'Service')
|
|
ContentType = apps.get_model('contenttypes', 'ContentType')
|
|
Device = apps.get_model('dcim', 'device')
|
|
VirtualMachine = apps.get_model('virtualization', 'virtualmachine')
|
|
db_alias = schema_editor.connection.alias
|
|
|
|
Service.objects.using(db_alias).filter(
|
|
parent_object_type=ContentType.objects.get_for_model(Device),
|
|
).update(
|
|
device_id=F('parent_object_id')
|
|
)
|
|
|
|
Service.objects.using(db_alias).filter(
|
|
parent_object_type=ContentType.objects.get_for_model(VirtualMachine),
|
|
).update(
|
|
virtual_machine_id=F('parent_object_id')
|
|
)
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
('dcim', '0202_location_comments_region_comments_sitegroup_comments'),
|
|
('ipam', '0079_add_service_fhrp_group_parent_gfk'),
|
|
('virtualization', '0048_populate_mac_addresses'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.RunPython(
|
|
populate_service_parent_gfk,
|
|
reverse_code=repopulate_device_and_virtualmachine_relations,
|
|
)
|
|
]
|
|
|
|
|
|
def oc_service_parent(objectchange, reverting):
|
|
device_ct = ContentType.objects.get_by_natural_key('dcim', 'device').pk
|
|
virtual_machine_ct = ContentType.objects.get_by_natural_key('virtualization', 'virtualmachine').pk
|
|
for data in (objectchange.prechange_data, objectchange.postchange_data):
|
|
if data is None:
|
|
continue
|
|
if device_id := data.get('device'):
|
|
data.update({
|
|
'parent_object_type': device_ct,
|
|
'parent_object_id': device_id,
|
|
})
|
|
elif virtual_machine_id := data.get('virtual_machine'):
|
|
data.update({
|
|
'parent_object_type': virtual_machine_ct,
|
|
'parent_object_id': virtual_machine_id,
|
|
})
|
|
|
|
|
|
objectchange_migrators = {
|
|
'ipam.service': oc_service_parent,
|
|
}
|