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

Closes #4817: Standardize device/VM component name field to 64 characters

Jeremy Stretch 5 лет назад
Родитель
Сommit
d03d302eef

+ 1 - 0
docs/release-notes/version-2.9.md

@@ -19,6 +19,7 @@ NetBox v2.9 replaces Django's built-in permissions framework with one that suppo
 * [#4793](https://github.com/netbox-community/netbox/issues/4793) - Add `description` field to device component templates
 * [#4793](https://github.com/netbox-community/netbox/issues/4793) - Add `description` field to device component templates
 * [#4795](https://github.com/netbox-community/netbox/issues/4795) - Add bulk disconnect capability for console and power ports
 * [#4795](https://github.com/netbox-community/netbox/issues/4795) - Add bulk disconnect capability for console and power ports
 * [#4807](https://github.com/netbox-community/netbox/issues/4807) - Add bulk edit ability for device bay templates
 * [#4807](https://github.com/netbox-community/netbox/issues/4807) - Add bulk edit ability for device bay templates
+* [#4817](https://github.com/netbox-community/netbox/issues/4817) - Standardize device/VM component `name` field to 64 characters
 
 
 ### Configuration Changes
 ### Configuration Changes
 
 

+ 68 - 0
netbox/dcim/migrations/0112_standardize_component_name.py

@@ -0,0 +1,68 @@
+# Generated by Django 3.0.6 on 2020-07-02 16:02
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0111_component_template_description'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='consoleport',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='consoleporttemplate',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='consoleserverport',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='consoleserverporttemplate',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='devicebay',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='devicebaytemplate',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='inventoryitem',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='poweroutlet',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='poweroutlettemplate',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='powerport',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+        migrations.AlterField(
+            model_name='powerporttemplate',
+            name='name',
+            field=models.CharField(max_length=64),
+        ),
+    ]

+ 8 - 59
netbox/dcim/models/device_component_templates.py

@@ -27,6 +27,14 @@ __all__ = (
 
 
 
 
 class ComponentTemplateModel(models.Model):
 class ComponentTemplateModel(models.Model):
+    name = models.CharField(
+        max_length=64
+    )
+    _name = NaturalOrderingField(
+        target_field='name',
+        max_length=100,
+        blank=True
+    )
     label = models.CharField(
     label = models.CharField(
         max_length=64,
         max_length=64,
         blank=True,
         blank=True,
@@ -78,14 +86,6 @@ class ConsolePortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='consoleport_templates'
         related_name='consoleport_templates'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=ConsolePortTypeChoices,
         choices=ConsolePortTypeChoices,
@@ -113,14 +113,6 @@ class ConsoleServerPortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='consoleserverport_templates'
         related_name='consoleserverport_templates'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=ConsolePortTypeChoices,
         choices=ConsolePortTypeChoices,
@@ -148,14 +140,6 @@ class PowerPortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='powerport_templates'
         related_name='powerport_templates'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=PowerPortTypeChoices,
         choices=PowerPortTypeChoices,
@@ -197,14 +181,6 @@ class PowerOutletTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='poweroutlet_templates'
         related_name='poweroutlet_templates'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=PowerOutletTypeChoices,
         choices=PowerOutletTypeChoices,
@@ -259,9 +235,6 @@ class InterfaceTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='interface_templates'
         related_name='interface_templates'
     )
     )
-    name = models.CharField(
-        max_length=64
-    )
     _name = NaturalOrderingField(
     _name = NaturalOrderingField(
         target_field='name',
         target_field='name',
         naturalize_function=naturalize_interface,
         naturalize_function=naturalize_interface,
@@ -299,14 +272,6 @@ class FrontPortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='frontport_templates'
         related_name='frontport_templates'
     )
     )
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=PortTypeChoices
         choices=PortTypeChoices
@@ -367,14 +332,6 @@ class RearPortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='rearport_templates'
         related_name='rearport_templates'
     )
     )
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=PortTypeChoices
         choices=PortTypeChoices
@@ -406,14 +363,6 @@ class DeviceBayTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='device_bay_templates'
         related_name='device_bay_templates'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
 
 
     class Meta:
     class Meta:
         ordering = ('device_type', '_name')
         ordering = ('device_type', '_name')

+ 14 - 75
netbox/dcim/models/device_components.py

@@ -36,6 +36,14 @@ __all__ = (
 
 
 
 
 class ComponentModel(models.Model):
 class ComponentModel(models.Model):
+    name = models.CharField(
+        max_length=64
+    )
+    _name = NaturalOrderingField(
+        target_field='name',
+        max_length=100,
+        blank=True
+    )
     label = models.CharField(
     label = models.CharField(
         max_length=64,
         max_length=64,
         blank=True,
         blank=True,
@@ -243,14 +251,6 @@ class ConsolePort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='consoleports'
         related_name='consoleports'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=ConsolePortTypeChoices,
         choices=ConsolePortTypeChoices,
@@ -303,14 +303,6 @@ class ConsoleServerPort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='consoleserverports'
         related_name='consoleserverports'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=ConsolePortTypeChoices,
         choices=ConsolePortTypeChoices,
@@ -356,14 +348,6 @@ class PowerPort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='powerports'
         related_name='powerports'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=PowerPortTypeChoices,
         choices=PowerPortTypeChoices,
@@ -517,14 +501,6 @@ class PowerOutlet(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='poweroutlets'
         related_name='poweroutlets'
     )
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=PowerOutletTypeChoices,
         choices=PowerOutletTypeChoices,
@@ -584,15 +560,6 @@ class PowerOutlet(CableTermination, ComponentModel):
 #
 #
 
 
 class BaseInterface(models.Model):
 class BaseInterface(models.Model):
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        naturalize_function=naturalize_interface,
-        max_length=100,
-        blank=True
-    )
     enabled = models.BooleanField(
     enabled = models.BooleanField(
         default=True
         default=True
     )
     )
@@ -629,6 +596,12 @@ class Interface(CableTermination, ComponentModel, BaseInterface):
         null=True,
         null=True,
         blank=True
         blank=True
     )
     )
+    _name = NaturalOrderingField(
+        target_field='name',
+        naturalize_function=naturalize_interface,
+        max_length=100,
+        blank=True
+    )
     _connected_interface = models.OneToOneField(
     _connected_interface = models.OneToOneField(
         to='self',
         to='self',
         on_delete=models.SET_NULL,
         on_delete=models.SET_NULL,
@@ -839,14 +812,6 @@ class FrontPort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='frontports'
         related_name='frontports'
     )
     )
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=PortTypeChoices
         choices=PortTypeChoices
@@ -912,14 +877,6 @@ class RearPort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='rearports'
         related_name='rearports'
     )
     )
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
     type = models.CharField(
         max_length=50,
         max_length=50,
         choices=PortTypeChoices
         choices=PortTypeChoices
@@ -964,15 +921,6 @@ class DeviceBay(ComponentModel):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='device_bays'
         related_name='device_bays'
     )
     )
-    name = models.CharField(
-        max_length=50,
-        verbose_name='Name'
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     installed_device = models.OneToOneField(
     installed_device = models.OneToOneField(
         to='dcim.Device',
         to='dcim.Device',
         on_delete=models.SET_NULL,
         on_delete=models.SET_NULL,
@@ -1045,15 +993,6 @@ class InventoryItem(ComponentModel):
         blank=True,
         blank=True,
         null=True
         null=True
     )
     )
-    name = models.CharField(
-        max_length=50,
-        verbose_name='Name'
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     manufacturer = models.ForeignKey(
     manufacturer = models.ForeignKey(
         to='dcim.Manufacturer',
         to='dcim.Manufacturer',
         on_delete=models.PROTECT,
         on_delete=models.PROTECT,

+ 11 - 0
netbox/virtualization/models.py

@@ -9,7 +9,9 @@ from dcim.choices import InterfaceModeChoices
 from dcim.models import BaseInterface, Device
 from dcim.models import BaseInterface, Device
 from extras.models import ConfigContextModel, CustomFieldModel, ObjectChange, TaggedItem
 from extras.models import ConfigContextModel, CustomFieldModel, ObjectChange, TaggedItem
 from extras.utils import extras_features
 from extras.utils import extras_features
+from utilities.fields import NaturalOrderingField
 from utilities.models import ChangeLoggedModel
 from utilities.models import ChangeLoggedModel
+from utilities.ordering import naturalize_interface
 from utilities.query_functions import CollateAsChar
 from utilities.query_functions import CollateAsChar
 from utilities.querysets import RestrictedQuerySet
 from utilities.querysets import RestrictedQuerySet
 from utilities.utils import serialize_object
 from utilities.utils import serialize_object
@@ -387,6 +389,15 @@ class VMInterface(BaseInterface):
         on_delete=models.CASCADE,
         on_delete=models.CASCADE,
         related_name='interfaces'
         related_name='interfaces'
     )
     )
+    name = models.CharField(
+        max_length=64
+    )
+    _name = NaturalOrderingField(
+        target_field='name',
+        naturalize_function=naturalize_interface,
+        max_length=100,
+        blank=True
+    )
     description = models.CharField(
     description = models.CharField(
         max_length=200,
         max_length=200,
         blank=True
         blank=True