From ade4354ca4ac43497353d0e7ee7ee96eeb00e666 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Wed, 9 Jul 2025 11:12:52 -0500 Subject: [PATCH] Fix some test errors --- netbox/ipam/api/serializers_/ip.py | 9 ++++----- netbox/ipam/filtersets.py | 24 ++++++++++++++++++++---- netbox/ipam/forms/filtersets.py | 6 ++++++ netbox/ipam/graphql/filters.py | 6 ++++++ netbox/ipam/models/ip.py | 4 ++-- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/netbox/ipam/api/serializers_/ip.py b/netbox/ipam/api/serializers_/ip.py index a07eadce6..b515838ff 100644 --- a/netbox/ipam/api/serializers_/ip.py +++ b/netbox/ipam/api/serializers_/ip.py @@ -44,7 +44,6 @@ class AggregateSerializer(NetBoxModelSerializer): class PrefixSerializer(NetBoxModelSerializer): - # TODO: Alter for parent prefix family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) scope_type = ContentTypeField( @@ -61,7 +60,7 @@ class PrefixSerializer(NetBoxModelSerializer): vlan = VLANSerializer(nested=True, required=False, allow_null=True) status = ChoiceField(choices=PrefixStatusChoices, required=False) role = RoleSerializer(nested=True, required=False, allow_null=True) - children = serializers.IntegerField(read_only=True) + _children = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(read_only=True) prefix = IPNetworkField() @@ -70,7 +69,7 @@ class PrefixSerializer(NetBoxModelSerializer): fields = [ 'id', 'url', 'display_url', 'display', 'family', 'prefix', 'vrf', 'scope_type', 'scope_id', 'scope', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', 'description', 'comments', 'tags', - 'custom_fields', 'created', 'last_updated', 'children', '_depth', + 'custom_fields', 'created', 'last_updated', '_children', '_depth', ] brief_fields = ('id', 'url', 'display', 'family', 'prefix', 'description', '_depth') @@ -135,7 +134,7 @@ class AvailablePrefixSerializer(serializers.Serializer): # class IPRangeSerializer(NetBoxModelSerializer): - # TODO: Alter for prefix + prefix = PrefixSerializer(nested=True, required=False, allow_null=True) family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) start_address = IPAddressField() end_address = IPAddressField() @@ -160,7 +159,7 @@ class IPRangeSerializer(NetBoxModelSerializer): # class IPAddressSerializer(NetBoxModelSerializer): - # TODO: Alter for prefix + prefix = PrefixSerializer(nested=True, required=False, allow_null=True) family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) address = IPAddressField() vrf = VRFSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 720c5d0bf..0b3ca4b26 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -291,8 +291,6 @@ class RoleFilterSet(OrganizationalModelFilterSet): class PrefixFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet, ContactModelFilterSet): - # TODO: Alter for aggregate - # TODO: Alter for parent prefix family = django_filters.NumberFilter( field_name='prefix', lookup_expr='family' @@ -332,6 +330,26 @@ class PrefixFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet, C field_name='prefix', lookup_expr='net_mask_length__lte' ) + aggregate_id = django_filters.ModelMultipleChoiceFilter( + queryset=Aggregate.objects.all(), + label=_('Aggregate'), + ) + aggregate = django_filters.ModelMultipleChoiceFilter( + field_name='aggregate__prefix', + queryset=Aggregate.objects.all(), + to_field_name='prefix', + label=_('Aggregate (Prefix)'), + ) + parent_id = django_filters.ModelMultipleChoiceFilter( + queryset=Prefix.objects.all(), + label=_('Parent Prefix'), + ) + parent = django_filters.ModelMultipleChoiceFilter( + field_name='parent__prefix', + queryset=Prefix.objects.all(), + to_field_name='prefix', + label=_('Parent Prefix (Prefix)'), + ) vrf_id = django_filters.ModelMultipleChoiceFilter( queryset=VRF.objects.all(), label=_('VRF'), @@ -459,7 +477,6 @@ class PrefixFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet, C class IPRangeFilterSet(TenancyFilterSet, NetBoxModelFilterSet, ContactModelFilterSet): - # TODO: Alter for prefix family = django_filters.NumberFilter( field_name='start_address', lookup_expr='family' @@ -562,7 +579,6 @@ class IPRangeFilterSet(TenancyFilterSet, NetBoxModelFilterSet, ContactModelFilte class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): - # TODO: Alter for prefix family = django_filters.NumberFilter( field_name='address', lookup_expr='family' diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 780d43bb5..c96fbd471 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -204,6 +204,12 @@ class PrefixFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFil choices=PREFIX_MASK_LENGTH_CHOICES, label=_('Mask length') ) + aggregate_id = DynamicModelMultipleChoiceField( + queryset=Aggregate.objects.all(), + required=False, + label=_('Aggregate'), + null_option='Global' + ) vrf_id = DynamicModelMultipleChoiceField( queryset=VRF.objects.all(), required=False, diff --git a/netbox/ipam/graphql/filters.py b/netbox/ipam/graphql/filters.py index 4e1afc3ba..07a301b77 100644 --- a/netbox/ipam/graphql/filters.py +++ b/netbox/ipam/graphql/filters.py @@ -119,6 +119,7 @@ class FHRPGroupAssignmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin) @strawberry_django.filter(models.IPAddress, lookups=True) class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin): + prefix: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field() address: FilterLookup[str] | None = strawberry_django.filter_field() vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field() vrf_id: ID | None = strawberry_django.filter_field() @@ -158,6 +159,7 @@ class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter @strawberry_django.filter(models.IPRange, lookups=True) class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin): + prefix: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field() start_address: FilterLookup[str] | None = strawberry_django.filter_field() end_address: FilterLookup[str] | None = strawberry_django.filter_field() size: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = ( @@ -189,6 +191,10 @@ class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMi @strawberry_django.filter(models.Prefix, lookups=True) class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin): + aggregate: Annotated['AggregateFilter', strawberry.lazy('ipam.graphql.filters')] | None = ( + strawberry_django.filter_field() + ) + parent: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field() prefix: FilterLookup[str] | None = strawberry_django.filter_field() vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field() vrf_id: ID | None = strawberry_django.filter_field() diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 45bce76c9..4073bcf21 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -369,11 +369,11 @@ class Prefix(ContactsMixin, GetAvailablePrefixesMixin, CachedScopeMixin, Primary return self.prefix.prefixlen if self.prefix else None @property - def depth(self): + def depth_count(self): return self._depth @property - def children(self): + def children_count(self): return self._children def _set_prefix_length(self, value):