Enable adding previous members to school classes

This commit is contained in:
Ramon Wenger 2020-03-05 16:18:30 +01:00
parent b82b82369c
commit 4a3d08203d
5 changed files with 60 additions and 21 deletions

View File

@ -3,16 +3,26 @@
<h2 class="school-class__name">{{name}}</h2>
<div class="school-class__members school-class-members">
<ul class="school-class-members__list members-list" data-cy="active-class-members-list">
<li v-for="member in activeMembers" :key="member.id" class="members-list__item" data-cy="school-class-member">
<p class="member-item"><span class="member-item__name">{{fullName(member)}}</span> <span
class="member-item__role">{{role(member)}}</span></p>
<li
class="members-list__item member-item"
data-cy="school-class-member"
v-for="member in activeMembers"
:key="member.id">
<span class="member-item__name">{{fullName(member)}}</span>
<span class="member-item__role">{{role(member)}}</span>
<a class="member-item__action" data-cy="remove-from-class" @click="$emit('remove', member)">Deaktivieren</a>
</li>
</ul>
<h3>Deaktivierte Benutzer</h3>
<ul data-cy="inactive-class-members-list">
<li v-for="member in inactiveMembers" :key="member.id" class="members-list__item" data-cy="school-class-member">
<p class="member-item"><span class="member-item__name">{{fullName(member)}}</span> <span
class="member-item__role">{{role(member)}}</span></p>
<li
class="members-list__item member-item"
data-cy="school-class-member"
v-for="member in inactiveMembers"
:key="member.id">
<span class="member-item__name">{{fullName(member)}}</span>
<span class="member-item__role">{{role(member)}}</span>
<a class="member-item__action" @click="$emit('add', member)">Aktivieren</a>
</li>
</ul>
</div>
@ -28,7 +38,7 @@
return `${member.firstName} ${member.lastName}`;
},
role({isTeacher}) {
return isTeacher ? 'Lehrperson' : '';
return isTeacher ? 'Lehrperson' : 'Schüler';
}
},
computed: {
@ -44,6 +54,7 @@
<style scoped lang="scss">
@import "@/styles/_variables.scss";
@import "@/styles/_mixins.scss";
$height: 52px;
@ -61,14 +72,22 @@
display: flex;
flex-direction: row;
justify-content: space-between;
&__name {
font-family: $sans-serif-font-family;
font-weight: $font-weight-bold;
flex: 2 1 auto;
}
&__role {
padding-right: $medium-spacing;
flex: 0 1 110px;
}
&__action {
@include default-link;
color: $color-brand;
flex: 0 1 110px;
}
}
</style>

View File

@ -0,0 +1,5 @@
mutation AddRemoveMember($input: AddRemoveMemberInput!) {
addRemoveMember(input: $input) {
success
}
}

View File

@ -1,5 +0,0 @@
mutation RemoveMember($input: RemoveMemberInput!) {
removeMember(input: $input) {
success
}
}

View File

@ -133,10 +133,11 @@ class JoinClass(relay.ClientIDMutation):
raise CodeNotFoundException('[CNV] Code ist nicht gültig') # CAV = Code Not Valid
class RemoveMember(relay.ClientIDMutation):
class AddRemoveMember(relay.ClientIDMutation):
class Input:
member = graphene.ID(required=True)
school_class = graphene.ID(required=True)
active = graphene.Boolean(required=True)
success = graphene.Boolean()
@ -144,6 +145,7 @@ class RemoveMember(relay.ClientIDMutation):
def mutate_and_get_payload(cls, root, info, **kwargs):
member_id = kwargs.get('member')
school_class_id = kwargs.get('school_class')
active = kwargs.get('active')
user = info.context.user
member_pk = from_global_id(member_id)[1]
@ -153,7 +155,7 @@ class RemoveMember(relay.ClientIDMutation):
raise PermissionError('Fehlende Berechtigung')
school_class_member = SchoolClassMember.objects.get(user__pk=member_pk, school_class=school_class)
school_class_member.active = False
school_class_member.active = active
school_class_member.save()
return cls(success=True)
@ -164,4 +166,4 @@ class ProfileMutations:
update_avatar = UpdateAvatar.Field()
update_setting = UpdateSetting.Field()
join_class = JoinClass.Field()
remove_member = RemoveMember.Field()
add_remove_member = AddRemoveMember.Field()

View File

@ -50,9 +50,9 @@ class JoinSchoolClassTest(TestCase):
self.teacher_context = Context(user=teacher)
self.student_context = Context(user=student)
self.mutation = get_graphql_mutation('removeMember.gql')
self.mutation = get_graphql_mutation('addRemoveMember.gql')
def test_leave_class(self):
def test_leave_and_join_class(self):
self.assertEqual(
SchoolClassMember.objects.filter(school_class__name=self.school_class_name, active=True).count(), 6)
self.assertEqual(
@ -61,7 +61,8 @@ class JoinSchoolClassTest(TestCase):
result = self.client.execute(self.mutation, variables={
'input': {
'schoolClass': self.school_class_id,
'member': self.student_id
'member': self.student_id,
'active': False
}
}, context=self.teacher_context)
self.assertIsNone(result.get('errors'))
@ -71,6 +72,21 @@ class JoinSchoolClassTest(TestCase):
SchoolClassMember.objects.filter(school_class__name=self.school_class_name, active=False).count(),
1)
result = self.client.execute(self.mutation, variables={
'input': {
'schoolClass': self.school_class_id,
'member': self.student_id,
'active': True
}
}, context=self.teacher_context)
self.assertIsNone(result.get('errors'))
self.assertEqual(
SchoolClassMember.objects.filter(school_class__name=self.school_class_name, active=True).count(), 6)
self.assertEqual(
SchoolClassMember.objects.filter(school_class__name=self.school_class_name, active=False).count(),
0)
def test_leave_class_student_raises_error(self):
self.assertEqual(
SchoolClassMember.objects.filter(school_class__name=self.school_class_name, active=True).count(), 6)
@ -79,7 +95,8 @@ class JoinSchoolClassTest(TestCase):
result = self.client.execute(self.mutation, variables={
'input': {
'schoolClass': self.school_class_id,
'member': self.other_student_id
'member': self.other_student_id,
'active': False
}
}, context=self.student_context)
self.assertIsNotNone(result['errors'])
@ -98,7 +115,8 @@ class JoinSchoolClassTest(TestCase):
result = self.client.execute(self.mutation, variables={
'input': {
'schoolClass': to_global_id('SchoolClassNode', school_class.id),
'member': to_global_id('UserNode', student.id)
'member': to_global_id('UserNode', student.id),
'active': False
}
}, context=self.teacher_context)
self.assertIsNotNone(result['errors'])