skillbox/server/notes/schema.py

119 lines
2.8 KiB
Python

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__)
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()
class Meta:
model = ContentBlockBookmark
fields = "__all__"
filter_fields = []
interfaces = (relay.Node,)
@staticmethod
def resolve_path(root: ContentBlockBookmark, info, **kwargs):
return root.content_block.route
class ModuleBookmarkNode(DjangoObjectType):
note = graphene.Field(NoteNode)
path = graphene.String()
class Meta:
model = ModuleBookmark
fields = "__all__"
@staticmethod
def resolve_path(root: ModuleBookmark, info, **kwargs):
return root.module.route
class ChapterBookmarkNode(DjangoObjectType):
note = graphene.Field(NoteNode)
path = 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
class InstrumentBookmarkNode(DjangoObjectType):
uuid = graphene.UUID()
note = graphene.Field(NoteNode)
path = graphene.String(required=True)
class Meta:
model = InstrumentBookmark
fields = "__all__"
filter_fields = []
interfaces = (relay.Node,)
@staticmethod
def resolve_path(root: InstrumentBookmark, info, **kwargs):
return root.instrument.route
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)
class Meta:
model = Highlight
fields = "__all__"
filter_fields = []
interfaces = (relay.Node,)
@staticmethod
def resolve_page(root: Highlight, *args, **kwargs):
return root.page.specific