Просмотр исходного кода

Merge pull request #6739 from netbox-community/6471-reset-migrations

Closes #6471: Squash database migrations up to v2.11.0
Jeremy Stretch 4 лет назад
Родитель
Сommit
7f121f7518
100 измененных файлов с 1697 добавлено и 3837 удалено
  1. 0 62
      netbox/circuits/migrations/0001_initial.py
  2. 107 0
      netbox/circuits/migrations/0001_squashed.py
  3. 0 41
      netbox/circuits/migrations/0002_auto_20160622_1821.py
  4. 129 0
      netbox/circuits/migrations/0002_squashed_0029.py
  5. 0 19
      netbox/circuits/migrations/0003_provider_32bit_asn_support.py
  6. 0 20
      netbox/circuits/migrations/0004_circuit_add_tenant.py
  7. 0 18
      netbox/circuits/migrations/0005_circuit_add_upstream_speed.py
  8. 0 97
      netbox/circuits/migrations/0006_terminations.py
  9. 0 18
      netbox/circuits/migrations/0007_circuit_add_description.py
  10. 0 19
      netbox/circuits/migrations/0008_circuittermination_interface_protect_on_delete.py
  11. 0 79
      netbox/circuits/migrations/0009_unicode_literals.py
  12. 0 18
      netbox/circuits/migrations/0010_circuit_status.py
  13. 0 25
      netbox/circuits/migrations/0011_tags.py
  14. 0 43
      netbox/circuits/migrations/0012_change_logging.py
  15. 0 89
      netbox/circuits/migrations/0013_cables.py
  16. 0 18
      netbox/circuits/migrations/0014_circuittermination_description.py
  17. 0 25
      netbox/circuits/migrations/0015_custom_tag_models.py
  18. 0 39
      netbox/circuits/migrations/0016_3569_circuit_fields.py
  19. 0 18
      netbox/circuits/migrations/0017_circuittype_description.py
  20. 0 28
      netbox/circuits/migrations/0018_standardize_description.py
  21. 0 18
      netbox/circuits/migrations/0019_nullbooleanfield_to_booleanfield.py
  22. 0 22
      netbox/circuits/migrations/0020_custom_field_data.py
  23. 0 49
      netbox/circuits/migrations/0021_cache_cable_peer.py
  24. 0 26
      netbox/circuits/migrations/0022_cablepath.py
  25. 0 18
      netbox/circuits/migrations/0023_circuittermination_port_speed_optional.py
  26. 0 38
      netbox/circuits/migrations/0024_standardize_name_length.py
  27. 0 47
      netbox/circuits/migrations/0025_standardize_models.py
  28. 0 16
      netbox/circuits/migrations/0026_mark_connected.py
  29. 0 65
      netbox/circuits/migrations/0027_providernetwork.py
  30. 0 37
      netbox/circuits/migrations/0028_cache_circuit_terminations.py
  31. 0 32
      netbox/circuits/migrations/0029_circuit_tracing.py
  32. 0 296
      netbox/dcim/migrations/0001_initial.py
  33. 663 0
      netbox/dcim/migrations/0001_squashed.py
  34. 0 112
      netbox/dcim/migrations/0002_auto_20160622_1821.py
  35. 313 0
      netbox/dcim/migrations/0002_squashed.py
  36. 0 23
      netbox/dcim/migrations/0003_auto_20160628_1721.py
  37. 485 0
      netbox/dcim/migrations/0003_squashed_0130.py
  38. 0 54
      netbox/dcim/migrations/0004_auto_20160701_2049.py
  39. 0 24
      netbox/dcim/migrations/0005_auto_20160706_1722.py
  40. 0 25
      netbox/dcim/migrations/0006_add_device_primary_ip4_ip6.py
  41. 0 39
      netbox/dcim/migrations/0007_device_copy_primary_ip.py
  42. 0 17
      netbox/dcim/migrations/0008_device_remove_primary_ip.py
  43. 0 19
      netbox/dcim/migrations/0009_site_32bit_asn_support.py
  44. 0 19
      netbox/dcim/migrations/0010_devicebay_installed_device_set_null.py
  45. 0 18
      netbox/dcim/migrations/0011_devicetype_part_number.py
  46. 0 30
      netbox/dcim/migrations/0012_site_rack_device_add_tenant.py
  47. 0 23
      netbox/dcim/migrations/0013_add_interface_form_factors.py
  48. 0 23
      netbox/dcim/migrations/0014_rack_add_type_width.py
  49. 0 19
      netbox/dcim/migrations/0015_rack_add_u_height_validator.py
  50. 0 19
      netbox/dcim/migrations/0016_module_add_manufacturer.py
  51. 0 31
      netbox/dcim/migrations/0017_rack_add_role.py
  52. 0 19
      netbox/dcim/migrations/0018_device_add_asset_tag.py
  53. 0 23
      netbox/dcim/migrations/0019_new_iface_form_factors.py
  54. 0 18
      netbox/dcim/migrations/0020_rack_desc_units.py
  55. 0 29
      netbox/dcim/migrations/0021_add_ff_flexstack.py
  56. 0 55
      netbox/dcim/migrations/0022_color_names_to_rgb.py
  57. 0 18
      netbox/dcim/migrations/0023_devicetype_comments.py
  58. 0 28
      netbox/dcim/migrations/0024_site_add_contact_fields.py
  59. 0 18
      netbox/dcim/migrations/0025_devicetype_add_interface_ordering.py
  60. 0 31
      netbox/dcim/migrations/0026_add_rack_reservations.py
  61. 0 19
      netbox/dcim/migrations/0027_device_add_site.py
  62. 0 21
      netbox/dcim/migrations/0028_device_copy_rack_to_site.py
  63. 0 24
      netbox/dcim/migrations/0029_allow_rackless_devices.py
  64. 0 29
      netbox/dcim/migrations/0030_interface_add_lag.py
  65. 0 36
      netbox/dcim/migrations/0031_regions.py
  66. 0 19
      netbox/dcim/migrations/0032_device_increase_name_length.py
  67. 0 19
      netbox/dcim/migrations/0033_rackreservation_rack_editable.py
  68. 0 33
      netbox/dcim/migrations/0034_rename_module_to_inventoryitem.py
  69. 0 25
      netbox/dcim/migrations/0035_device_expand_status_choices.py
  70. 0 23
      netbox/dcim/migrations/0036_add_ff_juniper_vcp.py
  71. 0 207
      netbox/dcim/migrations/0037_unicode_literals.py
  72. 0 23
      netbox/dcim/migrations/0038_wireless_interfaces.py
  73. 0 23
      netbox/dcim/migrations/0039_interface_add_enabled_mtu.py
  74. 0 24
      netbox/dcim/migrations/0040_inventoryitem_add_asset_tag_description.py
  75. 0 38
      netbox/dcim/migrations/0041_napalm_integration.py
  76. 0 23
      netbox/dcim/migrations/0042_interface_ff_10ge_cx4.py
  77. 0 68
      netbox/dcim/migrations/0043_device_component_name_lengths.py
  78. 0 30
      netbox/dcim/migrations/0044_virtualization.py
  79. 0 18
      netbox/dcim/migrations/0045_devicerole_vm_role.py
  80. 0 19
      netbox/dcim/migrations/0046_rack_lengthen_facility_id.py
  81. 0 23
      netbox/dcim/migrations/0047_more_100ge_form_factors.py
  82. 0 18
      netbox/dcim/migrations/0048_rack_serial.py
  83. 0 20
      netbox/dcim/migrations/0049_rackreservation_change_user.py
  84. 0 30
      netbox/dcim/migrations/0050_interface_vlan_tagging.py
  85. 0 20
      netbox/dcim/migrations/0051_rackreservation_tenant.py
  86. 0 42
      netbox/dcim/migrations/0052_virtual_chassis.py
  87. 0 24
      netbox/dcim/migrations/0053_platform_manufacturer.py
  88. 0 29
      netbox/dcim/migrations/0054_site_status_timezone_description.py
  89. 0 23
      netbox/dcim/migrations/0055_virtualchassis_ordering.py
  90. 0 24
      netbox/dcim/migrations/0056_django2.py
  91. 0 75
      netbox/dcim/migrations/0057_tags.py
  92. 0 21
      netbox/dcim/migrations/0058_relax_rack_naming_constraints.py
  93. 0 23
      netbox/dcim/migrations/0059_site_latitude_longitude.py
  94. 0 133
      netbox/dcim/migrations/0060_change_logging.py
  95. 0 19
      netbox/dcim/migrations/0061_platform_napalm_args.py
  96. 0 29
      netbox/dcim/migrations/0062_interface_mtu.py
  97. 0 19
      netbox/dcim/migrations/0063_device_local_context_data.py
  98. 0 17
      netbox/dcim/migrations/0064_remove_platform_rpc_client.py
  99. 0 131
      netbox/dcim/migrations/0065_front_rear_ports.py
  100. 0 322
      netbox/dcim/migrations/0066_cables.py

+ 0 - 62
netbox/circuits/migrations/0001_initial.py

@@ -1,62 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-06-22 18:21
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    initial = True
-
-    dependencies = [
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='Circuit',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateField(auto_now_add=True)),
-                ('last_updated', models.DateTimeField(auto_now=True)),
-                ('cid', models.CharField(max_length=50, verbose_name=b'Circuit ID')),
-                ('install_date', models.DateField(blank=True, null=True, verbose_name=b'Date installed')),
-                ('port_speed', models.PositiveIntegerField(verbose_name=b'Port speed (Kbps)')),
-                ('commit_rate', models.PositiveIntegerField(blank=True, null=True, verbose_name=b'Commit rate (Kbps)')),
-                ('xconnect_id', models.CharField(blank=True, max_length=50, verbose_name=b'Cross-connect ID')),
-                ('pp_info', models.CharField(blank=True, max_length=100, verbose_name=b'Patch panel/port(s)')),
-                ('comments', models.TextField(blank=True)),
-            ],
-            options={
-                'ordering': ['provider', 'cid'],
-            },
-        ),
-        migrations.CreateModel(
-            name='CircuitType',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50, unique=True)),
-                ('slug', models.SlugField(unique=True)),
-            ],
-            options={
-                'ordering': ['name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='Provider',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateField(auto_now_add=True)),
-                ('last_updated', models.DateTimeField(auto_now=True)),
-                ('name', models.CharField(max_length=50, unique=True)),
-                ('slug', models.SlugField(unique=True)),
-                ('asn', models.PositiveIntegerField(blank=True, null=True, verbose_name=b'ASN')),
-                ('account', models.CharField(blank=True, max_length=30, verbose_name=b'Account number')),
-                ('portal_url', models.URLField(blank=True, verbose_name=b'Portal')),
-                ('noc_contact', models.TextField(blank=True, verbose_name=b'NOC contact')),
-                ('admin_contact', models.TextField(blank=True, verbose_name=b'Admin contact')),
-                ('comments', models.TextField(blank=True)),
-            ],
-            options={
-                'ordering': ['name'],
-            },
-        ),
-    ]

+ 107 - 0
netbox/circuits/migrations/0001_squashed.py

@@ -0,0 +1,107 @@
+import dcim.fields
+import django.core.serializers.json
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+    ]
+
+    replaces = [
+        ('circuits', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Circuit',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('cid', models.CharField(max_length=100)),
+                ('status', models.CharField(default='active', max_length=50)),
+                ('install_date', models.DateField(blank=True, null=True)),
+                ('commit_rate', models.PositiveIntegerField(blank=True, null=True)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('comments', models.TextField(blank=True)),
+            ],
+            options={
+                'ordering': ['provider', 'cid'],
+            },
+        ),
+        migrations.CreateModel(
+            name='CircuitTermination',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('term_side', models.CharField(max_length=1)),
+                ('port_speed', models.PositiveIntegerField(blank=True, null=True)),
+                ('upstream_speed', models.PositiveIntegerField(blank=True, null=True)),
+                ('xconnect_id', models.CharField(blank=True, max_length=50)),
+                ('pp_info', models.CharField(blank=True, max_length=100)),
+                ('description', models.CharField(blank=True, max_length=200)),
+            ],
+            options={
+                'ordering': ['circuit', 'term_side'],
+            },
+        ),
+        migrations.CreateModel(
+            name='CircuitType',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('description', models.CharField(blank=True, max_length=200)),
+            ],
+            options={
+                'ordering': ['name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='Provider',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('asn', dcim.fields.ASNField(blank=True, null=True)),
+                ('account', models.CharField(blank=True, max_length=30)),
+                ('portal_url', models.URLField(blank=True)),
+                ('noc_contact', models.TextField(blank=True)),
+                ('admin_contact', models.TextField(blank=True)),
+                ('comments', models.TextField(blank=True)),
+            ],
+            options={
+                'ordering': ['name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='ProviderNetwork',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('comments', models.TextField(blank=True)),
+                ('provider', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='networks', to='circuits.provider')),
+            ],
+            options={
+                'ordering': ('provider', 'name'),
+            },
+        ),
+    ]

+ 0 - 41
netbox/circuits/migrations/0002_auto_20160622_1821.py

@@ -1,41 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-06-22 18:21
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    initial = True
-
-    dependencies = [
-        ('dcim', '0001_initial'),
-        ('circuits', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuit',
-            name='interface',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='circuit', to='dcim.Interface'),
-        ),
-        migrations.AddField(
-            model_name='circuit',
-            name='provider',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='circuits.Provider'),
-        ),
-        migrations.AddField(
-            model_name='circuit',
-            name='site',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='dcim.Site'),
-        ),
-        migrations.AddField(
-            model_name='circuit',
-            name='type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='circuits.CircuitType'),
-        ),
-        migrations.AlterUniqueTogether(
-            name='circuit',
-            unique_together=set([('provider', 'cid')]),
-        ),
-    ]

+ 129 - 0
netbox/circuits/migrations/0002_squashed_0029.py

@@ -0,0 +1,129 @@
+from django.db import migrations, models
+import django.db.models.deletion
+import taggit.managers
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0001_initial'),
+        ('contenttypes', '0002_remove_content_type_name'),
+        ('circuits', '0001_initial'),
+        ('extras', '0001_initial'),
+        ('tenancy', '0001_initial'),
+    ]
+
+    replaces = [
+        ('circuits', '0002_auto_20160622_1821'),
+        ('circuits', '0003_provider_32bit_asn_support'),
+        ('circuits', '0004_circuit_add_tenant'),
+        ('circuits', '0005_circuit_add_upstream_speed'),
+        ('circuits', '0006_terminations'),
+        ('circuits', '0007_circuit_add_description'),
+        ('circuits', '0008_circuittermination_interface_protect_on_delete'),
+        ('circuits', '0009_unicode_literals'),
+        ('circuits', '0010_circuit_status'),
+        ('circuits', '0011_tags'),
+        ('circuits', '0012_change_logging'),
+        ('circuits', '0013_cables'),
+        ('circuits', '0014_circuittermination_description'),
+        ('circuits', '0015_custom_tag_models'),
+        ('circuits', '0016_3569_circuit_fields'),
+        ('circuits', '0017_circuittype_description'),
+        ('circuits', '0018_standardize_description'),
+        ('circuits', '0019_nullbooleanfield_to_booleanfield'),
+        ('circuits', '0020_custom_field_data'),
+        ('circuits', '0021_cache_cable_peer'),
+        ('circuits', '0022_cablepath'),
+        ('circuits', '0023_circuittermination_port_speed_optional'),
+        ('circuits', '0024_standardize_name_length'),
+        ('circuits', '0025_standardize_models'),
+        ('circuits', '0026_mark_connected'),
+        ('circuits', '0027_providernetwork'),
+        ('circuits', '0028_cache_circuit_terminations'),
+        ('circuits', '0029_circuit_tracing'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='providernetwork',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='provider',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='circuittermination',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='circuittermination',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='circuittermination',
+            name='circuit',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='terminations', to='circuits.circuit'),
+        ),
+        migrations.AddField(
+            model_name='circuittermination',
+            name='provider_network',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='circuit_terminations', to='circuits.providernetwork'),
+        ),
+        migrations.AddField(
+            model_name='circuittermination',
+            name='site',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='circuit_terminations', to='dcim.site'),
+        ),
+        migrations.AddField(
+            model_name='circuit',
+            name='provider',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='circuits.provider'),
+        ),
+        migrations.AddField(
+            model_name='circuit',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='circuit',
+            name='tenant',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='tenancy.tenant'),
+        ),
+        migrations.AddField(
+            model_name='circuit',
+            name='termination_a',
+            field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='circuits.circuittermination'),
+        ),
+        migrations.AddField(
+            model_name='circuit',
+            name='termination_z',
+            field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='circuits.circuittermination'),
+        ),
+        migrations.AddField(
+            model_name='circuit',
+            name='type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='circuits.circuittype'),
+        ),
+        migrations.AddConstraint(
+            model_name='providernetwork',
+            constraint=models.UniqueConstraint(fields=('provider', 'name'), name='circuits_providernetwork_provider_name'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='providernetwork',
+            unique_together={('provider', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='circuittermination',
+            unique_together={('circuit', 'term_side')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='circuit',
+            unique_together={('provider', 'cid')},
+        ),
+    ]

+ 0 - 19
netbox/circuits/migrations/0003_provider_32bit_asn_support.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-07-13 19:24
-import dcim.fields
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0002_auto_20160622_1821'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='provider',
-            name='asn',
-            field=dcim.fields.ASNField(blank=True, null=True, verbose_name=b'ASN'),
-        ),
-    ]

+ 0 - 20
netbox/circuits/migrations/0004_circuit_add_tenant.py

@@ -1,20 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-07-26 21:59
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('tenancy', '0001_initial'),
-        ('circuits', '0003_provider_32bit_asn_support'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuit',
-            name='tenant',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='circuits', to='tenancy.Tenant'),
-        ),
-    ]

+ 0 - 18
netbox/circuits/migrations/0005_circuit_add_upstream_speed.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-08-08 20:24
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0004_circuit_add_tenant'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuit',
-            name='upstream_speed',
-            field=models.PositiveIntegerField(blank=True, help_text=b'Upstream speed, if different from port speed', null=True, verbose_name=b'Upstream speed (Kbps)'),
-        ),
-    ]

+ 0 - 97
netbox/circuits/migrations/0006_terminations.py

@@ -1,97 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-12-13 16:30
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-def circuits_to_terms(apps, schema_editor):
-    Circuit = apps.get_model('circuits', 'Circuit')
-    CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
-    for c in Circuit.objects.all():
-        CircuitTermination(
-            circuit=c,
-            term_side=b'A',
-            site=c.site,
-            interface=c.interface,
-            port_speed=c.port_speed,
-            upstream_speed=c.upstream_speed,
-            xconnect_id=c.xconnect_id,
-            pp_info=c.pp_info,
-        ).save()
-
-
-def terms_to_circuits(apps, schema_editor):
-    CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
-    for ct in CircuitTermination.objects.filter(term_side='A'):
-        c = ct.circuit
-        c.site = ct.site
-        c.interface = ct.interface
-        c.port_speed = ct.port_speed
-        c.upstream_speed = ct.upstream_speed
-        c.xconnect_id = ct.xconnect_id
-        c.pp_info = ct.pp_info
-        c.save()
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0022_color_names_to_rgb'),
-        ('circuits', '0005_circuit_add_upstream_speed'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='CircuitTermination',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('term_side', models.CharField(choices=[(b'A', b'A'), (b'Z', b'Z')], max_length=1,
-                                               verbose_name='Termination')),
-                ('port_speed', models.PositiveIntegerField(verbose_name=b'Port speed (Kbps)')),
-                ('upstream_speed',
-                 models.PositiveIntegerField(blank=True, help_text=b'Upstream speed, if different from port speed',
-                                             null=True, verbose_name=b'Upstream speed (Kbps)')),
-                ('xconnect_id', models.CharField(blank=True, max_length=50, verbose_name=b'Cross-connect ID')),
-                ('pp_info', models.CharField(blank=True, max_length=100, verbose_name=b'Patch panel/port(s)')),
-                ('circuit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='terminations',
-                                              to='circuits.Circuit')),
-                ('interface', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
-                                                   related_name='circuit_termination', to='dcim.Interface')),
-                ('site',
-                 models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='circuit_terminations',
-                                   to='dcim.Site')),
-            ],
-            options={
-                'ordering': ['circuit', 'term_side'],
-            },
-        ),
-        migrations.AlterUniqueTogether(
-            name='circuittermination',
-            unique_together=set([('circuit', 'term_side')]),
-        ),
-        migrations.RunPython(circuits_to_terms, terms_to_circuits),
-        migrations.RemoveField(
-            model_name='circuit',
-            name='interface',
-        ),
-        migrations.RemoveField(
-            model_name='circuit',
-            name='port_speed',
-        ),
-        migrations.RemoveField(
-            model_name='circuit',
-            name='pp_info',
-        ),
-        migrations.RemoveField(
-            model_name='circuit',
-            name='site',
-        ),
-        migrations.RemoveField(
-            model_name='circuit',
-            name='upstream_speed',
-        ),
-        migrations.RemoveField(
-            model_name='circuit',
-            name='xconnect_id',
-        ),
-    ]

+ 0 - 18
netbox/circuits/migrations/0007_circuit_add_description.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-01-17 20:08
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0006_terminations'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuit',
-            name='description',
-            field=models.CharField(blank=True, max_length=100),
-        ),
-    ]

+ 0 - 19
netbox/circuits/migrations/0008_circuittermination_interface_protect_on_delete.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11 on 2017-04-19 17:17
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0007_circuit_add_description'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='interface',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='circuit_termination', to='dcim.Interface'),
-        ),
-    ]

+ 0 - 79
netbox/circuits/migrations/0009_unicode_literals.py

@@ -1,79 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11 on 2017-05-24 15:34
-import dcim.fields
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0008_circuittermination_interface_protect_on_delete'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='circuit',
-            name='cid',
-            field=models.CharField(max_length=50, verbose_name='Circuit ID'),
-        ),
-        migrations.AlterField(
-            model_name='circuit',
-            name='commit_rate',
-            field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Commit rate (Kbps)'),
-        ),
-        migrations.AlterField(
-            model_name='circuit',
-            name='install_date',
-            field=models.DateField(blank=True, null=True, verbose_name='Date installed'),
-        ),
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='port_speed',
-            field=models.PositiveIntegerField(verbose_name='Port speed (Kbps)'),
-        ),
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='pp_info',
-            field=models.CharField(blank=True, max_length=100, verbose_name='Patch panel/port(s)'),
-        ),
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='term_side',
-            field=models.CharField(choices=[('A', 'A'), ('Z', 'Z')], max_length=1, verbose_name='Termination'),
-        ),
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='upstream_speed',
-            field=models.PositiveIntegerField(blank=True, help_text='Upstream speed, if different from port speed', null=True, verbose_name='Upstream speed (Kbps)'),
-        ),
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='xconnect_id',
-            field=models.CharField(blank=True, max_length=50, verbose_name='Cross-connect ID'),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='account',
-            field=models.CharField(blank=True, max_length=30, verbose_name='Account number'),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='admin_contact',
-            field=models.TextField(blank=True, verbose_name='Admin contact'),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='asn',
-            field=dcim.fields.ASNField(blank=True, null=True, verbose_name='ASN'),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='noc_contact',
-            field=models.TextField(blank=True, verbose_name='NOC contact'),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='portal_url',
-            field=models.URLField(blank=True, verbose_name='Portal'),
-        ),
-    ]

+ 0 - 18
netbox/circuits/migrations/0010_circuit_status.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.9 on 2018-02-06 18:48
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0009_unicode_literals'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuit',
-            name='status',
-            field=models.PositiveSmallIntegerField(choices=[[2, 'Planned'], [3, 'Provisioning'], [1, 'Active'], [4, 'Offline'], [0, 'Deprovisioning'], [5, 'Decommissioned']], default=1),
-        ),
-    ]

+ 0 - 25
netbox/circuits/migrations/0011_tags.py

@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.12 on 2018-05-22 19:04
-from django.db import migrations
-import taggit.managers
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('taggit', '0002_auto_20150616_2121'),
-        ('circuits', '0010_circuit_status'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuit',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='provider',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-    ]

+ 0 - 43
netbox/circuits/migrations/0012_change_logging.py

@@ -1,43 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.12 on 2018-06-13 17:14
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0011_tags'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuittype',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='circuittype',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='circuit',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='circuit',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-    ]

+ 0 - 89
netbox/circuits/migrations/0013_cables.py

@@ -1,89 +0,0 @@
-import sys
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-CONNECTION_STATUS_CONNECTED = True
-
-
-def circuit_terminations_to_cables(apps, schema_editor):
-    """
-    Copy all existing CircuitTermination Interface associations as Cables
-    """
-    ContentType = apps.get_model('contenttypes', 'ContentType')
-    CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
-    Interface = apps.get_model('dcim', 'Interface')
-    Cable = apps.get_model('dcim', 'Cable')
-
-    # Load content types
-    circuittermination_type = ContentType.objects.get_for_model(CircuitTermination)
-    interface_type = ContentType.objects.get_for_model(Interface)
-
-    # Create a new Cable instance from each console connection
-    if 'test' not in sys.argv:
-        print("\n    Adding circuit terminations... ", end='', flush=True)
-    for circuittermination in CircuitTermination.objects.filter(interface__isnull=False):
-
-        # Create the new Cable
-        cable = Cable.objects.create(
-            termination_a_type=circuittermination_type,
-            termination_a_id=circuittermination.id,
-            termination_b_type=interface_type,
-            termination_b_id=circuittermination.interface_id,
-            status=CONNECTION_STATUS_CONNECTED
-        )
-
-        # Cache the Cable on its two termination points
-        CircuitTermination.objects.filter(pk=circuittermination.pk).update(
-            cable=cable,
-            connected_endpoint=circuittermination.interface,
-            connection_status=CONNECTION_STATUS_CONNECTED
-        )
-        # Cache the connected Cable on the Interface
-        Interface.objects.filter(pk=circuittermination.interface_id).update(
-            cable=cable,
-            _connected_circuittermination=circuittermination,
-            connection_status=CONNECTION_STATUS_CONNECTED
-        )
-
-    cable_count = Cable.objects.filter(termination_a_type=circuittermination_type).count()
-    if 'test' not in sys.argv:
-        print("{} cables created".format(cable_count))
-
-
-class Migration(migrations.Migration):
-    atomic = False
-
-    dependencies = [
-        ('circuits', '0012_change_logging'),
-        ('dcim', '0066_cables'),
-    ]
-
-    operations = [
-
-        # Add new CircuitTermination fields
-        migrations.AddField(
-            model_name='circuittermination',
-            name='connected_endpoint',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Interface'),
-        ),
-        migrations.AddField(
-            model_name='circuittermination',
-            name='connection_status',
-            field=models.NullBooleanField(),
-        ),
-        migrations.AddField(
-            model_name='circuittermination',
-            name='cable',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
-        ),
-
-        # Copy CircuitTermination connections to Interfaces as Cables
-        migrations.RunPython(circuit_terminations_to_cables),
-
-        # Remove interface field from CircuitTermination
-        migrations.RemoveField(
-            model_name='circuittermination',
-            name='interface',
-        ),
-    ]

+ 0 - 18
netbox/circuits/migrations/0014_circuittermination_description.py

@@ -1,18 +0,0 @@
-# Generated by Django 2.1.3 on 2018-11-05 18:38
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0013_cables'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuittermination',
-            name='description',
-            field=models.CharField(blank=True, max_length=100),
-        ),
-    ]

+ 0 - 25
netbox/circuits/migrations/0015_custom_tag_models.py

@@ -1,25 +0,0 @@
-# Generated by Django 2.1.4 on 2019-02-20 06:56
-
-from django.db import migrations
-import taggit.managers
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0014_circuittermination_description'),
-        ('extras', '0019_tag_taggeditem'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='circuit',
-            name='tags',
-            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='tags',
-            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
-        ),
-    ]

+ 0 - 39
netbox/circuits/migrations/0016_3569_circuit_fields.py

@@ -1,39 +0,0 @@
-from django.db import migrations, models
-
-
-CIRCUIT_STATUS_CHOICES = (
-    (0, 'deprovisioning'),
-    (1, 'active'),
-    (2, 'planned'),
-    (3, 'provisioning'),
-    (4, 'offline'),
-    (5, 'decommissioned')
-)
-
-
-def circuit_status_to_slug(apps, schema_editor):
-    Circuit = apps.get_model('circuits', 'Circuit')
-    for id, slug in CIRCUIT_STATUS_CHOICES:
-        Circuit.objects.filter(status=str(id)).update(status=slug)
-
-
-class Migration(migrations.Migration):
-    atomic = False
-
-    dependencies = [
-        ('circuits', '0015_custom_tag_models'),
-    ]
-
-    operations = [
-
-        # Circuit.status
-        migrations.AlterField(
-            model_name='circuit',
-            name='status',
-            field=models.CharField(default='active', max_length=50),
-        ),
-        migrations.RunPython(
-            code=circuit_status_to_slug
-        ),
-
-    ]

+ 0 - 18
netbox/circuits/migrations/0017_circuittype_description.py

@@ -1,18 +0,0 @@
-# Generated by Django 2.2.6 on 2019-12-10 18:19
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0016_3569_circuit_fields'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuittype',
-            name='description',
-            field=models.CharField(blank=True, max_length=100),
-        ),
-    ]

+ 0 - 28
netbox/circuits/migrations/0018_standardize_description.py

@@ -1,28 +0,0 @@
-# Generated by Django 3.0.3 on 2020-03-13 20:27
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0017_circuittype_description'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='circuit',
-            name='description',
-            field=models.CharField(blank=True, max_length=200),
-        ),
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='description',
-            field=models.CharField(blank=True, max_length=200),
-        ),
-        migrations.AlterField(
-            model_name='circuittype',
-            name='description',
-            field=models.CharField(blank=True, max_length=200),
-        ),
-    ]

+ 0 - 18
netbox/circuits/migrations/0019_nullbooleanfield_to_booleanfield.py

@@ -1,18 +0,0 @@
-# Generated by Django 3.1b1 on 2020-07-16 15:55
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0018_standardize_description'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='connection_status',
-            field=models.BooleanField(blank=True, null=True),
-        ),
-    ]

+ 0 - 22
netbox/circuits/migrations/0020_custom_field_data.py

@@ -1,22 +0,0 @@
-import django.core.serializers.json
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0019_nullbooleanfield_to_booleanfield'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuit',
-            name='custom_field_data',
-            field=models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder),
-        ),
-        migrations.AddField(
-            model_name='provider',
-            name='custom_field_data',
-            field=models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder),
-        ),
-    ]

+ 0 - 49
netbox/circuits/migrations/0021_cache_cable_peer.py

@@ -1,49 +0,0 @@
-import sys
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-def cache_cable_peers(apps, schema_editor):
-    ContentType = apps.get_model('contenttypes', 'ContentType')
-    Cable = apps.get_model('dcim', 'Cable')
-    CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
-
-    if 'test' not in sys.argv:
-        print(f"\n    Updating circuit termination cable peers...", flush=True)
-    ct = ContentType.objects.get_for_model(CircuitTermination)
-    for cable in Cable.objects.filter(termination_a_type=ct):
-        CircuitTermination.objects.filter(pk=cable.termination_a_id).update(
-            _cable_peer_type_id=cable.termination_b_type_id,
-            _cable_peer_id=cable.termination_b_id
-        )
-    for cable in Cable.objects.filter(termination_b_type=ct):
-        CircuitTermination.objects.filter(pk=cable.termination_b_id).update(
-            _cable_peer_type_id=cable.termination_a_type_id,
-            _cable_peer_id=cable.termination_a_id
-        )
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('contenttypes', '0002_remove_content_type_name'),
-        ('circuits', '0020_custom_field_data'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuittermination',
-            name='_cable_peer_id',
-            field=models.PositiveIntegerField(blank=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='circuittermination',
-            name='_cable_peer_type',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
-        ),
-        migrations.RunPython(
-            code=cache_cable_peers,
-            reverse_code=migrations.RunPython.noop
-        ),
-    ]

+ 0 - 26
netbox/circuits/migrations/0022_cablepath.py

@@ -1,26 +0,0 @@
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0121_cablepath'),
-        ('circuits', '0021_cache_cable_peer'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuittermination',
-            name='_path',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dcim.cablepath'),
-        ),
-        migrations.RemoveField(
-            model_name='circuittermination',
-            name='connected_endpoint',
-        ),
-        migrations.RemoveField(
-            model_name='circuittermination',
-            name='connection_status',
-        ),
-    ]

+ 0 - 18
netbox/circuits/migrations/0023_circuittermination_port_speed_optional.py

@@ -1,18 +0,0 @@
-# Generated by Django 3.1 on 2020-10-09 17:54
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0022_cablepath'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='port_speed',
-            field=models.PositiveIntegerField(blank=True, null=True),
-        ),
-    ]

+ 0 - 38
netbox/circuits/migrations/0024_standardize_name_length.py

@@ -1,38 +0,0 @@
-# Generated by Django 3.1 on 2020-10-15 19:33
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0023_circuittermination_port_speed_optional'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='circuit',
-            name='cid',
-            field=models.CharField(max_length=100),
-        ),
-        migrations.AlterField(
-            model_name='circuittype',
-            name='name',
-            field=models.CharField(max_length=100, unique=True),
-        ),
-        migrations.AlterField(
-            model_name='circuittype',
-            name='slug',
-            field=models.SlugField(max_length=100, unique=True),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='name',
-            field=models.CharField(max_length=100, unique=True),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='slug',
-            field=models.SlugField(max_length=100, unique=True),
-        ),
-    ]

+ 0 - 47
netbox/circuits/migrations/0025_standardize_models.py

@@ -1,47 +0,0 @@
-import django.core.serializers.json
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0024_standardize_name_length'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuittype',
-            name='custom_field_data',
-            field=models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder),
-        ),
-        migrations.AlterField(
-            model_name='circuit',
-            name='id',
-            field=models.BigAutoField(primary_key=True, serialize=False),
-        ),
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='id',
-            field=models.BigAutoField(primary_key=True, serialize=False),
-        ),
-        migrations.AlterField(
-            model_name='circuittype',
-            name='id',
-            field=models.BigAutoField(primary_key=True, serialize=False),
-        ),
-        migrations.AlterField(
-            model_name='provider',
-            name='id',
-            field=models.BigAutoField(primary_key=True, serialize=False),
-        ),
-        migrations.AddField(
-            model_name='circuittermination',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='circuittermination',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-    ]

+ 0 - 16
netbox/circuits/migrations/0026_mark_connected.py

@@ -1,16 +0,0 @@
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0025_standardize_models'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='circuittermination',
-            name='mark_connected',
-            field=models.BooleanField(default=False),
-        ),
-    ]

+ 0 - 65
netbox/circuits/migrations/0027_providernetwork.py

@@ -1,65 +0,0 @@
-import django.core.serializers.json
-from django.db import migrations, models
-import django.db.models.deletion
-import taggit.managers
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('extras', '0058_journalentry'),
-        ('circuits', '0026_mark_connected'),
-    ]
-
-    operations = [
-        # Create the new ProviderNetwork model
-        migrations.CreateModel(
-            name='ProviderNetwork',
-            fields=[
-                ('created', models.DateField(auto_now_add=True, null=True)),
-                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
-                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
-                ('id', models.BigAutoField(primary_key=True, serialize=False)),
-                ('name', models.CharField(max_length=100)),
-                ('description', models.CharField(blank=True, max_length=200)),
-                ('comments', models.TextField(blank=True)),
-                ('provider', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='networks', to='circuits.provider')),
-                ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')),
-            ],
-            options={
-                'ordering': ('provider', 'name'),
-            },
-        ),
-        migrations.AddConstraint(
-            model_name='providernetwork',
-            constraint=models.UniqueConstraint(fields=('provider', 'name'), name='circuits_providernetwork_provider_name'),
-        ),
-        migrations.AlterUniqueTogether(
-            name='providernetwork',
-            unique_together={('provider', 'name')},
-        ),
-
-        # Add ProviderNetwork FK to CircuitTermination
-        migrations.AddField(
-            model_name='circuittermination',
-            name='provider_network',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='circuit_terminations', to='circuits.providernetwork'),
-        ),
-        migrations.AlterField(
-            model_name='circuittermination',
-            name='site',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='circuit_terminations', to='dcim.site'),
-        ),
-
-        # Add FKs to CircuitTermination on Circuit
-        migrations.AddField(
-            model_name='circuit',
-            name='termination_a',
-            field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='circuits.circuittermination'),
-        ),
-        migrations.AddField(
-            model_name='circuit',
-            name='termination_z',
-            field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='circuits.circuittermination'),
-        ),
-    ]

+ 0 - 37
netbox/circuits/migrations/0028_cache_circuit_terminations.py

@@ -1,37 +0,0 @@
-import sys
-
-from django.db import migrations
-
-
-def cache_circuit_terminations(apps, schema_editor):
-    Circuit = apps.get_model('circuits', 'Circuit')
-    CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
-
-    if 'test' not in sys.argv:
-        print(f"\n    Caching circuit terminations...", flush=True)
-
-    a_terminations = {
-        ct.circuit_id: ct.pk for ct in CircuitTermination.objects.filter(term_side='A')
-    }
-    z_terminations = {
-        ct.circuit_id: ct.pk for ct in CircuitTermination.objects.filter(term_side='Z')
-    }
-    for circuit in Circuit.objects.all():
-        Circuit.objects.filter(pk=circuit.pk).update(
-            termination_a_id=a_terminations.get(circuit.pk),
-            termination_z_id=z_terminations.get(circuit.pk),
-        )
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0027_providernetwork'),
-    ]
-
-    operations = [
-        migrations.RunPython(
-            code=cache_circuit_terminations,
-            reverse_code=migrations.RunPython.noop
-        ),
-    ]

+ 0 - 32
netbox/circuits/migrations/0029_circuit_tracing.py

@@ -1,32 +0,0 @@
-from django.db import migrations
-from django.db.models import Q
-
-
-def delete_obsolete_cablepaths(apps, schema_editor):
-    """
-    Delete all CablePath instances which originate or terminate at a CircuitTermination.
-    """
-    ContentType = apps.get_model('contenttypes', 'ContentType')
-    CircuitTermination = apps.get_model('circuits', 'CircuitTermination')
-    CablePath = apps.get_model('dcim', 'CablePath')
-
-    ct = ContentType.objects.get_for_model(CircuitTermination)
-    CablePath.objects.filter(Q(origin_type=ct) | Q(destination_type=ct)).delete()
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('circuits', '0028_cache_circuit_terminations'),
-    ]
-
-    operations = [
-        migrations.RemoveField(
-            model_name='circuittermination',
-            name='_path',
-        ),
-        migrations.RunPython(
-            code=delete_obsolete_cablepaths,
-            reverse_code=migrations.RunPython.noop
-        ),
-    ]

+ 0 - 296
netbox/dcim/migrations/0001_initial.py

@@ -1,296 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-06-22 18:21
-import django.core.validators
-from django.db import migrations, models
-import django.db.models.deletion
-import utilities.fields
-
-
-class Migration(migrations.Migration):
-
-    initial = True
-
-    dependencies = [
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='ConsolePort',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-                ('connection_status', models.NullBooleanField(choices=[[False, b'Planned'], [True, b'Connected']], default=True)),
-            ],
-            options={
-                'ordering': ['device', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='ConsolePortTemplate',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-            ],
-            options={
-                'ordering': ['device_type', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='ConsoleServerPort',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-            ],
-        ),
-        migrations.CreateModel(
-            name='ConsoleServerPortTemplate',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-            ],
-            options={
-                'ordering': ['device_type', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='Device',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateField(auto_now_add=True)),
-                ('last_updated', models.DateTimeField(auto_now=True)),
-                ('name', utilities.fields.NullableCharField(blank=True, max_length=50, null=True, unique=True)),
-                ('serial', models.CharField(blank=True, max_length=50, verbose_name=b'Serial number')),
-                ('position', models.PositiveSmallIntegerField(blank=True, help_text=b'Number of the lowest U position occupied by the device', null=True, validators=[django.core.validators.MinValueValidator(1)], verbose_name=b'Position (U)')),
-                ('face', models.PositiveSmallIntegerField(blank=True, choices=[[0, b'Front'], [1, b'Rear']], null=True, verbose_name=b'Rack face')),
-                ('status', models.BooleanField(choices=[[True, b'Active'], [False, b'Offline']], default=True, verbose_name=b'Status')),
-                ('comments', models.TextField(blank=True)),
-            ],
-            options={
-                'ordering': ['name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='DeviceRole',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50, unique=True)),
-                ('slug', models.SlugField(unique=True)),
-                ('color', models.CharField(choices=[[b'teal', b'Teal'], [b'green', b'Green'], [b'blue', b'Blue'], [b'purple', b'Purple'], [b'yellow', b'Yellow'], [b'orange', b'Orange'], [b'red', b'Red'], [b'light_gray', b'Light Gray'], [b'medium_gray', b'Medium Gray'], [b'dark_gray', b'Dark Gray']], max_length=30)),
-            ],
-            options={
-                'ordering': ['name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='DeviceType',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('model', models.CharField(max_length=50)),
-                ('slug', models.SlugField()),
-                ('u_height', models.PositiveSmallIntegerField(default=1, verbose_name=b'Height (U)')),
-                ('is_full_depth', models.BooleanField(default=True, help_text=b'Device consumes both front and rear rack faces', verbose_name=b'Is full depth')),
-                ('is_console_server', models.BooleanField(default=False, help_text=b'This type of device has console server ports', verbose_name=b'Is a console server')),
-                ('is_pdu', models.BooleanField(default=False, help_text=b'This type of device has power outlets', verbose_name=b'Is a PDU')),
-                ('is_network_device', models.BooleanField(default=True, help_text=b'This type of device has network interfaces', verbose_name=b'Is a network device')),
-            ],
-            options={
-                'ordering': ['manufacturer', 'model'],
-            },
-        ),
-        migrations.CreateModel(
-            name='Interface',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-                ('form_factor', models.PositiveSmallIntegerField(choices=[[0, b'Virtual'], [800, b'10/100M (Copper)'], [1000, b'1GE (Copper)'], [1100, b'1GE (SFP)'], [1200, b'10GE (SFP+)'], [1300, b'10GE (XFP)'], [1400, b'40GE (QSFP+)']], default=1200)),
-                ('mgmt_only', models.BooleanField(default=False, help_text=b'This interface is used only for out-of-band management', verbose_name=b'OOB Management')),
-                ('description', models.CharField(blank=True, max_length=100)),
-                ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interfaces', to='dcim.Device')),
-            ],
-            options={
-                'ordering': ['device', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='InterfaceConnection',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('connection_status', models.BooleanField(choices=[[False, b'Planned'], [True, b'Connected']], default=True, verbose_name=b'Status')),
-                ('interface_a', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='connected_as_a', to='dcim.Interface')),
-                ('interface_b', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='connected_as_b', to='dcim.Interface')),
-            ],
-        ),
-        migrations.CreateModel(
-            name='InterfaceTemplate',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-                ('form_factor', models.PositiveSmallIntegerField(choices=[[0, b'Virtual'], [800, b'10/100M (Copper)'], [1000, b'1GE (Copper)'], [1100, b'1GE (SFP)'], [1200, b'10GE (SFP+)'], [1300, b'10GE (XFP)'], [1400, b'40GE (QSFP+)']], default=1200)),
-                ('mgmt_only', models.BooleanField(default=False, verbose_name=b'Management only')),
-                ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interface_templates', to='dcim.DeviceType')),
-            ],
-            options={
-                'ordering': ['device_type', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='Manufacturer',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50, unique=True)),
-                ('slug', models.SlugField(unique=True)),
-            ],
-            options={
-                'ordering': ['name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='Module',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50, verbose_name=b'Name')),
-                ('part_id', models.CharField(blank=True, max_length=50, verbose_name=b'Part ID')),
-                ('serial', models.CharField(blank=True, max_length=50, verbose_name=b'Serial number')),
-                ('discovered', models.BooleanField(default=False, verbose_name=b'Discovered')),
-                ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modules', to='dcim.Device')),
-                ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='submodules', to='dcim.Module')),
-            ],
-            options={
-                'ordering': ['device__id', 'parent__id', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='Platform',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50, unique=True)),
-                ('slug', models.SlugField(unique=True)),
-                ('rpc_client', models.CharField(blank=True, choices=[[b'juniper-junos', b'Juniper Junos (NETCONF)'], [b'cisco-ios', b'Cisco IOS (SSH)'], [b'opengear', b'Opengear (SSH)']], max_length=30, verbose_name=b'RPC client')),
-            ],
-            options={
-                'ordering': ['name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='PowerOutlet',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-                ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='power_outlets', to='dcim.Device')),
-            ],
-        ),
-        migrations.CreateModel(
-            name='PowerOutletTemplate',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-                ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='power_outlet_templates', to='dcim.DeviceType')),
-            ],
-            options={
-                'ordering': ['device_type', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='PowerPort',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-                ('connection_status', models.NullBooleanField(choices=[[False, b'Planned'], [True, b'Connected']], default=True)),
-                ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='power_ports', to='dcim.Device')),
-                ('power_outlet', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_port', to='dcim.PowerOutlet')),
-            ],
-            options={
-                'ordering': ['device', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='PowerPortTemplate',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-                ('device_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='power_port_templates', to='dcim.DeviceType')),
-            ],
-            options={
-                'ordering': ['device_type', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='Rack',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateField(auto_now_add=True)),
-                ('last_updated', models.DateTimeField(auto_now=True)),
-                ('name', models.CharField(max_length=50)),
-                ('facility_id', utilities.fields.NullableCharField(blank=True, max_length=30, null=True, verbose_name=b'Facility ID')),
-                ('u_height', models.PositiveSmallIntegerField(default=42, verbose_name=b'Height (U)')),
-                ('comments', models.TextField(blank=True)),
-            ],
-            options={
-                'ordering': ['site', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='RackGroup',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50)),
-                ('slug', models.SlugField()),
-            ],
-            options={
-                'ordering': ['site', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='Site',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('created', models.DateField(auto_now_add=True)),
-                ('last_updated', models.DateTimeField(auto_now=True)),
-                ('name', models.CharField(max_length=50, unique=True)),
-                ('slug', models.SlugField(unique=True)),
-                ('facility', models.CharField(blank=True, max_length=50)),
-                ('asn', models.PositiveIntegerField(blank=True, null=True, verbose_name=b'ASN')),
-                ('physical_address', models.CharField(blank=True, max_length=200)),
-                ('shipping_address', models.CharField(blank=True, max_length=200)),
-                ('comments', models.TextField(blank=True)),
-            ],
-            options={
-                'ordering': ['name'],
-            },
-        ),
-        migrations.AddField(
-            model_name='rackgroup',
-            name='site',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rack_groups', to='dcim.Site'),
-        ),
-        migrations.AddField(
-            model_name='rack',
-            name='group',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='racks', to='dcim.RackGroup'),
-        ),
-        migrations.AddField(
-            model_name='rack',
-            name='site',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='racks', to='dcim.Site'),
-        ),
-        migrations.AddField(
-            model_name='devicetype',
-            name='manufacturer',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='device_types', to='dcim.Manufacturer'),
-        ),
-        migrations.AddField(
-            model_name='device',
-            name='device_role',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.DeviceRole'),
-        ),
-        migrations.AddField(
-            model_name='device',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='instances', to='dcim.DeviceType'),
-        ),
-        migrations.AddField(
-            model_name='device',
-            name='platform',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='devices', to='dcim.Platform'),
-        ),
-    ]

+ 663 - 0
netbox/dcim/migrations/0001_squashed.py

@@ -0,0 +1,663 @@
+import dcim.fields
+import django.contrib.postgres.fields
+import django.core.serializers.json
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import timezone_field.fields
+import utilities.fields
+import utilities.ordering
+import utilities.query_functions
+import utilities.validators
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+    ]
+
+    replaces = [
+        ('dcim', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Cable',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('termination_a_id', models.PositiveIntegerField()),
+                ('termination_b_id', models.PositiveIntegerField()),
+                ('type', models.CharField(blank=True, max_length=50)),
+                ('status', models.CharField(default='connected', max_length=50)),
+                ('label', models.CharField(blank=True, max_length=100)),
+                ('color', utilities.fields.ColorField(blank=True, max_length=6)),
+                ('length', models.PositiveSmallIntegerField(blank=True, null=True)),
+                ('length_unit', models.CharField(blank=True, max_length=50)),
+                ('_abs_length', models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True)),
+            ],
+            options={
+                'ordering': ['pk'],
+            },
+        ),
+        migrations.CreateModel(
+            name='CablePath',
+            fields=[
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('origin_id', models.PositiveIntegerField()),
+                ('destination_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('path', dcim.fields.PathField(base_field=models.CharField(max_length=40), size=None)),
+                ('is_active', models.BooleanField(default=False)),
+                ('is_split', models.BooleanField(default=False)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='ConsolePort',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('type', models.CharField(blank=True, max_length=50)),
+                ('speed', models.PositiveSmallIntegerField(blank=True, null=True)),
+            ],
+            options={
+                'ordering': ('device', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='ConsolePortTemplate',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('type', models.CharField(blank=True, max_length=50)),
+            ],
+            options={
+                'ordering': ('device_type', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='ConsoleServerPort',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('type', models.CharField(blank=True, max_length=50)),
+                ('speed', models.PositiveSmallIntegerField(blank=True, null=True)),
+            ],
+            options={
+                'ordering': ('device', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='ConsoleServerPortTemplate',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('type', models.CharField(blank=True, max_length=50)),
+            ],
+            options={
+                'ordering': ('device_type', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='Device',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('local_context_data', models.JSONField(blank=True, null=True)),
+                ('name', models.CharField(blank=True, max_length=64, null=True)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize, null=True)),
+                ('serial', models.CharField(blank=True, max_length=50)),
+                ('asset_tag', models.CharField(blank=True, max_length=50, null=True, unique=True)),
+                ('position', models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1)])),
+                ('face', models.CharField(blank=True, max_length=50)),
+                ('status', models.CharField(default='active', max_length=50)),
+                ('vc_position', models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(255)])),
+                ('vc_priority', models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(255)])),
+                ('comments', models.TextField(blank=True)),
+            ],
+            options={
+                'ordering': ('_name', 'pk'),
+            },
+        ),
+        migrations.CreateModel(
+            name='DeviceBay',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+            ],
+            options={
+                'ordering': ('device', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='DeviceBayTemplate',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+            ],
+            options={
+                'ordering': ('device_type', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='DeviceRole',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('color', utilities.fields.ColorField(default='9e9e9e', max_length=6)),
+                ('vm_role', models.BooleanField(default=True)),
+                ('description', models.CharField(blank=True, max_length=200)),
+            ],
+            options={
+                'ordering': ['name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='DeviceType',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('model', models.CharField(max_length=100)),
+                ('slug', models.SlugField(max_length=100)),
+                ('part_number', models.CharField(blank=True, max_length=50)),
+                ('u_height', models.PositiveSmallIntegerField(default=1)),
+                ('is_full_depth', models.BooleanField(default=True)),
+                ('subdevice_role', models.CharField(blank=True, max_length=50)),
+                ('front_image', models.ImageField(blank=True, upload_to='devicetype-images')),
+                ('rear_image', models.ImageField(blank=True, upload_to='devicetype-images')),
+                ('comments', models.TextField(blank=True)),
+            ],
+            options={
+                'ordering': ['manufacturer', 'model'],
+            },
+        ),
+        migrations.CreateModel(
+            name='FrontPort',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('type', models.CharField(max_length=50)),
+                ('rear_port_position', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(1024)])),
+            ],
+            options={
+                'ordering': ('device', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='FrontPortTemplate',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('type', models.CharField(max_length=50)),
+                ('rear_port_position', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(1024)])),
+            ],
+            options={
+                'ordering': ('device_type', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='Interface',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('enabled', models.BooleanField(default=True)),
+                ('mac_address', dcim.fields.MACAddressField(blank=True, null=True)),
+                ('mtu', models.PositiveIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(65536)])),
+                ('mode', models.CharField(blank=True, max_length=50)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize_interface)),
+                ('type', models.CharField(max_length=50)),
+                ('mgmt_only', models.BooleanField(default=False)),
+            ],
+            options={
+                'ordering': ('device', utilities.query_functions.CollateAsChar('_name')),
+            },
+        ),
+        migrations.CreateModel(
+            name='InterfaceTemplate',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize_interface)),
+                ('type', models.CharField(max_length=50)),
+                ('mgmt_only', models.BooleanField(default=False)),
+            ],
+            options={
+                'ordering': ('device_type', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='InventoryItem',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('part_id', models.CharField(blank=True, max_length=50)),
+                ('serial', models.CharField(blank=True, max_length=50)),
+                ('asset_tag', models.CharField(blank=True, max_length=50, null=True, unique=True)),
+                ('discovered', models.BooleanField(default=False)),
+                ('lft', models.PositiveIntegerField(editable=False)),
+                ('rght', models.PositiveIntegerField(editable=False)),
+                ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
+                ('level', models.PositiveIntegerField(editable=False)),
+            ],
+            options={
+                'ordering': ('device__id', 'parent__id', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='Location',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100)),
+                ('slug', models.SlugField(max_length=100)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('lft', models.PositiveIntegerField(editable=False)),
+                ('rght', models.PositiveIntegerField(editable=False)),
+                ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
+                ('level', models.PositiveIntegerField(editable=False)),
+            ],
+            options={
+                'ordering': ['site', 'name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='Manufacturer',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('description', models.CharField(blank=True, max_length=200)),
+            ],
+            options={
+                'ordering': ['name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='Platform',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('napalm_driver', models.CharField(blank=True, max_length=50)),
+                ('napalm_args', models.JSONField(blank=True, null=True)),
+                ('description', models.CharField(blank=True, max_length=200)),
+            ],
+            options={
+                'ordering': ['name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='PowerFeed',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('name', models.CharField(max_length=100)),
+                ('status', models.CharField(default='active', max_length=50)),
+                ('type', models.CharField(default='primary', max_length=50)),
+                ('supply', models.CharField(default='ac', max_length=50)),
+                ('phase', models.CharField(default='single-phase', max_length=50)),
+                ('voltage', models.SmallIntegerField(default=120, validators=[utilities.validators.ExclusionValidator([0])])),
+                ('amperage', models.PositiveSmallIntegerField(default=20, validators=[django.core.validators.MinValueValidator(1)])),
+                ('max_utilization', models.PositiveSmallIntegerField(default=80, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)])),
+                ('available_power', models.PositiveIntegerField(default=0, editable=False)),
+                ('comments', models.TextField(blank=True)),
+            ],
+            options={
+                'ordering': ['power_panel', 'name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='PowerOutlet',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('type', models.CharField(blank=True, max_length=50)),
+                ('feed_leg', models.CharField(blank=True, max_length=50)),
+            ],
+            options={
+                'ordering': ('device', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='PowerOutletTemplate',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('type', models.CharField(blank=True, max_length=50)),
+                ('feed_leg', models.CharField(blank=True, max_length=50)),
+            ],
+            options={
+                'ordering': ('device_type', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='PowerPanel',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100)),
+            ],
+            options={
+                'ordering': ['site', 'name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='PowerPort',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('type', models.CharField(blank=True, max_length=50)),
+                ('maximum_draw', models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1)])),
+                ('allocated_draw', models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1)])),
+            ],
+            options={
+                'ordering': ('device', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='PowerPortTemplate',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('type', models.CharField(blank=True, max_length=50)),
+                ('maximum_draw', models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1)])),
+                ('allocated_draw', models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1)])),
+            ],
+            options={
+                'ordering': ('device_type', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='Rack',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('facility_id', models.CharField(blank=True, max_length=50, null=True)),
+                ('status', models.CharField(default='active', max_length=50)),
+                ('serial', models.CharField(blank=True, max_length=50)),
+                ('asset_tag', models.CharField(blank=True, max_length=50, null=True, unique=True)),
+                ('type', models.CharField(blank=True, max_length=50)),
+                ('width', models.PositiveSmallIntegerField(default=19)),
+                ('u_height', models.PositiveSmallIntegerField(default=42, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)])),
+                ('desc_units', models.BooleanField(default=False)),
+                ('outer_width', models.PositiveSmallIntegerField(blank=True, null=True)),
+                ('outer_depth', models.PositiveSmallIntegerField(blank=True, null=True)),
+                ('outer_unit', models.CharField(blank=True, max_length=50)),
+                ('comments', models.TextField(blank=True)),
+            ],
+            options={
+                'ordering': ('site', 'location', '_name', 'pk'),
+            },
+        ),
+        migrations.CreateModel(
+            name='RackReservation',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('units', django.contrib.postgres.fields.ArrayField(base_field=models.PositiveSmallIntegerField(), size=None)),
+                ('description', models.CharField(max_length=200)),
+            ],
+            options={
+                'ordering': ['created', 'pk'],
+            },
+        ),
+        migrations.CreateModel(
+            name='RackRole',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('color', utilities.fields.ColorField(default='9e9e9e', max_length=6)),
+                ('description', models.CharField(blank=True, max_length=200)),
+            ],
+            options={
+                'ordering': ['name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='RearPort',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('_cable_peer_id', models.PositiveIntegerField(blank=True, null=True)),
+                ('mark_connected', models.BooleanField(default=False)),
+                ('type', models.CharField(max_length=50)),
+                ('positions', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(1024)])),
+            ],
+            options={
+                'ordering': ('device', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='RearPortTemplate',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('label', models.CharField(blank=True, max_length=64)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('type', models.CharField(max_length=50)),
+                ('positions', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(1024)])),
+            ],
+            options={
+                'ordering': ('device_type', '_name'),
+            },
+        ),
+        migrations.CreateModel(
+            name='Region',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('lft', models.PositiveIntegerField(editable=False)),
+                ('rght', models.PositiveIntegerField(editable=False)),
+                ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
+                ('level', models.PositiveIntegerField(editable=False)),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+        migrations.CreateModel(
+            name='Site',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('status', models.CharField(default='active', max_length=50)),
+                ('facility', models.CharField(blank=True, max_length=50)),
+                ('asn', dcim.fields.ASNField(blank=True, null=True)),
+                ('time_zone', timezone_field.fields.TimeZoneField(blank=True)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('physical_address', models.CharField(blank=True, max_length=200)),
+                ('shipping_address', models.CharField(blank=True, max_length=200)),
+                ('latitude', models.DecimalField(blank=True, decimal_places=6, max_digits=8, null=True)),
+                ('longitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
+                ('contact_name', models.CharField(blank=True, max_length=50)),
+                ('contact_phone', models.CharField(blank=True, max_length=20)),
+                ('contact_email', models.EmailField(blank=True, max_length=254)),
+                ('comments', models.TextField(blank=True)),
+            ],
+            options={
+                'ordering': ('_name',),
+            },
+        ),
+        migrations.CreateModel(
+            name='SiteGroup',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=100, unique=True)),
+                ('slug', models.SlugField(max_length=100, unique=True)),
+                ('description', models.CharField(blank=True, max_length=200)),
+                ('lft', models.PositiveIntegerField(editable=False)),
+                ('rght', models.PositiveIntegerField(editable=False)),
+                ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
+                ('level', models.PositiveIntegerField(editable=False)),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+        migrations.CreateModel(
+            name='VirtualChassis',
+            fields=[
+                ('created', models.DateField(auto_now_add=True, null=True)),
+                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
+                ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
+                ('id', models.BigAutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=64)),
+                ('domain', models.CharField(blank=True, max_length=30)),
+                ('master', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='vc_master_for', to='dcim.device')),
+            ],
+            options={
+                'verbose_name_plural': 'virtual chassis',
+                'ordering': ['name'],
+            },
+        ),
+    ]

+ 0 - 112
netbox/dcim/migrations/0002_auto_20160622_1821.py

@@ -1,112 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-06-22 18:21
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    initial = True
-
-    dependencies = [
-        ('dcim', '0001_initial'),
-        ('ipam', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='device',
-            name='primary_ip',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_for', to='ipam.IPAddress', verbose_name=b'Primary IP'),
-        ),
-        migrations.AddField(
-            model_name='device',
-            name='rack',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.Rack'),
-        ),
-        migrations.AddField(
-            model_name='consoleserverporttemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cs_port_templates', to='dcim.DeviceType'),
-        ),
-        migrations.AddField(
-            model_name='consoleserverport',
-            name='device',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cs_ports', to='dcim.Device'),
-        ),
-        migrations.AddField(
-            model_name='consoleporttemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='console_port_templates', to='dcim.DeviceType'),
-        ),
-        migrations.AddField(
-            model_name='consoleport',
-            name='cs_port',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_console', to='dcim.ConsoleServerPort', verbose_name=b'Console server port'),
-        ),
-        migrations.AddField(
-            model_name='consoleport',
-            name='device',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='console_ports', to='dcim.Device'),
-        ),
-        migrations.AlterUniqueTogether(
-            name='rackgroup',
-            unique_together=set([('site', 'name'), ('site', 'slug')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='rack',
-            unique_together=set([('site', 'facility_id'), ('site', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='powerporttemplate',
-            unique_together=set([('device_type', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='powerport',
-            unique_together=set([('device', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='poweroutlettemplate',
-            unique_together=set([('device_type', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='poweroutlet',
-            unique_together=set([('device', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='module',
-            unique_together=set([('device', 'parent', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='interfacetemplate',
-            unique_together=set([('device_type', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='interface',
-            unique_together=set([('device', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='devicetype',
-            unique_together=set([('manufacturer', 'slug'), ('manufacturer', 'model')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='device',
-            unique_together=set([('rack', 'position', 'face')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='consoleserverporttemplate',
-            unique_together=set([('device_type', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='consoleserverport',
-            unique_together=set([('device', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='consoleporttemplate',
-            unique_together=set([('device_type', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='consoleport',
-            unique_together=set([('device', 'name')]),
-        ),
-    ]

+ 313 - 0
netbox/dcim/migrations/0002_squashed.py

@@ -0,0 +1,313 @@
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import mptt.fields
+import taggit.managers
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0001_initial'),
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('contenttypes', '0002_remove_content_type_name'),
+        ('extras', '0001_initial'),
+        ('tenancy', '0001_initial'),
+    ]
+
+    replaces = [
+        ('dcim', '0002_auto_20160622_1821'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='virtualchassis',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='sitegroup',
+            name='parent',
+            field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='dcim.sitegroup'),
+        ),
+        migrations.AddField(
+            model_name='site',
+            name='group',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sites', to='dcim.sitegroup'),
+        ),
+        migrations.AddField(
+            model_name='site',
+            name='region',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sites', to='dcim.region'),
+        ),
+        migrations.AddField(
+            model_name='site',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='site',
+            name='tenant',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sites', to='tenancy.tenant'),
+        ),
+        migrations.AddField(
+            model_name='region',
+            name='parent',
+            field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='dcim.region'),
+        ),
+        migrations.AddField(
+            model_name='rearporttemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rearporttemplates', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='rearport',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='rearport',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='rearport',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rearports', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='rearport',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='rackreservation',
+            name='rack',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='dcim.rack'),
+        ),
+        migrations.AddField(
+            model_name='rackreservation',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='rackreservation',
+            name='tenant',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='rackreservations', to='tenancy.tenant'),
+        ),
+        migrations.AddField(
+            model_name='rackreservation',
+            name='user',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AddField(
+            model_name='rack',
+            name='location',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='racks', to='dcim.location'),
+        ),
+        migrations.AddField(
+            model_name='rack',
+            name='role',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='racks', to='dcim.rackrole'),
+        ),
+        migrations.AddField(
+            model_name='rack',
+            name='site',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='racks', to='dcim.site'),
+        ),
+        migrations.AddField(
+            model_name='rack',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='rack',
+            name='tenant',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='racks', to='tenancy.tenant'),
+        ),
+        migrations.AddField(
+            model_name='powerporttemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='powerporttemplates', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='powerport',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='powerport',
+            name='_path',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dcim.cablepath'),
+        ),
+        migrations.AddField(
+            model_name='powerport',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='powerport',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='powerports', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='powerport',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='powerpanel',
+            name='location',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='dcim.location'),
+        ),
+        migrations.AddField(
+            model_name='powerpanel',
+            name='site',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='dcim.site'),
+        ),
+        migrations.AddField(
+            model_name='powerpanel',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='poweroutlettemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlettemplates', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='poweroutlettemplate',
+            name='power_port',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='poweroutlet_templates', to='dcim.powerporttemplate'),
+        ),
+        migrations.AddField(
+            model_name='poweroutlet',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='poweroutlet',
+            name='_path',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dcim.cablepath'),
+        ),
+        migrations.AddField(
+            model_name='poweroutlet',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='poweroutlet',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlets', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='poweroutlet',
+            name='power_port',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='poweroutlets', to='dcim.powerport'),
+        ),
+        migrations.AddField(
+            model_name='poweroutlet',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='powerfeed',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='powerfeed',
+            name='_path',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dcim.cablepath'),
+        ),
+        migrations.AddField(
+            model_name='powerfeed',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='powerfeed',
+            name='power_panel',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='powerfeeds', to='dcim.powerpanel'),
+        ),
+        migrations.AddField(
+            model_name='powerfeed',
+            name='rack',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='dcim.rack'),
+        ),
+        migrations.AddField(
+            model_name='powerfeed',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='platform',
+            name='manufacturer',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='platforms', to='dcim.manufacturer'),
+        ),
+        migrations.AddField(
+            model_name='location',
+            name='parent',
+            field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='dcim.location'),
+        ),
+        migrations.AddField(
+            model_name='location',
+            name='site',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='locations', to='dcim.site'),
+        ),
+        migrations.AddField(
+            model_name='inventoryitem',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='inventoryitems', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='inventoryitem',
+            name='manufacturer',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='inventory_items', to='dcim.manufacturer'),
+        ),
+        migrations.AddField(
+            model_name='inventoryitem',
+            name='parent',
+            field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='child_items', to='dcim.inventoryitem'),
+        ),
+        migrations.AddField(
+            model_name='inventoryitem',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='interfacetemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interfacetemplates', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='interface',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='interface',
+            name='_path',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dcim.cablepath'),
+        ),
+        migrations.AddField(
+            model_name='interface',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='interface',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interfaces', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='interface',
+            name='lag',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='member_interfaces', to='dcim.interface'),
+        ),
+        migrations.AddField(
+            model_name='interface',
+            name='parent',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='child_interfaces', to='dcim.interface'),
+        ),
+    ]

+ 0 - 23
netbox/dcim/migrations/0003_auto_20160628_1721.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-06-28 17:21
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0002_auto_20160622_1821'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[0, b'Virtual'], [800, b'10/100M (100BASE-TX)'], [1000, b'1GE (1000BASE-T)'], [1100, b'1GE (SFP)'], [1150, b'10GE (10GBASE-T)'], [1200, b'10GE (SFP+)'], [1300, b'10GE (XFP)'], [1400, b'40GE (QSFP+)']], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[0, b'Virtual'], [800, b'10/100M (100BASE-TX)'], [1000, b'1GE (1000BASE-T)'], [1100, b'1GE (SFP)'], [1150, b'10GE (10GBASE-T)'], [1200, b'10GE (SFP+)'], [1300, b'10GE (XFP)'], [1400, b'40GE (QSFP+)']], default=1200),
-        ),
-    ]

+ 485 - 0
netbox/dcim/migrations/0003_squashed_0130.py

@@ -0,0 +1,485 @@
+from django.db import migrations, models
+import django.db.models.deletion
+import taggit.managers
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0002_auto_20160622_1821'),
+        ('virtualization', '0001_virtualization'),
+        ('contenttypes', '0002_remove_content_type_name'),
+        ('ipam', '0001_initial'),
+        ('tenancy', '0001_initial'),
+        ('extras', '0002_custom_fields'),
+    ]
+
+    replaces = [
+        ('dcim', '0003_auto_20160628_1721'),
+        ('dcim', '0004_auto_20160701_2049'),
+        ('dcim', '0005_auto_20160706_1722'),
+        ('dcim', '0006_add_device_primary_ip4_ip6'),
+        ('dcim', '0007_device_copy_primary_ip'),
+        ('dcim', '0008_device_remove_primary_ip'),
+        ('dcim', '0009_site_32bit_asn_support'),
+        ('dcim', '0010_devicebay_installed_device_set_null'),
+        ('dcim', '0011_devicetype_part_number'),
+        ('dcim', '0012_site_rack_device_add_tenant'),
+        ('dcim', '0013_add_interface_form_factors'),
+        ('dcim', '0014_rack_add_type_width'),
+        ('dcim', '0015_rack_add_u_height_validator'),
+        ('dcim', '0016_module_add_manufacturer'),
+        ('dcim', '0017_rack_add_role'),
+        ('dcim', '0018_device_add_asset_tag'),
+        ('dcim', '0019_new_iface_form_factors'),
+        ('dcim', '0020_rack_desc_units'),
+        ('dcim', '0021_add_ff_flexstack'),
+        ('dcim', '0022_color_names_to_rgb'),
+        ('dcim', '0023_devicetype_comments'),
+        ('dcim', '0024_site_add_contact_fields'),
+        ('dcim', '0025_devicetype_add_interface_ordering'),
+        ('dcim', '0026_add_rack_reservations'),
+        ('dcim', '0027_device_add_site'),
+        ('dcim', '0028_device_copy_rack_to_site'),
+        ('dcim', '0029_allow_rackless_devices'),
+        ('dcim', '0030_interface_add_lag'),
+        ('dcim', '0031_regions'),
+        ('dcim', '0032_device_increase_name_length'),
+        ('dcim', '0033_rackreservation_rack_editable'),
+        ('dcim', '0034_rename_module_to_inventoryitem'),
+        ('dcim', '0035_device_expand_status_choices'),
+        ('dcim', '0036_add_ff_juniper_vcp'),
+        ('dcim', '0037_unicode_literals'),
+        ('dcim', '0038_wireless_interfaces'),
+        ('dcim', '0039_interface_add_enabled_mtu'),
+        ('dcim', '0040_inventoryitem_add_asset_tag_description'),
+        ('dcim', '0041_napalm_integration'),
+        ('dcim', '0042_interface_ff_10ge_cx4'),
+        ('dcim', '0043_device_component_name_lengths'),
+        ('dcim', '0044_virtualization'),
+        ('dcim', '0045_devicerole_vm_role'),
+        ('dcim', '0046_rack_lengthen_facility_id'),
+        ('dcim', '0047_more_100ge_form_factors'),
+        ('dcim', '0048_rack_serial'),
+        ('dcim', '0049_rackreservation_change_user'),
+        ('dcim', '0050_interface_vlan_tagging'),
+        ('dcim', '0051_rackreservation_tenant'),
+        ('dcim', '0052_virtual_chassis'),
+        ('dcim', '0053_platform_manufacturer'),
+        ('dcim', '0054_site_status_timezone_description'),
+        ('dcim', '0055_virtualchassis_ordering'),
+        ('dcim', '0056_django2'),
+        ('dcim', '0057_tags'),
+        ('dcim', '0058_relax_rack_naming_constraints'),
+        ('dcim', '0059_site_latitude_longitude'),
+        ('dcim', '0060_change_logging'),
+        ('dcim', '0061_platform_napalm_args'),
+        ('dcim', '0062_interface_mtu'),
+        ('dcim', '0063_device_local_context_data'),
+        ('dcim', '0064_remove_platform_rpc_client'),
+        ('dcim', '0065_front_rear_ports'),
+        ('dcim', '0066_cables'),
+        ('dcim', '0067_device_type_remove_qualifiers'),
+        ('dcim', '0068_rack_new_fields'),
+        ('dcim', '0069_deprecate_nullablecharfield'),
+        ('dcim', '0070_custom_tag_models'),
+        ('dcim', '0071_device_components_add_description'),
+        ('dcim', '0072_powerfeeds'),
+        ('dcim', '0073_interface_form_factor_to_type'),
+        ('dcim', '0074_increase_field_length_platform_name_slug'),
+        ('dcim', '0075_cable_devices'),
+        ('dcim', '0076_console_port_types'),
+        ('dcim', '0077_power_types'),
+        ('dcim', '0078_3569_site_fields'),
+        ('dcim', '0079_3569_rack_fields'),
+        ('dcim', '0080_3569_devicetype_fields'),
+        ('dcim', '0081_3569_device_fields'),
+        ('dcim', '0082_3569_interface_fields'),
+        ('dcim', '0082_3569_port_fields'),
+        ('dcim', '0083_3569_cable_fields'),
+        ('dcim', '0084_3569_powerfeed_fields'),
+        ('dcim', '0085_3569_poweroutlet_fields'),
+        ('dcim', '0086_device_name_nonunique'),
+        ('dcim', '0087_role_descriptions'),
+        ('dcim', '0088_powerfeed_available_power'),
+        ('dcim', '0089_deterministic_ordering'),
+        ('dcim', '0090_cable_termination_models'),
+        ('dcim', '0091_interface_type_other'),
+        ('dcim', '0092_fix_rack_outer_unit'),
+        ('dcim', '0093_device_component_ordering'),
+        ('dcim', '0094_device_component_template_ordering'),
+        ('dcim', '0095_primary_model_ordering'),
+        ('dcim', '0096_interface_ordering'),
+        ('dcim', '0097_interfacetemplate_type_other'),
+        ('dcim', '0098_devicetype_images'),
+        ('dcim', '0099_powerfeed_negative_voltage'),
+        ('dcim', '0100_mptt_remove_indexes'),
+        ('dcim', '0101_nested_rackgroups'),
+        ('dcim', '0102_nested_rackgroups_rebuild'),
+        ('dcim', '0103_standardize_description'),
+        ('dcim', '0104_correct_infiniband_types'),
+        ('dcim', '0105_interface_name_collation'),
+        ('dcim', '0106_role_default_color'),
+        ('dcim', '0107_component_labels'),
+        ('dcim', '0108_add_tags'),
+        ('dcim', '0109_interface_remove_vm'),
+        ('dcim', '0110_virtualchassis_name'),
+        ('dcim', '0111_component_template_description'),
+        ('dcim', '0112_standardize_components'),
+        ('dcim', '0113_nullbooleanfield_to_booleanfield'),
+        ('dcim', '0114_update_jsonfield'),
+        ('dcim', '0115_rackreservation_order'),
+        ('dcim', '0116_rearport_max_positions'),
+        ('dcim', '0117_custom_field_data'),
+        ('dcim', '0118_inventoryitem_mptt'),
+        ('dcim', '0119_inventoryitem_mptt_rebuild'),
+        ('dcim', '0120_cache_cable_peer'),
+        ('dcim', '0121_cablepath'),
+        ('dcim', '0122_standardize_name_length'),
+        ('dcim', '0123_standardize_models'),
+        ('dcim', '0124_mark_connected'),
+        ('dcim', '0125_console_port_speed'),
+        ('dcim', '0126_rename_rackgroup_location'),
+        ('dcim', '0127_device_location'),
+        ('dcim', '0128_device_location_populate'),
+        ('dcim', '0129_interface_parent'),
+        ('dcim', '0130_sitegroup'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='interface',
+            name='tagged_vlans',
+            field=models.ManyToManyField(blank=True, related_name='interfaces_as_tagged', to='ipam.VLAN'),
+        ),
+        migrations.AddField(
+            model_name='interface',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='interface',
+            name='untagged_vlan',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='interfaces_as_untagged', to='ipam.vlan'),
+        ),
+        migrations.AddField(
+            model_name='frontporttemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontporttemplates', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='frontporttemplate',
+            name='rear_port',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontport_templates', to='dcim.rearporttemplate'),
+        ),
+        migrations.AddField(
+            model_name='frontport',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='frontport',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='frontport',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontports', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='frontport',
+            name='rear_port',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontports', to='dcim.rearport'),
+        ),
+        migrations.AddField(
+            model_name='frontport',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='devicetype',
+            name='manufacturer',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='device_types', to='dcim.manufacturer'),
+        ),
+        migrations.AddField(
+            model_name='devicetype',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='devicebaytemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='devicebaytemplates', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='devicebay',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='devicebays', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='devicebay',
+            name='installed_device',
+            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parent_bay', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='devicebay',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='cluster',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='devices', to='virtualization.cluster'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='device_role',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.devicerole'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='instances', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='location',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.location'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='platform',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='devices', to='dcim.platform'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='primary_ip4',
+            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_ip4_for', to='ipam.ipaddress'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='primary_ip6',
+            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_ip6_for', to='ipam.ipaddress'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='rack',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.rack'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='site',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.site'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='tenant',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='tenancy.tenant'),
+        ),
+        migrations.AddField(
+            model_name='device',
+            name='virtual_chassis',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='members', to='dcim.virtualchassis'),
+        ),
+        migrations.AddField(
+            model_name='consoleserverporttemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverporttemplates', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='consoleserverport',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='consoleserverport',
+            name='_path',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dcim.cablepath'),
+        ),
+        migrations.AddField(
+            model_name='consoleserverport',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='consoleserverport',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverports', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='consoleserverport',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='consoleporttemplate',
+            name='device_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleporttemplates', to='dcim.devicetype'),
+        ),
+        migrations.AddField(
+            model_name='consoleport',
+            name='_cable_peer_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='consoleport',
+            name='_path',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dcim.cablepath'),
+        ),
+        migrations.AddField(
+            model_name='consoleport',
+            name='cable',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.cable'),
+        ),
+        migrations.AddField(
+            model_name='consoleport',
+            name='device',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleports', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='consoleport',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='cablepath',
+            name='destination_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='cablepath',
+            name='origin_type',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='cable',
+            name='_termination_a_device',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='cable',
+            name='_termination_b_device',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='dcim.device'),
+        ),
+        migrations.AddField(
+            model_name='cable',
+            name='tags',
+            field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'),
+        ),
+        migrations.AddField(
+            model_name='cable',
+            name='termination_a_type',
+            field=models.ForeignKey(limit_choices_to=models.Q(models.Q(models.Q(('app_label', 'circuits'), ('model__in', ('circuittermination',))), models.Q(('app_label', 'dcim'), ('model__in', ('consoleport', 'consoleserverport', 'frontport', 'interface', 'powerfeed', 'poweroutlet', 'powerport', 'rearport'))), _connector='OR')), on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AddField(
+            model_name='cable',
+            name='termination_b_type',
+            field=models.ForeignKey(limit_choices_to=models.Q(models.Q(models.Q(('app_label', 'circuits'), ('model__in', ('circuittermination',))), models.Q(('app_label', 'dcim'), ('model__in', ('consoleport', 'consoleserverport', 'frontport', 'interface', 'powerfeed', 'poweroutlet', 'powerport', 'rearport'))), _connector='OR')), on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='rearporttemplate',
+            unique_together={('device_type', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='rearport',
+            unique_together={('device', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='rack',
+            unique_together={('location', 'facility_id'), ('location', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='powerporttemplate',
+            unique_together={('device_type', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='powerport',
+            unique_together={('device', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='powerpanel',
+            unique_together={('site', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='poweroutlettemplate',
+            unique_together={('device_type', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='poweroutlet',
+            unique_together={('device', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='powerfeed',
+            unique_together={('power_panel', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='location',
+            unique_together={('site', 'name'), ('site', 'slug')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='inventoryitem',
+            unique_together={('device', 'parent', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='interfacetemplate',
+            unique_together={('device_type', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='interface',
+            unique_together={('device', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='frontporttemplate',
+            unique_together={('rear_port', 'rear_port_position'), ('device_type', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='frontport',
+            unique_together={('device', 'name'), ('rear_port', 'rear_port_position')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='devicetype',
+            unique_together={('manufacturer', 'model'), ('manufacturer', 'slug')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='devicebaytemplate',
+            unique_together={('device_type', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='devicebay',
+            unique_together={('device', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='device',
+            unique_together={('rack', 'position', 'face'), ('virtual_chassis', 'vc_position'), ('site', 'tenant', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='consoleserverporttemplate',
+            unique_together={('device_type', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='consoleserverport',
+            unique_together={('device', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='consoleporttemplate',
+            unique_together={('device_type', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='consoleport',
+            unique_together={('device', 'name')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='cablepath',
+            unique_together={('origin_type', 'origin_id')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='cable',
+            unique_together={('termination_b_type', 'termination_b_id'), ('termination_a_type', 'termination_a_id')},
+        ),
+    ]

+ 0 - 54
netbox/dcim/migrations/0004_auto_20160701_2049.py

@@ -1,54 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-07-01 20:49
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0003_auto_20160628_1721'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='DeviceBay',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50, verbose_name=b'Name')),
-                ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='device_bays', to='dcim.Device')),
-                ('installed_device', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_bay', to='dcim.Device')),
-            ],
-            options={
-                'ordering': ['device', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='DeviceBayTemplate',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=30)),
-            ],
-            options={
-                'ordering': ['device_type', 'name'],
-            },
-        ),
-        migrations.AddField(
-            model_name='devicetype',
-            name='subdevice_role',
-            field=models.NullBooleanField(choices=[(None, b'N/A'), (True, b'Parent'), (False, b'Child')], default=None, help_text=b'Parent devices house child devices in device bays. Select "None" if this device type is neither a parent nor a child.', verbose_name=b'Parent/child status'),
-        ),
-        migrations.AddField(
-            model_name='devicebaytemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='device_bay_templates', to='dcim.DeviceType'),
-        ),
-        migrations.AlterUniqueTogether(
-            name='devicebaytemplate',
-            unique_together=set([('device_type', 'name')]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='devicebay',
-            unique_together=set([('device', 'name')]),
-        ),
-    ]

+ 0 - 24
netbox/dcim/migrations/0005_auto_20160706_1722.py

@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-07-06 17:22
-import dcim.fields
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0004_auto_20160701_2049'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='interface',
-            name='mac_address',
-            field=dcim.fields.MACAddressField(blank=True, null=True, verbose_name=b'MAC Address'),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='subdevice_role',
-            field=models.NullBooleanField(choices=[(None, b'None'), (True, b'Parent'), (False, b'Child')], default=None, help_text=b'Parent devices house child devices in device bays. Select "None" if this device type is neither a parent nor a child.', verbose_name=b'Parent/child status'),
-        ),
-    ]

+ 0 - 25
netbox/dcim/migrations/0006_add_device_primary_ip4_ip6.py

@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-07-11 18:40
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('ipam', '0001_initial'),
-        ('dcim', '0005_auto_20160706_1722'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='device',
-            name='primary_ip4',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_ip4_for', to='ipam.IPAddress', verbose_name=b'Primary IPv4'),
-        ),
-        migrations.AddField(
-            model_name='device',
-            name='primary_ip6',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_ip6_for', to='ipam.IPAddress', verbose_name=b'Primary IPv6'),
-        ),
-    ]

+ 0 - 39
netbox/dcim/migrations/0007_device_copy_primary_ip.py

@@ -1,39 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-07-11 18:40
-from django.db import migrations
-
-
-def copy_primary_ip(apps, schema_editor):
-    Device = apps.get_model('dcim', 'Device')
-    for d in Device.objects.select_related('primary_ip'):
-        if not d.primary_ip:
-            continue
-        if d.primary_ip.family == 4:
-            d.primary_ip4 = d.primary_ip
-        elif d.primary_ip.family == 6:
-            d.primary_ip6 = d.primary_ip
-        d.save()
-
-
-def restore_primary_ip(apps, schema_editor):
-    Device = apps.get_model('dcim', 'Device')
-    for d in Device.objects.select_related('primary_ip4', 'primary_ip6'):
-        if d.primary_ip:
-            continue
-        # Prefer IPv6 over IPv4
-        if d.primary_ip6:
-            d.primary_ip = d.primary_ip6
-        elif d.primary_ip4:
-            d.primary_ip = d.primary_ip4
-        d.save()
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0006_add_device_primary_ip4_ip6'),
-    ]
-
-    operations = [
-        migrations.RunPython(copy_primary_ip, restore_primary_ip),
-    ]

+ 0 - 17
netbox/dcim/migrations/0008_device_remove_primary_ip.py

@@ -1,17 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-07-11 19:01
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0007_device_copy_primary_ip'),
-    ]
-
-    operations = [
-        migrations.RemoveField(
-            model_name='device',
-            name='primary_ip',
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0009_site_32bit_asn_support.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-07-13 19:24
-import dcim.fields
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0008_device_remove_primary_ip'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='site',
-            name='asn',
-            field=dcim.fields.ASNField(blank=True, null=True, verbose_name=b'ASN'),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0010_devicebay_installed_device_set_null.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.7 on 2016-07-14 21:38
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0009_site_32bit_asn_support'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='devicebay',
-            name='installed_device',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parent_bay', to='dcim.Device'),
-        ),
-    ]

+ 0 - 18
netbox/dcim/migrations/0011_devicetype_part_number.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-07-26 15:05
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0010_devicebay_installed_device_set_null'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='devicetype',
-            name='part_number',
-            field=models.CharField(blank=True, help_text=b'Discrete part number (optional)', max_length=50),
-        ),
-    ]

+ 0 - 30
netbox/dcim/migrations/0012_site_rack_device_add_tenant.py

@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-07-26 21:59
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('tenancy', '0001_initial'),
-        ('dcim', '0011_devicetype_part_number'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='device',
-            name='tenant',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='tenancy.Tenant'),
-        ),
-        migrations.AddField(
-            model_name='rack',
-            name='tenant',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='racks', to='tenancy.Tenant'),
-        ),
-        migrations.AddField(
-            model_name='site',
-            name='tenant',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sites', to='tenancy.Tenant'),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0013_add_interface_form_factors.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-08-06 20:24
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0012_site_rack_device_add_tenant'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual']]], [b'Ethernet', [[800, b'100BASE-TX (10/100M)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Modular', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1300, b'XFP (10GE)'], [1200, b'SFP+ (10GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual']]], [b'Ethernet', [[800, b'100BASE-TX (10/100M)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Modular', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1300, b'XFP (10GE)'], [1200, b'SFP+ (10GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus']]]], default=1200),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0014_rack_add_type_width.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-08-08 21:11
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0013_add_interface_form_factors'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='rack',
-            name='type',
-            field=models.PositiveSmallIntegerField(blank=True, choices=[(100, b'2-post frame'), (200, b'4-post frame'), (300, b'4-post cabinet'), (1000, b'Wall-mounted frame'), (1100, b'Wall-mounted cabinet')], null=True, verbose_name=b'Type'),
-        ),
-        migrations.AddField(
-            model_name='rack',
-            name='width',
-            field=models.PositiveSmallIntegerField(choices=[(19, b'19 inches'), (23, b'23 inches')], default=19, help_text=b'Rail-to-rail width', verbose_name=b'Width'),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0015_rack_add_u_height_validator.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-08-09 21:18
-import django.core.validators
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0014_rack_add_type_width'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='rack',
-            name='u_height',
-            field=models.PositiveSmallIntegerField(default=42, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)], verbose_name=b'Height (U)'),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0016_module_add_manufacturer.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-08-10 13:45
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0015_rack_add_u_height_validator'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='module',
-            name='manufacturer',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='modules', to='dcim.Manufacturer'),
-        ),
-    ]

+ 0 - 31
netbox/dcim/migrations/0017_rack_add_role.py

@@ -1,31 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.9.8 on 2016-08-10 14:58
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0016_module_add_manufacturer'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='RackRole',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50, unique=True)),
-                ('slug', models.SlugField(unique=True)),
-                ('color', models.CharField(choices=[[b'teal', b'Teal'], [b'green', b'Green'], [b'blue', b'Blue'], [b'purple', b'Purple'], [b'yellow', b'Yellow'], [b'orange', b'Orange'], [b'red', b'Red'], [b'light_gray', b'Light Gray'], [b'medium_gray', b'Medium Gray'], [b'dark_gray', b'Dark Gray']], max_length=30)),
-            ],
-            options={
-                'ordering': ['name'],
-            },
-        ),
-        migrations.AddField(
-            model_name='rack',
-            name='role',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='racks', to='dcim.RackRole'),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0018_device_add_asset_tag.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-08-11 15:42
-from django.db import migrations
-import utilities.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0017_rack_add_role'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='device',
-            name='asset_tag',
-            field=utilities.fields.NullableCharField(blank=True, help_text=b'A unique tag used to identify this device', max_length=50, null=True, unique=True, verbose_name=b'Asset tag'),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0019_new_iface_form_factors.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-09-13 15:20
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0018_device_add_asset_tag'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus']]], [b'Other', [[32767, b'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus']]], [b'Other', [[32767, b'Other']]]], default=1200),
-        ),
-    ]

+ 0 - 18
netbox/dcim/migrations/0020_rack_desc_units.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-10-28 15:01
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0019_new_iface_form_factors'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='rack',
-            name='desc_units',
-            field=models.BooleanField(default=False, help_text=b'Units are numbered top-to-bottom', verbose_name=b'Descending units'),
-        ),
-    ]

+ 0 - 29
netbox/dcim/migrations/0021_add_ff_flexstack.py

@@ -1,29 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-10-31 18:47
-import django.core.validators
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0020_rack_desc_units'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='device',
-            name='position',
-            field=models.PositiveSmallIntegerField(blank=True, help_text=b'The lowest-numbered unit occupied by the device', null=True, validators=[django.core.validators.MinValueValidator(1)], verbose_name=b'Position (U)'),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus']]], [b'Other', [[32767, b'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus']]], [b'Other', [[32767, b'Other']]]], default=1200),
-        ),
-    ]

+ 0 - 55
netbox/dcim/migrations/0022_color_names_to_rgb.py

@@ -1,55 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-12-06 16:35
-from django.db import migrations
-import utilities.fields
-
-
-COLOR_CONVERSION = {
-    'teal': '009688',
-    'green': '4caf50',
-    'blue': '2196f3',
-    'purple': '9c27b0',
-    'yellow': 'ffeb3b',
-    'orange': 'ff9800',
-    'red': 'f44336',
-    'light_gray': 'c0c0c0',
-    'medium_gray': '9e9e9e',
-    'dark_gray': '607d8b',
-}
-
-
-def color_names_to_rgb(apps, schema_editor):
-    RackRole = apps.get_model('dcim', 'RackRole')
-    DeviceRole = apps.get_model('dcim', 'DeviceRole')
-    for color_name, color_rgb in COLOR_CONVERSION.items():
-        RackRole.objects.filter(color=color_name).update(color=color_rgb)
-        DeviceRole.objects.filter(color=color_name).update(color=color_rgb)
-
-
-def color_rgb_to_name(apps, schema_editor):
-    RackRole = apps.get_model('dcim', 'RackRole')
-    DeviceRole = apps.get_model('dcim', 'DeviceRole')
-    for color_name, color_rgb in COLOR_CONVERSION.items():
-        RackRole.objects.filter(color=color_rgb).update(color=color_name)
-        DeviceRole.objects.filter(color=color_rgb).update(color=color_name)
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0021_add_ff_flexstack'),
-    ]
-
-    operations = [
-        migrations.RunPython(color_names_to_rgb, color_rgb_to_name),
-        migrations.AlterField(
-            model_name='devicerole',
-            name='color',
-            field=utilities.fields.ColorField(max_length=6),
-        ),
-        migrations.AlterField(
-            model_name='rackrole',
-            name='color',
-            field=utilities.fields.ColorField(max_length=6),
-        ),
-    ]

+ 0 - 18
netbox/dcim/migrations/0023_devicetype_comments.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-12-16 16:08
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0022_color_names_to_rgb'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='devicetype',
-            name='comments',
-            field=models.TextField(blank=True),
-        ),
-    ]

+ 0 - 28
netbox/dcim/migrations/0024_site_add_contact_fields.py

@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2016-12-29 16:23
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0023_devicetype_comments'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='site',
-            name='contact_email',
-            field=models.EmailField(blank=True, max_length=254, verbose_name=b'Contact E-mail'),
-        ),
-        migrations.AddField(
-            model_name='site',
-            name='contact_name',
-            field=models.CharField(blank=True, max_length=50),
-        ),
-        migrations.AddField(
-            model_name='site',
-            name='contact_phone',
-            field=models.CharField(blank=True, max_length=20),
-        ),
-    ]

+ 0 - 18
netbox/dcim/migrations/0025_devicetype_add_interface_ordering.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-01-06 16:56
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0024_site_add_contact_fields'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='devicetype',
-            name='interface_ordering',
-            field=models.PositiveSmallIntegerField(choices=[[1, b'Slot/position'], [2, b'Name (alphabetically)']], default=1),
-        ),
-    ]

+ 0 - 31
netbox/dcim/migrations/0026_add_rack_reservations.py

@@ -1,31 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-02-16 18:43
-from django.conf import settings
-import django.contrib.postgres.fields
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-        ('dcim', '0025_devicetype_add_interface_ordering'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='RackReservation',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('units', django.contrib.postgres.fields.ArrayField(base_field=models.PositiveSmallIntegerField(), size=None)),
-                ('created', models.DateTimeField(auto_now_add=True)),
-                ('description', models.CharField(max_length=100)),
-                ('rack', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='dcim.Rack')),
-                ('user', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
-            ],
-            options={
-                'ordering': ['created'],
-            },
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0027_device_add_site.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-02-16 21:21
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0026_add_rack_reservations'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='device',
-            name='site',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.Site'),
-        ),
-    ]

+ 0 - 21
netbox/dcim/migrations/0028_device_copy_rack_to_site.py

@@ -1,21 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-02-16 21:23
-from django.db import migrations
-
-
-def copy_site_from_rack(apps, schema_editor):
-    Device = apps.get_model('dcim', 'Device')
-    for device in Device.objects.all():
-        device.site = device.rack.site
-        device.save()
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0027_device_add_site'),
-    ]
-
-    operations = [
-        migrations.RunPython(copy_site_from_rack),
-    ]

+ 0 - 24
netbox/dcim/migrations/0029_allow_rackless_devices.py

@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-02-16 21:25
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0028_device_copy_rack_to_site'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='device',
-            name='rack',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.Rack'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='site',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='devices', to='dcim.Site'),
-        ),
-    ]

+ 0 - 29
netbox/dcim/migrations/0030_interface_add_lag.py

@@ -1,29 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-02-27 19:55
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0029_allow_rackless_devices'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='interface',
-            name='lag',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='member_interfaces', to='dcim.Interface', verbose_name=b'Parent LAG'),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual'], [200, b'Link Aggregation Group (LAG)']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus']]], [b'Other', [[32767, b'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual'], [200, b'Link Aggregation Group (LAG)']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus']]], [b'Other', [[32767, b'Other']]]], default=1200),
-        ),
-    ]

+ 0 - 36
netbox/dcim/migrations/0031_regions.py

@@ -1,36 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-02-28 17:14
-from django.db import migrations, models
-import django.db.models.deletion
-import mptt.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0030_interface_add_lag'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='Region',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.CharField(max_length=50, unique=True)),
-                ('slug', models.SlugField(unique=True)),
-                ('lft', models.PositiveIntegerField(db_index=True, editable=False)),
-                ('rght', models.PositiveIntegerField(db_index=True, editable=False)),
-                ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
-                ('level', models.PositiveIntegerField(db_index=True, editable=False)),
-                ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='dcim.Region')),
-            ],
-            options={
-                'abstract': False,
-            },
-        ),
-        migrations.AddField(
-            model_name='site',
-            name='region',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sites', to='dcim.Region'),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0032_device_increase_name_length.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.4 on 2017-03-02 15:09
-from django.db import migrations
-import utilities.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0031_regions'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='device',
-            name='name',
-            field=utilities.fields.NullableCharField(blank=True, max_length=64, null=True, unique=True),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0033_rackreservation_rack_editable.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.6 on 2017-03-17 18:39
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0032_device_increase_name_length'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='rackreservation',
-            name='rack',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='dcim.Rack'),
-        ),
-    ]

+ 0 - 33
netbox/dcim/migrations/0034_rename_module_to_inventoryitem.py

@@ -1,33 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.6 on 2017-03-21 14:55
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0033_rackreservation_rack_editable'),
-    ]
-
-    operations = [
-        migrations.RenameModel(
-            old_name='Module',
-            new_name='InventoryItem',
-        ),
-        migrations.AlterField(
-            model_name='inventoryitem',
-            name='device',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='inventory_items', to='dcim.Device'),
-        ),
-        migrations.AlterField(
-            model_name='inventoryitem',
-            name='parent',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='child_items', to='dcim.InventoryItem'),
-        ),
-        migrations.AlterField(
-            model_name='inventoryitem',
-            name='manufacturer',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='inventory_items', to='dcim.Manufacturer'),
-        ),
-    ]

+ 0 - 25
netbox/dcim/migrations/0035_device_expand_status_choices.py

@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10.7 on 2017-05-08 15:57
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0034_rename_module_to_inventoryitem'),
-    ]
-
-    # We convert the BooleanField to an IntegerField first as PostgreSQL does not provide a direct cast for boolean to
-    # smallint (attempting to convert directly yields the error "cannot cast type boolean to smallint").
-    operations = [
-        migrations.AlterField(
-            model_name='device',
-            name='status',
-            field=models.PositiveIntegerField(choices=[[1, b'Active'], [0, b'Offline'], [2, b'Planned'], [3, b'Staged'], [4, b'Failed'], [5, b'Inventory']], default=1, verbose_name=b'Status'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='status',
-            field=models.PositiveSmallIntegerField(choices=[[1, b'Active'], [0, b'Offline'], [2, b'Planned'], [3, b'Staged'], [4, b'Failed'], [5, b'Inventory']], default=1, verbose_name=b'Status'),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0036_add_ff_juniper_vcp.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.1 on 2017-05-09 16:00
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0035_device_expand_status_choices'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual'], [200, b'Link Aggregation Group (LAG)']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus'], [5200, b'Juniper VCP']]], [b'Other', [[32767, b'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[[b'Virtual interfaces', [[0, b'Virtual'], [200, b'Link Aggregation Group (LAG)']]], [b'Ethernet (fixed)', [[800, b'100BASE-TX (10/100ME)'], [1000, b'1000BASE-T (1GE)'], [1150, b'10GBASE-T (10GE)']]], [b'Ethernet (modular)', [[1050, b'GBIC (1GE)'], [1100, b'SFP (1GE)'], [1200, b'SFP+ (10GE)'], [1300, b'XFP (10GE)'], [1310, b'XENPAK (10GE)'], [1320, b'X2 (10GE)'], [1350, b'SFP28 (25GE)'], [1400, b'QSFP+ (40GE)'], [1500, b'CFP (100GE)'], [1600, b'QSFP28 (100GE)']]], [b'FibreChannel', [[3010, b'SFP (1GFC)'], [3020, b'SFP (2GFC)'], [3040, b'SFP (4GFC)'], [3080, b'SFP+ (8GFC)'], [3160, b'SFP+ (16GFC)']]], [b'Serial', [[4000, b'T1 (1.544 Mbps)'], [4010, b'E1 (2.048 Mbps)'], [4040, b'T3 (45 Mbps)'], [4050, b'E3 (34 Mbps)'], [4050, b'E3 (34 Mbps)']]], [b'Stacking', [[5000, b'Cisco StackWise'], [5050, b'Cisco StackWise Plus'], [5100, b'Cisco FlexStack'], [5150, b'Cisco FlexStack Plus'], [5200, b'Juniper VCP']]], [b'Other', [[32767, b'Other']]]], default=1200),
-        ),
-    ]

+ 0 - 207
netbox/dcim/migrations/0037_unicode_literals.py

@@ -1,207 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11 on 2017-05-24 15:34
-import dcim.fields
-import django.core.validators
-from django.db import migrations, models
-import django.db.models.deletion
-import utilities.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0036_add_ff_juniper_vcp'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='consoleport',
-            name='connection_status',
-            field=models.NullBooleanField(choices=[[False, 'Planned'], [True, 'Connected']], default=True),
-        ),
-        migrations.AlterField(
-            model_name='consoleport',
-            name='cs_port',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_console', to='dcim.ConsoleServerPort', verbose_name='Console server port'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='asset_tag',
-            field=utilities.fields.NullableCharField(blank=True, help_text='A unique tag used to identify this device', max_length=50, null=True, unique=True, verbose_name='Asset tag'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='face',
-            field=models.PositiveSmallIntegerField(blank=True, choices=[[0, 'Front'], [1, 'Rear']], null=True, verbose_name='Rack face'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='position',
-            field=models.PositiveSmallIntegerField(blank=True, help_text='The lowest-numbered unit occupied by the device', null=True, validators=[django.core.validators.MinValueValidator(1)], verbose_name='Position (U)'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='primary_ip4',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_ip4_for', to='ipam.IPAddress', verbose_name='Primary IPv4'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='primary_ip6',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='primary_ip6_for', to='ipam.IPAddress', verbose_name='Primary IPv6'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='serial',
-            field=models.CharField(blank=True, max_length=50, verbose_name='Serial number'),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='status',
-            field=models.PositiveSmallIntegerField(choices=[[1, 'Active'], [0, 'Offline'], [2, 'Planned'], [3, 'Staged'], [4, 'Failed'], [5, 'Inventory']], default=1, verbose_name='Status'),
-        ),
-        migrations.AlterField(
-            model_name='devicebay',
-            name='name',
-            field=models.CharField(max_length=50, verbose_name='Name'),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='interface_ordering',
-            field=models.PositiveSmallIntegerField(choices=[[1, 'Slot/position'], [2, 'Name (alphabetically)']], default=1),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='is_console_server',
-            field=models.BooleanField(default=False, help_text='This type of device has console server ports', verbose_name='Is a console server'),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='is_full_depth',
-            field=models.BooleanField(default=True, help_text='Device consumes both front and rear rack faces', verbose_name='Is full depth'),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='is_network_device',
-            field=models.BooleanField(default=True, help_text='This type of device has network interfaces', verbose_name='Is a network device'),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='is_pdu',
-            field=models.BooleanField(default=False, help_text='This type of device has power outlets', verbose_name='Is a PDU'),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='part_number',
-            field=models.CharField(blank=True, help_text='Discrete part number (optional)', max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='subdevice_role',
-            field=models.NullBooleanField(choices=[(None, 'None'), (True, 'Parent'), (False, 'Child')], default=None, help_text='Parent devices house child devices in device bays. Select "None" if this device type is neither a parent nor a child.', verbose_name='Parent/child status'),
-        ),
-        migrations.AlterField(
-            model_name='devicetype',
-            name='u_height',
-            field=models.PositiveSmallIntegerField(default=1, verbose_name='Height (U)'),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1600, 'QSFP28 (100GE)']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='lag',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='member_interfaces', to='dcim.Interface', verbose_name='Parent LAG'),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='mac_address',
-            field=dcim.fields.MACAddressField(blank=True, null=True, verbose_name='MAC Address'),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='mgmt_only',
-            field=models.BooleanField(default=False, help_text='This interface is used only for out-of-band management', verbose_name='OOB Management'),
-        ),
-        migrations.AlterField(
-            model_name='interfaceconnection',
-            name='connection_status',
-            field=models.BooleanField(choices=[[False, 'Planned'], [True, 'Connected']], default=True, verbose_name='Status'),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1600, 'QSFP28 (100GE)']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='mgmt_only',
-            field=models.BooleanField(default=False, verbose_name='Management only'),
-        ),
-        migrations.AlterField(
-            model_name='inventoryitem',
-            name='discovered',
-            field=models.BooleanField(default=False, verbose_name='Discovered'),
-        ),
-        migrations.AlterField(
-            model_name='inventoryitem',
-            name='name',
-            field=models.CharField(max_length=50, verbose_name='Name'),
-        ),
-        migrations.AlterField(
-            model_name='inventoryitem',
-            name='part_id',
-            field=models.CharField(blank=True, max_length=50, verbose_name='Part ID'),
-        ),
-        migrations.AlterField(
-            model_name='inventoryitem',
-            name='serial',
-            field=models.CharField(blank=True, max_length=50, verbose_name='Serial number'),
-        ),
-        migrations.AlterField(
-            model_name='platform',
-            name='rpc_client',
-            field=models.CharField(blank=True, choices=[['juniper-junos', 'Juniper Junos (NETCONF)'], ['cisco-ios', 'Cisco IOS (SSH)'], ['opengear', 'Opengear (SSH)']], max_length=30, verbose_name='RPC client'),
-        ),
-        migrations.AlterField(
-            model_name='powerport',
-            name='connection_status',
-            field=models.NullBooleanField(choices=[[False, 'Planned'], [True, 'Connected']], default=True),
-        ),
-        migrations.AlterField(
-            model_name='rack',
-            name='desc_units',
-            field=models.BooleanField(default=False, help_text='Units are numbered top-to-bottom', verbose_name='Descending units'),
-        ),
-        migrations.AlterField(
-            model_name='rack',
-            name='facility_id',
-            field=utilities.fields.NullableCharField(blank=True, max_length=30, null=True, verbose_name='Facility ID'),
-        ),
-        migrations.AlterField(
-            model_name='rack',
-            name='type',
-            field=models.PositiveSmallIntegerField(blank=True, choices=[(100, '2-post frame'), (200, '4-post frame'), (300, '4-post cabinet'), (1000, 'Wall-mounted frame'), (1100, 'Wall-mounted cabinet')], null=True, verbose_name='Type'),
-        ),
-        migrations.AlterField(
-            model_name='rack',
-            name='u_height',
-            field=models.PositiveSmallIntegerField(default=42, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)], verbose_name='Height (U)'),
-        ),
-        migrations.AlterField(
-            model_name='rack',
-            name='width',
-            field=models.PositiveSmallIntegerField(choices=[(19, '19 inches'), (23, '23 inches')], default=19, help_text='Rail-to-rail width', verbose_name='Width'),
-        ),
-        migrations.AlterField(
-            model_name='site',
-            name='asn',
-            field=dcim.fields.ASNField(blank=True, null=True, verbose_name='ASN'),
-        ),
-        migrations.AlterField(
-            model_name='site',
-            name='contact_email',
-            field=models.EmailField(blank=True, max_length=254, verbose_name='Contact E-mail'),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0038_wireless_interfaces.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.1 on 2017-06-16 21:38
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0037_unicode_literals'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1600, 'QSFP28 (100GE)']]], ['Wireless', [[2600, 'IEEE 802.11a'], [2610, 'IEEE 802.11b/g'], [2620, 'IEEE 802.11n'], [2630, 'IEEE 802.11ac'], [2640, 'IEEE 802.11ad']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1600, 'QSFP28 (100GE)']]], ['Wireless', [[2600, 'IEEE 802.11a'], [2610, 'IEEE 802.11b/g'], [2620, 'IEEE 802.11n'], [2630, 'IEEE 802.11ac'], [2640, 'IEEE 802.11ad']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0039_interface_add_enabled_mtu.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.1 on 2017-06-23 17:05
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0038_wireless_interfaces'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='interface',
-            name='enabled',
-            field=models.BooleanField(default=True),
-        ),
-        migrations.AddField(
-            model_name='interface',
-            name='mtu',
-            field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='MTU'),
-        ),
-    ]

+ 0 - 24
netbox/dcim/migrations/0040_inventoryitem_add_asset_tag_description.py

@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11 on 2017-06-23 20:44
-from django.db import migrations, models
-import utilities.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0039_interface_add_enabled_mtu'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='inventoryitem',
-            name='asset_tag',
-            field=utilities.fields.NullableCharField(blank=True, help_text='A unique tag used to identify this item', max_length=50, null=True, unique=True, verbose_name='Asset tag'),
-        ),
-        migrations.AddField(
-            model_name='inventoryitem',
-            name='description',
-            field=models.CharField(blank=True, max_length=100),
-        ),
-    ]

+ 0 - 38
netbox/dcim/migrations/0041_napalm_integration.py

@@ -1,38 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.3 on 2017-07-14 17:26
-from django.db import migrations, models
-
-
-def rpc_client_to_napalm_driver(apps, schema_editor):
-    """
-    Migrate legacy RPC clients to their respective NAPALM drivers
-    """
-    Platform = apps.get_model('dcim', 'Platform')
-
-    Platform.objects.filter(rpc_client='juniper-junos').update(napalm_driver='junos')
-    Platform.objects.filter(rpc_client='cisco-ios').update(napalm_driver='ios')
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0040_inventoryitem_add_asset_tag_description'),
-    ]
-
-    operations = [
-        migrations.AlterModelOptions(
-            name='device',
-            options={'ordering': ['name']},
-        ),
-        migrations.AddField(
-            model_name='platform',
-            name='napalm_driver',
-            field=models.CharField(blank=True, help_text='The name of the NAPALM driver to use when interacting with devices.', max_length=50, verbose_name='NAPALM driver'),
-        ),
-        migrations.AlterField(
-            model_name='platform',
-            name='rpc_client',
-            field=models.CharField(blank=True, choices=[['juniper-junos', 'Juniper Junos (NETCONF)'], ['cisco-ios', 'Cisco IOS (SSH)'], ['opengear', 'Opengear (SSH)']], max_length=30, verbose_name='Legacy RPC client'),
-        ),
-        migrations.RunPython(rpc_client_to_napalm_driver),
-    ]

+ 0 - 23
netbox/dcim/migrations/0042_interface_ff_10ge_cx4.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.4 on 2017-08-29 21:00
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0041_napalm_integration'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)'], [1170, '10GBASE-CX4 (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1600, 'QSFP28 (100GE)']]], ['Wireless', [[2600, 'IEEE 802.11a'], [2610, 'IEEE 802.11b/g'], [2620, 'IEEE 802.11n'], [2630, 'IEEE 802.11ac'], [2640, 'IEEE 802.11ad']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)'], [1170, '10GBASE-CX4 (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1600, 'QSFP28 (100GE)']]], ['Wireless', [[2600, 'IEEE 802.11a'], [2610, 'IEEE 802.11b/g'], [2620, 'IEEE 802.11n'], [2630, 'IEEE 802.11ac'], [2640, 'IEEE 802.11ad']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-    ]

+ 0 - 68
netbox/dcim/migrations/0043_device_component_name_lengths.py

@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.4 on 2017-08-29 21:26
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0042_interface_ff_10ge_cx4'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='consoleport',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='consoleporttemplate',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='consoleserverport',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='consoleserverporttemplate',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='devicebaytemplate',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='name',
-            field=models.CharField(max_length=64),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='name',
-            field=models.CharField(max_length=64),
-        ),
-        migrations.AlterField(
-            model_name='poweroutlet',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='poweroutlettemplate',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='powerport',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-        migrations.AlterField(
-            model_name='powerporttemplate',
-            name='name',
-            field=models.CharField(max_length=50),
-        ),
-    ]

+ 0 - 30
netbox/dcim/migrations/0044_virtualization.py

@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.4 on 2017-08-31 14:15
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('virtualization', '0001_virtualization'),
-        ('dcim', '0043_device_component_name_lengths'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='device',
-            name='cluster',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='devices', to='virtualization.Cluster'),
-        ),
-        migrations.AddField(
-            model_name='interface',
-            name='virtual_machine',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interfaces', to='virtualization.VirtualMachine'),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='device',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interfaces', to='dcim.Device'),
-        ),
-    ]

+ 0 - 18
netbox/dcim/migrations/0045_devicerole_vm_role.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.4 on 2017-09-29 16:09
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0044_virtualization'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='devicerole',
-            name='vm_role',
-            field=models.BooleanField(default=True, help_text='Virtual machines may be assigned to this role', verbose_name='VM Role'),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0046_rack_lengthen_facility_id.py

@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.4 on 2017-10-09 17:43
-from django.db import migrations
-import utilities.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0045_devicerole_vm_role'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='rack',
-            name='facility_id',
-            field=utilities.fields.NullableCharField(blank=True, max_length=50, null=True, verbose_name='Facility ID'),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0047_more_100ge_form_factors.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.4 on 2017-10-09 18:43
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0046_rack_lengthen_facility_id'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)'], [1170, '10GBASE-CX4 (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1510, 'CFP2 (100GE)'], [1520, 'CFP4 (100GE)'], [1550, 'Cisco CPAK (100GE)'], [1600, 'QSFP28 (100GE)']]], ['Wireless', [[2600, 'IEEE 802.11a'], [2610, 'IEEE 802.11b/g'], [2620, 'IEEE 802.11n'], [2630, 'IEEE 802.11ac'], [2640, 'IEEE 802.11ad']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)'], [1170, '10GBASE-CX4 (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1510, 'CFP2 (100GE)'], [1520, 'CFP4 (100GE)'], [1550, 'Cisco CPAK (100GE)'], [1600, 'QSFP28 (100GE)']]], ['Wireless', [[2600, 'IEEE 802.11a'], [2610, 'IEEE 802.11b/g'], [2620, 'IEEE 802.11n'], [2630, 'IEEE 802.11ac'], [2640, 'IEEE 802.11ad']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-    ]

+ 0 - 18
netbox/dcim/migrations/0048_rack_serial.py

@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.4 on 2017-10-09 18:50
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0047_more_100ge_form_factors'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='rack',
-            name='serial',
-            field=models.CharField(blank=True, max_length=50, verbose_name='Serial number'),
-        ),
-    ]

+ 0 - 20
netbox/dcim/migrations/0049_rackreservation_change_user.py

@@ -1,20 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.6 on 2017-10-31 17:32
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0048_rack_serial'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='rackreservation',
-            name='user',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
-        ),
-    ]

+ 0 - 30
netbox/dcim/migrations/0050_interface_vlan_tagging.py

@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.6 on 2017-11-10 20:10
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('ipam', '0020_ipaddress_add_role_carp'),
-        ('dcim', '0049_rackreservation_change_user'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='interface',
-            name='mode',
-            field=models.PositiveSmallIntegerField(blank=True, choices=[[100, 'Access'], [200, 'Tagged'], [300, 'Tagged All']], null=True),
-        ),
-        migrations.AddField(
-            model_name='interface',
-            name='tagged_vlans',
-            field=models.ManyToManyField(blank=True, related_name='interfaces_as_tagged', to='ipam.VLAN', verbose_name='Tagged VLANs'),
-        ),
-        migrations.AddField(
-            model_name='interface',
-            name='untagged_vlan',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interfaces_as_untagged', to='ipam.VLAN', verbose_name='Untagged VLAN'),
-        ),
-    ]

+ 0 - 20
netbox/dcim/migrations/0051_rackreservation_tenant.py

@@ -1,20 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.6 on 2017-11-15 18:56
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('tenancy', '0003_unicode_literals'),
-        ('dcim', '0050_interface_vlan_tagging'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='rackreservation',
-            name='tenant',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='rackreservations', to='tenancy.Tenant'),
-        ),
-    ]

+ 0 - 42
netbox/dcim/migrations/0052_virtual_chassis.py

@@ -1,42 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.6 on 2017-11-27 17:27
-import django.core.validators
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0051_rackreservation_tenant'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='VirtualChassis',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('domain', models.CharField(blank=True, max_length=30)),
-                ('master', models.OneToOneField(default=1, on_delete=django.db.models.deletion.PROTECT, related_name='vc_master_for', to='dcim.Device')),
-            ],
-        ),
-        migrations.AddField(
-            model_name='device',
-            name='virtual_chassis',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='members', to='dcim.VirtualChassis'),
-        ),
-        migrations.AddField(
-            model_name='device',
-            name='vc_position',
-            field=models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(255)]),
-        ),
-        migrations.AddField(
-            model_name='device',
-            name='vc_priority',
-            field=models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MaxValueValidator(255)]),
-        ),
-        migrations.AlterUniqueTogether(
-            name='device',
-            unique_together=set([('virtual_chassis', 'vc_position'), ('rack', 'position', 'face')]),
-        ),
-    ]

+ 0 - 24
netbox/dcim/migrations/0053_platform_manufacturer.py

@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.6 on 2017-12-19 20:56
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0052_virtual_chassis'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='platform',
-            name='manufacturer',
-            field=models.ForeignKey(blank=True, help_text='Optionally limit this platform to devices of a certain manufacturer', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='platforms', to='dcim.Manufacturer'),
-        ),
-        migrations.AlterField(
-            model_name='platform',
-            name='napalm_driver',
-            field=models.CharField(blank=True, help_text='The name of the NAPALM driver to use when interacting with devices', max_length=50, verbose_name='NAPALM driver'),
-        ),
-    ]

+ 0 - 29
netbox/dcim/migrations/0054_site_status_timezone_description.py

@@ -1,29 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.6 on 2018-01-25 18:21
-from django.db import migrations, models
-import timezone_field.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0053_platform_manufacturer'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='site',
-            name='description',
-            field=models.CharField(blank=True, max_length=100),
-        ),
-        migrations.AddField(
-            model_name='site',
-            name='status',
-            field=models.PositiveSmallIntegerField(choices=[[1, 'Active'], [2, 'Planned'], [4, 'Retired']], default=1),
-        ),
-        migrations.AddField(
-            model_name='site',
-            name='time_zone',
-            field=timezone_field.fields.TimeZoneField(blank=True),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0055_virtualchassis_ordering.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.9 on 2018-02-21 14:41
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0054_site_status_timezone_description'),
-    ]
-
-    operations = [
-        migrations.AlterModelOptions(
-            name='virtualchassis',
-            options={'ordering': ['master'], 'verbose_name_plural': 'virtual chassis'},
-        ),
-        migrations.AlterField(
-            model_name='virtualchassis',
-            name='master',
-            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='vc_master_for', to='dcim.Device'),
-        ),
-    ]

+ 0 - 24
netbox/dcim/migrations/0056_django2.py

@@ -1,24 +0,0 @@
-# Generated by Django 2.0.3 on 2018-03-30 14:18
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0055_virtualchassis_ordering'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='untagged_vlan',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='interfaces_as_untagged', to='ipam.VLAN', verbose_name='Untagged VLAN'),
-        ),
-        migrations.AlterField(
-            model_name='platform',
-            name='manufacturer',
-            field=models.ForeignKey(blank=True, help_text='Optionally limit this platform to devices of a certain manufacturer', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='platforms', to='dcim.Manufacturer'),
-        ),
-    ]

+ 0 - 75
netbox/dcim/migrations/0057_tags.py

@@ -1,75 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.12 on 2018-05-22 19:04
-from django.db import migrations
-import taggit.managers
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('taggit', '0002_auto_20150616_2121'),
-        ('dcim', '0056_django2'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='device',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='devicetype',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='rack',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='site',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='consoleport',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='consoleserverport',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='devicebay',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='interface',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='inventoryitem',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='poweroutlet',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='powerport',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-        migrations.AddField(
-            model_name='virtualchassis',
-            name='tags',
-            field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'),
-        ),
-    ]

+ 0 - 21
netbox/dcim/migrations/0058_relax_rack_naming_constraints.py

@@ -1,21 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.12 on 2018-05-22 19:27
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0057_tags'),
-    ]
-
-    operations = [
-        migrations.AlterModelOptions(
-            name='rack',
-            options={'ordering': ['site', 'group', 'name']},
-        ),
-        migrations.AlterUniqueTogether(
-            name='rack',
-            unique_together=set([('group', 'name'), ('group', 'facility_id')]),
-        ),
-    ]

+ 0 - 23
netbox/dcim/migrations/0059_site_latitude_longitude.py

@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.12 on 2018-06-21 18:45
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0058_relax_rack_naming_constraints'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='site',
-            name='latitude',
-            field=models.DecimalField(blank=True, decimal_places=6, max_digits=8, null=True),
-        ),
-        migrations.AddField(
-            model_name='site',
-            name='longitude',
-            field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
-        ),
-    ]

+ 0 - 133
netbox/dcim/migrations/0060_change_logging.py

@@ -1,133 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.11.12 on 2018-06-13 17:14
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0059_site_latitude_longitude'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='devicerole',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='devicerole',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='devicetype',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='devicetype',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='manufacturer',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='manufacturer',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='platform',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='platform',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='rackgroup',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='rackgroup',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='rackreservation',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='rackrole',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='rackrole',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='region',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='region',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='virtualchassis',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AddField(
-            model_name='virtualchassis',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='device',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='rack',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='rack',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='rackreservation',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='site',
-            name='created',
-            field=models.DateField(auto_now_add=True, null=True),
-        ),
-        migrations.AlterField(
-            model_name='site',
-            name='last_updated',
-            field=models.DateTimeField(auto_now=True, null=True),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0061_platform_napalm_args.py

@@ -1,19 +0,0 @@
-# Generated by Django 2.0.6 on 2018-06-29 15:02
-
-import django.contrib.postgres.fields.jsonb
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0060_change_logging'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='platform',
-            name='napalm_args',
-            field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, help_text='Additional arguments to pass when initiating the NAPALM driver (JSON format)', null=True, verbose_name='NAPALM arguments'),
-        ),
-    ]

+ 0 - 29
netbox/dcim/migrations/0062_interface_mtu.py

@@ -1,29 +0,0 @@
-# Generated by Django 2.0.8 on 2018-08-22 14:23
-
-import django.core.validators
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0061_platform_napalm_args'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='interface',
-            name='mtu',
-            field=models.PositiveIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(65536)], verbose_name='MTU'),
-        ),
-        migrations.AlterField(
-            model_name='interface',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)'], [1170, '10GBASE-CX4 (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1510, 'CFP2 (100GE)'], [1520, 'CFP4 (100GE)'], [1550, 'Cisco CPAK (100GE)'], [1600, 'QSFP28 (100GE)']]], ['Wireless', [[2600, 'IEEE 802.11a'], [2610, 'IEEE 802.11b/g'], [2620, 'IEEE 802.11n'], [2630, 'IEEE 802.11ac'], [2640, 'IEEE 802.11ad']]], ['SONET', [[6100, 'OC-3/STM-1'], [6200, 'OC-12/STM-4'], [6300, 'OC-48/STM-16'], [6400, 'OC-192/STM-64'], [6500, 'OC-768/STM-256'], [6600, 'OC-1920/STM-640'], [6700, 'OC-3840/STM-1234']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)'], [3320, 'SFP28 (32GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP'], [5300, 'Extreme SummitStack'], [5310, 'Extreme SummitStack-128'], [5320, 'Extreme SummitStack-256'], [5330, 'Extreme SummitStack-512']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-        migrations.AlterField(
-            model_name='interfacetemplate',
-            name='form_factor',
-            field=models.PositiveSmallIntegerField(choices=[['Virtual interfaces', [[0, 'Virtual'], [200, 'Link Aggregation Group (LAG)']]], ['Ethernet (fixed)', [[800, '100BASE-TX (10/100ME)'], [1000, '1000BASE-T (1GE)'], [1150, '10GBASE-T (10GE)'], [1170, '10GBASE-CX4 (10GE)']]], ['Ethernet (modular)', [[1050, 'GBIC (1GE)'], [1100, 'SFP (1GE)'], [1200, 'SFP+ (10GE)'], [1300, 'XFP (10GE)'], [1310, 'XENPAK (10GE)'], [1320, 'X2 (10GE)'], [1350, 'SFP28 (25GE)'], [1400, 'QSFP+ (40GE)'], [1500, 'CFP (100GE)'], [1510, 'CFP2 (100GE)'], [1520, 'CFP4 (100GE)'], [1550, 'Cisco CPAK (100GE)'], [1600, 'QSFP28 (100GE)']]], ['Wireless', [[2600, 'IEEE 802.11a'], [2610, 'IEEE 802.11b/g'], [2620, 'IEEE 802.11n'], [2630, 'IEEE 802.11ac'], [2640, 'IEEE 802.11ad']]], ['SONET', [[6100, 'OC-3/STM-1'], [6200, 'OC-12/STM-4'], [6300, 'OC-48/STM-16'], [6400, 'OC-192/STM-64'], [6500, 'OC-768/STM-256'], [6600, 'OC-1920/STM-640'], [6700, 'OC-3840/STM-1234']]], ['FibreChannel', [[3010, 'SFP (1GFC)'], [3020, 'SFP (2GFC)'], [3040, 'SFP (4GFC)'], [3080, 'SFP+ (8GFC)'], [3160, 'SFP+ (16GFC)'], [3320, 'SFP28 (32GFC)']]], ['Serial', [[4000, 'T1 (1.544 Mbps)'], [4010, 'E1 (2.048 Mbps)'], [4040, 'T3 (45 Mbps)'], [4050, 'E3 (34 Mbps)']]], ['Stacking', [[5000, 'Cisco StackWise'], [5050, 'Cisco StackWise Plus'], [5100, 'Cisco FlexStack'], [5150, 'Cisco FlexStack Plus'], [5200, 'Juniper VCP'], [5300, 'Extreme SummitStack'], [5310, 'Extreme SummitStack-128'], [5320, 'Extreme SummitStack-256'], [5330, 'Extreme SummitStack-512']]], ['Other', [[32767, 'Other']]]], default=1200),
-        ),
-    ]

+ 0 - 19
netbox/dcim/migrations/0063_device_local_context_data.py

@@ -1,19 +0,0 @@
-# Generated by Django 2.0.8 on 2018-09-16 02:01
-
-import django.contrib.postgres.fields.jsonb
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0062_interface_mtu'),
-    ]
-
-    operations = [
-        migrations.AddField(
-            model_name='device',
-            name='local_context_data',
-            field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True),
-        ),
-    ]

+ 0 - 17
netbox/dcim/migrations/0064_remove_platform_rpc_client.py

@@ -1,17 +0,0 @@
-# Generated by Django 2.0.8 on 2018-08-22 16:09
-
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('dcim', '0063_device_local_context_data'),
-    ]
-
-    operations = [
-        migrations.RemoveField(
-            model_name='platform',
-            name='rpc_client',
-        ),
-    ]

+ 0 - 131
netbox/dcim/migrations/0065_front_rear_ports.py

@@ -1,131 +0,0 @@
-import django.core.validators
-from django.db import migrations, models
-import django.db.models.deletion
-import taggit.managers
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('taggit', '0002_auto_20150616_2121'),
-        ('dcim', '0064_remove_platform_rpc_client'),
-    ]
-
-    operations = [
-        migrations.CreateModel(
-            name='FrontPort',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
-                ('name', models.CharField(max_length=64)),
-                ('type', models.PositiveSmallIntegerField()),
-                ('rear_port_position', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(64)])),
-                ('description', models.CharField(blank=True, max_length=100)),
-                ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontports', to='dcim.Device')),
-            ],
-            options={
-                'ordering': ['device', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='FrontPortTemplate',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
-                ('name', models.CharField(max_length=64)),
-                ('type', models.PositiveSmallIntegerField()),
-                ('rear_port_position', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(64)])),
-            ],
-            options={
-                'ordering': ['device_type', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='RearPort',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
-                ('name', models.CharField(max_length=64)),
-                ('type', models.PositiveSmallIntegerField()),
-                ('positions', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(64)])),
-                ('description', models.CharField(blank=True, max_length=100)),
-                ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rearports', to='dcim.Device')),
-                ('tags', taggit.managers.TaggableManager(through='taggit.TaggedItem', to='taggit.Tag')),
-            ],
-            options={
-                'ordering': ['device', 'name'],
-            },
-        ),
-        migrations.CreateModel(
-            name='RearPortTemplate',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
-                ('name', models.CharField(max_length=64)),
-                ('type', models.PositiveSmallIntegerField()),
-                ('positions', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(64)])),
-            ],
-            options={
-                'ordering': ['device_type', 'name'],
-            },
-        ),
-        migrations.AddField(
-            model_name='rearporttemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rearport_templates', to='dcim.DeviceType'),
-        ),
-        migrations.AddField(
-            model_name='frontporttemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontport_templates', to='dcim.DeviceType'),
-        ),
-        migrations.AddField(
-            model_name='frontporttemplate',
-            name='rear_port',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontport_templates', to='dcim.RearPortTemplate'),
-        ),
-        migrations.AddField(
-            model_name='frontport',
-            name='rear_port',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='frontports', to='dcim.RearPort'),
-        ),
-        migrations.AddField(
-            model_name='frontport',
-            name='tags',
-            field=taggit.managers.TaggableManager(through='taggit.TaggedItem', to='taggit.Tag'),
-        ),
-        migrations.AlterUniqueTogether(
-            name='rearporttemplate',
-            unique_together={('device_type', 'name')},
-        ),
-        migrations.AlterUniqueTogether(
-            name='rearport',
-            unique_together={('device', 'name')},
-        ),
-        migrations.AlterUniqueTogether(
-            name='frontporttemplate',
-            unique_together={('rear_port', 'rear_port_position'), ('device_type', 'name')},
-        ),
-        migrations.AlterUniqueTogether(
-            name='frontport',
-            unique_together={('device', 'name'), ('rear_port', 'rear_port_position')},
-        ),
-
-        # Rename reverse relationships of component templates to DeviceType
-        migrations.AlterField(
-            model_name='consoleporttemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleport_templates', to='dcim.DeviceType'),
-        ),
-        migrations.AlterField(
-            model_name='consoleserverporttemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverport_templates', to='dcim.DeviceType'),
-        ),
-        migrations.AlterField(
-            model_name='poweroutlettemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlet_templates', to='dcim.DeviceType'),
-        ),
-        migrations.AlterField(
-            model_name='powerporttemplate',
-            name='device_type',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='powerport_templates', to='dcim.DeviceType'),
-        ),
-    ]

+ 0 - 322
netbox/dcim/migrations/0066_cables.py

@@ -1,322 +0,0 @@
-import sys
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-import utilities.fields
-
-
-def console_connections_to_cables(apps, schema_editor):
-    """
-    Copy all existing console connections as Cables
-    """
-    ContentType = apps.get_model('contenttypes', 'ContentType')
-    ConsolePort = apps.get_model('dcim', 'ConsolePort')
-    ConsoleServerPort = apps.get_model('dcim', 'ConsoleServerPort')
-    Cable = apps.get_model('dcim', 'Cable')
-
-    # Load content types
-    consoleport_type = ContentType.objects.get_for_model(ConsolePort)
-    consoleserverport_type = ContentType.objects.get_for_model(ConsoleServerPort)
-
-    # Create a new Cable instance from each console connection
-    if 'test' not in sys.argv:
-        print("\n    Adding console connections... ", end='', flush=True)
-    for consoleport in ConsolePort.objects.filter(connected_endpoint__isnull=False):
-
-        # Create the new Cable
-        cable = Cable.objects.create(
-            termination_a_type=consoleport_type,
-            termination_a_id=consoleport.id,
-            termination_b_type=consoleserverport_type,
-            termination_b_id=consoleport.connected_endpoint_id,
-            status=consoleport.connection_status
-        )
-
-        # Cache the Cable on its two termination points
-        ConsolePort.objects.filter(pk=consoleport.id).update(
-            cable=cable
-        )
-        ConsoleServerPort.objects.filter(pk=consoleport.connected_endpoint_id).update(
-            connection_status=consoleport.connection_status,
-            cable=cable
-        )
-
-    cable_count = Cable.objects.filter(termination_a_type=consoleport_type).count()
-    if 'test' not in sys.argv:
-        print("{} cables created".format(cable_count))
-
-    # Normalize connection_status for all non-connected ConsolePorts
-    ConsolePort.objects.filter(connected_endpoint__isnull=True).update(connection_status=None)
-
-
-def power_connections_to_cables(apps, schema_editor):
-    """
-    Copy all existing power connections as Cables
-    """
-    ContentType = apps.get_model('contenttypes', 'ContentType')
-    PowerPort = apps.get_model('dcim', 'PowerPort')
-    PowerOutlet = apps.get_model('dcim', 'PowerOutlet')
-    Cable = apps.get_model('dcim', 'Cable')
-
-    # Load content types
-    powerport_type = ContentType.objects.get_for_model(PowerPort)
-    poweroutlet_type = ContentType.objects.get_for_model(PowerOutlet)
-
-    # Create a new Cable instance from each power connection
-    if 'test' not in sys.argv:
-        print("    Adding power connections... ", end='', flush=True)
-    for powerport in PowerPort.objects.filter(connected_endpoint__isnull=False):
-
-        # Create the new Cable
-        cable = Cable.objects.create(
-            termination_a_type=powerport_type,
-            termination_a_id=powerport.id,
-            termination_b_type=poweroutlet_type,
-            termination_b_id=powerport.connected_endpoint_id,
-            status=powerport.connection_status
-        )
-
-        # Cache the Cable on its two termination points
-        PowerPort.objects.filter(pk=powerport.id).update(
-            cable=cable
-        )
-        PowerOutlet.objects.filter(pk=powerport.connected_endpoint_id).update(
-            connection_status=powerport.connection_status,
-            cable=cable
-        )
-
-    cable_count = Cable.objects.filter(termination_a_type=powerport_type).count()
-    if 'test' not in sys.argv:
-        print("{} cables created".format(cable_count))
-
-    # Normalize connection_status for all non-connected PowerPorts
-    PowerPort.objects.filter(connected_endpoint__isnull=True).update(connection_status=None)
-
-
-def interface_connections_to_cables(apps, schema_editor):
-    """
-    Copy all InterfaceConnections as Cables
-    """
-    ContentType = apps.get_model('contenttypes', 'ContentType')
-    Interface = apps.get_model('dcim', 'Interface')
-    InterfaceConnection = apps.get_model('dcim', 'InterfaceConnection')
-    Cable = apps.get_model('dcim', 'Cable')
-
-    # Load content types
-    interface_type = ContentType.objects.get_for_model(Interface)
-
-    # Create a new Cable instance from each InterfaceConnection
-    if 'test' not in sys.argv:
-        print("    Adding interface connections... ", end='', flush=True)
-    for conn in InterfaceConnection.objects.all():
-
-        # Create the new Cable
-        cable = Cable.objects.create(
-            termination_a_type=interface_type,
-            termination_a_id=conn.interface_a_id,
-            termination_b_type=interface_type,
-            termination_b_id=conn.interface_b_id,
-            status=conn.connection_status
-        )
-
-        # Cache the connected Cable on each Interface
-        Interface.objects.filter(pk=conn.interface_a_id).update(
-            _connected_interface=conn.interface_b,
-            connection_status=conn.connection_status,
-            cable=cable
-        )
-        Interface.objects.filter(pk=conn.interface_b_id).update(
-            _connected_interface=conn.interface_a,
-            connection_status=conn.connection_status,
-            cable=cable
-        )
-
-    cable_count = Cable.objects.filter(termination_a_type=interface_type).count()
-    if 'test' not in sys.argv:
-        print("{} cables created".format(cable_count))
-
-
-def delete_interfaceconnection_content_type(apps, schema_editor):
-    """
-    Delete the ContentType for the InterfaceConnection model. (This is not done automatically upon model deletion.)
-    """
-    ContentType = apps.get_model('contenttypes', 'ContentType')
-    InterfaceConnection = apps.get_model('dcim', 'InterfaceConnection')
-    ContentType.objects.get_for_model(InterfaceConnection).delete()
-
-
-class Migration(migrations.Migration):
-    atomic = False
-
-    dependencies = [
-        ('contenttypes', '0002_remove_content_type_name'),
-        ('circuits', '0006_terminations'),
-        ('dcim', '0065_front_rear_ports'),
-    ]
-
-    operations = [
-
-        # Create the Cable model
-        migrations.CreateModel(
-            name='Cable',
-            options={'ordering': ['pk']},
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
-                ('created', models.DateField(auto_now_add=True, null=True)),
-                ('last_updated', models.DateTimeField(auto_now=True, null=True)),
-                ('termination_a_id', models.PositiveIntegerField()),
-                ('termination_b_id', models.PositiveIntegerField()),
-                ('type', models.PositiveSmallIntegerField(blank=True, null=True)),
-                ('status', models.BooleanField(default=True)),
-                ('label', models.CharField(blank=True, max_length=100)),
-                ('color', utilities.fields.ColorField(blank=True, max_length=6)),
-                ('length', models.PositiveSmallIntegerField(blank=True, null=True)),
-                ('length_unit', models.PositiveSmallIntegerField(blank=True, null=True)),
-                ('_abs_length', models.DecimalField(blank=True, decimal_places=4, max_digits=10, null=True)),
-                ('termination_a_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontport', 'rearport', 'circuittermination', 'powerfeed']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
-                ('termination_b_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontport', 'rearport', 'circuittermination', 'powerfeed']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
-            ],
-        ),
-        migrations.AlterUniqueTogether(
-            name='cable',
-            unique_together={('termination_b_type', 'termination_b_id'), ('termination_a_type', 'termination_a_id')},
-        ),
-
-        # Alter console port models
-        migrations.RenameField(
-            model_name='consoleport',
-            old_name='cs_port',
-            new_name='connected_endpoint'
-        ),
-        migrations.AlterField(
-            model_name='consoleport',
-            name='device',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleports', to='dcim.Device'),
-        ),
-        migrations.AlterField(
-            model_name='consoleport',
-            name='connected_endpoint',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_endpoint', to='dcim.ConsoleServerPort'),
-        ),
-        migrations.AlterField(
-            model_name='consoleport',
-            name='connection_status',
-            field=models.NullBooleanField(),
-        ),
-        migrations.AddField(
-            model_name='consoleport',
-            name='cable',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
-        ),
-        migrations.AlterField(
-            model_name='consoleserverport',
-            name='device',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='consoleserverports', to='dcim.Device'),
-        ),
-        migrations.AddField(
-            model_name='consoleserverport',
-            name='cable',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
-        ),
-        migrations.AddField(
-            model_name='consoleserverport',
-            name='connection_status',
-            field=models.NullBooleanField(),
-        ),
-
-        # Alter power port models
-        migrations.RenameField(
-            model_name='powerport',
-            old_name='power_outlet',
-            new_name='connected_endpoint'
-        ),
-        migrations.AlterField(
-            model_name='powerport',
-            name='device',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='powerports', to='dcim.Device'),
-        ),
-        migrations.AlterField(
-            model_name='powerport',
-            name='connected_endpoint',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_endpoint', to='dcim.PowerOutlet'),
-        ),
-        migrations.AlterField(
-            model_name='powerport',
-            name='connection_status',
-            field=models.NullBooleanField(),
-        ),
-        migrations.AddField(
-            model_name='powerport',
-            name='cable',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
-        ),
-        migrations.AlterField(
-            model_name='poweroutlet',
-            name='device',
-            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='poweroutlets', to='dcim.Device'),
-        ),
-        migrations.AddField(
-            model_name='poweroutlet',
-            name='cable',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
-        ),
-        migrations.AddField(
-            model_name='poweroutlet',
-            name='connection_status',
-            field=models.NullBooleanField(),
-        ),
-
-        # Alter the Interface model
-        migrations.AddField(
-            model_name='interface',
-            name='_connected_circuittermination',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='circuits.CircuitTermination'),
-        ),
-        migrations.AddField(
-            model_name='interface',
-            name='_connected_interface',
-            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Interface'),
-        ),
-        migrations.AddField(
-            model_name='interface',
-            name='connection_status',
-            field=models.NullBooleanField(),
-        ),
-        migrations.AddField(
-            model_name='interface',
-            name='cable',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
-        ),
-
-        # Alter front/rear port models
-        migrations.AddField(
-            model_name='frontport',
-            name='cable',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
-        ),
-        migrations.AddField(
-            model_name='rearport',
-            name='cable',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='dcim.Cable'),
-        ),
-
-        # Copy console/power/interface connections as Cables
-        migrations.RunPython(console_connections_to_cables),
-        migrations.RunPython(power_connections_to_cables),
-        migrations.RunPython(interface_connections_to_cables),
-
-        # Delete the InterfaceConnection model and its ContentType
-        migrations.RunPython(delete_interfaceconnection_content_type),
-        migrations.RemoveField(
-            model_name='interfaceconnection',
-            name='interface_a',
-        ),
-        migrations.RemoveField(
-            model_name='interfaceconnection',
-            name='interface_b',
-        ),
-        migrations.DeleteModel(
-            name='InterfaceConnection',
-        ),
-    ]

Некоторые файлы не были показаны из-за большого количества измененных файлов