Przeglądaj źródła

Show termination type on cable view regardless of image; restore bulk form help text

Jeremy Stretch 5 godzin temu
rodzic
commit
94bcf832c8

+ 9 - 5
netbox/dcim/forms/bulk_create.py

@@ -50,7 +50,7 @@ class DeviceBulkAddComponentForm(BackgroundJobMixin, ChangelogMessageMixin, Cust
 
 
 class ConsolePortBulkCreateForm(
-    form_from_model(ConsolePort, ['type', 'speed', 'mark_connected']),
+    form_from_model(ConsolePort, ['speed', 'mark_connected']),
     DeviceBulkAddComponentForm
 ):
     model = ConsolePort
@@ -58,12 +58,13 @@ class ConsolePortBulkCreateForm(
         label=_('Type'),
         choices=add_blank_choice(ConsolePortTypeChoices),
         required=False,
+        help_text=_('Physical port type'),
     )
     field_order = ('name', 'label', 'type', 'mark_connected', 'description', 'tags')
 
 
 class ConsoleServerPortBulkCreateForm(
-    form_from_model(ConsoleServerPort, ['type', 'speed', 'mark_connected']),
+    form_from_model(ConsoleServerPort, ['speed', 'mark_connected']),
     DeviceBulkAddComponentForm
 ):
     model = ConsoleServerPort
@@ -71,12 +72,13 @@ class ConsoleServerPortBulkCreateForm(
         label=_('Type'),
         choices=add_blank_choice(ConsolePortTypeChoices),
         required=False,
+        help_text=_('Physical port type'),
     )
     field_order = ('name', 'label', 'type', 'speed', 'description', 'tags')
 
 
 class PowerPortBulkCreateForm(
-    form_from_model(PowerPort, ['type', 'maximum_draw', 'allocated_draw', 'mark_connected']),
+    form_from_model(PowerPort, ['maximum_draw', 'allocated_draw', 'mark_connected']),
     DeviceBulkAddComponentForm
 ):
     model = PowerPort
@@ -84,12 +86,13 @@ class PowerPortBulkCreateForm(
         label=_('Type'),
         choices=add_blank_choice(PowerPortTypeChoices),
         required=False,
+        help_text=_('Physical port type'),
     )
     field_order = ('name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', 'tags')
 
 
 class PowerOutletBulkCreateForm(
-    form_from_model(PowerOutlet, ['type', 'status', 'color', 'feed_leg', 'mark_connected']),
+    form_from_model(PowerOutlet, ['status', 'color', 'feed_leg', 'mark_connected']),
     DeviceBulkAddComponentForm
 ):
     model = PowerOutlet
@@ -97,6 +100,7 @@ class PowerOutletBulkCreateForm(
         label=_('Type'),
         choices=add_blank_choice(PowerOutletTypeChoices),
         required=False,
+        help_text=_('Physical port type'),
     )
     field_order = (
         'name', 'label', 'type', 'status', 'color', 'feed_leg', 'mark_connected',
@@ -152,7 +156,7 @@ class InterfaceBulkCreateForm(
 
 
 class RearPortBulkCreateForm(
-    form_from_model(RearPort, ['type', 'color', 'positions', 'mark_connected']),
+    form_from_model(RearPort, ['color', 'positions', 'mark_connected']),
     DeviceBulkAddComponentForm
 ):
     model = RearPort

+ 14 - 10
netbox/dcim/forms/bulk_edit.py

@@ -1721,12 +1721,13 @@ class ComponentBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm):
 
 class ConsolePortBulkEditForm(
     ComponentBulkEditForm,
-    form_from_model(ConsolePort, ['label', 'type', 'speed', 'mark_connected', 'description'])
+    form_from_model(ConsolePort, ['label', 'speed', 'mark_connected', 'description'])
 ):
     type = ChoiceField(
         label=_('Type'),
         choices=add_blank_choice(ConsolePortTypeChoices),
-        required=False
+        required=False,
+        help_text=_('Physical port type')
     )
     mark_connected = forms.NullBooleanField(
         label=_('Mark connected'),
@@ -1743,12 +1744,13 @@ class ConsolePortBulkEditForm(
 
 class ConsoleServerPortBulkEditForm(
     ComponentBulkEditForm,
-    form_from_model(ConsoleServerPort, ['label', 'type', 'speed', 'mark_connected', 'description'])
+    form_from_model(ConsoleServerPort, ['label', 'speed', 'mark_connected', 'description'])
 ):
     type = ChoiceField(
         label=_('Type'),
         choices=add_blank_choice(ConsolePortTypeChoices),
-        required=False
+        required=False,
+        help_text=_('Physical port type')
     )
     mark_connected = forms.NullBooleanField(
         label=_('Mark connected'),
@@ -1765,12 +1767,13 @@ class ConsoleServerPortBulkEditForm(
 
 class PowerPortBulkEditForm(
     ComponentBulkEditForm,
-    form_from_model(PowerPort, ['label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description'])
+    form_from_model(PowerPort, ['label', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description'])
 ):
     type = ChoiceField(
         label=_('Type'),
         choices=add_blank_choice(PowerPortTypeChoices),
-        required=False
+        required=False,
+        help_text=_('Physical port type')
     )
     mark_connected = forms.NullBooleanField(
         label=_('Mark connected'),
@@ -1790,13 +1793,14 @@ class PowerOutletBulkEditForm(
     ComponentBulkEditForm,
     form_from_model(
         PowerOutlet,
-        ['label', 'type', 'status', 'color', 'feed_leg', 'power_port', 'mark_connected', 'description']
+        ['label', 'status', 'color', 'feed_leg', 'power_port', 'mark_connected', 'description']
     )
 ):
     type = ChoiceField(
         label=_('Type'),
         choices=add_blank_choice(PowerOutletTypeChoices),
-        required=False
+        required=False,
+        help_text=_('Physical port type')
     )
     mark_connected = forms.NullBooleanField(
         label=_('Mark connected'),
@@ -2128,7 +2132,7 @@ class InterfaceBulkEditForm(
 
 class FrontPortBulkEditForm(
     ComponentBulkEditForm,
-    form_from_model(FrontPort, ['label', 'type', 'color', 'mark_connected', 'description'])
+    form_from_model(FrontPort, ['label', 'color', 'mark_connected', 'description'])
 ):
     type = ChoiceField(
         label=_('Type'),
@@ -2150,7 +2154,7 @@ class FrontPortBulkEditForm(
 
 class RearPortBulkEditForm(
     ComponentBulkEditForm,
-    form_from_model(RearPort, ['label', 'type', 'color', 'mark_connected', 'description'])
+    form_from_model(RearPort, ['label', 'color', 'mark_connected', 'description'])
 ):
     type = ChoiceField(
         label=_('Type'),

+ 21 - 0
netbox/dcim/tests/test_views.py

@@ -12,6 +12,7 @@ from django.contrib.contenttypes.models import ContentType
 from django.contrib.messages import get_messages
 from django.db import connection
 from django.http import QueryDict, StreamingHttpResponse
+from django.templatetags.static import static
 from django.test import override_settings, tag
 from django.test.utils import CaptureQueriesContext
 from django.urls import reverse
@@ -5681,6 +5682,26 @@ class CableTestCase(
             [(1, interfaces[1]), (2, interfaces[0])]
         )
 
+    @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[])
+    def test_termination_type_images(self):
+        """Each side shows its termination type, with a connector image only where one exists."""
+        power_port = PowerPort.objects.create(
+            device=Device.objects.get(name='Device 2'), name='Power Port 1', type=PowerPortTypeChoices.TYPE_IEC_C14
+        )
+        power_outlet = PowerOutlet.objects.create(
+            device=Device.objects.get(name='Device 3'), name='Power Outlet 1', type=PowerOutletTypeChoices.TYPE_DC
+        )
+        cable = Cable(a_terminations=[power_port], b_terminations=[power_outlet])
+        cable.save()
+
+        response = self.client.get(cable.get_absolute_url())
+        self.assertHttpStatus(response, 200)
+        content = response.content.decode()
+        self.assertIn(static(power_port.get_type_image()), content)
+        self.assertIn(str(power_port.get_type_display()), content)
+        self.assertIsNone(power_outlet.get_type_image())
+        self.assertIn(str(power_outlet.get_type_display()), content)
+
 
 #
 # Connections

+ 1 - 1
netbox/templates/dcim/inc/cable_termination.html

@@ -31,7 +31,7 @@
           {% endfor %}
         </td>
       </tr>
-      {% if terminations.0.get_type_image %}
+      {% if terminations.0.type %}
         <tr>
           <th scope="row">{% trans "Type" %}</th>
           <td>

+ 2 - 2
scripts/generate_connector_images.py

@@ -11,9 +11,9 @@ so relative physical size is not conveyed. Contacts too small to read at icon si
 Usage: python scripts/generate_connector_images.py
 """
 import math
-from pathlib import Path
+import pathlib
 
-OUTPUT_DIR = Path(__file__).resolve().parent.parent / 'netbox' / 'project-static' / 'img' / 'connectors'
+OUTPUT_DIR = pathlib.Path(__file__).resolve().parent.parent / 'netbox' / 'project-static' / 'img' / 'connectors'
 SIZE = 64          # Frame size (px)
 CONTENT = 56       # Size of the face's longest dimension within the frame
 OUTLINE = 3        # Stroke width of face outlines