From da20120872250f93f368bb39d679dc6a256ece9e Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 30 Aug 2023 14:34:01 -0700 Subject: [PATCH] 13459 fix swagger for TreeNodeMultipleChoiceFilter --- netbox/circuits/filtersets.py | 18 +++--- netbox/dcim/filtersets.py | 86 +++++++++++++++-------------- netbox/ipam/filtersets.py | 16 +++--- netbox/tenancy/filtersets.py | 18 +++--- netbox/virtualization/filtersets.py | 18 +++--- netbox/wireless/filtersets.py | 6 +- 6 files changed, 86 insertions(+), 76 deletions(-) diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index e28238fea..85cfaaad6 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -1,6 +1,8 @@ import django_filters from django.db.models import Q from django.utils.translation import gettext as _ +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from dcim.filtersets import CabledObjectFilterSet from dcim.models import Region, Site, SiteGroup @@ -28,26 +30,26 @@ class ProviderFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='circuits__terminations__site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='circuits__terminations__site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='circuits__terminations__site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( field_name='circuits__terminations__site', queryset=Site.objects.all(), @@ -181,26 +183,26 @@ class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='terminations__site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='terminations__site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='terminations__site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( field_name='terminations__site', queryset=Site.objects.all(), diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 0261998db..c886e8ba2 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1,6 +1,8 @@ import django_filters from django.contrib.auth import get_user_model from django.utils.translation import gettext as _ +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from extras.filtersets import LocalConfigContextFilterSet from extras.models import ConfigTemplate @@ -117,24 +119,24 @@ class SiteFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSe lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='group', lookup_expr='in', label=_('Group (ID)'), ) - group = TreeNodeMultipleChoiceFilter( + group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), lookup_expr='in', to_field_name='slug', label=_('Group (slug)'), - ) + )) asn = django_filters.ModelMultipleChoiceFilter( field_name='asns__asn', queryset=ASN.objects.all(), @@ -178,26 +180,26 @@ class LocationFilterSet(TenancyFilterSet, ContactModelFilterSet, OrganizationalM lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label=_('Site (ID)'), @@ -214,13 +216,13 @@ class LocationFilterSet(TenancyFilterSet, ContactModelFilterSet, OrganizationalM lookup_expr='in', label=_('Location (ID)'), ) - parent = TreeNodeMultipleChoiceFilter( + parent = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Location.objects.all(), field_name='parent', lookup_expr='in', to_field_name='slug', label=_('Location (slug)'), - ) + )) status = django_filters.MultipleChoiceFilter( choices=LocationStatusChoices, null_value=None @@ -253,26 +255,26 @@ class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSe lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label=_('Site (ID)'), @@ -289,13 +291,13 @@ class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSe lookup_expr='in', label=_('Location (ID)'), ) - location = TreeNodeMultipleChoiceFilter( + location = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Location.objects.all(), field_name='location', lookup_expr='in', to_field_name='slug', label=_('Location (slug)'), - ) + )) status = django_filters.MultipleChoiceFilter( choices=RackStatusChoices, null_value=None @@ -361,39 +363,39 @@ class RackReservationFilterSet(NetBoxModelFilterSet, TenancyFilterSet): lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='rack__site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='rack__site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='rack__site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) location_id = TreeNodeMultipleChoiceFilter( queryset=Location.objects.all(), field_name='rack__location', lookup_expr='in', label=_('Location (ID)'), ) - location = TreeNodeMultipleChoiceFilter( + location = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Location.objects.all(), field_name='rack__location', lookup_expr='in', to_field_name='slug', label=_('Location (slug)'), - ) + )) user_id = django_filters.ModelMultipleChoiceFilter( queryset=get_user_model().objects.all(), label=_('User (ID)'), @@ -871,26 +873,26 @@ class DeviceFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilter lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label=_('Site (ID)'), @@ -1177,26 +1179,26 @@ class DeviceComponentFilterSet(django_filters.FilterSet): lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='device__site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='device__site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='device__site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( field_name='device__site', queryset=Site.objects.all(), @@ -1672,26 +1674,26 @@ class VirtualChassisFilterSet(NetBoxModelFilterSet): lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='master__site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='master__site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='master__site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( field_name='master__site', queryset=Site.objects.all(), @@ -1828,26 +1830,26 @@ class PowerPanelFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label=_('Site (ID)'), @@ -1885,26 +1887,26 @@ class PowerFeedFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet, PathEndpoi lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='power_panel__site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='power_panel__site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='power_panel__site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( field_name='power_panel__site', queryset=Site.objects.all(), diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index bc9181286..8ee66cd23 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -303,26 +303,26 @@ class PrefixFilterSet(NetBoxModelFilterSet, TenancyFilterSet): lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label=_('Site (ID)'), @@ -890,26 +890,26 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label=_('Site (ID)'), diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index 0f4900f54..a6db2a9fd 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -1,6 +1,8 @@ import django_filters from django.db.models import Q from django.utils.translation import gettext as _ +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from extras.filters import TagFilter from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet @@ -55,13 +57,13 @@ class ContactFilterSet(NetBoxModelFilterSet): lookup_expr='in', label=_('Contact group (ID)'), ) - group = TreeNodeMultipleChoiceFilter( + group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=ContactGroup.objects.all(), field_name='group', lookup_expr='in', to_field_name='slug', label=_('Contact group (slug)'), - ) + )) class Meta: model = Contact @@ -127,12 +129,12 @@ class ContactModelFilterSet(django_filters.FilterSet): queryset=ContactRole.objects.all(), label=_('Contact Role') ) - contact_group = TreeNodeMultipleChoiceFilter( + contact_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=ContactGroup.objects.all(), field_name='contacts__contact__group', lookup_expr='in', label=_('Contact group'), - ) + )) # @@ -163,13 +165,13 @@ class TenantFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): lookup_expr='in', label=_('Tenant group (ID)'), ) - group = TreeNodeMultipleChoiceFilter( + group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=TenantGroup.objects.all(), field_name='group', lookup_expr='in', to_field_name='slug', label=_('Tenant group (slug)'), - ) + )) class Meta: model = Tenant @@ -196,13 +198,13 @@ class TenancyFilterSet(django_filters.FilterSet): lookup_expr='in', label=_('Tenant Group (ID)'), ) - tenant_group = TreeNodeMultipleChoiceFilter( + tenant_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=TenantGroup.objects.all(), field_name='tenant__group', to_field_name='slug', lookup_expr='in', label=_('Tenant Group (slug)'), - ) + )) tenant_id = django_filters.ModelMultipleChoiceFilter( queryset=Tenant.objects.all(), label=_('Tenant (ID)'), diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index 571dbe64b..5bb00a20d 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -1,6 +1,8 @@ import django_filters from django.db.models import Q from django.utils.translation import gettext as _ +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from dcim.filtersets import CommonInterfaceFilterSet from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup @@ -42,26 +44,26 @@ class ClusterFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label=_('Site (ID)'), @@ -168,26 +170,26 @@ class VirtualMachineFilterSet( lookup_expr='in', label=_('Region (ID)'), ) - region = TreeNodeMultipleChoiceFilter( + region = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), field_name='site__region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), - ) + )) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', label=_('Site group (ID)'), ) - site_group = TreeNodeMultipleChoiceFilter( + site_group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), field_name='site__group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), - ) + )) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label=_('Site (ID)'), diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py index 6ffb9cb91..09e60aa1b 100644 --- a/netbox/wireless/filtersets.py +++ b/netbox/wireless/filtersets.py @@ -1,5 +1,7 @@ import django_filters from django.db.models import Q +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from dcim.choices import LinkStatusChoices from ipam.models import VLAN @@ -37,12 +39,12 @@ class WirelessLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): field_name='group', lookup_expr='in' ) - group = TreeNodeMultipleChoiceFilter( + group = extend_schema_field(OpenApiTypes.STR)(TreeNodeMultipleChoiceFilter( queryset=WirelessLANGroup.objects.all(), field_name='group', lookup_expr='in', to_field_name='slug' - ) + )) status = django_filters.MultipleChoiceFilter( choices=WirelessLANStatusChoices )