From d56b29e502d1794c7019d835e79086efc881d15c Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 2 Oct 2023 13:59:09 -0700 Subject: [PATCH] 10769 allow filtering of cables if have terminations --- netbox/dcim/filtersets.py | 20 ++++++++++++++++++++ netbox/dcim/forms/filtersets.py | 16 +++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 0261998db..de27efb23 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1745,6 +1745,14 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): method='filter_by_cable_end_b', field_name='terminations__termination_id' ) + has_a_terminations = django_filters.BooleanFilter( + method='_has_a_terminations', + label=_('Has a terminations'), + ) + has_b_terminations = django_filters.BooleanFilter( + method='_has_b_terminations', + label=_('Has b terminations'), + ) type = django_filters.MultipleChoiceFilter( choices=CableTypeChoices ) @@ -1812,6 +1820,18 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): # Filter by termination id and cable_end type return self.filter_by_cable_end(queryset, name, value, CableEndChoices.SIDE_B) + def _has_a_terminations(self, queryset, name, value): + if value: + return queryset.filter(terminations__cable_end=CableEndChoices.SIDE_A) + else: + return queryset.exclude(terminations__cable_end=CableEndChoices.SIDE_A) + + def _has_b_terminations(self, queryset, name, value): + if value: + return queryset.filter(terminations__cable_end=CableEndChoices.SIDE_B) + else: + return queryset.exclude(terminations__cable_end=CableEndChoices.SIDE_B) + class CableTerminationFilterSet(BaseFilterSet): termination_type = ContentTypeFilter() diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 43e5f4481..777829c5d 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -908,7 +908,7 @@ class VirtualChassisFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Cable fieldsets = ( - (None, ('q', 'filter_id', 'tag')), + (None, ('q', 'filter_id', 'has_a_terminations', 'has_b_terminations', 'tag')), (_('Location'), ('site_id', 'location_id', 'rack_id', 'device_id')), (_('Attributes'), ('type', 'status', 'color', 'length', 'length_unit')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), @@ -979,6 +979,20 @@ class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): choices=add_blank_choice(CableLengthUnitChoices), required=False ) + has_a_terminations = forms.NullBooleanField( + label=_('Has a terminations'), + required=False, + widget=forms.Select( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + has_b_terminations = forms.NullBooleanField( + label=_('Has b terminations'), + required=False, + widget=forms.Select( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) tag = TagFilterField(model)