Add first preliminary version of 'AddContentBlock' mutation
This commit is contained in:
parent
499b52dad1
commit
7d0a97208e
|
|
@ -16,6 +16,18 @@ class ContentBlock(StrictHierarchyPage):
|
||||||
verbose_name = 'Inhaltsblock'
|
verbose_name = 'Inhaltsblock'
|
||||||
verbose_name_plural = 'Inhaltsblöcke'
|
verbose_name_plural = 'Inhaltsblöcke'
|
||||||
|
|
||||||
|
PLAIN = 'plain'
|
||||||
|
YELLOW = 'yellow'
|
||||||
|
GREEN = 'green'
|
||||||
|
BLUE = 'blue'
|
||||||
|
|
||||||
|
TYPE_CHOICES = (
|
||||||
|
(PLAIN, 'Normal'),
|
||||||
|
(YELLOW, 'Gelb'),
|
||||||
|
(GREEN, 'Grün'),
|
||||||
|
(BLUE, 'Blau'),
|
||||||
|
)
|
||||||
|
|
||||||
contents = StreamField([
|
contents = StreamField([
|
||||||
('text_block', TextBlock(icon='doc-full')),
|
('text_block', TextBlock(icon='doc-full')),
|
||||||
('basic_knowledge', BasicKnowledgeBlock(icon='placeholder')),
|
('basic_knowledge', BasicKnowledgeBlock(icon='placeholder')),
|
||||||
|
|
@ -27,12 +39,8 @@ class ContentBlock(StrictHierarchyPage):
|
||||||
|
|
||||||
type = models.CharField(
|
type = models.CharField(
|
||||||
max_length=100,
|
max_length=100,
|
||||||
choices=(
|
choices=TYPE_CHOICES,
|
||||||
('plain', 'Normal'),
|
default=PLAIN
|
||||||
('yellow', 'Gelb'),
|
|
||||||
('green', 'Grün'),
|
|
||||||
('blue', 'Blau'),
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
content_panels = [
|
content_panels = [
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
from graphene import InputObjectType
|
||||||
|
import graphene
|
||||||
|
|
||||||
|
|
||||||
|
class InputTypes(graphene.Enum):
|
||||||
|
text_block = 'text_block'
|
||||||
|
basic_knowledge = 'basic_knowledge'
|
||||||
|
student_entry = 'student_entry'
|
||||||
|
image_block = 'image_block'
|
||||||
|
link_block = 'link_block'
|
||||||
|
task = 'task'
|
||||||
|
|
||||||
|
|
||||||
|
class ContentElementInput(InputObjectType):
|
||||||
|
# we'll handle this with a single input, even tho it would be nice to have a type for every different possibility
|
||||||
|
# see discussion at https://github.com/graphql/graphql-js/issues/207
|
||||||
|
type = InputTypes(required=True)
|
||||||
|
text = graphene.String(description='To be used for link_block, text_block types')
|
||||||
|
url = graphene.String(description='To be used for link, basic_knowledge, image_block types')
|
||||||
|
description = graphene.String(description='To be used for basic_knowledge type')
|
||||||
|
title = graphene.String(description='To be used for image_block type')
|
||||||
|
task_text = graphene.String(description='To be used for task type')
|
||||||
|
|
||||||
|
|
||||||
|
class ContentBlockInput(InputObjectType):
|
||||||
|
title = graphene.String(required=True)
|
||||||
|
type = graphene.String()
|
||||||
|
after = graphene.ID()
|
||||||
|
contents = graphene.List(ContentElementInput)
|
||||||
|
|
@ -1,12 +1,17 @@
|
||||||
|
import json
|
||||||
|
|
||||||
import graphene
|
import graphene
|
||||||
|
from graphene import relay
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from wagtail.core.fields import StreamField
|
||||||
|
|
||||||
from api.utils import get_object, get_errors
|
from api.utils import get_object, get_errors
|
||||||
from book.models import ContentBlock
|
from book.models import ContentBlock, Chapter
|
||||||
|
from book.schema.inputs import ContentBlockInput
|
||||||
from book.schema.queries import ContentBlockNode
|
from book.schema.queries import ContentBlockNode
|
||||||
|
|
||||||
|
|
||||||
class MutateContentBlock(graphene.relay.ClientIDMutation):
|
class MutateContentBlock(relay.ClientIDMutation):
|
||||||
class Input:
|
class Input:
|
||||||
id = graphene.ID()
|
id = graphene.ID()
|
||||||
type = graphene.String()
|
type = graphene.String()
|
||||||
|
|
@ -58,5 +63,37 @@ class MutateContentBlock(graphene.relay.ClientIDMutation):
|
||||||
return cls(content_block=None, errors=errors)
|
return cls(content_block=None, errors=errors)
|
||||||
|
|
||||||
|
|
||||||
|
class AddContentBlock(relay.ClientIDMutation):
|
||||||
|
class Input:
|
||||||
|
content_block = graphene.Argument(ContentBlockInput)
|
||||||
|
|
||||||
|
new_content_block = graphene.Field(ContentBlockNode)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def mutate_and_get_payload(cls, root, info, **args):
|
||||||
|
content_block_data = args.get('content_block')
|
||||||
|
title = content_block_data.get('title')
|
||||||
|
new_content_block = ContentBlock(title=title)
|
||||||
|
parent = Chapter.objects.get(pk=18).specific # atm just "1.1 Lehrbeginn" / todo: dynamic, refactor in above class
|
||||||
|
parent.add_child(instance=new_content_block)
|
||||||
|
revision = new_content_block.save_revision()
|
||||||
|
revision.publish()
|
||||||
|
new_content_block.save()
|
||||||
|
|
||||||
|
contents = content_block_data.get('contents')
|
||||||
|
for content in contents:
|
||||||
|
# todo: add all the content blocks
|
||||||
|
# todo: refactor this mess
|
||||||
|
if content['type'] == 'text_block':
|
||||||
|
new_content_block.contents = json.dumps([
|
||||||
|
{'type': 'text_block', 'value': {
|
||||||
|
'text': '<p>{}</p>'.format(content['text'])
|
||||||
|
}}
|
||||||
|
])
|
||||||
|
new_content_block.save()
|
||||||
|
return cls(new_content_block=new_content_block)
|
||||||
|
|
||||||
|
|
||||||
class BookMutations(object):
|
class BookMutations(object):
|
||||||
mutate_content_block = MutateContentBlock.Field()
|
mutate_content_block = MutateContentBlock.Field()
|
||||||
|
add_content_block = AddContentBlock.Field()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue