diff --git a/client/src/components/profile/Classlist.vue b/client/src/components/profile/ClassList.vue similarity index 56% rename from client/src/components/profile/Classlist.vue rename to client/src/components/profile/ClassList.vue index 3f10d95f..5b66c076 100644 --- a/client/src/components/profile/Classlist.vue +++ b/client/src/components/profile/ClassList.vue @@ -3,16 +3,26 @@

{{name}}

Deaktivierte Benutzer

@@ -28,7 +38,7 @@ return `${member.firstName} ${member.lastName}`; }, role({isTeacher}) { - return isTeacher ? 'Lehrperson' : ''; + return isTeacher ? 'Lehrperson' : 'Schüler'; } }, computed: { @@ -44,6 +54,7 @@ diff --git a/client/src/graphql/gql/mutations/addRemoveMember.gql b/client/src/graphql/gql/mutations/addRemoveMember.gql new file mode 100644 index 00000000..4cc6ca49 --- /dev/null +++ b/client/src/graphql/gql/mutations/addRemoveMember.gql @@ -0,0 +1,5 @@ +mutation AddRemoveMember($input: AddRemoveMemberInput!) { + addRemoveMember(input: $input) { + success + } +} diff --git a/client/src/graphql/gql/mutations/removeMember.gql b/client/src/graphql/gql/mutations/removeMember.gql deleted file mode 100644 index c43074b7..00000000 --- a/client/src/graphql/gql/mutations/removeMember.gql +++ /dev/null @@ -1,5 +0,0 @@ -mutation RemoveMember($input: RemoveMemberInput!) { - removeMember(input: $input) { - success - } -} diff --git a/server/users/mutations.py b/server/users/mutations.py index 1100f9a7..694a78b8 100644 --- a/server/users/mutations.py +++ b/server/users/mutations.py @@ -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() diff --git a/server/users/tests/test_leave_reenter_class.py b/server/users/tests/test_leave_reenter_class.py index 2db4a35e..1f63cc05 100644 --- a/server/users/tests/test_leave_reenter_class.py +++ b/server/users/tests/test_leave_reenter_class.py @@ -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'])