From 8d9761b3ef2fe1532a952b79db273021b235d38b Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 18 Feb 2021 17:54:02 +0100 Subject: [PATCH] Add new chapter visibility properties to model and schema --- server/api/schema.py | 2 +- .../migrations/0024_auto_20210218_1336.py | 24 +++++++++++ server/books/models/chapter.py | 3 ++ server/books/schema/mutations/__init__.py | 22 ++++++---- server/books/schema/mutations/chapter.py | 43 +++++++++++++++++++ server/books/schema/mutations/contentblock.py | 7 +-- server/books/schema/mutations/main.py | 11 ----- server/books/schema/queries.py | 2 +- 8 files changed, 87 insertions(+), 27 deletions(-) create mode 100644 server/books/migrations/0024_auto_20210218_1336.py create mode 100644 server/books/schema/mutations/chapter.py diff --git a/server/api/schema.py b/server/api/schema.py index afd53d37..453a1c45 100644 --- a/server/api/schema.py +++ b/server/api/schema.py @@ -8,7 +8,7 @@ from api import graphene_wagtail # Keep this import exactly here, it's necessar from assignments.schema.mutations import AssignmentMutations from assignments.schema.queries import AssignmentsQuery, StudentSubmissionQuery from basicknowledge.queries import BasicKnowledgeQuery -from books.schema.mutations.main import BookMutations +from books.schema.mutations import BookMutations from books.schema.queries import BookQuery from core.schema.mutations.coupon import CouponMutations from core.schema.mutations.main import CoreMutations diff --git a/server/books/migrations/0024_auto_20210218_1336.py b/server/books/migrations/0024_auto_20210218_1336.py new file mode 100644 index 00000000..fad99a2f --- /dev/null +++ b/server/books/migrations/0024_auto_20210218_1336.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.17 on 2021-02-18 13:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0025_auto_20210126_1343'), + ('books', '0023_auto_20200707_1501'), + ] + + operations = [ + migrations.AddField( + model_name='chapter', + name='description_hidden_for', + field=models.ManyToManyField(related_name='hidden_chapter_descriptions', to='users.SchoolClass'), + ), + migrations.AddField( + model_name='chapter', + name='title_hidden_for', + field=models.ManyToManyField(related_name='hidden_chapter_titles', to='users.SchoolClass'), + ), + ] diff --git a/server/books/models/chapter.py b/server/books/models/chapter.py index 7e340b4b..8f329601 100644 --- a/server/books/models/chapter.py +++ b/server/books/models/chapter.py @@ -4,6 +4,7 @@ from django.db import models from wagtail.admin.edit_handlers import FieldPanel, TabbedInterface, ObjectList from core.wagtail_utils import StrictHierarchyPage +from users.models import SchoolClass logger = logging.getLogger(__name__) @@ -34,3 +35,5 @@ class Chapter(StrictHierarchyPage): parent_page_types = ['books.Module'] subpage_types = ['books.ContentBlock'] + title_hidden_for = models.ManyToManyField(SchoolClass, related_name='hidden_chapter_titles') + description_hidden_for = models.ManyToManyField(SchoolClass, related_name='hidden_chapter_descriptions') diff --git a/server/books/schema/mutations/__init__.py b/server/books/schema/mutations/__init__.py index 3e491c29..fc85ed51 100644 --- a/server/books/schema/mutations/__init__.py +++ b/server/books/schema/mutations/__init__.py @@ -1,9 +1,13 @@ -# -*- coding: utf-8 -*- -# -# Iterativ GmbH -# http://www.iterativ.ch/ -# -# Copyright (c) 2018 Iterativ GmbH. All rights reserved. -# -# Created on 25.09.18 -# @author: Ramon Wenger +from books.schema.mutations.chapter import UpdateChapterVisibility +from books.schema.mutations.contentblock import MutateContentBlock, AddContentBlock, DeleteContentBlock +from books.schema.mutations.module import UpdateSolutionVisibility, UpdateLastModule, UpdateLastTopic + + +class BookMutations(object): + mutate_content_block = MutateContentBlock.Field() + add_content_block = AddContentBlock.Field() + delete_content_block = DeleteContentBlock.Field() + update_solution_visibility = UpdateSolutionVisibility.Field() + update_last_module = UpdateLastModule.Field() + update_last_topic = UpdateLastTopic.Field() + update_chapter_visibility = UpdateChapterVisibility.Field() diff --git a/server/books/schema/mutations/chapter.py b/server/books/schema/mutations/chapter.py new file mode 100644 index 00000000..48f62da1 --- /dev/null +++ b/server/books/schema/mutations/chapter.py @@ -0,0 +1,43 @@ +import graphene +from graphene import relay + +from api.utils import get_object +from books.models import Chapter +from books.schema.inputs import UserGroupBlockVisibility +from books.schema.queries import ChapterNode +from users.models import SchoolClass + + +class UpdateChapterVisibility(relay.ClientIDMutation): + class Input: + id = graphene.ID(required=True) + visibility = graphene.List(UserGroupBlockVisibility) + type = graphene.String(required=True) + + chapter = graphene.Field(ChapterNode) + + @classmethod + def mutate_and_get_payload(cls, root, info, **kwargs): + id_param = kwargs['id'] + visibility_list = kwargs.get('visibility', None) + mutation_type = kwargs['type'] + + chapter = get_object(Chapter, id_param) + + if visibility_list is not None: + for v in visibility_list: + school_class = get_object(SchoolClass, v.school_class_id) + if v.hidden: + if mutation_type == 'chapter-title': + chapter.title_hidden_for.add(school_class) + else: + chapter.description_hidden_for.add(school_class) + else: + if mutation_type == 'chapter-title': + chapter.title_hidden_for.remove(school_class) + else: + chapter.description_hidden_for.remove(school_class) + + chapter.save() + + return cls(chapter=chapter) diff --git a/server/books/schema/mutations/contentblock.py b/server/books/schema/mutations/contentblock.py index d7234c81..f20500b9 100644 --- a/server/books/schema/mutations/contentblock.py +++ b/server/books/schema/mutations/contentblock.py @@ -10,7 +10,6 @@ from books.models import ContentBlock, Chapter, SchoolClass from books.schema.inputs import ContentBlockInput from books.schema.queries import ContentBlockNode from core.utils import set_hidden_for, set_visible_for -from notes.models import ContentBlockBookmark from .utils import handle_content_block, set_user_defined_block_type @@ -19,7 +18,6 @@ class MutateContentBlock(relay.ClientIDMutation): id = graphene.ID(required=True) content_block = graphene.Argument(ContentBlockInput) - errors = graphene.List(graphene.String) content_block = graphene.Field(ContentBlockNode) @classmethod @@ -52,17 +50,16 @@ class MutateContentBlock(relay.ClientIDMutation): if contents is not None: content_block.contents = json.dumps([handle_content_block(c, info.context, module) for c in contents]) - content_block.save() return cls(content_block=content_block) except ValidationError as e: errors = get_errors(e) + raise errors except Exception as e: errors = ['Error: {}'.format(e)] - - return cls(content_block=None, errors=errors) + raise errors class AddContentBlock(relay.ClientIDMutation): diff --git a/server/books/schema/mutations/main.py b/server/books/schema/mutations/main.py index 075f8cf8..e69de29b 100644 --- a/server/books/schema/mutations/main.py +++ b/server/books/schema/mutations/main.py @@ -1,11 +0,0 @@ -from books.schema.mutations.contentblock import MutateContentBlock, AddContentBlock, DeleteContentBlock -from books.schema.mutations.module import UpdateSolutionVisibility, UpdateLastModule, UpdateLastTopic - - -class BookMutations(object): - mutate_content_block = MutateContentBlock.Field() - add_content_block = AddContentBlock.Field() - delete_content_block = DeleteContentBlock.Field() - update_solution_visibility = UpdateSolutionVisibility.Field() - update_last_module = UpdateLastModule.Field() - update_last_topic = UpdateLastTopic.Field() diff --git a/server/books/schema/queries.py b/server/books/schema/queries.py index 74d09723..5c3a1aea 100644 --- a/server/books/schema/queries.py +++ b/server/books/schema/queries.py @@ -77,7 +77,7 @@ class ChapterNode(DjangoObjectType): class Meta: model = Chapter only_fields = [ - 'slug', 'title', 'description', + 'slug', 'title', 'description', 'title_hidden_for', 'description_hidden_for' ] filter_fields = [ 'slug', 'title',