From d03d302eef3819db64cad8ae74dc5255647045f6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 2 Jul 2020 12:08:19 -0400 Subject: [PATCH] Closes #4817: Standardize device/VM component name field to 64 characters --- docs/release-notes/version-2.9.md | 1 + .../0112_standardize_component_name.py | 68 ++++++++++++++ .../dcim/models/device_component_templates.py | 67 ++------------ netbox/dcim/models/device_components.py | 89 +++---------------- netbox/virtualization/models.py | 11 +++ 5 files changed, 102 insertions(+), 134 deletions(-) create mode 100644 netbox/dcim/migrations/0112_standardize_component_name.py diff --git a/docs/release-notes/version-2.9.md b/docs/release-notes/version-2.9.md index c0d51afc2..c13d45f95 100644 --- a/docs/release-notes/version-2.9.md +++ b/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 diff --git a/netbox/dcim/migrations/0112_standardize_component_name.py b/netbox/dcim/migrations/0112_standardize_component_name.py new file mode 100644 index 000000000..1e12b1bf2 --- /dev/null +++ b/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), + ), + ] diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 626363da1..a7b76fdde 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/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') diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index aea34e73e..6a2591916 100644 --- a/netbox/dcim/models/device_components.py +++ b/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, diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 5d74f8468..258183bff 100644 --- a/netbox/virtualization/models.py +++ b/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