68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
import graphene
|
|
from django.db.models import Q
|
|
from graphene import relay
|
|
from graphene_django import DjangoObjectType
|
|
|
|
from api.utils import get_by_id_or_slug
|
|
from portfolio.models import Project, ProjectEntry
|
|
from users.models import Role, UserRole
|
|
from users.schema import PublicUserNode
|
|
|
|
|
|
class ProjectEntryNode(DjangoObjectType):
|
|
class Meta:
|
|
model = ProjectEntry
|
|
interfaces = (relay.Node,)
|
|
fields = ("description", "document_url", "project", "created")
|
|
|
|
|
|
class ProjectNode(DjangoObjectType):
|
|
pk = graphene.Int()
|
|
entries_count = graphene.Int()
|
|
entries = graphene.List(ProjectEntryNode)
|
|
student = graphene.Field(PublicUserNode)
|
|
|
|
class Meta:
|
|
model = Project
|
|
filter_fields = ["slug", "appearance"]
|
|
interfaces = (relay.Node,)
|
|
|
|
def resolve_pk(self, *args, **kwargs):
|
|
return self.id
|
|
|
|
def resolve_entries_count(self, *args, **kwargs):
|
|
return self.entries.count()
|
|
|
|
@staticmethod
|
|
def resolve_entries(root: Project, info, **kwargs):
|
|
return root.entries.all()
|
|
|
|
|
|
class PortfolioQuery(object):
|
|
project = graphene.Field(ProjectNode, id=graphene.ID(), slug=graphene.String())
|
|
projects = graphene.List(ProjectNode)
|
|
|
|
def resolve_projects(self, info, **kwargs):
|
|
user = info.context.user
|
|
if user.is_superuser:
|
|
return Project.objects.all().order_by("-pk")
|
|
|
|
if (
|
|
UserRole.get_role_for_user(user).role
|
|
== Role.objects.get_default_teacher_role()
|
|
):
|
|
return Project.objects.filter(
|
|
Q(student__school_classes__in=user.school_classes.all(), final=True)
|
|
| Q(student=user, final=False)
|
|
).distinct()
|
|
|
|
return Project.objects.filter(student=user)
|
|
|
|
def resolve_project(self, info, **kwargs):
|
|
user = info.context.user # type: User
|
|
project = get_by_id_or_slug(Project, **kwargs) # type: Project
|
|
|
|
if project.is_viewable_by(user):
|
|
return project
|
|
return None
|