From 53f50bdc13f25c99d4235fe171849980faab62e9 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 31 Oct 2018 15:35:58 +0100 Subject: [PATCH] Add mutations for objective group visibility --- server/books/schema/inputs.py | 4 +-- server/books/schema/mutations/contentblock.py | 23 ++----------- server/core/utils.py | 20 +++++++++++ server/objectives/admin.py | 4 +-- .../migrations/0006_auto_20181031_1323.py | 29 ++++++++++++++++ .../migrations/0007_auto_20181031_1347.py | 23 +++++++++++++ server/objectives/models.py | 6 +++- server/objectives/mutations.py | 34 +++++++++++++++++-- 8 files changed, 115 insertions(+), 28 deletions(-) create mode 100644 server/core/utils.py create mode 100644 server/objectives/migrations/0006_auto_20181031_1323.py create mode 100644 server/objectives/migrations/0007_auto_20181031_1347.py diff --git a/server/books/schema/inputs.py b/server/books/schema/inputs.py index 18122154..99fd9086 100644 --- a/server/books/schema/inputs.py +++ b/server/books/schema/inputs.py @@ -29,7 +29,7 @@ class ContentElementInput(InputObjectType): value = ContentElementValueInput() -class UserGroupContentBlockVisibility(InputObjectType): +class UserGroupBlockVisibility(InputObjectType): school_class_id = graphene.ID(required=True) hidden = graphene.Boolean(required=True) @@ -38,4 +38,4 @@ class ContentBlockInput(InputObjectType): title = graphene.String() type = graphene.String() contents = graphene.List(ContentElementInput) - visibility = graphene.List(UserGroupContentBlockVisibility) + visibility = graphene.List(UserGroupBlockVisibility) diff --git a/server/books/schema/mutations/contentblock.py b/server/books/schema/mutations/contentblock.py index f6a335dd..6de57be7 100644 --- a/server/books/schema/mutations/contentblock.py +++ b/server/books/schema/mutations/contentblock.py @@ -9,6 +9,7 @@ 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 core.utils import set_hidden_for, set_visible_for from .utils import handle_content_block, set_user_defined_block_type @@ -37,9 +38,9 @@ class MutateContentBlock(relay.ClientIDMutation): if visibility_list is not None: if content_block.user_created: - cls.set_visible_for(content_block, visibility_list) + set_visible_for(content_block, visibility_list) else: - cls.set_hidden_for(content_block, visibility_list) + set_hidden_for(content_block, visibility_list) if title is not None: content_block.title = title @@ -59,24 +60,6 @@ class MutateContentBlock(relay.ClientIDMutation): return cls(content_block=None, errors=errors) - @classmethod - def set_hidden_for(cls, content_block, visibility_list): - for v in visibility_list: - school_class = get_object(SchoolClass, v.school_class_id) - if v.hidden: - content_block.hidden_for.add(school_class) - else: - content_block.hidden_for.remove(school_class) - - @classmethod - def set_visible_for(cls, content_block, visibility_list): - for v in visibility_list: - school_class = get_object(SchoolClass, v.school_class_id) - if v.hidden: - content_block.visible_for.remove(school_class) - else: - content_block.visible_for.add(school_class) - class AddContentBlock(relay.ClientIDMutation): class Input: diff --git a/server/core/utils.py b/server/core/utils.py new file mode 100644 index 00000000..f192977c --- /dev/null +++ b/server/core/utils.py @@ -0,0 +1,20 @@ +from api.utils import get_object +from users.models import SchoolClass + + +def set_hidden_for(block, visibility_list): + for v in visibility_list: + school_class = get_object(SchoolClass, v.school_class_id) + if v.hidden: + block.hidden_for.add(school_class) + else: + block.hidden_for.remove(school_class) + + +def set_visible_for(block, visibility_list): + for v in visibility_list: + school_class = get_object(SchoolClass, v.school_class_id) + if v.hidden: + block.visible_for.remove(school_class) + else: + block.visible_for.add(school_class) diff --git a/server/objectives/admin.py b/server/objectives/admin.py index 2f704ac8..07bc2b9e 100644 --- a/server/objectives/admin.py +++ b/server/objectives/admin.py @@ -5,8 +5,8 @@ from objectives.models import ObjectiveGroup, Objective, ObjectiveProgressStatus @admin.register(ObjectiveGroup) class ObjectiveGroupAdmin(admin.ModelAdmin): - list_display = ('title', 'module', 'user') - list_filter = ('title', 'module', 'user') + list_display = ('title', 'module', 'owner') + list_filter = ('title', 'module', 'owner') @admin.register(Objective) diff --git a/server/objectives/migrations/0006_auto_20181031_1323.py b/server/objectives/migrations/0006_auto_20181031_1323.py new file mode 100644 index 00000000..4620d2e1 --- /dev/null +++ b/server/objectives/migrations/0006_auto_20181031_1323.py @@ -0,0 +1,29 @@ +# Generated by Django 2.0.6 on 2018-10-31 13:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_auto_20181017_1340'), + ('objectives', '0005_migrate_titles'), + ] + + operations = [ + migrations.RenameField( + model_name='objectivegroup', + old_name='user', + new_name='owner', + ), + migrations.AddField( + model_name='objectivegroup', + name='hidden_for', + field=models.ManyToManyField(related_name='hidden_objective_groups', to='users.SchoolClass'), + ), + migrations.AddField( + model_name='objectivegroup', + name='visible_for', + field=models.ManyToManyField(related_name='visible_objective_groups', to='users.SchoolClass'), + ), + ] diff --git a/server/objectives/migrations/0007_auto_20181031_1347.py b/server/objectives/migrations/0007_auto_20181031_1347.py new file mode 100644 index 00000000..fad46f1a --- /dev/null +++ b/server/objectives/migrations/0007_auto_20181031_1347.py @@ -0,0 +1,23 @@ +# Generated by Django 2.0.6 on 2018-10-31 13:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('objectives', '0006_auto_20181031_1323'), + ] + + operations = [ + migrations.AlterField( + model_name='objectivegroup', + name='hidden_for', + field=models.ManyToManyField(blank=True, related_name='hidden_objective_groups', to='users.SchoolClass'), + ), + migrations.AlterField( + model_name='objectivegroup', + name='visible_for', + field=models.ManyToManyField(blank=True, related_name='visible_objective_groups', to='users.SchoolClass'), + ), + ] diff --git a/server/objectives/models.py b/server/objectives/models.py index c1a2f6f2..245d4597 100644 --- a/server/objectives/models.py +++ b/server/objectives/models.py @@ -2,6 +2,7 @@ from django.contrib.auth import get_user_model from django.db import models from books.models import Module +from users.models import SchoolClass class ObjectiveGroup(models.Model): @@ -20,7 +21,10 @@ class ObjectiveGroup(models.Model): title = models.CharField('title', blank=True, null=False, max_length=255, choices=TITLE_CHOICES, default=LANGUAGE_COMMUNICATION) module = models.ForeignKey(Module, blank=False, null=False, on_delete=models.CASCADE, related_name='objective_groups') # a user can define her own objectives, hence this optional param - user = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE) + owner = models.ForeignKey(get_user_model(), blank=True, null=True, on_delete=models.CASCADE) + + hidden_for = models.ManyToManyField(SchoolClass, related_name='hidden_objective_groups', blank=True) + visible_for = models.ManyToManyField(SchoolClass, related_name='visible_objective_groups', blank=True) def __str__(self): return 'ObjectiveGroup {}-{}-{}'.format(self.id, self.module, self.title) diff --git a/server/objectives/mutations.py b/server/objectives/mutations.py index 92bc4d97..f88c6c10 100644 --- a/server/objectives/mutations.py +++ b/server/objectives/mutations.py @@ -1,8 +1,10 @@ import graphene -from graphene import relay +from graphene import relay, InputObjectType from api.utils import get_object -from objectives.models import ObjectiveProgressStatus, Objective -from objectives.schema import ObjectiveNode +from books.schema.inputs import UserGroupBlockVisibility +from core.utils import set_visible_for, set_hidden_for +from objectives.models import ObjectiveProgressStatus, Objective, ObjectiveGroup +from objectives.schema import ObjectiveNode, ObjectiveGroupNode class UpdateObjectiveProgress(relay.ClientIDMutation): @@ -29,5 +31,31 @@ class UpdateObjectiveProgress(relay.ClientIDMutation): return cls(objective=objective) +class UpdateObjectiveGroupVisibility(relay.ClientIDMutation): + class Input: + id = graphene.ID(required=True, description='The ID of the objective group') + visibility = graphene.List(UserGroupBlockVisibility) + + objective_group = graphene.Field(ObjectiveGroupNode) + + @classmethod + def mutate_and_get_payload(cls, root, info, **kwargs): + objective_group_id = kwargs.get('id') + visibility_list = kwargs.get('visibility') + objective_group = get_object(ObjectiveGroup, objective_group_id) # info.context.user = django user + + if visibility_list is not None: + if objective_group.owner is not None: + set_visible_for(objective_group, visibility_list) + else: + set_hidden_for(objective_group, visibility_list) + + objective_group.save() + + + return cls(objective_group=objective_group) + + class ObjectiveMutations: update_objective_progress = UpdateObjectiveProgress.Field() + update_objective_group_visibility = UpdateObjectiveGroupVisibility.Field()