From 964ae56d34b1f97bc147224c9730dcd80ad9a938 Mon Sep 17 00:00:00 2001 From: Jason Novinger Date: Tue, 29 Apr 2025 12:16:05 -0500 Subject: [PATCH] Fixes #17319: Arrange device and module type fields behind tab in component template forms --- netbox/dcim/forms/model_forms.py | 63 ++++++++++++++++++++++-------- netbox/dcim/forms/object_create.py | 10 ++++- 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 5a3a27d25..92ddc18fd 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -899,7 +899,7 @@ class ComponentTemplateForm(forms.ModelForm): class ModularComponentTemplateForm(ComponentTemplateForm): device_type = DynamicModelChoiceField( label=_('Device type'), - queryset=DeviceType.objects.all().all(), + queryset=DeviceType.objects.all(), required=False, context={ 'parent': 'manufacturer', @@ -914,6 +914,16 @@ class ModularComponentTemplateForm(ComponentTemplateForm): } ) + fieldsets = ( + FieldSet( + TabbedGroups( + FieldSet('device_type', name=_('Device Type')), + FieldSet('module_type', name=_('Module Type')), + ), + 'name', 'label', 'type', 'description' + ), + ) + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -930,10 +940,6 @@ class ModularComponentTemplateForm(ComponentTemplateForm): class ConsolePortTemplateForm(ModularComponentTemplateForm): - fieldsets = ( - FieldSet('device_type', 'module_type', 'name', 'label', 'type', 'description'), - ) - class Meta: model = ConsolePortTemplate fields = [ @@ -942,10 +948,6 @@ class ConsolePortTemplateForm(ModularComponentTemplateForm): class ConsoleServerPortTemplateForm(ModularComponentTemplateForm): - fieldsets = ( - FieldSet('device_type', 'module_type', 'name', 'label', 'type', 'description'), - ) - class Meta: model = ConsoleServerPortTemplate fields = [ @@ -956,7 +958,11 @@ class ConsoleServerPortTemplateForm(ModularComponentTemplateForm): class PowerPortTemplateForm(ModularComponentTemplateForm): fieldsets = ( FieldSet( - 'device_type', 'module_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', + TabbedGroups( + FieldSet('device_type', name=_('Device Type')), + FieldSet('module_type', name=_('Module Type')), + ), + 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', ), ) @@ -978,7 +984,13 @@ class PowerOutletTemplateForm(ModularComponentTemplateForm): ) fieldsets = ( - FieldSet('device_type', 'module_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description'), + FieldSet( + TabbedGroups( + FieldSet('device_type', name=_('Device Type')), + FieldSet('module_type', name=_('Module Type')), + ), + 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', + ), ) class Meta: @@ -1001,7 +1013,11 @@ class InterfaceTemplateForm(ModularComponentTemplateForm): fieldsets = ( FieldSet( - 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description', 'bridge', + TabbedGroups( + FieldSet('device_type', name=_('Device Type')), + FieldSet('module_type', name=_('Module Type')), + ), + 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description', 'bridge', ), FieldSet('poe_mode', 'poe_type', name=_('PoE')), FieldSet('rf_role', name=_('Wireless')), @@ -1028,8 +1044,11 @@ class FrontPortTemplateForm(ModularComponentTemplateForm): fieldsets = ( FieldSet( - 'device_type', 'module_type', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', - 'description', + TabbedGroups( + FieldSet('device_type', name=_('Device Type')), + FieldSet('module_type', name=_('Module Type')), + ), + 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', ), ) @@ -1043,7 +1062,13 @@ class FrontPortTemplateForm(ModularComponentTemplateForm): class RearPortTemplateForm(ModularComponentTemplateForm): fieldsets = ( - FieldSet('device_type', 'module_type', 'name', 'label', 'type', 'color', 'positions', 'description'), + FieldSet( + TabbedGroups( + FieldSet('device_type', name=_('Device Type')), + FieldSet('module_type', name=_('Module Type')), + ), + 'name', 'label', 'type', 'color', 'positions', 'description', + ), ) class Meta: @@ -1055,7 +1080,13 @@ class RearPortTemplateForm(ModularComponentTemplateForm): class ModuleBayTemplateForm(ModularComponentTemplateForm): fieldsets = ( - FieldSet('device_type', 'module_type', 'name', 'label', 'position', 'description'), + FieldSet( + TabbedGroups( + FieldSet('device_type', name=_('Device Type')), + FieldSet('module_type', name=_('Module Type')), + ), + 'name', 'label', 'position', 'description', + ), ) class Meta: diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index 1e898a386..bcf91c547 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -4,7 +4,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.models import * from netbox.forms import NetBoxModelForm from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField -from utilities.forms.rendering import FieldSet +from utilities.forms.rendering import FieldSet, TabbedGroups from utilities.forms.widgets import APISelect from . import model_forms @@ -118,7 +118,13 @@ class FrontPortTemplateCreateForm(ComponentCreateForm, model_forms.FrontPortTemp # Override fieldsets from FrontPortTemplateForm to omit rear_port_position fieldsets = ( - FieldSet('device_type', 'module_type', 'name', 'label', 'type', 'color', 'rear_port', 'description'), + FieldSet( + TabbedGroups( + FieldSet('device_type', name=_('Device Type')), + FieldSet('module_type', name=_('Module Type')), + ), + 'name', 'label', 'type', 'color', 'rear_port', 'description', + ), ) class Meta(model_forms.FrontPortTemplateForm.Meta):