From d59be2912e68e982e18197d7e3b521c6957ba30a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 20 Nov 2018 21:28:19 -0500 Subject: [PATCH] Closes #2601: Added a description field to pass-through ports --- CHANGELOG.md | 1 + netbox/dcim/api/serializers.py | 4 ++-- netbox/dcim/forms.py | 12 +++++++++--- netbox/dcim/migrations/0065_front_rear_ports.py | 2 ++ netbox/dcim/models.py | 14 ++++++++++++-- netbox/dcim/tables.py | 4 ++-- netbox/templates/dcim/device.html | 2 ++ netbox/templates/dcim/inc/frontport.html | 4 ++++ netbox/templates/dcim/inc/rearport.html | 4 ++++ 9 files changed, 38 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6af71c070..9198b931d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ NetBox now supports modeling physical cables for console, power, and interface c * [#2585](https://github.com/digitalocean/netbox/issues/2585) - Prevent cable connections that include a virtual interface * [#2586](https://github.com/digitalocean/netbox/issues/2586) - Added tests for the Cable model's clean() method * [#2593](https://github.com/digitalocean/netbox/issues/2593) - Fix toggling of connected cable's status +* [#2601](https://github.com/digitalocean/netbox/issues/2601) - Added a `description` field to pass-through ports * [#2602](https://github.com/digitalocean/netbox/issues/2602) - Return HTTP 204 when no new IPs/prefixes are available for provisioning ## API Changes diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 75a869490..7b38d718a 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -416,7 +416,7 @@ class RearPortSerializer(ValidatedModelSerializer): class Meta: model = RearPort - fields = ['id', 'device', 'name', 'type', 'positions', 'cable', 'tags'] + fields = ['id', 'device', 'name', 'type', 'positions', 'description', 'cable', 'tags'] class FrontPortRearPortSerializer(WritableNestedSerializer): @@ -439,7 +439,7 @@ class FrontPortSerializer(ValidatedModelSerializer): class Meta: model = FrontPort - fields = ['id', 'device', 'name', 'type', 'rear_port', 'rear_port_position', 'cable', 'tags'] + fields = ['id', 'device', 'name', 'type', 'rear_port', 'rear_port_position', 'description', 'cable', 'tags'] class DeviceBaySerializer(TaggitSerializer, ValidatedModelSerializer): diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 27f03ef3b..f0521ef1e 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1685,13 +1685,13 @@ class FrontPortForm(BootstrapMixin, forms.ModelForm): class Meta: model = FrontPort - fields = ['device', 'name', 'type', 'rear_port', 'rear_port_position', 'tags'] + fields = ['device', 'name', 'type', 'rear_port', 'rear_port_position', 'description', 'tags'] widgets = { 'device': forms.HiddenInput(), } -# TODO: Merge with FrontPortTemplateCreateForm to remove duplicate logic +# TODO: Merge with FrontPortTemplateCreateForm to remove duplicate logic class FrontPortCreateForm(ComponentForm): name_pattern = ExpandableNameField( label='Name' @@ -1704,6 +1704,9 @@ class FrontPortCreateForm(ComponentForm): label='Rear ports', help_text='Select one rear port assignment for each front port being created.' ) + description = forms.CharField( + required=False + ) def __init__(self, *args, **kwargs): @@ -1771,7 +1774,7 @@ class RearPortForm(BootstrapMixin, forms.ModelForm): class Meta: model = RearPort - fields = ['device', 'name', 'type', 'positions', 'tags'] + fields = ['device', 'name', 'type', 'positions', 'description', 'tags'] widgets = { 'device': forms.HiddenInput(), } @@ -1790,6 +1793,9 @@ class RearPortCreateForm(ComponentForm): initial=1, help_text='The number of front ports which may be mapped to each rear port' ) + description = forms.CharField( + required=False + ) class RearPortBulkRenameForm(BulkRenameForm): diff --git a/netbox/dcim/migrations/0065_front_rear_ports.py b/netbox/dcim/migrations/0065_front_rear_ports.py index d647ff8f2..a7fe9eab9 100644 --- a/netbox/dcim/migrations/0065_front_rear_ports.py +++ b/netbox/dcim/migrations/0065_front_rear_ports.py @@ -19,6 +19,7 @@ class Migration(migrations.Migration): ('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={ @@ -44,6 +45,7 @@ class Migration(migrations.Migration): ('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')), ], diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index d1df9633d..7d0d16c54 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -2158,11 +2158,15 @@ class FrontPort(CableTermination, ComponentModel): default=1, validators=[MinValueValidator(1), MaxValueValidator(64)] ) + description = models.CharField( + max_length=100, + blank=True + ) objects = DeviceComponentManager() tags = TaggableManager() - csv_headers = ['device', 'name', 'type', 'rear_port', 'rear_port_position'] + csv_headers = ['device', 'name', 'type', 'rear_port', 'rear_port_position', 'description'] class Meta: ordering = ['device', 'name'] @@ -2181,6 +2185,7 @@ class FrontPort(CableTermination, ComponentModel): self.get_type_display(), self.rear_port.name, self.rear_port_position, + self.description, ) def clean(self): @@ -2219,11 +2224,15 @@ class RearPort(CableTermination, ComponentModel): default=1, validators=[MinValueValidator(1), MaxValueValidator(64)] ) + description = models.CharField( + max_length=100, + blank=True + ) objects = DeviceComponentManager() tags = TaggableManager() - csv_headers = ['device', 'name', 'type', 'positions'] + csv_headers = ['device', 'name', 'type', 'positions', 'description'] class Meta: ordering = ['device', 'name'] @@ -2238,6 +2247,7 @@ class RearPort(CableTermination, ComponentModel): self.name, self.get_type_display(), self.positions, + self.description, ) diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 547b0721d..aa5f77cc0 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -594,7 +594,7 @@ class FrontPortTable(BaseTable): class Meta(BaseTable.Meta): model = FrontPort - fields = ('name', 'type', 'rear_port', 'rear_port_position') + fields = ('name', 'type', 'rear_port', 'rear_port_position', 'description') empty_text = "None" @@ -602,7 +602,7 @@ class RearPortTable(BaseTable): class Meta(BaseTable.Meta): model = RearPort - fields = ('name', 'type', 'positions') + fields = ('name', 'type', 'positions', 'description') empty_text = "None" diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 16cc749d1..860a3aa44 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -681,6 +681,7 @@ Type Rear Port Position + Description Connected Cable @@ -733,6 +734,7 @@ Name Type Positions + Description Connected Cable diff --git a/netbox/templates/dcim/inc/frontport.html b/netbox/templates/dcim/inc/frontport.html index 4ee74729e..568eaa38e 100644 --- a/netbox/templates/dcim/inc/frontport.html +++ b/netbox/templates/dcim/inc/frontport.html @@ -1,3 +1,4 @@ +{% load helpers %} {# Checkbox #} @@ -19,6 +20,9 @@ {{ frontport.rear_port }} {{ frontport.rear_port_position }} + {# Description #} + {{ frontport.description|placeholder }} + {# Cable #} {% if frontport.cable %} diff --git a/netbox/templates/dcim/inc/rearport.html b/netbox/templates/dcim/inc/rearport.html index 1a93fcf49..77ddbb78a 100644 --- a/netbox/templates/dcim/inc/rearport.html +++ b/netbox/templates/dcim/inc/rearport.html @@ -1,3 +1,4 @@ +{% load helpers %} {# Checkbox #} @@ -18,6 +19,9 @@ {# Positions #} {{ rearport.positions }} + {# Description #} + {{ rearport.description|placeholder }} + {# Cable #} {% if rearport.cable %}