From acdcc7ea131418ce764248734868a018ca4837c6 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 4 Mar 2020 16:42:20 +0100 Subject: [PATCH] Add class member node --- server/users/models.py | 6 ++++-- server/users/schema.py | 44 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/server/users/models.py b/server/users/models.py index 51049015..209c3e80 100644 --- a/server/users/models.py +++ b/server/users/models.py @@ -11,7 +11,6 @@ from users.managers import RoleManager, UserRoleManager, UserManager DEFAULT_SCHOOL_ID = 1 - class User(AbstractUser): last_module = models.ForeignKey('books.Module', related_name='+', on_delete=models.SET_NULL, null=True) avatar_url = models.CharField(max_length=254, blank=True, default='') @@ -43,13 +42,16 @@ class User(AbstractUser): return User.objects.filter(school_classes__users=self.pk) def get_teacher(self): - if self.user_roles.filter(role__key='teacher').exists(): + if self.is_teacher(): return self elif self.school_classes.count() > 0: return self.school_classes.first().get_teacher() else: return None + def is_teacher(self): + return self.user_roles.filter(role__key='teacher').exists() + def selected_class(self): try: settings = UserSetting.objects.get(user=self) diff --git a/server/users/schema.py b/server/users/schema.py index 398c6202..310290d4 100644 --- a/server/users/schema.py +++ b/server/users/schema.py @@ -1,19 +1,21 @@ import graphene -from graphene import relay +from django.db.models import Prefetch, Value, CharField +from django.db.models.functions import Concat +from graphene import relay, ObjectType from graphene_django import DjangoObjectType from graphene_django.filter import DjangoFilterConnectionField +from graphql_relay import to_global_id -from assignments.models import StudentSubmission -from assignments.schema.types import StudentSubmissionNode from basicknowledge.models import BasicKnowledge from basicknowledge.queries import InstrumentNode from books.models import Module from books.schema.queries import ModuleNode -from users.models import User, SchoolClass +from users.models import User, SchoolClass, SchoolClassMember class SchoolClassNode(DjangoObjectType): pk = graphene.Int() + members = graphene.List('users.schema.ClassMemberNode') class Meta: model = SchoolClass @@ -23,6 +25,9 @@ class SchoolClassNode(DjangoObjectType): def resolve_pk(self, *args, **kwargs): return self.id + def resolve_members(self, info, **kwargs): + return SchoolClassMember.objects.filter(school_class=self) + class UserNode(DjangoObjectType): pk = graphene.Int() @@ -46,6 +51,37 @@ class UserNode(DjangoObjectType): return self.selected_class() +class ClassMemberNode(ObjectType): + """ + We need to build this ourselves, because we want the active property on the node, because providing it on the + Connection or Edge for a UserNodeConnection is difficult. + """ + user = graphene.Field(UserNode) + active = graphene.Boolean() + first_name = graphene.String() + last_name = graphene.String() + is_teacher = graphene.Boolean() + id = graphene.ID() + + def resolve_id(self, *args): + return to_global_id('UserNode', self.user.pk) + + def resolve_active(self, *args): + return self.active + + def resolve_first_name(self, *args): + return self.user.first_name + + def resolve_last_name(self, *args): + return self.user.last_name + + def resolve_user(self, info, **kwargs): + return self.user + + def resolve_is_teacher(self, *args): + return self.user.is_teacher() + + class UsersQuery(object): me = graphene.Field(UserNode) all_users = DjangoFilterConnectionField(UserNode)