Arthur 2 лет назад
Родитель
Сommit
700f015942

+ 93 - 0
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

+ 16 - 31
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()

+ 49 - 35
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 CircuitTypeType(OrganizationalObjectType):
-
-    class Meta:
-        model = models.CircuitType
-        fields = '__all__'
-        filterset_class = filtersets.CircuitTypeFilterSet
+    # class CircuitType(NetBoxObjectType, ContactsMixin):
+    pass
 
 
-class ProviderType(NetBoxObjectType, ContactsMixin):
-
-    class Meta:
-        model = models.Provider
-        fields = '__all__'
-        filterset_class = filtersets.ProviderFilterSet
+@strawberry.django.type(
+    models.CircuitType,
+    fields='__all__',
+    filters=CircuitTypeFilter
+)
+class CircuitTypeType:
+    # class CircuitTypeType(OrganizationalObjectType):
+    pass
 
 
-class ProviderAccountType(NetBoxObjectType):
+@strawberry.django.type(
+    models.Provider,
+    fields='__all__',
+    filters=ProviderFilter
+)
+class ProviderType:
+    # class ProviderType(NetBoxObjectType, ContactsMixin):
+    pass
 
-    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

+ 1 - 0
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

+ 2 - 1
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
 
 

+ 10 - 16
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

+ 28 - 0
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

+ 0 - 1
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 *