skillbox/server/book/schema.py

90 lines
2.4 KiB
Python

import graphene
from graphene import relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from .models import Book, Topic, Module
class ModuleNode(DjangoObjectType):
pk = graphene.Int()
hero_image = graphene.String()
class Meta:
model = Module
only_fields = [
'slug', 'title', 'meta_title', 'teaser', 'description', 'objectivegroup_set'
]
filter_fields = {
'slug': ['exact', 'icontains', 'in'],
'title': ['exact', 'icontains', 'in'],
}
interfaces = (relay.Node,)
def resolve_pk(self, *args, **kwargs):
return self.id
def resolve_hero_image(self, *args, **kwargs):
if self.hero_image:
return self.hero_image.file.url
class TopicNode(DjangoObjectType):
pk = graphene.Int()
modules = DjangoFilterConnectionField(ModuleNode)
class Meta:
model = Topic
only_fields = [
'slug', 'title', 'meta_title', 'teaser', 'description',
]
filter_fields = {
'slug': ['exact', 'icontains', 'in'],
'title': ['exact', 'icontains', 'in'],
}
interfaces = (relay.Node,)
def resolve_pk(self, *args, **kwargs):
return self.id
def resolve_modules(self, *args, **kwargs):
return Module.get_topic_modules(self)
class BookNode(DjangoObjectType):
pk = graphene.Int()
topics = DjangoFilterConnectionField(TopicNode)
class Meta:
model = Book
only_fields = [
'slug', 'title',
]
filter_fields = {
'slug': ['exact', 'icontains', 'in'],
'title': ['exact', 'icontains', 'in'],
}
interfaces = (relay.Node,)
def resolve_pk(self, *args, **kwargs):
return self.id
def resolve_topics(self, *args, **kwargs):
return Topic.get_book_topics(self)
class BookQuery(object):
books = DjangoFilterConnectionField(BookNode)
topics = DjangoFilterConnectionField(TopicNode)
modules = DjangoFilterConnectionField(ModuleNode)
def resolve_books(self, *args, **kwargs):
return Book.objects.filter(**kwargs).live()
def resolve_topics(self, *args, **kwargs):
return Topic.objects.filter(**kwargs).live()
def resolve_modules(self, *args, **kwargs):
return Module.objects.filter(**kwargs).live()