diff --git a/netbox/circuits/migrations/0047_circuittermination__termination.py b/netbox/circuits/migrations/0047_circuittermination__termination.py index af3af157b..546450ee7 100644 --- a/netbox/circuits/migrations/0047_circuittermination__termination.py +++ b/netbox/circuits/migrations/0047_circuittermination__termination.py @@ -1,4 +1,5 @@ import django.db.models.deletion +from django.contrib.contenttypes.models import ContentType from django.db import migrations, models @@ -49,3 +50,28 @@ class Migration(migrations.Migration): # Copy over existing site assignments migrations.RunPython(code=copy_site_assignments, reverse_code=migrations.RunPython.noop), ] + + +def oc_circuittermination_termination(objectchange, revert): + site_ct = ContentType.objects.get_by_natural_key('dcim', 'site').pk + provider_network_ct = ContentType.objects.get_by_natural_key('circuits', 'providernetwork').pk + for data in (objectchange.prechange_data, objectchange.postchange_data): + if data is None: + continue + if site_id := data.get('site'): + data.update({ + 'termination_type': site_ct, + 'termination_id': site_id, + }) + elif provider_network_id := data.get('provider_network'): + data.update({ + 'termination_type': provider_network_ct, + 'termination_id': provider_network_id, + }) + data.pop('site') + data.pop('provider_network') + + +objectchange_migrators = { + 'circuits.circuittermination': oc_circuittermination_termination, +} diff --git a/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py b/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py index 0a694465a..448a1e625 100644 --- a/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py +++ b/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py @@ -1,4 +1,5 @@ import django.db.models.deletion +from django.contrib.contenttypes.models import ContentType from django.db import migrations, models @@ -82,3 +83,21 @@ class Migration(migrations.Migration): ), ), ] + + +def oc_circuitgroupassignment_member(objectchange, revert): + circuit_ct = ContentType.objects.get_by_natural_key('circuits', 'circuit').pk + for data in (objectchange.prechange_data, objectchange.postchange_data): + if data is None: + continue + if circuit_id := data.get('circuit'): + data.update({ + 'member_type': circuit_ct, + 'member_id': circuit_id, + }) + data.pop('circuit') + + +objectchange_migrators = { + 'circuits.circuitgroupassignment': oc_circuitgroupassignment_member, +} diff --git a/netbox/ipam/migrations/0071_prefix_scope.py b/netbox/ipam/migrations/0071_prefix_scope.py index 02047dc09..d7c2c2fcd 100644 --- a/netbox/ipam/migrations/0071_prefix_scope.py +++ b/netbox/ipam/migrations/0071_prefix_scope.py @@ -1,4 +1,5 @@ import django.db.models.deletion +from django.contrib.contenttypes.models import ContentType from django.db import migrations, models @@ -44,3 +45,21 @@ class Migration(migrations.Migration): # Copy over existing site assignments migrations.RunPython(code=copy_site_assignments, reverse_code=migrations.RunPython.noop), ] + + +def oc_prefix_scope(objectchange, revert): + site_ct = ContentType.objects.get_by_natural_key('dcim', 'site').pk + for data in (objectchange.prechange_data, objectchange.postchange_data): + if data is None: + continue + if site_id := data.get('site'): + data.update({ + 'scope_type': site_ct, + 'scope_id': site_id, + }) + data.pop('site') + + +objectchange_migrators = { + 'ipam.prefix': oc_prefix_scope, +} diff --git a/netbox/ipam/migrations/0080_populate_service_parent.py b/netbox/ipam/migrations/0080_populate_service_parent.py index f043926bc..62f13df18 100644 --- a/netbox/ipam/migrations/0080_populate_service_parent.py +++ b/netbox/ipam/migrations/0080_populate_service_parent.py @@ -1,3 +1,4 @@ +from django.contrib.contenttypes.models import ContentType from django.db import migrations from django.db.models import F @@ -54,3 +55,28 @@ class Migration(migrations.Migration): reverse_code=repopulate_device_and_virtualmachine_relations, ) ] + + +def oc_service_parent(objectchange, revert): + 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, + }) + data.pop('device') + data.pop('virtual_machine') + + +objectchange_migrators = { + 'ipam.service': oc_service_parent, +} diff --git a/netbox/tenancy/migrations/0018_contact_groups.py b/netbox/tenancy/migrations/0018_contact_groups.py index 1279ccdf7..72d2d9505 100644 --- a/netbox/tenancy/migrations/0018_contact_groups.py +++ b/netbox/tenancy/migrations/0018_contact_groups.py @@ -66,3 +66,17 @@ class Migration(migrations.Migration): name='group', ), ] + + +def oc_contact_groups(objectchange, revert): + for data in (objectchange.prechange_data, objectchange.postchange_data): + if data is None: + continue + if 'group' in data: + data['groups'] = [data['group']] if data['group'] else [] + data.pop('group') + + +objectchange_migrators = { + 'tenancy.contact': oc_contact_groups, +} diff --git a/netbox/virtualization/migrations/0044_cluster_scope.py b/netbox/virtualization/migrations/0044_cluster_scope.py index 532bc79c1..03d6481ff 100644 --- a/netbox/virtualization/migrations/0044_cluster_scope.py +++ b/netbox/virtualization/migrations/0044_cluster_scope.py @@ -1,4 +1,5 @@ import django.db.models.deletion +from django.contrib.contenttypes.models import ContentType from django.db import migrations, models @@ -43,3 +44,21 @@ class Migration(migrations.Migration): # Copy over existing site assignments migrations.RunPython(code=copy_site_assignments, reverse_code=migrations.RunPython.noop), ] + + +def oc_cluster_scope(objectchange, revert): + site_ct = ContentType.objects.get_by_natural_key('dcim', 'site').pk + for data in (objectchange.prechange_data, objectchange.postchange_data): + if data is None: + continue + if site_id := data.get('site'): + data.update({ + 'scope_type': site_ct, + 'scope_id': site_id, + }) + data.pop('site') + + +objectchange_migrators = { + 'virtualization.cluster': oc_cluster_scope, +}