diff --git a/netbox/netbox/graphql/schema.py b/netbox/netbox/graphql/schema.py index 136477245..bb752b8c4 100644 --- a/netbox/netbox/graphql/schema.py +++ b/netbox/netbox/graphql/schema.py @@ -5,6 +5,7 @@ from dcim.graphql.schema import DCIMQuery from extras.graphql.schema import ExtrasQuery from ipam.graphql.schema import IPAMQuery from tenancy.graphql.schema import TenancyQuery +from users.graphql.schema import UsersQuery from virtualization.graphql.schema import VirtualizationQuery @@ -14,6 +15,7 @@ class Query( ExtrasQuery, IPAMQuery, TenancyQuery, + UsersQuery, VirtualizationQuery, graphene.ObjectType ): diff --git a/netbox/users/graphql/__init__.py b/netbox/users/graphql/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/users/graphql/schema.py b/netbox/users/graphql/schema.py new file mode 100644 index 000000000..b25c8f33d --- /dev/null +++ b/netbox/users/graphql/schema.py @@ -0,0 +1,12 @@ +import graphene + +from netbox.graphql.fields import ObjectField, ObjectListField +from .types import * + + +class UsersQuery(graphene.ObjectType): + group = ObjectField(GroupType) + groups = ObjectListField(GroupType) + + user = ObjectField(UserType) + users = ObjectListField(UserType) diff --git a/netbox/users/graphql/types.py b/netbox/users/graphql/types.py new file mode 100644 index 000000000..3315744b9 --- /dev/null +++ b/netbox/users/graphql/types.py @@ -0,0 +1,37 @@ +from django.contrib.auth.models import Group, User +from graphene_django import DjangoObjectType + +from users import filtersets +from utilities.querysets import RestrictedQuerySet + +__all__ = ( + 'GroupType', + 'UserType', +) + + +class GroupType(DjangoObjectType): + + class Meta: + model = Group + fields = ('id', 'name') + filterset_class = filtersets.GroupFilterSet + + @classmethod + def get_queryset(cls, queryset, info): + return RestrictedQuerySet(model=Group) + + +class UserType(DjangoObjectType): + + class Meta: + model = User + fields = ( + 'id', 'username', 'password', 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'date_joined', + 'groups', + ) + filterset_class = filtersets.UserFilterSet + + @classmethod + def get_queryset(cls, queryset, info): + return RestrictedQuerySet(model=User) diff --git a/netbox/users/tests/test_api.py b/netbox/users/tests/test_api.py index 9ddb76884..adaa3c337 100644 --- a/netbox/users/tests/test_api.py +++ b/netbox/users/tests/test_api.py @@ -17,7 +17,7 @@ class AppTest(APITestCase): self.assertEqual(response.status_code, 200) -class UserTest(APIViewTestCases.APIViewTestCase): +class UserTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = User view_namespace = 'users' brief_fields = ['display', 'id', 'url', 'username'] @@ -48,7 +48,7 @@ class UserTest(APIViewTestCases.APIViewTestCase): User.objects.bulk_create(users) -class GroupTest(APIViewTestCases.APIViewTestCase): +class GroupTest(APIViewTestCases.GraphQLTestCase, APIViewTestCases.APIViewTestCase): model = Group view_namespace = 'users' brief_fields = ['display', 'id', 'name', 'url'] diff --git a/netbox/utilities/api.py b/netbox/utilities/api.py index b4bde9b53..4e147b7a2 100644 --- a/netbox/utilities/api.py +++ b/netbox/utilities/api.py @@ -33,6 +33,9 @@ def get_graphql_type_for_model(model): Return the GraphQL type class for the given model. """ app_name, model_name = model._meta.label.split('.') + # Object types for Django's auth models are in the users app + if app_name == 'auth': + app_name = 'users' class_name = f'{app_name}.graphql.types.{model_name}Type' try: return dynamic_import(class_name)