From f3810be3e4c1a6429a52c57267b74ba8f46dba22 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 24 Aug 2023 14:54:24 -0700 Subject: [PATCH] 9856 user and circuits base --- netbox/circuits/graphql/filters.py | 93 ++++++++++++++++++++++++++++++ netbox/circuits/graphql/schema.py | 47 +++++---------- netbox/circuits/graphql/types.py | 84 ++++++++++++++++----------- netbox/extras/graphql/mixins.py | 1 + netbox/netbox/graphql/schema.py | 3 +- netbox/netbox/graphql/types.py | 26 ++++----- netbox/users/graphql/filters.py | 28 +++++++++ netbox/users/graphql/schema.py | 1 - 8 files changed, 199 insertions(+), 84 deletions(-) create mode 100644 netbox/circuits/graphql/filters.py create mode 100644 netbox/users/graphql/filters.py diff --git a/netbox/circuits/graphql/filters.py b/netbox/circuits/graphql/filters.py new file mode 100644 index 000000000..d47d36502 --- /dev/null +++ b/netbox/circuits/graphql/filters.py @@ -0,0 +1,93 @@ +import strawberry +from strawberry import auto +from circuits import models, filtersets + +__all__ = ( + 'CircuitTerminationFilter', + 'CircuitFilter', + 'CircuitTypeFilter', + 'ProviderFilter', + 'ProviderAccountFilter', + 'ProviderNetworkFilter', +) + + +@strawberry.django.filter(models.CircuitTermination, lookups=True) +class CircuitTerminationFilter(filtersets.CircuitTerminationFilterSet): + id: auto + term_side: auto + port_speed: auto + upstream_speed: auto + xconnect_id: auto + description: auto + cable_end: auto + # q: auto + circuit_id: auto + site_id: auto + site: auto + # provider_network_id: auto + + +@strawberry.django.filter(models.Circuit, lookups=True) +class CircuitFilter(filtersets.CircuitFilterSet): + id: auto + cid: auto + description: auto + install_date: auto + termination_date: auto + commit_rate: auto + provider_id: auto + provider: auto + provider_account_id: auto + # provider_network_id: auto + type_id: auto + type: auto + status: auto + # region_id: auto + # region: auto + # site_group_id: auto + # site_group: auto + # site_id: auto + # site: auto + + +@strawberry.django.filter(models.CircuitType, lookups=True) +class CircuitTypeFilter(filtersets.CircuitTypeFilterSet): + id: auto + name: auto + slug: auto + description: auto + + +@strawberry.django.filter(models.Provider, lookups=True) +class ProviderFilter(filtersets.ProviderFilterSet): + id: auto + name: auto + slug: auto + # region_id: auto + # region: auto + # site_group_id: auto + # site_group: auto + # site_id: auto + # site: auto + # asn_id: auto + + +@strawberry.django.filter(models.ProviderAccount, lookups=True) +class ProviderAccountFilter(filtersets.ProviderAccountFilterSet): + id: auto + name: auto + account: auto + description: auto + # provider_id: auto + # provider: auto + + +@strawberry.django.filter(models.ProviderNetwork, lookups=True) +class ProviderNetworkFilter(filtersets.ProviderNetworkFilterSet): + id: auto + name: auto + service_id: auto + description: auto + # provider_id: auto + # provider: auto diff --git a/netbox/circuits/graphql/schema.py b/netbox/circuits/graphql/schema.py index 3d85f2512..1eb665d72 100644 --- a/netbox/circuits/graphql/schema.py +++ b/netbox/circuits/graphql/schema.py @@ -1,41 +1,26 @@ -import graphene +from typing import List +import strawberry from circuits import models -from netbox.graphql.fields import ObjectField, ObjectListField from .types import * -from utilities.graphql_optimizer import gql_query_optimizer -class CircuitsQuery(graphene.ObjectType): - circuit = ObjectField(CircuitType) - circuit_list = ObjectListField(CircuitType) +@strawberry.type +class CircuitsQuery: + circuit: CircuitType = strawberry.django.field() + circuit_list: List[CircuitType] = strawberry.django.field() - def resolve_circuit_list(root, info, **kwargs): - return gql_query_optimizer(models.Circuit.objects.all(), info) + circuit_termination: CircuitTerminationType = strawberry.django.field() + circuit_termination_list: List[CircuitTerminationType] = strawberry.django.field() - circuit_termination = ObjectField(CircuitTerminationType) - circuit_termination_list = ObjectListField(CircuitTerminationType) + circuit_type: CircuitTypeType = strawberry.django.field() + circuit_type_list: List[CircuitTypeType] = strawberry.django.field() - def resolve_circuit_termination_list(root, info, **kwargs): - return gql_query_optimizer(models.CircuitTermination.objects.all(), info) + provider: ProviderType = strawberry.django.field() + provider_list: List[ProviderType] = strawberry.django.field() - circuit_type = ObjectField(CircuitTypeType) - circuit_type_list = ObjectListField(CircuitTypeType) + provider_account: ProviderAccountType = strawberry.django.field() + provider_account_list: List[ProviderAccountType] = strawberry.django.field() - def resolve_circuit_type_list(root, info, **kwargs): - return gql_query_optimizer(models.CircuitType.objects.all(), info) - - provider = ObjectField(ProviderType) - provider_list = ObjectListField(ProviderType) - - def resolve_provider_list(root, info, **kwargs): - return gql_query_optimizer(models.Provider.objects.all(), info) - - provider_account = ObjectField(ProviderAccountType) - provider_account_list = ObjectListField(ProviderAccountType) - - provider_network = ObjectField(ProviderNetworkType) - provider_network_list = ObjectListField(ProviderNetworkType) - - def resolve_provider_network_list(root, info, **kwargs): - return gql_query_optimizer(models.ProviderNetwork.objects.all(), info) + provider_network: ProviderNetworkType = strawberry.django.field() + provider_network_list: List[ProviderNetworkType] = strawberry.django.field() diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index baa135e00..65a733a01 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -1,9 +1,10 @@ -import graphene +import strawberry from circuits import filtersets, models from dcim.graphql.mixins import CabledObjectMixin from extras.graphql.mixins import CustomFieldsMixin, TagsMixin, ContactsMixin from netbox.graphql.types import ObjectType, OrganizationalObjectType, NetBoxObjectType +from .filters import * __all__ = ( 'CircuitTerminationType', @@ -15,48 +16,61 @@ __all__ = ( ) -class CircuitTerminationType(CustomFieldsMixin, TagsMixin, CabledObjectMixin, ObjectType): - - class Meta: - model = models.CircuitTermination - fields = '__all__' - filterset_class = filtersets.CircuitTerminationFilterSet +@strawberry.django.type( + models.CircuitTermination, + fields='__all__', + filters=CircuitTerminationFilter +) +class CircuitTerminationType: + # class CircuitTerminationType(CustomFieldsMixin, TagsMixin, CabledObjectMixin, ObjectType): + pass +@strawberry.django.type( + models.Circuit, + fields='__all__', + filters=CircuitFilter +) class CircuitType(NetBoxObjectType, ContactsMixin): - class Meta: - model = models.Circuit - fields = '__all__' - filterset_class = filtersets.CircuitFilterSet + # class CircuitType(NetBoxObjectType, ContactsMixin): + pass -class CircuitTypeType(OrganizationalObjectType): - - class Meta: - model = models.CircuitType - fields = '__all__' - filterset_class = filtersets.CircuitTypeFilterSet +@strawberry.django.type( + models.CircuitType, + fields='__all__', + filters=CircuitTypeFilter +) +class CircuitTypeType: + # class CircuitTypeType(OrganizationalObjectType): + pass -class ProviderType(NetBoxObjectType, ContactsMixin): - - class Meta: - model = models.Provider - fields = '__all__' - filterset_class = filtersets.ProviderFilterSet +@strawberry.django.type( + models.Provider, + fields='__all__', + filters=ProviderFilter +) +class ProviderType: + # class ProviderType(NetBoxObjectType, ContactsMixin): + pass -class ProviderAccountType(NetBoxObjectType): - - class Meta: - model = models.ProviderAccount - fields = '__all__' - filterset_class = filtersets.ProviderAccountFilterSet +@strawberry.django.type( + models.ProviderAccount, + fields='__all__', + filters=ProviderAccountFilter +) +class ProviderAccountType: + # class ProviderAccountType(NetBoxObjectType): + pass -class ProviderNetworkType(NetBoxObjectType): - - class Meta: - model = models.ProviderNetwork - fields = '__all__' - filterset_class = filtersets.ProviderNetworkFilterSet +@strawberry.django.type( + models.ProviderNetwork, + fields='__all__', + filters=ProviderNetworkFilter +) +class ProviderNetworkType: + # class ProviderNetworkType(NetBoxObjectType): + pass diff --git a/netbox/extras/graphql/mixins.py b/netbox/extras/graphql/mixins.py index 7045575fb..ac535c99d 100644 --- a/netbox/extras/graphql/mixins.py +++ b/netbox/extras/graphql/mixins.py @@ -1,3 +1,4 @@ +import strawberry import graphene from django.contrib.contenttypes.models import ContentType from graphene.types.generic import GenericScalar diff --git a/netbox/netbox/graphql/schema.py b/netbox/netbox/graphql/schema.py index 8323e440c..02737b819 100644 --- a/netbox/netbox/graphql/schema.py +++ b/netbox/netbox/graphql/schema.py @@ -1,11 +1,12 @@ import strawberry from strawberry_django.optimizer import DjangoOptimizerExtension from strawberry.schema.config import StrawberryConfig +from circuits.graphql.schema import CircuitsQuery from users.graphql.schema import UsersQuery @strawberry.type -class Query(UsersQuery): +class Query(CircuitsQuery, UsersQuery): pass diff --git a/netbox/netbox/graphql/types.py b/netbox/netbox/graphql/types.py index 10847742b..ed466b21a 100644 --- a/netbox/netbox/graphql/types.py +++ b/netbox/netbox/graphql/types.py @@ -1,4 +1,5 @@ -import graphene +import strawberry +from strawberry import auto from django.contrib.contenttypes.models import ContentType from extras.graphql.mixins import ( @@ -7,7 +8,6 @@ from extras.graphql.mixins import ( JournalEntriesMixin, TagsMixin, ) -from graphene_django import DjangoObjectType __all__ = ( 'BaseObjectType', @@ -21,20 +21,17 @@ __all__ = ( # Base types # -class BaseObjectType(DjangoObjectType): +class BaseObjectType: """ Base GraphQL object type for all NetBox objects. Restricts the model queryset to enforce object permissions. """ - display = graphene.String() - class_type = graphene.String() - - class Meta: - abstract = True + display: auto + class_type: auto @classmethod def get_queryset(cls, queryset, info): # Enforce object permissions on the queryset - return queryset.restrict(info.context.user, 'view') + return queryset.restrict(info.context.request.user, 'view') def resolve_display(parent, info, **kwargs): return str(parent) @@ -50,8 +47,7 @@ class ObjectType( """ Base GraphQL object type for unclassified models which support change logging """ - class Meta: - abstract = True + pass class OrganizationalObjectType( @@ -63,8 +59,7 @@ class OrganizationalObjectType( """ Base type for organizational models """ - class Meta: - abstract = True + pass class NetBoxObjectType( @@ -77,15 +72,14 @@ class NetBoxObjectType( """ GraphQL type for most NetBox models. Includes support for custom fields, change logging, journaling, and tags. """ - class Meta: - abstract = True + pass # # Miscellaneous types # -class ContentTypeType(DjangoObjectType): +class ContentTypeType: class Meta: model = ContentType diff --git a/netbox/users/graphql/filters.py b/netbox/users/graphql/filters.py new file mode 100644 index 000000000..4630cd70e --- /dev/null +++ b/netbox/users/graphql/filters.py @@ -0,0 +1,28 @@ +import strawberry +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group +from strawberry import auto +from users import filtersets + +__all__ = ( + 'GroupFilter', + 'UserFilter', +) + + +@strawberry.django.filter(Group, lookups=True) +class GroupFilter(filtersets.GroupFilterSet): + id: auto + name: auto + + +@strawberry.django.filter(get_user_model(), lookups=True) +class UserFilter(filtersets.UserFilterSet): + id: auto + username: auto + first_name: auto + last_name: auto + email: auto + is_staff: auto + is_active: auto + is_superuser: auto diff --git a/netbox/users/graphql/schema.py b/netbox/users/graphql/schema.py index b41df6779..808764363 100644 --- a/netbox/users/graphql/schema.py +++ b/netbox/users/graphql/schema.py @@ -3,7 +3,6 @@ import strawberry from django.contrib.auth import get_user_model from django.contrib.auth.models import Group -from netbox.graphql.fields import ObjectField, ObjectListField from .types import *