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

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
 * [#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
+* [#4817](https://github.com/netbox-community/netbox/issues/4817) - Standardize device/VM component `name` field to 64 characters
 
 ### 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):
+    name = models.CharField(
+        max_length=64
+    )
+    _name = NaturalOrderingField(
+        target_field='name',
+        max_length=100,
+        blank=True
+    )
     label = models.CharField(
         max_length=64,
         blank=True,
@@ -78,14 +86,6 @@ class ConsolePortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         related_name='consoleport_templates'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=ConsolePortTypeChoices,
@@ -113,14 +113,6 @@ class ConsoleServerPortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         related_name='consoleserverport_templates'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=ConsolePortTypeChoices,
@@ -148,14 +140,6 @@ class PowerPortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         related_name='powerport_templates'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=PowerPortTypeChoices,
@@ -197,14 +181,6 @@ class PowerOutletTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         related_name='poweroutlet_templates'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=PowerOutletTypeChoices,
@@ -259,9 +235,6 @@ class InterfaceTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         related_name='interface_templates'
     )
-    name = models.CharField(
-        max_length=64
-    )
     _name = NaturalOrderingField(
         target_field='name',
         naturalize_function=naturalize_interface,
@@ -299,14 +272,6 @@ class FrontPortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         related_name='frontport_templates'
     )
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=PortTypeChoices
@@ -367,14 +332,6 @@ class RearPortTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         related_name='rearport_templates'
     )
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=PortTypeChoices
@@ -406,14 +363,6 @@ class DeviceBayTemplate(ComponentTemplateModel):
         on_delete=models.CASCADE,
         related_name='device_bay_templates'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
 
     class Meta:
         ordering = ('device_type', '_name')

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

@@ -36,6 +36,14 @@ __all__ = (
 
 
 class ComponentModel(models.Model):
+    name = models.CharField(
+        max_length=64
+    )
+    _name = NaturalOrderingField(
+        target_field='name',
+        max_length=100,
+        blank=True
+    )
     label = models.CharField(
         max_length=64,
         blank=True,
@@ -243,14 +251,6 @@ class ConsolePort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         related_name='consoleports'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=ConsolePortTypeChoices,
@@ -303,14 +303,6 @@ class ConsoleServerPort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         related_name='consoleserverports'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=ConsolePortTypeChoices,
@@ -356,14 +348,6 @@ class PowerPort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         related_name='powerports'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=PowerPortTypeChoices,
@@ -517,14 +501,6 @@ class PowerOutlet(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         related_name='poweroutlets'
     )
-    name = models.CharField(
-        max_length=50
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=PowerOutletTypeChoices,
@@ -584,15 +560,6 @@ class PowerOutlet(CableTermination, ComponentModel):
 #
 
 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(
         default=True
     )
@@ -629,6 +596,12 @@ class Interface(CableTermination, ComponentModel, BaseInterface):
         null=True,
         blank=True
     )
+    _name = NaturalOrderingField(
+        target_field='name',
+        naturalize_function=naturalize_interface,
+        max_length=100,
+        blank=True
+    )
     _connected_interface = models.OneToOneField(
         to='self',
         on_delete=models.SET_NULL,
@@ -839,14 +812,6 @@ class FrontPort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         related_name='frontports'
     )
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=PortTypeChoices
@@ -912,14 +877,6 @@ class RearPort(CableTermination, ComponentModel):
         on_delete=models.CASCADE,
         related_name='rearports'
     )
-    name = models.CharField(
-        max_length=64
-    )
-    _name = NaturalOrderingField(
-        target_field='name',
-        max_length=100,
-        blank=True
-    )
     type = models.CharField(
         max_length=50,
         choices=PortTypeChoices
@@ -964,15 +921,6 @@ class DeviceBay(ComponentModel):
         on_delete=models.CASCADE,
         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(
         to='dcim.Device',
         on_delete=models.SET_NULL,
@@ -1045,15 +993,6 @@ class InventoryItem(ComponentModel):
         blank=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(
         to='dcim.Manufacturer',
         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 extras.models import ConfigContextModel, CustomFieldModel, ObjectChange, TaggedItem
 from extras.utils import extras_features
+from utilities.fields import NaturalOrderingField
 from utilities.models import ChangeLoggedModel
+from utilities.ordering import naturalize_interface
 from utilities.query_functions import CollateAsChar
 from utilities.querysets import RestrictedQuerySet
 from utilities.utils import serialize_object
@@ -387,6 +389,15 @@ class VMInterface(BaseInterface):
         on_delete=models.CASCADE,
         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(
         max_length=200,
         blank=True