Daniel Sheppard 7 месяцев назад
Родитель
Сommit
ade4354ca4

+ 4 - 5
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)

+ 20 - 4
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'

+ 6 - 0
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,

+ 6 - 0
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()

+ 2 - 2
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):