Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions netbox/circuits/migrations/0046_charfield_null_choices.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)

Expand Down
85 changes: 43 additions & 42 deletions netbox/dcim/migrations/0194_charfield_null_choices.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
13 changes: 10 additions & 3 deletions netbox/dcim/migrations/0200_populate_mac_addresses.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
4 changes: 3 additions & 1 deletion netbox/dcim/migrations/0206_load_module_type_profiles.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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
Expand Down
7 changes: 4 additions & 3 deletions netbox/extras/migrations/0108_convert_reports_to_scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
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):
Expand Down
31 changes: 23 additions & 8 deletions netbox/extras/migrations/0109_script_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
)

Expand All @@ -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):
Expand Down
5 changes: 2 additions & 3 deletions netbox/extras/migrations/0115_convert_dashboard_widgets.py
Original file line number Diff line number Diff line change
@@ -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))
Expand Down
4 changes: 3 additions & 1 deletion netbox/extras/migrations/0116_custom_link_button_color.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@

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):
Expand Down
8 changes: 5 additions & 3 deletions netbox/extras/migrations/0117_move_objectchange.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,21 @@

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'
Expand Down
3 changes: 2 additions & 1 deletion netbox/extras/migrations/0120_eventrule_event_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@

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:
Expand Down
3 changes: 2 additions & 1 deletion netbox/extras/migrations/0122_charfield_null_choices.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
4 changes: 3 additions & 1 deletion netbox/extras/migrations/0123_journalentry_kind_default.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
4 changes: 3 additions & 1 deletion netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Loading