diff --git a/netbox/circuits/migrations/0053_ci_collations.py b/netbox/circuits/migrations/0053_ci_collations.py index c847c12e3..9c65ca750 100644 --- a/netbox/circuits/migrations/0053_ci_collations.py +++ b/netbox/circuits/migrations/0053_ci_collations.py @@ -21,7 +21,7 @@ class Migration(migrations.Migration): dependencies = [ ('circuits', '0052_extend_circuit_abs_distance_upper_limit'), - ('dcim', '0216_ci_collations'), + ('dcim', '0217_ci_collations'), ] operations = [ diff --git a/netbox/core/migrations/0020_ci_collations.py b/netbox/core/migrations/0020_ci_collations.py index d1ce9b0fd..ba39f21f1 100644 --- a/netbox/core/migrations/0020_ci_collations.py +++ b/netbox/core/migrations/0020_ci_collations.py @@ -14,7 +14,7 @@ class Migration(migrations.Migration): dependencies = [ ('core', '0019_configrevision_active'), - ('dcim', '0216_ci_collations'), + ('dcim', '0217_ci_collations'), ] operations = [ diff --git a/netbox/dcim/migrations/0216_ci_collations.py b/netbox/dcim/migrations/0216_ci_collations.py deleted file mode 100644 index ee0aa637d..000000000 --- a/netbox/dcim/migrations/0216_ci_collations.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.contrib.postgres.operations import CreateCollation -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('dcim', '0215_rackreservation_status'), - ] - - operations = [ - # Create a case-insensitive collation - CreateCollation( - 'case_insensitive', - provider='icu', - locale='und-u-ks-level2', - deterministic=False, - ), - # Create a case-insensitive collation with natural sorting - CreateCollation( - 'ci_natural_sort', - provider='icu', - locale='und-u-kn-true-ks-level2', - deterministic=False, - ), - ] diff --git a/netbox/dcim/migrations/0217_ci_collations.py b/netbox/dcim/migrations/0217_ci_collations.py index 97401cd38..6fb52e627 100644 --- a/netbox/dcim/migrations/0217_ci_collations.py +++ b/netbox/dcim/migrations/0217_ci_collations.py @@ -1,311 +1,26 @@ -from django.db import migrations, models - -PATTERN_OPS_INDEXES = [ - 'dcim_devicerole_slug_7952643b_like', - 'dcim_devicetype_slug_448745bd_like', - 'dcim_inventoryitemrole_name_4c8cfe6d_like', - 'dcim_inventoryitemrole_slug_3556c227_like', - 'dcim_location_slug_352c5472_like', - 'dcim_manufacturer_name_841fcd92_like', - 'dcim_manufacturer_slug_00430749_like', - 'dcim_moduletypeprofile_name_1709c36e_like', - 'dcim_platform_slug_b0908ae4_like', - 'dcim_rackrole_name_9077cfcc_like', - 'dcim_rackrole_slug_40bbcd3a_like', - 'dcim_racktype_slug_6bbb384a_like', - 'dcim_region_slug_ff078a66_like', - 'dcim_site_name_8fe66c76_like', - 'dcim_site_slug_4412c762_like', - 'dcim_sitegroup_slug_a11d2b04_like', -] - - -def remove_indexes(apps, schema_editor): - for idx in PATTERN_OPS_INDEXES: - schema_editor.execute(f'DROP INDEX IF EXISTS {idx}') +from django.contrib.postgres.operations import CreateCollation +from django.db import migrations class Migration(migrations.Migration): + dependencies = [ - ('dcim', '0216_ci_collations'), - ('extras', '0134_ci_collations'), - ('ipam', '0083_ci_collations'), - ('tenancy', '0021_ci_collations'), - ('virtualization', '0048_populate_mac_addresses'), + ('dcim', '0216_poweroutlettemplate_color'), ] operations = [ - migrations.RunPython( - code=remove_indexes, - reverse_code=migrations.RunPython.noop, + # Create a case-insensitive collation + CreateCollation( + 'case_insensitive', + provider='icu', + locale='und-u-ks-level2', + deterministic=False, ), - migrations.RemoveConstraint( - model_name='device', - name='dcim_device_unique_name_site_tenant', - ), - migrations.RemoveConstraint( - model_name='device', - name='dcim_device_unique_name_site', - ), - migrations.AlterField( - model_name='consoleport', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='consoleporttemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='consoleserverport', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='consoleserverporttemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='device', - name='name', - field=models.CharField(blank=True, db_collation='ci_natural_sort', max_length=64, null=True), - ), - migrations.AlterField( - model_name='devicebay', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='devicebaytemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='devicerole', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='devicerole', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100), - ), - migrations.AlterField( - model_name='devicetype', - name='model', - field=models.CharField(db_collation='case_insensitive', max_length=100), - ), - migrations.AlterField( - model_name='devicetype', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100), - ), - migrations.AlterField( - model_name='frontport', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='frontporttemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='interface', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='interfacetemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='inventoryitem', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='inventoryitemrole', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='inventoryitemrole', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='inventoryitemtemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='location', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='location', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100), - ), - migrations.AlterField( - model_name='manufacturer', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='manufacturer', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='modulebay', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='modulebaytemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='moduletype', - name='model', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='moduletypeprofile', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='platform', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='platform', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100), - ), - migrations.AlterField( - model_name='powerfeed', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='poweroutlet', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='poweroutlettemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='powerpanel', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='powerport', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='powerporttemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='rack', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='rackrole', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='rackrole', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='racktype', - name='model', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='racktype', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='rearport', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='rearporttemplate', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AlterField( - model_name='region', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='region', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100), - ), - migrations.AlterField( - model_name='site', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='site', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), - ), - migrations.AlterField( - model_name='sitegroup', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=100), - ), - migrations.AlterField( - model_name='sitegroup', - name='slug', - field=models.SlugField(db_collation='case_insensitive', max_length=100), - ), - migrations.AlterField( - model_name='virtualdevicecontext', - name='name', - field=models.CharField(db_collation='ci_natural_sort', max_length=64), - ), - migrations.AddConstraint( - model_name='device', - constraint=models.UniqueConstraint( - models.F('name'), models.F('site'), models.F('tenant'), name='dcim_device_unique_name_site_tenant' - ), - ), - migrations.AddConstraint( - model_name='device', - constraint=models.UniqueConstraint( - models.F('name'), - models.F('site'), - condition=models.Q(('tenant__isnull', True)), - name='dcim_device_unique_name_site', - violation_error_message='Device name must be unique per site.', - ), + # Create a case-insensitive collation with natural sorting + CreateCollation( + 'ci_natural_sort', + provider='icu', + locale='und-u-kn-true-ks-level2', + deterministic=False, ), ] diff --git a/netbox/dcim/migrations/0218_ci_collations.py b/netbox/dcim/migrations/0218_ci_collations.py new file mode 100644 index 000000000..b24c6cc6d --- /dev/null +++ b/netbox/dcim/migrations/0218_ci_collations.py @@ -0,0 +1,311 @@ +from django.db import migrations, models + +PATTERN_OPS_INDEXES = [ + 'dcim_devicerole_slug_7952643b_like', + 'dcim_devicetype_slug_448745bd_like', + 'dcim_inventoryitemrole_name_4c8cfe6d_like', + 'dcim_inventoryitemrole_slug_3556c227_like', + 'dcim_location_slug_352c5472_like', + 'dcim_manufacturer_name_841fcd92_like', + 'dcim_manufacturer_slug_00430749_like', + 'dcim_moduletypeprofile_name_1709c36e_like', + 'dcim_platform_slug_b0908ae4_like', + 'dcim_rackrole_name_9077cfcc_like', + 'dcim_rackrole_slug_40bbcd3a_like', + 'dcim_racktype_slug_6bbb384a_like', + 'dcim_region_slug_ff078a66_like', + 'dcim_site_name_8fe66c76_like', + 'dcim_site_slug_4412c762_like', + 'dcim_sitegroup_slug_a11d2b04_like', +] + + +def remove_indexes(apps, schema_editor): + for idx in PATTERN_OPS_INDEXES: + schema_editor.execute(f'DROP INDEX IF EXISTS {idx}') + + +class Migration(migrations.Migration): + dependencies = [ + ('dcim', '0217_ci_collations'), + ('extras', '0134_ci_collations'), + ('ipam', '0083_ci_collations'), + ('tenancy', '0021_ci_collations'), + ('virtualization', '0048_populate_mac_addresses'), + ] + + operations = [ + migrations.RunPython( + code=remove_indexes, + reverse_code=migrations.RunPython.noop, + ), + migrations.RemoveConstraint( + model_name='device', + name='dcim_device_unique_name_site_tenant', + ), + migrations.RemoveConstraint( + model_name='device', + name='dcim_device_unique_name_site', + ), + migrations.AlterField( + model_name='consoleport', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='consoleporttemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='consoleserverport', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='consoleserverporttemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='device', + name='name', + field=models.CharField(blank=True, db_collation='ci_natural_sort', max_length=64, null=True), + ), + migrations.AlterField( + model_name='devicebay', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='devicebaytemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='devicerole', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='devicerole', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100), + ), + migrations.AlterField( + model_name='devicetype', + name='model', + field=models.CharField(db_collation='case_insensitive', max_length=100), + ), + migrations.AlterField( + model_name='devicetype', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100), + ), + migrations.AlterField( + model_name='frontport', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='frontporttemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='interface', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='interfacetemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='inventoryitem', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='inventoryitemrole', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='inventoryitemrole', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='inventoryitemtemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='location', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='location', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100), + ), + migrations.AlterField( + model_name='manufacturer', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='manufacturer', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='modulebay', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='modulebaytemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='moduletype', + name='model', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='moduletypeprofile', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='platform', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='platform', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100), + ), + migrations.AlterField( + model_name='powerfeed', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='poweroutlet', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='poweroutlettemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='powerpanel', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='powerport', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='powerporttemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='rack', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='rackrole', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='rackrole', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='racktype', + name='model', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='racktype', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='rearport', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='rearporttemplate', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='region', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='region', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100), + ), + migrations.AlterField( + model_name='site', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='site', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='sitegroup', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='sitegroup', + name='slug', + field=models.SlugField(db_collation='case_insensitive', max_length=100), + ), + migrations.AlterField( + model_name='virtualdevicecontext', + name='name', + field=models.CharField(db_collation='ci_natural_sort', max_length=64), + ), + migrations.AddConstraint( + model_name='device', + constraint=models.UniqueConstraint( + models.F('name'), models.F('site'), models.F('tenant'), name='dcim_device_unique_name_site_tenant' + ), + ), + migrations.AddConstraint( + model_name='device', + constraint=models.UniqueConstraint( + models.F('name'), + models.F('site'), + condition=models.Q(('tenant__isnull', True)), + name='dcim_device_unique_name_site', + violation_error_message='Device name must be unique per site.', + ), + ), + ] diff --git a/netbox/extras/migrations/0134_ci_collations.py b/netbox/extras/migrations/0134_ci_collations.py index f990ad25e..8da9545a1 100644 --- a/netbox/extras/migrations/0134_ci_collations.py +++ b/netbox/extras/migrations/0134_ci_collations.py @@ -26,7 +26,7 @@ def remove_indexes(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ ('extras', '0133_make_cf_minmax_decimal'), - ('dcim', '0216_ci_collations'), + ('dcim', '0217_ci_collations'), ] operations = [ diff --git a/netbox/ipam/migrations/0083_ci_collations.py b/netbox/ipam/migrations/0083_ci_collations.py index 0c2652c51..7bba15471 100644 --- a/netbox/ipam/migrations/0083_ci_collations.py +++ b/netbox/ipam/migrations/0083_ci_collations.py @@ -24,7 +24,7 @@ class Migration(migrations.Migration): dependencies = [ ('ipam', '0082_add_prefix_network_containment_indexes'), - ('dcim', '0216_ci_collations'), + ('dcim', '0217_ci_collations'), ] operations = [ diff --git a/netbox/tenancy/migrations/0021_ci_collations.py b/netbox/tenancy/migrations/0021_ci_collations.py index 11af28134..2378572a5 100644 --- a/netbox/tenancy/migrations/0021_ci_collations.py +++ b/netbox/tenancy/migrations/0021_ci_collations.py @@ -19,7 +19,7 @@ class Migration(migrations.Migration): dependencies = [ ('tenancy', '0020_remove_contactgroupmembership'), - ('dcim', '0216_ci_collations'), + ('dcim', '0217_ci_collations'), ] operations = [ diff --git a/netbox/vpn/migrations/0010_ci_collations.py b/netbox/vpn/migrations/0010_ci_collations.py index 3863abcdb..6772b6afc 100644 --- a/netbox/vpn/migrations/0010_ci_collations.py +++ b/netbox/vpn/migrations/0010_ci_collations.py @@ -22,7 +22,7 @@ def remove_indexes(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('dcim', '0216_ci_collations'), + ('dcim', '0217_ci_collations'), ('vpn', '0009_remove_redundant_indexes'), ] diff --git a/netbox/wireless/migrations/0016_ci_collations.py b/netbox/wireless/migrations/0016_ci_collations.py index a84034ab7..84e5e4ff3 100644 --- a/netbox/wireless/migrations/0016_ci_collations.py +++ b/netbox/wireless/migrations/0016_ci_collations.py @@ -14,7 +14,7 @@ def remove_indexes(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('dcim', '0216_ci_collations'), + ('dcim', '0217_ci_collations'), ('wireless', '0015_extend_wireless_link_abs_distance_upper_limit'), ]