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