Selaa lähdekoodia

Closes #2601: Added a description field to pass-through ports

Jeremy Stretch 7 vuotta sitten
vanhempi
commit
d59be2912e

+ 1 - 0
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

+ 2 - 2
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):

+ 9 - 3
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):

+ 2 - 0
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')),
             ],

+ 12 - 2
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,
         )
 
 

+ 2 - 2
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"
 
 

+ 2 - 0
netbox/templates/dcim/device.html

@@ -681,6 +681,7 @@
                                     <th>Type</th>
                                     <th>Rear Port</th>
                                     <th>Position</th>
+                                    <th>Description</th>
                                     <th>Connected Cable</th>
                                     <th></th>
                                 </tr>
@@ -733,6 +734,7 @@
                                     <th>Name</th>
                                     <th>Type</th>
                                     <th>Positions</th>
+                                    <th>Description</th>
                                     <th>Connected Cable</th>
                                     <th></th>
                                 </tr>

+ 4 - 0
netbox/templates/dcim/inc/frontport.html

@@ -1,3 +1,4 @@
+{% load helpers %}
 <tr class="frontport{% if frontport.cable.status %} success{% elif frontport.cable %} info{% endif %}">
 
     {# Checkbox #}
@@ -19,6 +20,9 @@
     <td>{{ frontport.rear_port }}</td>
     <td>{{ frontport.rear_port_position }}</td>
 
+    {# Description #}
+    <td>{{ frontport.description|placeholder }}</td>
+
     {# Cable #}
     <td>
         {% if frontport.cable %}

+ 4 - 0
netbox/templates/dcim/inc/rearport.html

@@ -1,3 +1,4 @@
+{% load helpers %}
 <tr class="rearport{% if rearport.cable.status %} success{% elif rearport.cable %} info{% endif %}">
 
     {# Checkbox #}
@@ -18,6 +19,9 @@
     {# Positions #}
     <td>{{ rearport.positions }}</td>
 
+    {# Description #}
+    <td>{{ rearport.description|placeholder }}</td>
+
     {# Cable #}
     <td>
         {% if rearport.cable %}