Add new chapter visibility properties to model and schema

This commit is contained in:
Ramon Wenger 2021-02-18 17:54:02 +01:00
parent 1f3b6fe40d
commit 8d9761b3ef
8 changed files with 87 additions and 27 deletions

View File

@ -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

View File

@ -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'),
),
]

View File

@ -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')

View File

@ -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 <ramon.wenger@iterativ.ch>
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()

View File

@ -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)

View File

@ -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):

View File

@ -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()

View File

@ -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',