11import django .db .models .deletion
2+ from django .apps import apps
3+ from django .contrib .contenttypes .models import ContentType
24from django .db import migrations , models
35
46
@@ -15,7 +17,7 @@ def populate_mac_addresses(apps, schema_editor):
1517 assigned_object_type = interface_ct ,
1618 assigned_object_id = interface .pk
1719 )
18- for interface in Interface .objects .filter (mac_address__isnull = False )
20+ for interface in Interface .objects .using ( db_alias ). filter (mac_address__isnull = False )
1921 ]
2022 MACAddress .objects .using (db_alias ).bulk_create (mac_addresses , batch_size = 100 )
2123
@@ -51,3 +53,43 @@ class Migration(migrations.Migration):
5153 name = 'mac_address' ,
5254 ),
5355 ]
56+
57+
58+ # See peer migrator in virtualization.0048_populate_mac_addresses before making changes
59+ def oc_interface_primary_mac_address (objectchange , reverting ):
60+ MACAddress = apps .get_model ('dcim' , 'MACAddress' )
61+ interface_ct = ContentType .objects .get_by_natural_key ('dcim' , 'interface' )
62+
63+ # Swap data order if the change is being reverted
64+ if not reverting :
65+ before , after = objectchange .prechange_data , objectchange .postchange_data
66+ else :
67+ before , after = objectchange .postchange_data , objectchange .prechange_data
68+
69+ if after .get ('mac_address' ) != before .get ('mac_address' ):
70+ # Create & assign the new MACAddress (if any)
71+ if after .get ('mac_address' ):
72+ mac = MACAddress .objects .create (
73+ mac_address = after ['mac_address' ],
74+ assigned_object_type = interface_ct ,
75+ assigned_object_id = objectchange .changed_object_id ,
76+ )
77+ after ['primary_mac_address' ] = mac .pk
78+ else :
79+ after ['primary_mac_address' ] = None
80+ # Delete the old MACAddress (if any)
81+ if before .get ('mac_address' ):
82+ MACAddress .objects .filter (
83+ mac_address = before ['mac_address' ],
84+ assigned_object_type = interface_ct ,
85+ assigned_object_id = objectchange .changed_object_id ,
86+ ).delete ()
87+ before ['primary_mac_address' ] = None
88+
89+ before .pop ('mac_address' , None )
90+ after .pop ('mac_address' , None )
91+
92+
93+ objectchange_migrators = {
94+ 'dcim.interface' : oc_interface_primary_mac_address ,
95+ }
0 commit comments