Add mutations for objective group visibility

This commit is contained in:
Ramon Wenger 2018-10-31 15:35:58 +01:00
parent a437620f13
commit 53f50bdc13
8 changed files with 115 additions and 28 deletions

View File

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

View File

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

20
server/core/utils.py Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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