Simplify the logic of visible content blocks for students

This commit is contained in:
Ramon Wenger 2020-02-10 09:27:43 +01:00
parent 542c7c6d84
commit 12f3b2d9a7
4 changed files with 23 additions and 50 deletions

View File

@ -27,7 +27,6 @@ describe('Survey', () => {
cy.get('@interviewContent').within(() => { cy.get('@interviewContent').within(() => {
cy.get('.bookmark-actions__edit-note').click(); cy.get('.bookmark-actions__edit-note').click();
}); });
cy.get('[data-cy=bookmark-note]').within(() => { cy.get('[data-cy=bookmark-note]').within(() => {

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="class-selection" v-if="isTeacher"> <div class="class-selection" v-if="currentClassSelection">
<div class="class-selection__selected-class selected-class" @click="showPopover = !showPopover"> <div class="class-selection__selected-class selected-class" @click="showPopover = !showPopover">
<p class="selected-class__text">Klasse: {{currentClassSelection.name}}</p> <p class="selected-class__text">Klasse: {{currentClassSelection.name}}</p>
</div> </div>
@ -47,7 +47,8 @@
selectedClass: { selectedClass: {
id: '' id: ''
}, },
permissions: [] permissions: [],
schoolClasses: []
}, },
showPopover: false showPopover: false
} }
@ -78,14 +79,11 @@
currentClassSelection() { currentClassSelection() {
let currentClass = this.schoolClasses.find(schoolClass => { let currentClass = this.schoolClasses.find(schoolClass => {
return schoolClass.id === this.me.selectedClass.id return schoolClass.id === this.me.selectedClass.id
}) });
return currentClass || this.schoolClasses[0]; return currentClass || this.schoolClasses[0];
}, },
schoolClasses() { schoolClasses() {
return this.$getRidOfEdges(this.me.schoolClasses); return this.$getRidOfEdges(this.me.schoolClasses);
},
isTeacher() {
return this.me.permissions.includes('users.can_manage_school_class_content');
} }
}, },

View File

@ -1,4 +1,5 @@
import graphene import graphene
from django.db.models import Q
from graphene import relay from graphene import relay
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField from graphene_django.filter import DjangoFilterConnectionField
@ -85,24 +86,20 @@ class ChapterNode(DjangoObjectType):
def resolve_content_blocks(self, info, **kwargs): def resolve_content_blocks(self, info, **kwargs):
user = info.context.user user = info.context.user
school_classes = user.school_classes.values_list('pk') school_classes = user.school_classes.values_list('pk')
by_parent = ContentBlock.get_by_parent(self).prefetch_related(
'visible_for').prefetch_related( by_parent = ContentBlock.get_by_parent(self) \
'hidden_for') .prefetch_related('visible_for') \
.prefetch_related('hidden_for')
# don't filter the hidden blocks on the server any more, we do this on the client now, as they are not secret
default_blocks = Q(user_created=False)
owned_by_user = Q(user_created=True, owner=user)
teacher_created_and_visible = Q(Q(user_created=True) & Q(visible_for__in=school_classes))
if user.has_perm('users.can_manage_school_class_content'): # teacher if user.has_perm('users.can_manage_school_class_content'): # teacher
publisher_content_blocks = by_parent.filter(user_created=False) return by_parent.filter(default_blocks | owned_by_user)
user_created_content_blocks = by_parent.filter(user_created=True, owner=user)
else: # student else: # student
publisher_content_blocks = by_parent.filter(user_created=False).exclude( return by_parent.filter(default_blocks | teacher_created_and_visible)
hidden_for__in=school_classes)
self_created_content_blocks = by_parent.filter(user_created=True, owner=user)
user_created_content_blocks = by_parent.filter(user_created=True,
visible_for__in=school_classes).union(
self_created_content_blocks)
return publisher_content_blocks.union(user_created_content_blocks)
def resolve_bookmark(self, info, **kwags): def resolve_bookmark(self, info, **kwags):
return ChapterBookmark.objects.filter( return ChapterBookmark.objects.filter(
@ -234,24 +231,6 @@ class BookNode(DjangoObjectType):
return Topic.get_by_parent(self) return Topic.get_by_parent(self)
# todo: do we need this?
# class FilteredChapterNode(DjangoObjectType):
# content_blocks = DjangoFilterConnectionField(ContentBlockNode)
#
# class Meta:
# model = Chapter
# only_fields = [
# 'slug', 'title', 'description',
# ]
# filter_fields = [
# 'slug', 'title',
# ]
# interfaces = (relay.Node,)
#
# def resolve_content_blocks(self, *args, **kwargs):
# return ContentBlock.get_by_parent(self)
class BookQuery(object): class BookQuery(object):
book = relay.Node.Field(BookNode) book = relay.Node.Field(BookNode)
topic = graphene.Field(TopicNode, slug=graphene.String()) topic = graphene.Field(TopicNode, slug=graphene.String())
@ -287,7 +266,6 @@ class BookQuery(object):
elif slug is not None: elif slug is not None:
module = Module.objects.get(slug=slug) module = Module.objects.get(slug=slug)
return module return module
def resolve_topic(self, info, **kwargs): def resolve_topic(self, info, **kwargs):

View File

@ -1,4 +1,5 @@
import graphene import graphene
from django.db.models import Q
from graphene import relay from graphene import relay
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField from graphene_django.filter import DjangoFilterConnectionField
@ -29,17 +30,14 @@ class ObjectiveGroupNode(DjangoObjectType):
user = info.context.user user = info.context.user
school_classes = user.school_classes.values_list('pk') school_classes = user.school_classes.values_list('pk')
objectives_from_publisher = Q(owner=None)
objectives_from_user = Q(owner=user)
objectives_from_teacher = Q(owner__isnull=False, visible_for__in=school_classes)
if user.has_perm('users.can_manage_school_class_content'): # teacher if user.has_perm('users.can_manage_school_class_content'): # teacher
publisher_objectives = self.objectives.filter(owner=None) return self.objectives.filter(objectives_from_publisher | objectives_from_user)
user_created_objectives = self.objectives.filter(owner=user)
else: # student else: # student
publisher_objectives = self.objectives.filter(owner=None).exclude( return self.objectives.filter(objectives_from_publisher | objectives_from_teacher)
hidden_for__in=school_classes)
user_created_objectives = self.objectives.filter(owner__isnull=False,
visible_for__in=school_classes)
return publisher_objectives.union(user_created_objectives)
class ObjectiveNode(DjangoObjectType): class ObjectiveNode(DjangoObjectType):