from builtins import PermissionError import graphene import json from graphene import relay from api.utils import get_object from books.models import ContentBlock from notes.inputs import AddNoteArgument, UpdateNoteArgument from notes.models import ContentBlockBookmark, Note from notes.schema import NoteNode class UpdateContentBookmark(relay.ClientIDMutation): class Input: uuid = graphene.UUID(required=True) content_block = graphene.ID(required=True) bookmarked = graphene.Boolean(required=True) success = graphene.Boolean() errors = graphene.String() @classmethod def mutate_and_get_payload(cls, root, info, **kwargs): uuid = kwargs.get('uuid') user = info.context.user content_block_id = kwargs.get('content_block') bookmarked = kwargs.get('bookmarked') content_block = get_object(ContentBlock, content_block_id) if bookmarked: ContentBlockBookmark.objects.create( content_block=content_block, uuid=uuid, user=user ) else: ContentBlockBookmark.objects.get( content_block=content_block, uuid=uuid, user=user ).delete() return cls(success=True) class AddNote(relay.ClientIDMutation): class Input: note = graphene.Argument(AddNoteArgument) note = graphene.Field(NoteNode) @classmethod def mutate_and_get_payload(cls, root, info, **kwargs): user = info.context.user note = kwargs.get('note') content_uuid = note.get('content') content_block_id = note.get('content_block') content_block = get_object(ContentBlock, content_block_id) text = note.get('text') bookmark = ContentBlockBookmark.objects.get( content_block=content_block, uuid=content_uuid, user=user ) bookmark.note = Note.objects.create(text=text) bookmark.save() return cls(note=bookmark.note) class UpdateNote(relay.ClientIDMutation): class Input: note = graphene.Argument(UpdateNoteArgument) note = graphene.Field(NoteNode) @classmethod def mutate_and_get_payload(cls, root, info, **kwargs): user = info.context.user note = kwargs.get('note') id = note.get('id') text = note.get('text') note = get_object(Note, id) if note.contentblockbookmark.user != user: raise PermissionError note.text = text note.save() return cls(note=note) class NoteMutations: add_note = AddNote.Field() update_note = UpdateNote.Field() update_content_bookmark = UpdateContentBookmark.Field()