From 76aa255f0715de19ab09ed6c271a66ac3e1e531a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 8 May 2025 14:53:52 -0400 Subject: [PATCH] Fixes #19440: Ensure data migrations use the correct database connection --- .../migrations/0046_charfield_null_choices.py | 7 +- .../0047_circuittermination__termination.py | 7 +- ...48_circuitterminations_cached_relations.py | 9 +- .../0051_virtualcircuit_group_assignment.py | 3 +- .../migrations/0194_charfield_null_choices.py | 85 ++++++++++--------- .../migrations/0200_populate_mac_addresses.py | 13 ++- .../0206_load_module_type_profiles.py | 4 +- .../0108_convert_reports_to_scripts.py | 7 +- netbox/extras/migrations/0109_script_model.py | 31 +++++-- .../0115_convert_dashboard_widgets.py | 5 +- .../0116_custom_link_button_color.py | 4 +- .../migrations/0117_move_objectchange.py | 8 +- .../migrations/0120_eventrule_event_types.py | 3 +- .../migrations/0122_charfield_null_choices.py | 3 +- .../0123_journalentry_kind_default.py | 4 +- .../0070_vlangroup_vlan_id_ranges.py | 4 +- netbox/ipam/migrations/0071_prefix_scope.py | 6 +- .../0072_prefix_cached_relations.py | 5 +- .../migrations/0073_charfield_null_choices.py | 5 +- .../0080_populate_service_parent.py | 14 +-- .../migrations/0016_charfield_null_choices.py | 3 +- .../tenancy/migrations/0018_contact_groups.py | 6 +- .../users/migrations/0005_alter_user_table.py | 16 ++-- .../migrations/0006_custom_group_model.py | 5 +- .../migrations/0009_update_group_perms.py | 9 +- .../migrations/0040_convert_disk_size.py | 15 ++-- .../migrations/0041_charfield_null_choices.py | 3 +- .../migrations/0044_cluster_scope.py | 6 +- .../0045_clusters_cached_relations.py | 5 +- .../migrations/0048_populate_mac_addresses.py | 13 ++- .../migrations/0006_charfield_null_choices.py | 9 +- .../migrations/0010_charfield_null_choices.py | 11 +-- 32 files changed, 197 insertions(+), 131 deletions(-) diff --git a/netbox/circuits/migrations/0046_charfield_null_choices.py b/netbox/circuits/migrations/0046_charfield_null_choices.py index 2a8bcde90..de6b2e6f9 100644 --- a/netbox/circuits/migrations/0046_charfield_null_choices.py +++ b/netbox/circuits/migrations/0046_charfield_null_choices.py @@ -8,10 +8,11 @@ def set_null_values(apps, schema_editor): Circuit = apps.get_model('circuits', 'Circuit') CircuitGroupAssignment = apps.get_model('circuits', 'CircuitGroupAssignment') CircuitTermination = apps.get_model('circuits', 'CircuitTermination') + db_alias = schema_editor.connection.alias - Circuit.objects.filter(distance_unit='').update(distance_unit=None) - CircuitGroupAssignment.objects.filter(priority='').update(priority=None) - CircuitTermination.objects.filter(cable_end='').update(cable_end=None) + Circuit.objects.using(db_alias).filter(distance_unit='').update(distance_unit=None) + CircuitGroupAssignment.objects.using(db_alias).filter(priority='').update(priority=None) + CircuitTermination.objects.using(db_alias).filter(cable_end='').update(cable_end=None) class Migration(migrations.Migration): diff --git a/netbox/circuits/migrations/0047_circuittermination__termination.py b/netbox/circuits/migrations/0047_circuittermination__termination.py index 4caa3a37d..af3af157b 100644 --- a/netbox/circuits/migrations/0047_circuittermination__termination.py +++ b/netbox/circuits/migrations/0047_circuittermination__termination.py @@ -8,14 +8,15 @@ def copy_site_assignments(apps, schema_editor): """ ContentType = apps.get_model('contenttypes', 'ContentType') CircuitTermination = apps.get_model('circuits', 'CircuitTermination') + ProviderNetwork = apps.get_model('circuits', 'ProviderNetwork') Site = apps.get_model('dcim', 'Site') + db_alias = schema_editor.connection.alias - CircuitTermination.objects.filter(site__isnull=False).update( + CircuitTermination.objects.using(db_alias).filter(site__isnull=False).update( termination_type=ContentType.objects.get_for_model(Site), termination_id=models.F('site_id') ) - ProviderNetwork = apps.get_model('circuits', 'ProviderNetwork') - CircuitTermination.objects.filter(provider_network__isnull=False).update( + CircuitTermination.objects.using(db_alias).filter(provider_network__isnull=False).update( termination_type=ContentType.objects.get_for_model(ProviderNetwork), termination_id=models.F('provider_network_id'), ) diff --git a/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py b/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py index 9be254d54..cd228b661 100644 --- a/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py +++ b/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py @@ -7,15 +7,20 @@ def populate_denormalized_fields(apps, schema_editor): Copy site ForeignKey values to the Termination GFK. """ CircuitTermination = apps.get_model('circuits', 'CircuitTermination') + db_alias = schema_editor.connection.alias - terminations = CircuitTermination.objects.filter(site__isnull=False).prefetch_related('site') + terminations = CircuitTermination.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site') for termination in terminations: termination._region_id = termination.site.region_id termination._site_group_id = termination.site.group_id termination._site_id = termination.site_id # Note: Location cannot be set prior to migration - CircuitTermination.objects.bulk_update(terminations, ['_region', '_site_group', '_site'], batch_size=100) + CircuitTermination.objects.using(db_alias).bulk_update( + terminations, + ['_region', '_site_group', '_site'], + batch_size=100 + ) class Migration(migrations.Migration): diff --git a/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py b/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py index 0418c26e5..0a694465a 100644 --- a/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py +++ b/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py @@ -9,8 +9,9 @@ def set_member_type(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') Circuit = apps.get_model('circuits', 'Circuit') CircuitGroupAssignment = apps.get_model('circuits', 'CircuitGroupAssignment') + db_alias = schema_editor.connection.alias - CircuitGroupAssignment.objects.update( + CircuitGroupAssignment.objects.using(db_alias).update( member_type=ContentType.objects.get_for_model(Circuit) ) diff --git a/netbox/dcim/migrations/0194_charfield_null_choices.py b/netbox/dcim/migrations/0194_charfield_null_choices.py index e13b0e10d..e23b25556 100644 --- a/netbox/dcim/migrations/0194_charfield_null_choices.py +++ b/netbox/dcim/migrations/0194_charfield_null_choices.py @@ -26,49 +26,50 @@ def set_null_values(apps, schema_editor): RackType = apps.get_model('dcim', 'RackType') RearPort = apps.get_model('dcim', 'RearPort') Site = apps.get_model('dcim', 'Site') + db_alias = schema_editor.connection.alias - Cable.objects.filter(length_unit='').update(length_unit=None) - Cable.objects.filter(type='').update(type=None) - ConsolePort.objects.filter(cable_end='').update(cable_end=None) - ConsolePort.objects.filter(type='').update(type=None) - ConsolePortTemplate.objects.filter(type='').update(type=None) - ConsoleServerPort.objects.filter(cable_end='').update(cable_end=None) - ConsoleServerPort.objects.filter(type='').update(type=None) - ConsoleServerPortTemplate.objects.filter(type='').update(type=None) - Device.objects.filter(airflow='').update(airflow=None) - Device.objects.filter(face='').update(face=None) - DeviceType.objects.filter(airflow='').update(airflow=None) - DeviceType.objects.filter(subdevice_role='').update(subdevice_role=None) - DeviceType.objects.filter(weight_unit='').update(weight_unit=None) - FrontPort.objects.filter(cable_end='').update(cable_end=None) - Interface.objects.filter(cable_end='').update(cable_end=None) - Interface.objects.filter(mode='').update(mode=None) - Interface.objects.filter(poe_mode='').update(poe_mode=None) - Interface.objects.filter(poe_type='').update(poe_type=None) - Interface.objects.filter(rf_channel='').update(rf_channel=None) - Interface.objects.filter(rf_role='').update(rf_role=None) - InterfaceTemplate.objects.filter(poe_mode='').update(poe_mode=None) - InterfaceTemplate.objects.filter(poe_type='').update(poe_type=None) - InterfaceTemplate.objects.filter(rf_role='').update(rf_role=None) - ModuleType.objects.filter(airflow='').update(airflow=None) - ModuleType.objects.filter(weight_unit='').update(weight_unit=None) - PowerFeed.objects.filter(cable_end='').update(cable_end=None) - PowerOutlet.objects.filter(cable_end='').update(cable_end=None) - PowerOutlet.objects.filter(feed_leg='').update(feed_leg=None) - PowerOutlet.objects.filter(type='').update(type=None) - PowerOutletTemplate.objects.filter(feed_leg='').update(feed_leg=None) - PowerOutletTemplate.objects.filter(type='').update(type=None) - PowerPort.objects.filter(cable_end='').update(cable_end=None) - PowerPort.objects.filter(type='').update(type=None) - PowerPortTemplate.objects.filter(type='').update(type=None) - Rack.objects.filter(airflow='').update(airflow=None) - Rack.objects.filter(form_factor='').update(form_factor=None) - Rack.objects.filter(outer_unit='').update(outer_unit=None) - Rack.objects.filter(weight_unit='').update(weight_unit=None) - RackType.objects.filter(outer_unit='').update(outer_unit=None) - RackType.objects.filter(weight_unit='').update(weight_unit=None) - RearPort.objects.filter(cable_end='').update(cable_end=None) - Site.objects.filter(time_zone='').update(time_zone=None) + Cable.objects.using(db_alias).filter(length_unit='').update(length_unit=None) + Cable.objects.using(db_alias).filter(type='').update(type=None) + ConsolePort.objects.using(db_alias).filter(cable_end='').update(cable_end=None) + ConsolePort.objects.using(db_alias).filter(type='').update(type=None) + ConsolePortTemplate.objects.using(db_alias).filter(type='').update(type=None) + ConsoleServerPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None) + ConsoleServerPort.objects.using(db_alias).filter(type='').update(type=None) + ConsoleServerPortTemplate.objects.using(db_alias).filter(type='').update(type=None) + Device.objects.using(db_alias).filter(airflow='').update(airflow=None) + Device.objects.using(db_alias).filter(face='').update(face=None) + DeviceType.objects.using(db_alias).filter(airflow='').update(airflow=None) + DeviceType.objects.using(db_alias).filter(subdevice_role='').update(subdevice_role=None) + DeviceType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None) + FrontPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None) + Interface.objects.using(db_alias).filter(cable_end='').update(cable_end=None) + Interface.objects.using(db_alias).filter(mode='').update(mode=None) + Interface.objects.using(db_alias).filter(poe_mode='').update(poe_mode=None) + Interface.objects.using(db_alias).filter(poe_type='').update(poe_type=None) + Interface.objects.using(db_alias).filter(rf_channel='').update(rf_channel=None) + Interface.objects.using(db_alias).filter(rf_role='').update(rf_role=None) + InterfaceTemplate.objects.using(db_alias).filter(poe_mode='').update(poe_mode=None) + InterfaceTemplate.objects.using(db_alias).filter(poe_type='').update(poe_type=None) + InterfaceTemplate.objects.using(db_alias).filter(rf_role='').update(rf_role=None) + ModuleType.objects.using(db_alias).filter(airflow='').update(airflow=None) + ModuleType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None) + PowerFeed.objects.using(db_alias).filter(cable_end='').update(cable_end=None) + PowerOutlet.objects.using(db_alias).filter(cable_end='').update(cable_end=None) + PowerOutlet.objects.using(db_alias).filter(feed_leg='').update(feed_leg=None) + PowerOutlet.objects.using(db_alias).filter(type='').update(type=None) + PowerOutletTemplate.objects.using(db_alias).filter(feed_leg='').update(feed_leg=None) + PowerOutletTemplate.objects.using(db_alias).filter(type='').update(type=None) + PowerPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None) + PowerPort.objects.using(db_alias).filter(type='').update(type=None) + PowerPortTemplate.objects.using(db_alias).filter(type='').update(type=None) + Rack.objects.using(db_alias).filter(airflow='').update(airflow=None) + Rack.objects.using(db_alias).filter(form_factor='').update(form_factor=None) + Rack.objects.using(db_alias).filter(outer_unit='').update(outer_unit=None) + Rack.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None) + RackType.objects.using(db_alias).filter(outer_unit='').update(outer_unit=None) + RackType.objects.using(db_alias).filter(weight_unit='').update(weight_unit=None) + RearPort.objects.using(db_alias).filter(cable_end='').update(cable_end=None) + Site.objects.using(db_alias).filter(time_zone='').update(time_zone=None) class Migration(migrations.Migration): diff --git a/netbox/dcim/migrations/0200_populate_mac_addresses.py b/netbox/dcim/migrations/0200_populate_mac_addresses.py index 0cd18d78e..8536d7d79 100644 --- a/netbox/dcim/migrations/0200_populate_mac_addresses.py +++ b/netbox/dcim/migrations/0200_populate_mac_addresses.py @@ -6,19 +6,26 @@ def populate_mac_addresses(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') Interface = apps.get_model('dcim', 'Interface') MACAddress = apps.get_model('dcim', 'MACAddress') + db_alias = schema_editor.connection.alias interface_ct = ContentType.objects.get_for_model(Interface) mac_addresses = [ MACAddress( - mac_address=interface.mac_address, assigned_object_type=interface_ct, assigned_object_id=interface.pk + mac_address=interface.mac_address, + assigned_object_type=interface_ct, + assigned_object_id=interface.pk ) for interface in Interface.objects.filter(mac_address__isnull=False) ] - MACAddress.objects.bulk_create(mac_addresses, batch_size=100) + MACAddress.objects.using(db_alias).bulk_create(mac_addresses, batch_size=100) # TODO: Optimize interface updates for mac_address in mac_addresses: - Interface.objects.filter(pk=mac_address.assigned_object_id).update(primary_mac_address=mac_address) + Interface.objects.using(db_alias).filter( + pk=mac_address.assigned_object_id + ).update( + primary_mac_address=mac_address + ) class Migration(migrations.Migration): diff --git a/netbox/dcim/migrations/0206_load_module_type_profiles.py b/netbox/dcim/migrations/0206_load_module_type_profiles.py index e3ca7d27a..8f131570f 100644 --- a/netbox/dcim/migrations/0206_load_module_type_profiles.py +++ b/netbox/dcim/migrations/0206_load_module_type_profiles.py @@ -11,6 +11,8 @@ def load_initial_data(apps, schema_editor): Load initial ModuleTypeProfile objects from file. """ ModuleTypeProfile = apps.get_model('dcim', 'ModuleTypeProfile') + db_alias = schema_editor.connection.alias + initial_profiles = ( 'cpu', 'fan', @@ -25,7 +27,7 @@ def load_initial_data(apps, schema_editor): with file_path.open('r') as f: data = json.load(f) try: - ModuleTypeProfile.objects.create(**data) + ModuleTypeProfile.objects.using(db_alias).create(**data) except Exception as e: print(f"Error loading data from {file_path}") raise e diff --git a/netbox/extras/migrations/0108_convert_reports_to_scripts.py b/netbox/extras/migrations/0108_convert_reports_to_scripts.py index 948bac754..e972b6676 100644 --- a/netbox/extras/migrations/0108_convert_reports_to_scripts.py +++ b/netbox/extras/migrations/0108_convert_reports_to_scripts.py @@ -4,11 +4,12 @@ from django.db import migrations def convert_reportmodule_jobs(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') Job = apps.get_model('core', 'Job') + db_alias = schema_editor.connection.alias # Convert all ReportModule jobs to ScriptModule jobs - if reportmodule_ct := ContentType.objects.filter(app_label='extras', model='reportmodule').first(): - scriptmodule_ct = ContentType.objects.get(app_label='extras', model='scriptmodule') - Job.objects.filter(object_type_id=reportmodule_ct.id).update(object_type_id=scriptmodule_ct.id) + if reportmodule_ct := ContentType.objects.using(db_alias).filter(app_label='extras', model='reportmodule').first(): + scriptmodule_ct = ContentType.objects.using(db_alias).get(app_label='extras', model='scriptmodule') + Job.objects.using(db_alias).filter(object_type_id=reportmodule_ct.id).update(object_type_id=scriptmodule_ct.id) class Migration(migrations.Migration): diff --git a/netbox/extras/migrations/0109_script_model.py b/netbox/extras/migrations/0109_script_model.py index 706a776af..f1f81b3bd 100644 --- a/netbox/extras/migrations/0109_script_model.py +++ b/netbox/extras/migrations/0109_script_model.py @@ -88,24 +88,33 @@ def update_scripts(apps, schema_editor): ScriptModule = apps.get_model('extras', 'ScriptModule') ReportModule = apps.get_model('extras', 'ReportModule') Job = apps.get_model('core', 'Job') + db_alias = schema_editor.connection.alias script_ct = ContentType.objects.get_for_model(Script, for_concrete_model=False) scriptmodule_ct = ContentType.objects.get_for_model(ScriptModule, for_concrete_model=False) reportmodule_ct = ContentType.objects.get_for_model(ReportModule, for_concrete_model=False) - for module in ScriptModule.objects.all(): + for module in ScriptModule.objects.using(db_alias).all(): for script_name in get_module_scripts(module): - script = Script.objects.create( + script = Script.objects.using(db_alias).create( name=script_name, module=module, ) # Update all Jobs associated with this ScriptModule & script name to point to the new Script object - Job.objects.filter(object_type_id=scriptmodule_ct.id, object_id=module.pk, name=script_name).update( + Job.objects.using(db_alias).filter( + object_type_id=scriptmodule_ct.id, + object_id=module.pk, + name=script_name + ).update( object_type_id=script_ct.id, object_id=script.pk ) # Update all Jobs associated with this ScriptModule & script name to point to the new Script object - Job.objects.filter(object_type_id=reportmodule_ct.id, object_id=module.pk, name=script_name).update( + Job.objects.using(db_alias).filter( + object_type_id=reportmodule_ct.id, + object_id=module.pk, + name=script_name + ).update( object_type_id=script_ct.id, object_id=script.pk ) @@ -119,16 +128,22 @@ def update_event_rules(apps, schema_editor): Script = apps.get_model('extras', 'Script') ScriptModule = apps.get_model('extras', 'ScriptModule') EventRule = apps.get_model('extras', 'EventRule') + db_alias = schema_editor.connection.alias script_ct = ContentType.objects.get_for_model(Script) scriptmodule_ct = ContentType.objects.get_for_model(ScriptModule) - for eventrule in EventRule.objects.filter(action_object_type=scriptmodule_ct): + for eventrule in EventRule.objects.using(db_alias).filter(action_object_type=scriptmodule_ct): name = eventrule.action_parameters.get('script_name') - obj, __ = Script.objects.get_or_create( - module_id=eventrule.action_object_id, name=name, defaults={'is_executable': False} + obj, __ = Script.objects.using(db_alias).get_or_create( + module_id=eventrule.action_object_id, + name=name, + defaults={'is_executable': False} + ) + EventRule.objects.using(db_alias).filter(pk=eventrule.pk).update( + action_object_type=script_ct, + action_object_id=obj.id ) - EventRule.objects.filter(pk=eventrule.pk).update(action_object_type=script_ct, action_object_id=obj.id) class Migration(migrations.Migration): diff --git a/netbox/extras/migrations/0115_convert_dashboard_widgets.py b/netbox/extras/migrations/0115_convert_dashboard_widgets.py index 28f6eade9..50f08ff42 100644 --- a/netbox/extras/migrations/0115_convert_dashboard_widgets.py +++ b/netbox/extras/migrations/0115_convert_dashboard_widgets.py @@ -1,12 +1,11 @@ -# Generated by Django 5.0.4 on 2024-04-24 20:09 - from django.db import migrations def update_dashboard_widgets(apps, schema_editor): Dashboard = apps.get_model('extras', 'Dashboard') + db_alias = schema_editor.connection.alias - for dashboard in Dashboard.objects.all(): + for dashboard in Dashboard.objects.using(db_alias).all(): for key, widget in dashboard.config.items(): if models := widget['config'].get('models'): models = list(map(lambda x: x.replace('users.netboxgroup', 'users.group'), models)) diff --git a/netbox/extras/migrations/0116_custom_link_button_color.py b/netbox/extras/migrations/0116_custom_link_button_color.py index ff47eab11..037f53d33 100644 --- a/netbox/extras/migrations/0116_custom_link_button_color.py +++ b/netbox/extras/migrations/0116_custom_link_button_color.py @@ -3,7 +3,9 @@ from django.db import migrations, models def update_link_buttons(apps, schema_editor): CustomLink = apps.get_model('extras', 'CustomLink') - CustomLink.objects.filter(button_class='outline-dark').update(button_class='default') + db_alias = schema_editor.connection.alias + + CustomLink.objects.using(db_alias).filter(button_class='outline-dark').update(button_class='default') class Migration(migrations.Migration): diff --git a/netbox/extras/migrations/0117_move_objectchange.py b/netbox/extras/migrations/0117_move_objectchange.py index 62c7255e7..301fc0846 100644 --- a/netbox/extras/migrations/0117_move_objectchange.py +++ b/netbox/extras/migrations/0117_move_objectchange.py @@ -3,19 +3,21 @@ from django.db import migrations def update_content_types(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') + db_alias = schema_editor.connection.alias # Delete the new ContentTypes effected by the new model in the core app - ContentType.objects.filter(app_label='core', model='objectchange').delete() + ContentType.objects.using(db_alias).filter(app_label='core', model='objectchange').delete() # Update the app labels of the original ContentTypes for extras.ObjectChange to ensure that any # foreign key references are preserved - ContentType.objects.filter(app_label='extras', model='objectchange').update(app_label='core') + ContentType.objects.using(db_alias).filter(app_label='extras', model='objectchange').update(app_label='core') def update_dashboard_widgets(apps, schema_editor): Dashboard = apps.get_model('extras', 'Dashboard') + db_alias = schema_editor.connection.alias - for dashboard in Dashboard.objects.all(): + for dashboard in Dashboard.objects.using(db_alias).all(): for key, widget in dashboard.config.items(): if widget['config'].get('model') == 'extras.objectchange': widget['config']['model'] = 'core.objectchange' diff --git a/netbox/extras/migrations/0120_eventrule_event_types.py b/netbox/extras/migrations/0120_eventrule_event_types.py index 2bcc0a4e6..cdb451a1c 100644 --- a/netbox/extras/migrations/0120_eventrule_event_types.py +++ b/netbox/extras/migrations/0120_eventrule_event_types.py @@ -6,8 +6,9 @@ from core.events import * def set_event_types(apps, schema_editor): EventRule = apps.get_model('extras', 'EventRule') - event_rules = EventRule.objects.all() + db_alias = schema_editor.connection.alias + event_rules = EventRule.objects.using(db_alias).all() for event_rule in event_rules: event_rule.event_types = [] if event_rule.type_create: diff --git a/netbox/extras/migrations/0122_charfield_null_choices.py b/netbox/extras/migrations/0122_charfield_null_choices.py index a32051cb1..c39ecb043 100644 --- a/netbox/extras/migrations/0122_charfield_null_choices.py +++ b/netbox/extras/migrations/0122_charfield_null_choices.py @@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor): Replace empty strings with null values. """ CustomFieldChoiceSet = apps.get_model('extras', 'CustomFieldChoiceSet') + db_alias = schema_editor.connection.alias - CustomFieldChoiceSet.objects.filter(base_choices='').update(base_choices=None) + CustomFieldChoiceSet.objects.using(db_alias).filter(base_choices='').update(base_choices=None) class Migration(migrations.Migration): diff --git a/netbox/extras/migrations/0123_journalentry_kind_default.py b/netbox/extras/migrations/0123_journalentry_kind_default.py index b32960469..ae80ab097 100644 --- a/netbox/extras/migrations/0123_journalentry_kind_default.py +++ b/netbox/extras/migrations/0123_journalentry_kind_default.py @@ -8,7 +8,9 @@ def set_kind_default(apps, schema_editor): Set kind to "info" on any entries with no kind assigned. """ JournalEntry = apps.get_model('extras', 'JournalEntry') - JournalEntry.objects.filter(kind='').update(kind=JournalEntryKindChoices.KIND_INFO) + db_alias = schema_editor.connection.alias + + JournalEntry.objects.using(db_alias).filter(kind='').update(kind=JournalEntryKindChoices.KIND_INFO) class Migration(migrations.Migration): diff --git a/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py b/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py index 133173234..62372a8e2 100644 --- a/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py +++ b/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py @@ -11,7 +11,9 @@ def set_vid_ranges(apps, schema_editor): Convert the min_vid & max_vid fields to a range in the new vid_ranges ArrayField. """ VLANGroup = apps.get_model('ipam', 'VLANGroup') - for group in VLANGroup.objects.all(): + db_alias = schema_editor.connection.alias + + for group in VLANGroup.objects.using(db_alias).all(): group.vid_ranges = [NumericRange(group.min_vid, group.max_vid, bounds='[]')] group._total_vlan_ids = group.max_vid - group.min_vid + 1 group.save() diff --git a/netbox/ipam/migrations/0071_prefix_scope.py b/netbox/ipam/migrations/0071_prefix_scope.py index 47a971750..02047dc09 100644 --- a/netbox/ipam/migrations/0071_prefix_scope.py +++ b/netbox/ipam/migrations/0071_prefix_scope.py @@ -9,9 +9,11 @@ def copy_site_assignments(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') Prefix = apps.get_model('ipam', 'Prefix') Site = apps.get_model('dcim', 'Site') + db_alias = schema_editor.connection.alias - Prefix.objects.filter(site__isnull=False).update( - scope_type=ContentType.objects.get_for_model(Site), scope_id=models.F('site_id') + Prefix.objects.using(db_alias).filter(site__isnull=False).update( + scope_type=ContentType.objects.get_for_model(Site), + scope_id=models.F('site_id') ) diff --git a/netbox/ipam/migrations/0072_prefix_cached_relations.py b/netbox/ipam/migrations/0072_prefix_cached_relations.py index 58cefb12d..c46f5b1a4 100644 --- a/netbox/ipam/migrations/0072_prefix_cached_relations.py +++ b/netbox/ipam/migrations/0072_prefix_cached_relations.py @@ -7,15 +7,16 @@ def populate_denormalized_fields(apps, schema_editor): Copy site ForeignKey values to the scope GFK. """ Prefix = apps.get_model('ipam', 'Prefix') + db_alias = schema_editor.connection.alias - prefixes = Prefix.objects.filter(site__isnull=False).prefetch_related('site') + prefixes = Prefix.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site') for prefix in prefixes: prefix._region_id = prefix.site.region_id prefix._site_group_id = prefix.site.group_id prefix._site_id = prefix.site_id # Note: Location cannot be set prior to migration - Prefix.objects.bulk_update(prefixes, ['_region', '_site_group', '_site'], batch_size=100) + Prefix.objects.using(db_alias).bulk_update(prefixes, ['_region', '_site_group', '_site'], batch_size=100) class Migration(migrations.Migration): diff --git a/netbox/ipam/migrations/0073_charfield_null_choices.py b/netbox/ipam/migrations/0073_charfield_null_choices.py index cfb764b46..82be106a4 100644 --- a/netbox/ipam/migrations/0073_charfield_null_choices.py +++ b/netbox/ipam/migrations/0073_charfield_null_choices.py @@ -7,9 +7,10 @@ def set_null_values(apps, schema_editor): """ FHRPGroup = apps.get_model('ipam', 'FHRPGroup') IPAddress = apps.get_model('ipam', 'IPAddress') + db_alias = schema_editor.connection.alias - FHRPGroup.objects.filter(auth_type='').update(auth_type=None) - IPAddress.objects.filter(role='').update(role=None) + FHRPGroup.objects.using(db_alias).filter(auth_type='').update(auth_type=None) + IPAddress.objects.using(db_alias).filter(role='').update(role=None) class Migration(migrations.Migration): diff --git a/netbox/ipam/migrations/0080_populate_service_parent.py b/netbox/ipam/migrations/0080_populate_service_parent.py index 78f3086fc..f043926bc 100644 --- a/netbox/ipam/migrations/0080_populate_service_parent.py +++ b/netbox/ipam/migrations/0080_populate_service_parent.py @@ -2,36 +2,38 @@ from django.db import migrations from django.db.models import F -def populate_service_parent_gfk(apps, schema_config): +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.filter(device_id__isnull=False).update( + 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.filter(virtual_machine_id__isnull=False).update( + 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, schemaconfig): +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.filter( + Service.objects.using(db_alias).filter( parent_object_type=ContentType.objects.get_for_model(Device), ).update( device_id=F('parent_object_id') ) - Service.objects.filter( + Service.objects.using(db_alias).filter( parent_object_type=ContentType.objects.get_for_model(VirtualMachine), ).update( virtual_machine_id=F('parent_object_id') diff --git a/netbox/tenancy/migrations/0016_charfield_null_choices.py b/netbox/tenancy/migrations/0016_charfield_null_choices.py index 9f5016a13..1be1641f7 100644 --- a/netbox/tenancy/migrations/0016_charfield_null_choices.py +++ b/netbox/tenancy/migrations/0016_charfield_null_choices.py @@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor): Replace empty strings with null values. """ ContactAssignment = apps.get_model('tenancy', 'ContactAssignment') + db_alias = schema_editor.connection.alias - ContactAssignment.objects.filter(priority='').update(priority=None) + ContactAssignment.objects.using(db_alias).filter(priority='').update(priority=None) class Migration(migrations.Migration): diff --git a/netbox/tenancy/migrations/0018_contact_groups.py b/netbox/tenancy/migrations/0018_contact_groups.py index 11030eb49..1279ccdf7 100644 --- a/netbox/tenancy/migrations/0018_contact_groups.py +++ b/netbox/tenancy/migrations/0018_contact_groups.py @@ -3,10 +3,10 @@ from django.db import migrations, models def migrate_contact_groups(apps, schema_editor): - Contacts = apps.get_model('tenancy', 'Contact') + Contact = apps.get_model('tenancy', 'Contact') + db_alias = schema_editor.connection.alias - qs = Contacts.objects.filter(group__isnull=False) - for contact in qs: + for contact in Contact.objects.using(db_alias).filter(group__isnull=False): contact.groups.add(contact.group) diff --git a/netbox/users/migrations/0005_alter_user_table.py b/netbox/users/migrations/0005_alter_user_table.py index 2e9f699b3..173a7ab4d 100644 --- a/netbox/users/migrations/0005_alter_user_table.py +++ b/netbox/users/migrations/0005_alter_user_table.py @@ -3,18 +3,22 @@ from django.db import migrations def update_content_types(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') + CustomField = apps.get_model('extras', 'CustomField') + db_alias = schema_editor.connection.alias + # Delete the new ContentTypes effected by the new models in the users app - ContentType.objects.filter(app_label='users', model='user').delete() + ContentType.objects.using(db_alias).filter(app_label='users', model='user').delete() # Update the app labels of the original ContentTypes for auth.User to ensure # that any foreign key references are preserved - ContentType.objects.filter(app_label='auth', model='user').update(app_label='users') + ContentType.objects.using(db_alias).filter(app_label='auth', model='user').update(app_label='users') - netboxuser_ct = ContentType.objects.filter(app_label='users', model='netboxuser').first() + netboxuser_ct = ContentType.objects.using(db_alias).filter(app_label='users', model='netboxuser').first() if netboxuser_ct: - user_ct = ContentType.objects.filter(app_label='users', model='user').first() - CustomField = apps.get_model('extras', 'CustomField') - CustomField.objects.filter(related_object_type_id=netboxuser_ct.id).update(related_object_type_id=user_ct.id) + user_ct = ContentType.objects.using(db_alias).filter(app_label='users', model='user').first() + CustomField.objects.using(db_alias).filter(related_object_type_id=netboxuser_ct.id).update( + related_object_type_id=user_ct.id + ) netboxuser_ct.delete() diff --git a/netbox/users/migrations/0006_custom_group_model.py b/netbox/users/migrations/0006_custom_group_model.py index f70c1d58d..99be38cb4 100644 --- a/netbox/users/migrations/0006_custom_group_model.py +++ b/netbox/users/migrations/0006_custom_group_model.py @@ -9,10 +9,11 @@ def update_custom_fields(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') CustomField = apps.get_model('extras', 'CustomField') Group = apps.get_model('users', 'Group') + db_alias = schema_editor.connection.alias - if old_ct := ContentType.objects.filter(app_label='users', model='netboxgroup').first(): + if old_ct := ContentType.objects.using(db_alias).filter(app_label='users', model='netboxgroup').first(): new_ct = ContentType.objects.get_for_model(Group) - CustomField.objects.filter(related_object_type=old_ct).update(related_object_type=new_ct) + CustomField.objects.using(db_alias).filter(related_object_type=old_ct).update(related_object_type=new_ct) class Migration(migrations.Migration): diff --git a/netbox/users/migrations/0009_update_group_perms.py b/netbox/users/migrations/0009_update_group_perms.py index 63fdeffec..af0f123c5 100644 --- a/netbox/users/migrations/0009_update_group_perms.py +++ b/netbox/users/migrations/0009_update_group_perms.py @@ -1,16 +1,15 @@ -# Generated by Django 5.0.5 on 2024-05-15 18:05 - from django.db import migrations, models def update_content_types(apps, schema_editor): ObjectType = apps.get_model('core', 'ObjectType') ObjectPermission = apps.get_model('users', 'ObjectPermission') + db_alias = schema_editor.connection.alias - auth_group_ct = ObjectType.objects.filter(app_label='auth', model='group').first() - users_group_ct = ObjectType.objects.filter(app_label='users', model='group').first() + auth_group_ct = ObjectType.objects.using(db_alias).filter(app_label='auth', model='group').first() + users_group_ct = ObjectType.objects.using(db_alias).filter(app_label='users', model='group').first() if auth_group_ct and users_group_ct: - perms = ObjectPermission.objects.filter(object_types__in=[auth_group_ct]) + perms = ObjectPermission.objects.using(db_alias).filter(object_types__in=[auth_group_ct]) for perm in perms: perm.object_types.remove(auth_group_ct) perm.object_types.add(users_group_ct) diff --git a/netbox/virtualization/migrations/0040_convert_disk_size.py b/netbox/virtualization/migrations/0040_convert_disk_size.py index 20153f7a0..e3c3cd2ac 100644 --- a/netbox/virtualization/migrations/0040_convert_disk_size.py +++ b/netbox/virtualization/migrations/0040_convert_disk_size.py @@ -4,18 +4,19 @@ from netbox.settings import DISK_BASE_UNIT def convert_disk_size(apps, schema_editor): - VirtualMachine = apps.get_model('virtualization', 'VirtualMachine') - VirtualMachine.objects.filter(disk__isnull=False).update(disk=F('disk') * DISK_BASE_UNIT) - VirtualDisk = apps.get_model('virtualization', 'VirtualDisk') - VirtualDisk.objects.filter(size__isnull=False).update(size=F('size') * DISK_BASE_UNIT) + VirtualMachine = apps.get_model('virtualization', 'VirtualMachine') + db_alias = schema_editor.connection.alias + + VirtualMachine.objects.using(db_alias).filter(disk__isnull=False).update(disk=F('disk') * DISK_BASE_UNIT) + VirtualDisk.objects.using(db_alias).filter(size__isnull=False).update(size=F('size') * DISK_BASE_UNIT) # Recalculate disk size on all VMs with virtual disks - id_list = VirtualDisk.objects.values_list('virtual_machine_id').distinct() - virtual_machines = VirtualMachine.objects.filter(id__in=id_list) + id_list = VirtualDisk.objects.using(db_alias).values_list('virtual_machine_id').distinct() + virtual_machines = VirtualMachine.objects.using(db_alias).filter(id__in=id_list) for vm in virtual_machines: vm.disk = vm.virtualdisks.aggregate(Sum('size', default=0))['size__sum'] - VirtualMachine.objects.bulk_update(virtual_machines, fields=['disk']) + VirtualMachine.objects.using(db_alias).bulk_update(virtual_machines, fields=['disk']) class Migration(migrations.Migration): diff --git a/netbox/virtualization/migrations/0041_charfield_null_choices.py b/netbox/virtualization/migrations/0041_charfield_null_choices.py index 22eb9955a..33f17badf 100644 --- a/netbox/virtualization/migrations/0041_charfield_null_choices.py +++ b/netbox/virtualization/migrations/0041_charfield_null_choices.py @@ -6,8 +6,9 @@ def set_null_values(apps, schema_editor): Replace empty strings with null values. """ VMInterface = apps.get_model('virtualization', 'VMInterface') + db_alias = schema_editor.connection.alias - VMInterface.objects.filter(mode='').update(mode=None) + VMInterface.objects.using(db_alias).filter(mode='').update(mode=None) class Migration(migrations.Migration): diff --git a/netbox/virtualization/migrations/0044_cluster_scope.py b/netbox/virtualization/migrations/0044_cluster_scope.py index 31dd72989..532bc79c1 100644 --- a/netbox/virtualization/migrations/0044_cluster_scope.py +++ b/netbox/virtualization/migrations/0044_cluster_scope.py @@ -9,9 +9,11 @@ def copy_site_assignments(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') Cluster = apps.get_model('virtualization', 'Cluster') Site = apps.get_model('dcim', 'Site') + db_alias = schema_editor.connection.alias - Cluster.objects.filter(site__isnull=False).update( - scope_type=ContentType.objects.get_for_model(Site), scope_id=models.F('site_id') + Cluster.objects.using(db_alias).filter(site__isnull=False).update( + scope_type=ContentType.objects.get_for_model(Site), + scope_id=models.F('site_id') ) diff --git a/netbox/virtualization/migrations/0045_clusters_cached_relations.py b/netbox/virtualization/migrations/0045_clusters_cached_relations.py index 9918bf594..71a6129b7 100644 --- a/netbox/virtualization/migrations/0045_clusters_cached_relations.py +++ b/netbox/virtualization/migrations/0045_clusters_cached_relations.py @@ -7,15 +7,16 @@ def populate_denormalized_fields(apps, schema_editor): Copy the denormalized fields for _region, _site_group and _site from existing site field. """ Cluster = apps.get_model('virtualization', 'Cluster') + db_alias = schema_editor.connection.alias - clusters = Cluster.objects.filter(site__isnull=False).prefetch_related('site') + clusters = Cluster.objects.using(db_alias).filter(site__isnull=False).prefetch_related('site') for cluster in clusters: cluster._region_id = cluster.site.region_id cluster._site_group_id = cluster.site.group_id cluster._site_id = cluster.site_id # Note: Location cannot be set prior to migration - Cluster.objects.bulk_update(clusters, ['_region', '_site_group', '_site'], batch_size=100) + Cluster.objects.using(db_alias).bulk_update(clusters, ['_region', '_site_group', '_site'], batch_size=100) class Migration(migrations.Migration): diff --git a/netbox/virtualization/migrations/0048_populate_mac_addresses.py b/netbox/virtualization/migrations/0048_populate_mac_addresses.py index a4be1e2be..fe485d52e 100644 --- a/netbox/virtualization/migrations/0048_populate_mac_addresses.py +++ b/netbox/virtualization/migrations/0048_populate_mac_addresses.py @@ -6,19 +6,24 @@ def populate_mac_addresses(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') VMInterface = apps.get_model('virtualization', 'VMInterface') MACAddress = apps.get_model('dcim', 'MACAddress') + db_alias = schema_editor.connection.alias vminterface_ct = ContentType.objects.get_for_model(VMInterface) mac_addresses = [ MACAddress( - mac_address=vminterface.mac_address, assigned_object_type=vminterface_ct, assigned_object_id=vminterface.pk + mac_address=vminterface.mac_address, + assigned_object_type=vminterface_ct, + assigned_object_id=vminterface.pk ) - for vminterface in VMInterface.objects.filter(mac_address__isnull=False) + for vminterface in VMInterface.objects.using(db_alias).filter(mac_address__isnull=False) ] - MACAddress.objects.bulk_create(mac_addresses, batch_size=100) + MACAddress.objects.using(db_alias).bulk_create(mac_addresses, batch_size=100) # TODO: Optimize interface updates for mac_address in mac_addresses: - VMInterface.objects.filter(pk=mac_address.assigned_object_id).update(primary_mac_address=mac_address) + VMInterface.objects.using(db_alias).filter(pk=mac_address.assigned_object_id).update( + primary_mac_address=mac_address + ) class Migration(migrations.Migration): diff --git a/netbox/vpn/migrations/0006_charfield_null_choices.py b/netbox/vpn/migrations/0006_charfield_null_choices.py index 784b66d72..6b4626b1c 100644 --- a/netbox/vpn/migrations/0006_charfield_null_choices.py +++ b/netbox/vpn/migrations/0006_charfield_null_choices.py @@ -8,11 +8,12 @@ def set_null_values(apps, schema_editor): IKEPolicy = apps.get_model('vpn', 'IKEPolicy') IKEProposal = apps.get_model('vpn', 'IKEProposal') IPSecProposal = apps.get_model('vpn', 'IPSecProposal') + db_alias = schema_editor.connection.alias - IKEPolicy.objects.filter(mode='').update(mode=None) - IKEProposal.objects.filter(authentication_algorithm='').update(authentication_algorithm=None) - IPSecProposal.objects.filter(authentication_algorithm='').update(authentication_algorithm=None) - IPSecProposal.objects.filter(encryption_algorithm='').update(encryption_algorithm=None) + IKEPolicy.objects.using(db_alias).filter(mode='').update(mode=None) + IKEProposal.objects.using(db_alias).filter(authentication_algorithm='').update(authentication_algorithm=None) + IPSecProposal.objects.using(db_alias).filter(authentication_algorithm='').update(authentication_algorithm=None) + IPSecProposal.objects.using(db_alias).filter(encryption_algorithm='').update(encryption_algorithm=None) class Migration(migrations.Migration): diff --git a/netbox/wireless/migrations/0010_charfield_null_choices.py b/netbox/wireless/migrations/0010_charfield_null_choices.py index f0394618a..ca2e975ad 100644 --- a/netbox/wireless/migrations/0010_charfield_null_choices.py +++ b/netbox/wireless/migrations/0010_charfield_null_choices.py @@ -7,12 +7,13 @@ def set_null_values(apps, schema_editor): """ WirelessLAN = apps.get_model('wireless', 'WirelessLAN') WirelessLink = apps.get_model('wireless', 'WirelessLink') + db_alias = schema_editor.connection.alias - WirelessLAN.objects.filter(auth_cipher='').update(auth_cipher=None) - WirelessLAN.objects.filter(auth_type='').update(auth_type=None) - WirelessLink.objects.filter(auth_cipher='').update(auth_cipher=None) - WirelessLink.objects.filter(auth_type='').update(auth_type=None) - WirelessLink.objects.filter(distance_unit='').update(distance_unit=None) + WirelessLAN.objects.using(db_alias).filter(auth_cipher='').update(auth_cipher=None) + WirelessLAN.objects.using(db_alias).filter(auth_type='').update(auth_type=None) + WirelessLink.objects.using(db_alias).filter(auth_cipher='').update(auth_cipher=None) + WirelessLink.objects.using(db_alias).filter(auth_type='').update(auth_type=None) + WirelessLink.objects.using(db_alias).filter(distance_unit='').update(distance_unit=None) class Migration(migrations.Migration):