from datetime import datetime import graphene from graphene import relay from graphene_django import DjangoObjectType from graphene_django.filter import DjangoFilterConnectionField from django.utils.dateformat import format 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 class SchoolClassNode(DjangoObjectType): pk = graphene.Int() class Meta: model = SchoolClass filter_fields = ['name'] interfaces = (relay.Node,) def resolve_pk(self, *args, **kwargs): return self.id class UserNode(DjangoObjectType): pk = graphene.Int() permissions = graphene.List(graphene.String) selected_class = graphene.Field(SchoolClassNode) expiry_date = graphene.String() class Meta: model = User filter_fields = ['username', 'email'] only_fields = ['username', 'email', 'first_name', 'last_name', 'school_classes', 'last_module', 'avatar_url', 'selected_class', 'expiry_date'] interfaces = (relay.Node,) def resolve_pk(self, info, **kwargs): return self.id def resolve_permissions(self, info): return self.get_all_permissions() def resolve_selected_class(self, info): return self.selected_class() def resolve_expiry_date(self, info): if not self.hep_id: # concerns users that already have an (old) account return format(datetime(2020, 7, 31), 'U') # just set some expiry date else: return self.license_expiry_date class UsersQuery(object): me = graphene.Field(UserNode) all_users = DjangoFilterConnectionField(UserNode) my_activity = DjangoFilterConnectionField(ModuleNode) my_instrument_activity = DjangoFilterConnectionField(InstrumentNode) def resolve_me(self, info, **kwargs): return info.context.user def resolve_all_users(self, info, **kwargs): if not info.context.user.is_superuser: return User.objects.none() else: return User.objects.all() def resolve_my_activity(self, info, **kwargs): return Module.objects.all() def resolve_my_instrument_activity(self, info, **kwargs): return BasicKnowledge.objects.all() class AllUsersQuery(object): me = graphene.Field(UserNode) all_users = DjangoFilterConnectionField(UserNode) def resolve_all_users(self, info, **kwargs): if not info.context.user.is_superuser: return User.objects.none() else: return User.objects.all()