From e9e77fc6892c368e1e2d9fce918328531b0b67ec Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 12 Aug 2020 13:30:49 -0400 Subject: [PATCH] Add disabled_indicator to DynamicModelChoiceMixin --- netbox/dcim/forms.py | 54 +++++++++++--------------------- netbox/utilities/forms/fields.py | 10 +++++- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 1ea9f7d72..7824f0346 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -3422,12 +3422,10 @@ class ConnectCableToConsolePortForm(ConnectCableToDeviceForm): termination_b_id = DynamicModelChoiceField( queryset=ConsolePort.objects.all(), label='Name', + disabled_indicator='cable', query_params={ 'device_id': '$termination_b_device' - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) @@ -3435,12 +3433,10 @@ class ConnectCableToConsoleServerPortForm(ConnectCableToDeviceForm): termination_b_id = DynamicModelChoiceField( queryset=ConsoleServerPort.objects.all(), label='Name', + disabled_indicator='cable', query_params={ 'device_id': '$termination_b_device' - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) @@ -3448,12 +3444,10 @@ class ConnectCableToPowerPortForm(ConnectCableToDeviceForm): termination_b_id = DynamicModelChoiceField( queryset=PowerPort.objects.all(), label='Name', + disabled_indicator='cable', query_params={ 'device_id': '$termination_b_device' - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) @@ -3461,12 +3455,10 @@ class ConnectCableToPowerOutletForm(ConnectCableToDeviceForm): termination_b_id = DynamicModelChoiceField( queryset=PowerOutlet.objects.all(), label='Name', + disabled_indicator='cable', query_params={ 'device_id': '$termination_b_device' - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) @@ -3474,13 +3466,11 @@ class ConnectCableToInterfaceForm(ConnectCableToDeviceForm): termination_b_id = DynamicModelChoiceField( queryset=Interface.objects.all(), label='Name', + disabled_indicator='cable', query_params={ 'device_id': '$termination_b_device', 'kind': 'physical', - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) @@ -3488,12 +3478,10 @@ class ConnectCableToFrontPortForm(ConnectCableToDeviceForm): termination_b_id = DynamicModelChoiceField( queryset=FrontPort.objects.all(), label='Name', + disabled_indicator='cable', query_params={ 'device_id': '$termination_b_device' - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) @@ -3501,12 +3489,10 @@ class ConnectCableToRearPortForm(ConnectCableToDeviceForm): termination_b_id = DynamicModelChoiceField( queryset=RearPort.objects.all(), label='Name', + disabled_indicator='cable', query_params={ 'device_id': '$termination_b_device' - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) @@ -3534,12 +3520,10 @@ class ConnectCableToCircuitTerminationForm(BootstrapMixin, forms.ModelForm): queryset=CircuitTermination.objects.all(), label='Side', display_field='term_side', + disabled_indicator='cable', query_params={ 'circuit_id': '$termination_b_circuit' - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) class Meta: @@ -3582,12 +3566,10 @@ class ConnectCableToPowerFeedForm(BootstrapMixin, forms.ModelForm): termination_b_id = DynamicModelChoiceField( queryset=PowerFeed.objects.all(), label='Name', + disabled_indicator='cable', query_params={ 'power_panel_id': '$termination_b_powerpanel' - }, - widget=APISelect( - disabled_indicator='cable' - ) + } ) class Meta: diff --git a/netbox/utilities/forms/fields.py b/netbox/utilities/forms/fields.py index 398a8a0e8..fa5b86d7b 100644 --- a/netbox/utilities/forms/fields.py +++ b/netbox/utilities/forms/fields.py @@ -249,14 +249,18 @@ class DynamicModelChoiceMixin: :param display_field: The name of the attribute of an API response object to display in the selection list :param query_params: A dictionary of additional key/value pairs to attach to the API request :param null_option: The string used to represent a null selection (if any) + :param disabled_indicator: The name of the field which, if populated, will disable selection of the + choice (optional) """ filter = django_filters.ModelChoiceFilter widget = widgets.APISelect - def __init__(self, *args, display_field='name', query_params=None, null_option=None, **kwargs): + def __init__(self, *args, display_field='name', query_params=None, null_option=None, disabled_indicator=None, + **kwargs): self.display_field = display_field self.query_params = query_params or {} self.null_option = null_option + self.disabled_indicator = disabled_indicator # to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference # by widget_attrs() @@ -277,6 +281,10 @@ class DynamicModelChoiceMixin: if self.null_option is not None: attrs['data-null-option'] = self.null_option + # Set the disabled indicator, if any + if self.disabled_indicator is not None: + attrs['disabled-indicator'] = self.disabled_indicator + # Attach any static query parameters for key, value in self.query_params.items(): widget.add_additional_query_param(key, value)