From c84f0de8f85abbc37600e5d6d32cdd7c47d49ac5 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Sat, 18 Feb 2023 15:32:26 -0500 Subject: [PATCH] #11625: Employ HTMX form rendering for device & VM interfaces --- netbox/core/forms/model_forms.py | 17 +- netbox/dcim/forms/common.py | 15 ++ netbox/dcim/forms/model_forms.py | 7 + netbox/netbox/views/generic/object_views.py | 6 + netbox/project-static/dist/netbox.js | Bin 380935 -> 379494 bytes netbox/project-static/dist/netbox.js.map | Bin 353697 -> 352299 bytes netbox/project-static/src/forms/index.ts | 3 +- netbox/project-static/src/forms/vlanTags.ts | 148 ------------------ netbox/templates/dcim/interface_edit.html | 101 ------------ netbox/templates/htmx/form.html | 2 +- netbox/utilities/forms/utils.py | 16 ++ netbox/utilities/templatetags/form_helpers.py | 7 +- netbox/virtualization/forms/model_forms.py | 9 ++ 13 files changed, 66 insertions(+), 265 deletions(-) delete mode 100644 netbox/project-static/src/forms/vlanTags.ts delete mode 100644 netbox/templates/dcim/interface_edit.html diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index e9cc962cd..464c3eb47 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -5,7 +5,7 @@ from django import forms from core.models import * from netbox.forms import NetBoxModelForm from netbox.registry import registry -from utilities.forms import CommentField +from utilities.forms import CommentField, get_field_value __all__ = ( 'DataSourceForm', @@ -44,7 +44,7 @@ class DataSourceForm(NetBoxModelForm): ] if self.backend_fields: fieldsets.append( - ('Backend', self.backend_fields) + ('Backend Parameters', self.backend_fields) ) return fieldsets @@ -52,16 +52,11 @@ class DataSourceForm(NetBoxModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - backend_classes = registry['data_backends'] - - if self.is_bound and self.data.get('type') in backend_classes: - type_ = self.data['type'] - elif self.initial and self.initial.get('type') in backend_classes: - type_ = self.initial['type'] - else: - type_ = self.fields['type'].initial - backend = backend_classes.get(type_) + # Determine the selected backend type + backend_type = get_field_value(self, 'type') + backend = registry['data_backends'].get(backend_type) + # Add backend-specific form fields self.backend_fields = [] for name, form_field in backend.parameters.items(): field_name = f'backend_{name}' diff --git a/netbox/dcim/forms/common.py b/netbox/dcim/forms/common.py index a2243ce2d..f047d621b 100644 --- a/netbox/dcim/forms/common.py +++ b/netbox/dcim/forms/common.py @@ -3,6 +3,7 @@ from django.utils.translation import gettext as _ from dcim.choices import * from dcim.constants import * +from utilities.forms.utils import get_field_value __all__ = ( 'InterfaceCommonForm', @@ -23,6 +24,20 @@ class InterfaceCommonForm(forms.Form): label=_('MTU') ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Determine the selected 802.1Q mode + interface_mode = get_field_value(self, 'mode') + + # Delete VLAN tagging fields which are not relevant for the selected mode + if interface_mode in (InterfaceModeChoices.MODE_ACCESS, InterfaceModeChoices.MODE_TAGGED_ALL): + del self.fields['tagged_vlans'] + elif not interface_mode: + del self.fields['vlan_group'] + del self.fields['untagged_vlan'] + del self.fields['tagged_vlans'] + def clean(self): super().clean() diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 2e7ca0d4b..34f91bbe8 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1367,6 +1367,13 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): ] widgets = { 'speed': SelectSpeedWidget(), + 'mode': forms.Select( + attrs={ + 'hx-get': '.', + 'hx-include': '#form_fields input', + 'hx-target': '#form_fields', + } + ), } labels = { 'mode': '802.1Q Mode', diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 2dff8b274..1ba789cf1 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -431,6 +431,12 @@ class ComponentCreateView(GetReturnURLMixin, BaseObjectView): form = self.initialize_form(request) instance = self.alter_object(self.queryset.model(), request) + # If this is an HTMX request, return only the rendered form HTML + if is_htmx(request): + return render(request, 'htmx/form.html', { + 'form': form, + }) + return render(request, self.template_name, { 'object': instance, 'form': form, diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index e5793c1282d63d16d4b6e1eb8cf2ea7e3be55c7a..d0058eae95429ee31dd23e08aa909162466a1ffe 100644 GIT binary patch delta 47229 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 M1k@Xz6JF*210$wrmH+?% delta 48863 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 IH{O5z1-EB~DgXcg diff --git a/netbox/project-static/src/forms/index.ts b/netbox/project-static/src/forms/index.ts index 1ef8540fd..f166c75a8 100644 --- a/netbox/project-static/src/forms/index.ts +++ b/netbox/project-static/src/forms/index.ts @@ -1,10 +1,9 @@ import { initFormElements } from './elements'; import { initSpeedSelector } from './speedSelector'; import { initScopeSelector } from './scopeSelector'; -import { initVlanTags } from './vlanTags'; export function initForms(): void { - for (const func of [initFormElements, initSpeedSelector, initScopeSelector, initVlanTags]) { + for (const func of [initFormElements, initSpeedSelector, initScopeSelector]) { func(); } } diff --git a/netbox/project-static/src/forms/vlanTags.ts b/netbox/project-static/src/forms/vlanTags.ts deleted file mode 100644 index 4ad97c363..000000000 --- a/netbox/project-static/src/forms/vlanTags.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { all, getElement, resetSelect, toggleVisibility as _toggleVisibility } from '../util'; - -/** - * Get a select element's containing `.row` element. - * - * @param element Select element. - * @returns Containing row element. - */ -function fieldContainer(element: Nullable): Nullable { - const container = element?.parentElement?.parentElement ?? null; - if (container !== null && container.classList.contains('row')) { - return container; - } - return null; -} - -/** - * Toggle visibility of the select element's container and disable the select element itself. - * - * @param element Select element. - * @param action 'show' or 'hide' - */ -function toggleVisibility>( - element: E, - action: 'show' | 'hide', -): void { - // Find the select element's containing element. - const parent = fieldContainer(element); - if (element !== null && parent !== null) { - // Toggle container visibility to visually remove it from the form. - _toggleVisibility(parent, action); - // Create a new event so that the APISelect instance properly handles the enable/disable - // action. - const event = new Event(`netbox.select.disabled.${element.name}`); - switch (action) { - case 'hide': - // Disable the native select element and dispatch the event APISelect is listening for. - element.disabled = true; - element.dispatchEvent(event); - break; - case 'show': - // Enable the native select element and dispatch the event APISelect is listening for. - element.disabled = false; - element.dispatchEvent(event); - } - } -} - -/** - * Toggle element visibility when the mode field does not have a value. - */ -function handleModeNone(): void { - const elements = [ - getElement('id_tagged_vlans'), - getElement('id_untagged_vlan'), - getElement('id_vlan_group'), - ]; - - if (all(elements)) { - const [taggedVlans, untaggedVlan] = elements; - resetSelect(untaggedVlan); - resetSelect(taggedVlans); - for (const element of elements) { - toggleVisibility(element, 'hide'); - } - } -} - -/** - * Toggle element visibility when the mode field's value is Access. - */ -function handleModeAccess(): void { - const elements = [ - getElement('id_tagged_vlans'), - getElement('id_untagged_vlan'), - getElement('id_vlan_group'), - ]; - if (all(elements)) { - const [taggedVlans, untaggedVlan, vlanGroup] = elements; - resetSelect(taggedVlans); - toggleVisibility(vlanGroup, 'show'); - toggleVisibility(untaggedVlan, 'show'); - toggleVisibility(taggedVlans, 'hide'); - } -} - -/** - * Toggle element visibility when the mode field's value is Tagged. - */ -function handleModeTagged(): void { - const elements = [ - getElement('id_tagged_vlans'), - getElement('id_untagged_vlan'), - getElement('id_vlan_group'), - ]; - if (all(elements)) { - const [taggedVlans, untaggedVlan, vlanGroup] = elements; - toggleVisibility(taggedVlans, 'show'); - toggleVisibility(vlanGroup, 'show'); - toggleVisibility(untaggedVlan, 'show'); - } -} - -/** - * Toggle element visibility when the mode field's value is Tagged (All). - */ -function handleModeTaggedAll(): void { - const elements = [ - getElement('id_tagged_vlans'), - getElement('id_untagged_vlan'), - getElement('id_vlan_group'), - ]; - if (all(elements)) { - const [taggedVlans, untaggedVlan, vlanGroup] = elements; - resetSelect(taggedVlans); - toggleVisibility(vlanGroup, 'show'); - toggleVisibility(untaggedVlan, 'show'); - toggleVisibility(taggedVlans, 'hide'); - } -} - -/** - * Reset field visibility when the mode field's value changes. - */ -function handleModeChange(element: HTMLSelectElement): void { - switch (element.value) { - case 'access': - handleModeAccess(); - break; - case 'tagged': - handleModeTagged(); - break; - case 'tagged-all': - handleModeTaggedAll(); - break; - case '': - handleModeNone(); - break; - } -} - -export function initVlanTags(): void { - const element = getElement('id_mode'); - if (element !== null) { - element.addEventListener('change', () => handleModeChange(element)); - handleModeChange(element); - } -} diff --git a/netbox/templates/dcim/interface_edit.html b/netbox/templates/dcim/interface_edit.html deleted file mode 100644 index a044de660..000000000 --- a/netbox/templates/dcim/interface_edit.html +++ /dev/null @@ -1,101 +0,0 @@ -{% extends 'generic/object_edit.html' %} -{% load form_helpers %} - -{% block form %} - {# Render hidden fields #} - {% for field in form.hidden_fields %} - {{ field }} - {% endfor %} - -
-
-
Interface
-
- {% if form.instance.device %} -
- -
- -
-
- {% endif %} - {% render_field form.module %} - {% render_field form.name %} - {% render_field form.type %} - {% render_field form.speed %} - {% render_field form.duplex %} - {% render_field form.label %} - {% render_field form.description %} - {% render_field form.tags %} -
- -
-
-
Addressing
-
- {% render_field form.vrf %} - {% render_field form.mac_address %} - {% render_field form.wwn %} -
- -
-
-
Operation
-
- {% render_field form.mtu %} - {% render_field form.tx_power %} - {% render_field form.enabled %} - {% render_field form.mgmt_only %} - {% render_field form.mark_connected %} -
- -
-
-
Related Interfaces
-
- {% render_field form.parent %} - {% render_field form.bridge %} - {% render_field form.lag %} -
- - {% if form.instance.is_wireless %} -
-
-
Wireless
-
- {% render_field form.rf_role %} - {% render_field form.rf_channel %} - {% render_field form.rf_channel_frequency %} - {% render_field form.rf_channel_width %} - {% render_field form.wireless_lan_group %} - {% render_field form.wireless_lans %} -
- {% endif %} - -
-
-
Power over Ethernet (PoE)
-
- {% render_field form.poe_mode %} - {% render_field form.poe_type %} -
- -
-
-
802.1Q Switching
-
- {% render_field form.mode %} - {% render_field form.vlan_group %} - {% render_field form.untagged_vlan %} - {% render_field form.tagged_vlans %} -
- - {% if form.custom_fields %} -
-
-
Custom Fields
-
- {% render_custom_fields form %} -
- {% endif %} -{% endblock %} diff --git a/netbox/templates/htmx/form.html b/netbox/templates/htmx/form.html index e5a2ab6c6..e15df4706 100644 --- a/netbox/templates/htmx/form.html +++ b/netbox/templates/htmx/form.html @@ -17,7 +17,7 @@ {% endif %} {% for name in fields %} {% with field=form|getfield:name %} - {% if not field.field.widget.is_hidden %} + {% if field and not field.field.widget.is_hidden %} {% render_field field %} {% endif %} {% endwith %} diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 1a2f62b2e..2f08a3cce 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -12,6 +12,7 @@ __all__ = ( 'expand_alphanumeric_pattern', 'expand_ipaddress_pattern', 'form_from_model', + 'get_field_value', 'get_selected_values', 'parse_alphanumeric_range', 'parse_numeric_range', @@ -113,6 +114,21 @@ def expand_ipaddress_pattern(string, family): yield ''.join([lead, format(i, 'x' if family == 6 else 'd'), remnant]) +def get_field_value(form, field_name): + """ + Return the current bound or initial value associated with a form field, prior to calling + clean() for the form. + """ + field = form.fields[field_name] + + if form.is_bound: + if data := form.data.get(field_name): + if field.valid_value(data): + return data + + return form.get_initial_for_field(field, field_name) + + def get_selected_values(form, field_name): """ Return the list of selected human-friendly values for a form field diff --git a/netbox/utilities/templatetags/form_helpers.py b/netbox/utilities/templatetags/form_helpers.py index 089a3ced9..a3523a7cc 100644 --- a/netbox/utilities/templatetags/form_helpers.py +++ b/netbox/utilities/templatetags/form_helpers.py @@ -11,9 +11,12 @@ register = template.Library() @register.filter() def getfield(form, fieldname): """ - Return the specified field of a Form. + Return the specified bound field of a Form. """ - return form[fieldname] + try: + return form[fieldname] + except KeyError: + return None @register.filter(name='widget_type') diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 403a04d91..e461eac8a 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -349,6 +349,15 @@ class VMInterfaceForm(InterfaceCommonForm, NetBoxModelForm): labels = { 'mode': '802.1Q Mode', } + widgets = { + 'mode': forms.Select( + attrs={ + 'hx-get': '.', + 'hx-include': '#form_fields input', + 'hx-target': '#form_fields', + } + ), + } help_texts = { 'mode': INTERFACE_MODE_HELP_TEXT, }