From 82ad93fbe7640345bbe0f810472fdc04b9dd0147 Mon Sep 17 00:00:00 2001 From: rlacko <rlacko@rlacko.sch.bme.hu> Date: Thu, 8 Aug 2019 13:14:53 +0200 Subject: [PATCH] User and Staff serializer class separated --- src/account/serializers.py | 52 +++++++++++++++++++++++++++++++-- src/account/views.py | 8 ++++- src/homework/serializers.py | 58 ++++++++++++++++++++++++++++++------- src/homework/views.py | 9 ++++-- 4 files changed, 110 insertions(+), 17 deletions(-) diff --git a/src/account/serializers.py b/src/account/serializers.py index e38ad58..8a91ba9 100644 --- a/src/account/serializers.py +++ b/src/account/serializers.py @@ -10,7 +10,7 @@ class ChoiceSerializer(serializers.ModelSerializer): fields = ('choice', 'profile') -class ProfileSerializer(serializers.ModelSerializer): +class ProfileSerializer_User(serializers.ModelSerializer): groups = serializers.SlugRelatedField(many=True, slug_field='choice', queryset=models.GroupChoice.objects.all()) updated_at = serializers.DateTimeField(read_only=True) full_name = serializers.SerializerMethodField() @@ -40,13 +40,13 @@ class ProfileSerializer(serializers.ModelSerializer): def validate_role(self, value): modifier_role = CurrentUserMiddleware.get_current_user_profile().role - if value != modifier_role and modifier_role != "Staff": + if value != modifier_role: raise serializers.ValidationError("You don't have permission change role") return value def validate_signed(self, value): modifier = CurrentUserMiddleware.get_current_user_profile() - if value is False and modifier.role != "Staff": + if value is False: raise serializers.ValidationError("You cannot join without signed") return value @@ -61,3 +61,49 @@ class ProfileSerializer(serializers.ModelSerializer): def get_full_name(self, obj): return obj.full_name + +class ProfileSerializer_Staff(serializers.ModelSerializer): + groups = serializers.SlugRelatedField(many=True, slug_field='choice', queryset=models.GroupChoice.objects.all()) + updated_at = serializers.DateTimeField(read_only=True) + full_name = serializers.SerializerMethodField() + + class Meta: + model = models.Profile + read_only_fields = ('id', 'join_date', 'updated_at', 'full_name', ) + fields = ( + 'id', + 'join_date', + 'updated_at', + 'nick', + 'signed', + 'groups', + 'motivation_about', + 'motivation_profession', + 'motivation_exercise', + 'full_name', + 'role', + ) + + def validate_updated_at(self, value): + deadline = models.Deadline.get_solo().deadline + if deadline is not None and value > deadline: + raise serializers.ValidationError("You cannot join after the deadline") + return value + + def validate_role(self, value): + return value + + def validate_signed(self, value): + return value + + def update(self, instance, validated_data): + new_role = validated_data.get('role', instance.role) + if instance.role != new_role: + if new_role == 'Student': + email.admitted(instance.user) + if new_role == 'Denied': + email.denied(instance.user) + return super().update(instance, validated_data) + + def get_full_name(self, obj): + return obj.full_name \ No newline at end of file diff --git a/src/account/views.py b/src/account/views.py index c2ad4ec..0a5d2a1 100644 --- a/src/account/views.py +++ b/src/account/views.py @@ -9,9 +9,15 @@ from . import serializers class ProfileViewSet(viewsets.ModelViewSet): - serializer_class = serializers.ProfileSerializer + serializer_class = serializers.ProfileSerializer_User permission_classes = (permissions.IsAuthenticated, IsSafeOrPatch) + def get_serializer_class(self): + user = self.request.user + if user.profile.role == 'Staff': + return serializers.ProfileSerializer_Staff + return serializers.ProfileSerializer_User + def get_queryset(self): user = self.request.user if user.profile.role == 'Staff': diff --git a/src/homework/serializers.py b/src/homework/serializers.py index 3ee662e..06bb25f 100755 --- a/src/homework/serializers.py +++ b/src/homework/serializers.py @@ -23,8 +23,7 @@ class TaskSerializer(serializers.ModelSerializer): email.new_homework(profile.user, validated_data.get('deadline')) return self.Meta.model.objects.create(**validated_data) - -class SolutionSerializer(serializers.ModelSerializer): +class SolutionSerializer_Student(serializers.ModelSerializer): class Meta: model = models.Solution read_only_fields = ('created_by', 'created_at', 'updated_at', 'ready', 'files') @@ -46,21 +45,58 @@ class SolutionSerializer(serializers.ModelSerializer): return value def validate_accepted(self, value): + raise serializers.ValidationError("You don't have permission to modify accepted!") + + def validate_corrected(self, value): + raise serializers.ValidationError("You don't have permission to modify corrected!") + + def validate_note(self, value): + if value != '': + raise serializers.ValidationError("You don't have permission to create note!") + return value + + def update(self, instance, validated_data): + if instance.corrected is not True and validated_data.get('corrected', instance.corrected) is True: + email.homework_corrected( + instance.created_by.user, + instance.task.title, + validated_data.get('accepted', instance.accepted) + ) + return super().update(instance, validated_data) + + def create(self, validated_data): profile = CurrentUserMiddleware.get_current_user_profile() - if profile.role != 'Staff' and value: - raise serializers.ValidationError("You don't have permission to modify accepted!") + models.Solution.objects.filter(created_by=profile, task=validated_data['task']).delete() + return super().create(validated_data) + +class SolutionSerializer_Staff(serializers.ModelSerializer): + class Meta: + model = models.Solution + read_only_fields = ('created_by', 'created_at', 'updated_at', 'ready', 'files') + fields = ( + 'id', + 'task', + 'created_at', + 'updated_at', + 'accepted', + 'files', + 'created_by', + 'corrected', + 'note', + ) + + def validate_task(self, value): + if timezone.now() > value.deadline: + raise serializers.ValidationError('You late.') + return value + + def validate_accepted(self, value): return value def validate_corrected(self, value): - profile = CurrentUserMiddleware.get_current_user_profile() - if profile.role != 'Staff' and value: - raise serializers.ValidationError("You don't have permission to modify corrected!") return value def validate_note(self, value): - profile = CurrentUserMiddleware.get_current_user_profile() - if profile.role != 'Staff' and value != '': - raise serializers.ValidationError("You don't have permission to create note!") return value def update(self, instance, validated_data): @@ -75,4 +111,4 @@ class SolutionSerializer(serializers.ModelSerializer): def create(self, validated_data): profile = CurrentUserMiddleware.get_current_user_profile() models.Solution.objects.filter(created_by=profile, task=validated_data['task']).delete() - return super().create(validated_data) + return super().create(validated_data) \ No newline at end of file diff --git a/src/homework/views.py b/src/homework/views.py index 9a9d88c..d6dfb94 100755 --- a/src/homework/views.py +++ b/src/homework/views.py @@ -10,11 +10,16 @@ class TasksViewSet(viewsets.ModelViewSet): queryset = models.Task.objects.all() permission_classes = (permissions.IsStaffOrReadOnlyForAuthenticated, permissions.IsStaffOrStudent, ) - class SolutionsViewSet(viewsets.ModelViewSet): - serializer_class = serializers.SolutionSerializer + serializer_class = serializers.SolutionSerializer_Student permission_classes = (permissions.IsStaffOrStudent, ) + def get_serializer_class(self): + user = self.request.user + if user.profile.role == 'Staff': + return serializers.SolutionSerializer_Staff + return serializers.SolutionSerializer_Student + def get_queryset(self): user = self.request.user queryset = models.Solution.objects.filter(created_by=user.profile) -- GitLab