Enable adding previous members to school classes
This commit is contained in:
parent
b82b82369c
commit
4a3d08203d
|
|
@ -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>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
mutation AddRemoveMember($input: AddRemoveMemberInput!) {
|
||||
addRemoveMember(input: $input) {
|
||||
success
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
mutation RemoveMember($input: RemoveMemberInput!) {
|
||||
removeMember(input: $input) {
|
||||
success
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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'])
|
||||
|
|
|
|||
Loading…
Reference in New Issue