skillbox/server/notes/schema.py

170 lines
4.4 KiB
Python

import uuid
import graphene
from basicknowledge.queries import InstrumentNode
from books.schema.nodes import ContentBlockNode, ModuleNode
from books.schema.nodes.chapter import ChapterNode
from core.logger import get_logger
from graphene import relay
from graphene_django import DjangoObjectType
from notes.models import (
ChapterBookmark,
ContentBlockBookmark,
Highlight,
InstrumentBookmark,
ModuleBookmark,
Note,
)
logger = get_logger(__name__)
content_dict = {
'assignment': 'Auftrag',
'basic_knowledge': '',
'survey': 'Übung',
'image_block': 'Bild',
'link_block': 'Link',
'solution': 'Lösung',
'video_block': 'Video',
'document_block': 'Dokument',
'infogram_block': 'Infografik',
'genially_block': 'Infografik',
'thinglink_block': 'Infografik',
'subtitle': 'Titel',
'instruction': 'Anweisung',
'cms_document_block': 'Dokument',
}
def find_content(content_list, bookmark):
found = (content for content in content_list if uuid.UUID(content['id']) == bookmark.uuid)
content = next(found, None)
if content is None:
return ''
if content['type'] in ['text_block', 'subtitle', 'solution', 'basic_knowledge']:
return content['value']['text']
return content_dict.get(content['type'], '')
class NoteNode(DjangoObjectType):
pk = graphene.Int()
class Meta:
model = Note
fields = "__all__"
interfaces = (relay.Node,)
def resolve_pk(self, *args, **kwargs):
return self.id
class ContentBlockBookmarkNode(DjangoObjectType):
uuid = graphene.UUID()
note = graphene.Field(NoteNode)
path = graphene.String()
content = graphene.String()
class Meta:
model = ContentBlockBookmark
fields = "__all__"
filter_fields = []
interfaces = (relay.Node,)
@staticmethod
def resolve_path(root: ContentBlockBookmark, info, **kwargs):
return root.content_block.route
@staticmethod
def resolve_content(root: ContentBlockBookmark, info, **kwargs):
contents = root.content_block.contents.raw_data
return find_content(contents, root)
class ModuleBookmarkNode(DjangoObjectType):
note = graphene.Field(NoteNode)
path = graphene.String()
content = graphene.String()
class Meta:
model = ModuleBookmark
fields = "__all__"
@staticmethod
def resolve_path(root: ModuleBookmark, info, **kwargs):
return root.module.route
@staticmethod
def resolve_content(root: ModuleBookmark, info, **kwargs):
return root.module.intro
class ChapterBookmarkNode(DjangoObjectType):
note = graphene.Field(NoteNode)
path = graphene.String()
content = graphene.String()
class Meta:
model = ChapterBookmark
fields = "__all__"
filter_fields = []
interfaces = (relay.Node,)
@staticmethod
def resolve_path(root: ChapterBookmark, info, **kwargs):
return root.chapter.route
@staticmethod
def resolve_content(root: ChapterBookmark, info, **kwargs):
return root.chapter.description
class InstrumentBookmarkNode(DjangoObjectType):
uuid = graphene.UUID()
note = graphene.Field(NoteNode)
path = graphene.String(required=True)
content = graphene.String()
class Meta:
model = InstrumentBookmark
fields = "__all__"
filter_fields = []
interfaces = (relay.Node,)
@staticmethod
def resolve_path(root: InstrumentBookmark, info, **kwargs):
return root.instrument.route
@staticmethod
def resolve_content(root: InstrumentBookmark, info, **kwargs):
contents = root.instrument.contents.raw_data
return find_content(contents, root)
class BookmarkNode(graphene.Union):
class Meta:
types = (
ContentBlockBookmarkNode,
ModuleBookmarkNode,
ChapterBookmarkNode,
InstrumentBookmarkNode,
)
class HighlightableNode(graphene.Union):
class Meta:
types = (ContentBlockNode, InstrumentNode, ModuleNode, ChapterNode)
class HighlightNode(DjangoObjectType):
page = graphene.Field(HighlightableNode, required=True)
class Meta:
model = Highlight
fields = "__all__"
filter_fields = []
interfaces = (relay.Node,)
@staticmethod
def resolve_page(root: Highlight, *args, **kwargs):
return root.page.specific