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