From 0df67dbc12783b1322a8bd48f3d888d6411e39f4 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 3 Aug 2021 09:54:06 -0400 Subject: [PATCH] Add ip_addresses relation on InterfaceType, VMInterfaceType --- netbox/dcim/graphql/types.py | 3 ++- netbox/ipam/graphql/mixins.py | 12 ++++++++++++ netbox/utilities/testing/api.py | 8 ++++++-- netbox/virtualization/graphql/types.py | 3 ++- 4 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 netbox/ipam/graphql/mixins.py diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index de091ec64..a4eb4ed9a 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -1,4 +1,5 @@ from dcim import filtersets, models +from ipam.graphql.mixins import IPAddressesMixin from netbox.graphql.types import BaseObjectType, ObjectType, TaggedObjectType __all__ = ( @@ -158,7 +159,7 @@ class FrontPortTemplateType(BaseObjectType): filterset_class = filtersets.FrontPortTemplateFilterSet -class InterfaceType(TaggedObjectType): +class InterfaceType(IPAddressesMixin, TaggedObjectType): class Meta: model = models.Interface diff --git a/netbox/ipam/graphql/mixins.py b/netbox/ipam/graphql/mixins.py new file mode 100644 index 000000000..ba1eaf463 --- /dev/null +++ b/netbox/ipam/graphql/mixins.py @@ -0,0 +1,12 @@ +import graphene + +__all__ = ( + 'IPAddressesMixin', +) + + +class IPAddressesMixin: + ip_addresses = graphene.List('ipam.graphql.types.IPAddressType') + + def resolve_ip_addresses(self, info): + return self.ip_addresses.restrict(info.context.user, 'view') diff --git a/netbox/utilities/testing/api.py b/netbox/utilities/testing/api.py index 3bb54b529..fe652843a 100644 --- a/netbox/utilities/testing/api.py +++ b/netbox/utilities/testing/api.py @@ -5,7 +5,7 @@ from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.urls import reverse from django.test import override_settings -from graphene.types.dynamic import Dynamic +from graphene.types import Dynamic as GQLDynamic, List as GQLList from rest_framework import status from rest_framework.test import APIClient @@ -446,9 +446,13 @@ class APIViewTestCases: # Compile list of fields to include fields_string = '' for field_name, field in type_class._meta.fields.items(): - if type(field) is Dynamic: + if type(field) is GQLDynamic: # Dynamic fields must specify a subselection fields_string += f'{field_name} {{ id }}\n' + elif type(field.type) is GQLList and field_name not in ('tags', 'choices'): + # TODO: Come up with something more elegant + # Temporary hack to support automated testing of reverse generic relations + fields_string += f'{field_name} {{ id }}\n' else: fields_string += f'{field_name}\n' diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index f4e757ecf..d12775436 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/graphql/types.py @@ -1,3 +1,4 @@ +from ipam.graphql.mixins import IPAddressesMixin from virtualization import filtersets, models from netbox.graphql.types import ObjectType, TaggedObjectType @@ -42,7 +43,7 @@ class VirtualMachineType(TaggedObjectType): filterset_class = filtersets.VirtualMachineFilterSet -class VMInterfaceType(TaggedObjectType): +class VMInterfaceType(IPAddressesMixin, TaggedObjectType): class Meta: model = models.VMInterface