From 3547a30228b06a4abc984bc690cf60128f3ec485 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Tue, 16 Oct 2018 07:29:41 +0200 Subject: [PATCH] allow user to set block type --- .../content-block-form/ContentsForm.vue | 17 ++++++++++++++--- .../EditContentBlockWizard.vue | 3 ++- .../NewContentBlockWizard.vue | 3 ++- .../content-blocks/assignment/Assignment.vue | 3 --- .../graphql/gql/mutations/addContentBlock.gql | 1 + ...81015_0915.py => 0003_auto_20181015_1202.py} | 4 ++-- server/books/schema/mutations/contentblock.py | 14 +++++++++++--- server/books/schema/mutations/utils.py | 8 ++++++++ server/books/schema/queries.py | 1 + 9 files changed, 41 insertions(+), 13 deletions(-) rename server/books/migrations/{0003_auto_20181015_0915.py => 0003_auto_20181015_1202.py} (83%) diff --git a/client/src/components/content-block-form/ContentsForm.vue b/client/src/components/content-block-form/ContentsForm.vue index c6b29123..9acb063e 100644 --- a/client/src/components/content-block-form/ContentsForm.vue +++ b/client/src/components/content-block-form/ContentsForm.vue @@ -5,7 +5,11 @@ :placeholder="titlePlaceholder" :value="localContentBlock.title" :error="error"> - + @@ -68,6 +72,7 @@ import AssignmentForm from '@/components/content-forms/AssignmentForm'; import TextForm from '@/components/content-forms/TextForm'; import TrashIcon from '@/components/icons/TrashIcon'; + import Checkbox from '@/components/Checkbox'; export default { props: { @@ -89,17 +94,20 @@ DocumentForm, AssignmentForm, TextForm, - TrashIcon + TrashIcon, + Checkbox }, data() { + console.log(this.contentBlock) return { error: false, localContentBlock: Object.assign({}, { title: this.contentBlock.title, contents: [...this.contentBlock.contents], id: this.contentBlock.id || undefined, - subtitle: this.contentBlock.subtitle + subtitle: this.contentBlock.subtitle, + isAssignment: this.contentBlock.type && this.contentBlock.type === 'TASK' }) } }, @@ -229,6 +237,9 @@ return false; } this.$emit('save', this.localContentBlock); + }, + setContentBlockType(checked, localContentBlock) { + this.localContentBlock.isAssignment = checked; } } } diff --git a/client/src/components/content-block-form/EditContentBlockWizard.vue b/client/src/components/content-block-form/EditContentBlockWizard.vue index b7dbcaa0..705994bd 100644 --- a/client/src/components/content-block-form/EditContentBlockWizard.vue +++ b/client/src/components/content-block-form/EditContentBlockWizard.vue @@ -32,7 +32,8 @@ input: { contentBlock: { title: contentBlock.title, - contents: contentBlock.contents.filter(value => Object.keys(value).length > 0) + contents: contentBlock.contents.filter(value => Object.keys(value).length > 0), + type: contentBlock.isAssignment ? 'TASK' : 'NORMAL' }, id: contentBlock.id } diff --git a/client/src/components/content-block-form/NewContentBlockWizard.vue b/client/src/components/content-block-form/NewContentBlockWizard.vue index cda054b3..fe7bfb7f 100644 --- a/client/src/components/content-block-form/NewContentBlockWizard.vue +++ b/client/src/components/content-block-form/NewContentBlockWizard.vue @@ -31,7 +31,8 @@ input: { contentBlock: { title: contentBlock.title, - contents: contentBlock.contents.filter(value => Object.keys(value).length > 0) + contents: contentBlock.contents.filter(value => Object.keys(value).length > 0), + type: contentBlock.isAssignment ? 'TASK' : 'NORMAL' }, after: this.$store.state.contentBlockPosition.after, parent: this.$store.state.contentBlockPosition.parent diff --git a/client/src/components/content-blocks/assignment/Assignment.vue b/client/src/components/content-blocks/assignment/Assignment.vue index 486d5559..dbeebb96 100644 --- a/client/src/components/content-blocks/assignment/Assignment.vue +++ b/client/src/components/content-blocks/assignment/Assignment.vue @@ -177,9 +177,6 @@ .assignment { margin-bottom: 2em; - padding: 20px; - border-radius: $default-border-radius; - background-color: $color-brand-light; &__title { font-size: toRem(17px); diff --git a/client/src/graphql/gql/mutations/addContentBlock.gql b/client/src/graphql/gql/mutations/addContentBlock.gql index 03fef5c1..f6359991 100644 --- a/client/src/graphql/gql/mutations/addContentBlock.gql +++ b/client/src/graphql/gql/mutations/addContentBlock.gql @@ -5,6 +5,7 @@ mutation AddContentBlock($input: AddContentBlockInput!) { title slug contents + type } errors clientMutationId diff --git a/server/books/migrations/0003_auto_20181015_0915.py b/server/books/migrations/0003_auto_20181015_1202.py similarity index 83% rename from server/books/migrations/0003_auto_20181015_0915.py rename to server/books/migrations/0003_auto_20181015_1202.py index 4d0646c1..1508dd27 100644 --- a/server/books/migrations/0003_auto_20181015_0915.py +++ b/server/books/migrations/0003_auto_20181015_1202.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-10-15 09:15 +# Generated by Django 2.0.6 on 2018-10-15 12:02 from django.db import migrations, models @@ -6,7 +6,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('books', '0002_auto_20181010_0825'), + ('books', '0002_auto_20181011_1345'), ] operations = [ diff --git a/server/books/schema/mutations/contentblock.py b/server/books/schema/mutations/contentblock.py index ec18717c..abe81677 100644 --- a/server/books/schema/mutations/contentblock.py +++ b/server/books/schema/mutations/contentblock.py @@ -1,4 +1,5 @@ import json +import logging import graphene from django.core.exceptions import ValidationError @@ -9,7 +10,9 @@ from api.utils import get_object, get_errors from books.models import ContentBlock, Chapter, SchoolClass from books.schema.inputs import ContentBlockInput from books.schema.queries import ContentBlockNode -from .utils import handle_content_block +from .utils import handle_content_block, set_user_defined_block_type + +logger = logging.getLogger(__name__) class MutateContentBlock(relay.ClientIDMutation): @@ -29,9 +32,10 @@ class MutateContentBlock(relay.ClientIDMutation): title = content_block_data.get('title', None) contents = content_block_data.get('contents', None) visibility_list = content_block_data.get('visibility', None) + block_type = content_block_data.get('type', ContentBlock.NORMAL) content_block = get_object(ContentBlock, id_param) - + logger.info(content_block_data) if visibility_list is not None: for v in visibility_list: school_class = get_object(SchoolClass, v.school_class_id) @@ -46,6 +50,8 @@ class MutateContentBlock(relay.ClientIDMutation): if contents is not None: content_block.contents = json.dumps([handle_content_block(c, info.context) for c in contents]) + content_block.type = set_user_defined_block_type(block_type) + content_block.save() return cls(content_block=content_block) @@ -74,8 +80,10 @@ class AddContentBlock(relay.ClientIDMutation): title = content_block_data.get('title') contents = content_block_data.get('contents') + block_type = content_block_data.get('type', ContentBlock.NORMAL) - new_content_block = ContentBlock(title=title, user_created=True, owner=context.user) + block_type = set_user_defined_block_type(block_type) + new_content_block = ContentBlock(title=title, user_created=True, owner=context.user, type=block_type) if parent is not None: parent_chapter = get_object(Chapter, parent).specific diff --git a/server/books/schema/mutations/utils.py b/server/books/schema/mutations/utils.py index 4775fb35..812f5302 100644 --- a/server/books/schema/mutations/utils.py +++ b/server/books/schema/mutations/utils.py @@ -12,6 +12,7 @@ import bleach import re from assignments.models import Assignment +from books.models import ContentBlock def newlines_to_paragraphs(text): @@ -83,3 +84,10 @@ def handle_content_block(content, context, allowed_blocks=ALLOWED_BLOCKS): }} return None + + +def set_user_defined_block_type(block_type): + if block_type == ContentBlock.TASK.upper(): + return ContentBlock.TASK + else: + return ContentBlock.NORMAL diff --git a/server/books/schema/queries.py b/server/books/schema/queries.py index 146fe0e8..b2a1b385 100644 --- a/server/books/schema/queries.py +++ b/server/books/schema/queries.py @@ -22,6 +22,7 @@ class ContentBlockNode(DjangoObjectType): def resolve_mine(self, info, **kwargs): return self.owner is not None and self.owner.pk == info.context.user.pk + class ChapterNode(DjangoObjectType): content_blocks = DjangoFilterConnectionField(ContentBlockNode)