79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
import graphene
|
|
from graphene import relay
|
|
from graphene_django import DjangoObjectType
|
|
from graphene_django.filter import DjangoFilterConnectionField
|
|
|
|
from objectives.models import ObjectiveGroup, Objective, ObjectiveProgressStatus
|
|
|
|
|
|
class ObjectiveGroupNode(DjangoObjectType):
|
|
pk = graphene.Int()
|
|
display_title = graphene.String()
|
|
mine = graphene.Boolean()
|
|
|
|
class Meta:
|
|
model = ObjectiveGroup
|
|
filter_fields = ['title', 'module__slug']
|
|
interfaces = (relay.Node,)
|
|
|
|
def resolve_pk(self, *args, **kwargs):
|
|
return self.id
|
|
|
|
def resolve_display_title(self, *args, **kwargs):
|
|
return self.get_title_display()
|
|
|
|
def resolve_mine(self, info, **kwargs):
|
|
return self.owner is not None and self.owner.pk == info.context.user.pk
|
|
|
|
def resolve_objectives(self, info, **kwargs):
|
|
user = info.context.user
|
|
school_classes = user.school_classes.values_list('pk')
|
|
|
|
if user.has_perm('users.can_manage_school_class_content'): # teacher
|
|
publisher_objectives = self.objectives.filter(owner=None)
|
|
user_created_objectives = self.objectives.filter(owner=user)
|
|
else: # student
|
|
publisher_objectives = self.objectives.filter(owner=None).exclude(
|
|
hidden_for__in=school_classes)
|
|
|
|
user_created_objectives = self.objectives.filter(owner__isnull=False,
|
|
visible_for__in=school_classes)
|
|
|
|
return publisher_objectives.union(user_created_objectives)
|
|
|
|
|
|
class ObjectiveNode(DjangoObjectType):
|
|
pk = graphene.Int()
|
|
user_created = graphene.Boolean()
|
|
mine = graphene.Boolean()
|
|
|
|
class Meta:
|
|
model = Objective
|
|
filter_fields = ['text']
|
|
interfaces = (relay.Node,)
|
|
|
|
def resolve_objective_progress(self, info, **kwargs):
|
|
return self.objective_progress.filter(user=info.context.user)
|
|
|
|
def resolve_user_created(self, info, **kwargs):
|
|
return self.owner is not None
|
|
|
|
def resolve_mine(self, info, **kwargs):
|
|
return self.owner is not None and self.owner.pk == info.context.user.pk
|
|
|
|
class ObjectiveProgressStatusNode(DjangoObjectType):
|
|
pk = graphene.Int()
|
|
|
|
class Meta:
|
|
model = ObjectiveProgressStatus
|
|
filter_fields = ['objective__text', 'user__username', 'done']
|
|
interfaces = (relay.Node,)
|
|
|
|
def resolve_pk(self, *args, **kwargs):
|
|
return self.id
|
|
|
|
|
|
class ObjectivesQuery(object):
|
|
objective_group = relay.Node.Field(ObjectiveGroupNode)
|
|
objective_groups = DjangoFilterConnectionField(ObjectiveGroupNode)
|