import graphene from django.core.exceptions import ValidationError from api.utils import get_object, get_errors from book.models import ContentBlock from book.schema.queries import ContentBlockNode class MutateContentBlock(graphene.relay.ClientIDMutation): class Input: id = graphene.ID() type = graphene.String() title = graphene.String() contents = graphene.String() errors = graphene.List(graphene.String) content_block = graphene.Field(ContentBlockNode) # updated_title = graphene.String() # updated_type = graphene.String() @classmethod def mutate_and_get_payload(cls, *args, **kwargs): try: id_param = kwargs['id'] type_param = kwargs['type'] title = kwargs['title'] contents_data = kwargs['contents'] new_content_block = ContentBlock(type=type_param, title=title, contents=contents_data) content_block = get_object(ContentBlock, id_param) content_block.add_sibling(instance=new_content_block, pos='right') # ContentBlock.objects.get() # cb.add_sibling() new_content_block.save() # image_instance = get_object(Image, kwargs['id']) # if image_instance: # image_data = kwargs.get('image') # updated_image = update_create_instance(image_instance, image_data, exception=['id', 'tags']) # tag_slugs = image_data.get('tag_slugs', '') # if tag_slugs is not None: # tag_slugs = [t.strip() for t in tag_slugs.split(',') if t.strip()] # tags = list(Tag.objects.filter(slug__in=tag_slugs)) # tag_slugs = [t for t in tag_slugs if t not in [e.slug for e in tags]] # updated_image.tags.set(*(tags + tag_slugs)) return cls(content_block=new_content_block) except ValidationError as e: errors = get_errors(e) except Exception as e: errors = ['Error: {}'.format(e)] return cls(content_block=None, errors=errors) class BookMutations(object): mutate_content_block = MutateContentBlock.Field()