From 347e453b7d427e281e2d35c081c4aef6dbe61c8d Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 13 Mar 2024 10:48:46 -0700 Subject: [PATCH] 9856 filter types --- netbox/ipam/graphql/filters.py | 2 + netbox/netbox/graphql/filter_mixins.py | 50 +++++++++++++------------ netbox/tenancy/graphql/filter_mixins.py | 48 ------------------------ netbox/tenancy/graphql/filters.py | 1 + 4 files changed, 30 insertions(+), 71 deletions(-) delete mode 100644 netbox/tenancy/graphql/filter_mixins.py diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index 80d8c8fec..6031cfe07 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -25,11 +25,13 @@ __all__ = ( ) +# bug - fixme! @strawberry_django.filter(models.ASN, lookups=True) class ASNFilter(BaseFilterMixin): pass +# bug - fixme! @strawberry_django.filter(models.ASNRange, lookups=True) class ASNRangeFilter(BaseFilterMixin): pass diff --git a/netbox/netbox/graphql/filter_mixins.py b/netbox/netbox/graphql/filter_mixins.py index 2ab0850d4..262dcdf65 100644 --- a/netbox/netbox/graphql/filter_mixins.py +++ b/netbox/netbox/graphql/filter_mixins.py @@ -11,9 +11,11 @@ from utilities.filters import * def autotype_decorator(filterset): - def show_field(fieldname, v, cls): + def show_field(field_type, fieldname, v, cls): print(f"cls: {cls}") print(f"{fieldname}: {v}") + print(field_type) + print("") def wrapper(cls): cls.filterset = filterset @@ -38,9 +40,9 @@ def autotype_decorator(filterset): create_function = True attr_type = str | None elif isinstance(v, MACAddressFilter): - show_field("MACAddressFilter", v, cls) + show_field("MACAddressFilter", fieldname, v, cls) elif isinstance(v, MultiValueArrayFilter): - show_field("MultiValueArrayFilter", v, cls) + show_field("MultiValueArrayFilter", fieldname, v, cls) elif isinstance(v, MultiValueCharFilter): create_function = True attr_type = List[str] | None @@ -49,7 +51,7 @@ def autotype_decorator(filterset): elif isinstance(v, MultiValueDateTimeFilter): attr_type = auto elif isinstance(v, MultiValueDecimalFilter): - show_field("MultiValueDecimalFilter", v, cls) + show_field("MultiValueDecimalFilter", fieldname, v, cls) elif isinstance(v, MultiValueMACAddressFilter): create_function = True attr_type = List[str] | None @@ -57,14 +59,15 @@ def autotype_decorator(filterset): create_function = True attr_type = List[str] | None elif isinstance(v, MultiValueTimeFilter): - show_field("MultiValueTimeFilter", v, cls) + show_field("MultiValueTimeFilter", fieldname, v, cls) elif isinstance(v, MultiValueWWNFilter): create_function = True attr_type = List[str] | None elif isinstance(v, NullableCharFieldFilter): - show_field("NullableCharFieldFilter", v, cls) + show_field("NullableCharFieldFilter", fieldname, v, cls) elif isinstance(v, NumericArrayFilter): - show_field("NumericArrayFilter", v, cls) + create_function = True + attr_type = int elif isinstance(v, TreeNodeMultipleChoiceFilter): create_function = True attr_type = List[str] | None @@ -72,19 +75,19 @@ def autotype_decorator(filterset): # From django_filters - ordering of these matters as base classes must # come after derived classes so the base class doesn't get matched first elif issubclass(type(v), django_filters.OrderingFilter): - show_field("OrderingFilter", v, cls) + show_field("OrderingFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.BaseRangeFilter): - show_field("BaseRangeFilter", v, cls) + show_field("BaseRangeFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.BaseInFilter): - show_field("BaseInFilter", v, cls) + show_field("BaseInFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.LookupChoiceFilter): - show_field("LookupChoiceFilter", v, cls) + show_field("LookupChoiceFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.AllValuesMultipleFilter): - show_field("AllValuesMultipleFilter", v, cls) + show_field("AllValuesMultipleFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.AllValuesFilter): - show_field("AllValuesFilter", v, cls) + show_field("AllValuesFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.TimeRangeFilter): - show_field("TimeRangeFilter", v, cls) + show_field("TimeRangeFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.IsoDateTimeFromToRangeFilter): create_function = True attr_type = str | None @@ -98,11 +101,12 @@ def autotype_decorator(filterset): create_function = True attr_type = str | None elif issubclass(type(v), django_filters.RangeFilter): - show_field("RangeFilter", v, cls) + show_field("RangeFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.NumericRangeFilter): - show_field("NumericRangeFilter", v, cls) + show_field("NumericRangeFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.NumberFilter): - show_field("NumberFilter", v, cls) + create_function = True + attr_type = int elif issubclass(type(v), django_filters.ModelMultipleChoiceFilter): create_function = True attr_type = List[str] | None @@ -110,9 +114,9 @@ def autotype_decorator(filterset): create_function = True attr_type = str | None elif issubclass(type(v), django_filters.DurationFilter): - show_field("DurationFilter", v, cls) + show_field("DurationFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.IsoDateTimeFilter): - show_field("IsoDateTimeFilter", v, cls) + show_field("IsoDateTimeFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.DateTimeFilter): attr_type = auto elif issubclass(type(v), django_filters.TimeFilter): @@ -120,14 +124,14 @@ def autotype_decorator(filterset): elif issubclass(type(v), django_filters.DateFilter): attr_type = auto elif issubclass(type(v), django_filters.TypedMultipleChoiceFilter): - show_field("TypedMultipleChoiceFilter", v, cls) + show_field("TypedMultipleChoiceFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.MultipleChoiceFilter): create_function = True attr_type = List[str] | None elif issubclass(type(v), django_filters.TypedChoiceFilter): - show_field("TypedChoiceFilter", v, cls) + show_field("TypedChoiceFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.ChoiceFilter): - show_field("ChoiceFilter", v, cls) + show_field("ChoiceFilter", fieldname, v, cls) elif issubclass(type(v), django_filters.BooleanFilter): create_function = True attr_type = bool | None @@ -139,7 +143,7 @@ def autotype_decorator(filterset): create_function = True attr_type = str | None else: - show_field("unknown type!", v, cls) + show_field("unknown type!", fieldname, v, cls) if fieldname not in cls.__annotations__ and attr_type: cls.__annotations__[fieldname] = attr_type diff --git a/netbox/tenancy/graphql/filter_mixins.py b/netbox/tenancy/graphql/filter_mixins.py deleted file mode 100644 index c33dc24aa..000000000 --- a/netbox/tenancy/graphql/filter_mixins.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import List -import strawberry -import strawberry_django -from strawberry import auto -from netbox.graphql.filter_mixins import BaseFilterMixin - -__all__ = ( - 'ContactModelFilterMixin', - 'TenancyFilterMixin', -) - - -@strawberry.input -class TenancyFilterMixin(BaseFilterMixin): - created: auto - last_updated: auto - created_by_request: str | None - updated_by_request: str | None - modified_by_request: str | None - - def filter_created_by_request(self, queryset): - return self.filter_by_filterset(queryset, 'created_by_request') - - def filter_updated_by_request(self, queryset): - return self.filter_by_filterset(queryset, 'updated_by_request') - - def filter_modified_by_request(self, queryset): - return self.filter_by_filterset(queryset, 'modified_by_request') - - -@strawberry.input -class ContactModelFilterMixin(BaseFilterMixin): - tenant_group_id: List[str] | None - tenant_group: List[str] | None - tenant_id: List[str] | None - tenant: List[str] | None - - def filter_tenant_group_id(self, queryset): - return self.filter_by_filterset(queryset, 'tenant_group_id') - - def filter_tenant_group(self, queryset): - return self.filter_by_filterset(queryset, 'tenant_group') - - def filter_tenant_id(self, queryset): - return self.filter_by_filterset(queryset, 'tenant_id') - - def filter_tenant(self, queryset): - return self.filter_by_filterset(queryset, 'tenant') diff --git a/netbox/tenancy/graphql/filters.py b/netbox/tenancy/graphql/filters.py index 1df2e3578..bb710e7fd 100644 --- a/netbox/tenancy/graphql/filters.py +++ b/netbox/tenancy/graphql/filters.py @@ -44,6 +44,7 @@ class ContactGroupFilter(BaseFilterMixin): pass +# bug - fixme! @strawberry_django.filter(models.ContactAssignment, lookups=True) class ContactAssignmentFilter(BaseFilterMixin): pass