From d45a5898882f22f24305b82deffe1b0ba0950334 Mon Sep 17 00:00:00 2001
From: Dominik Seeger <dominik.seeger@gmx.net>
Date: Tue, 6 Aug 2019 15:23:28 +0200
Subject: [PATCH] put the final by reviewer logic in the serializer

---
 core/serializers/feedback.py | 11 ++++++++++-
 core/views/feedback.py       |  8 --------
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/core/serializers/feedback.py b/core/serializers/feedback.py
index 92416e1e..5a6749ec 100644
--- a/core/serializers/feedback.py
+++ b/core/serializers/feedback.py
@@ -7,7 +7,7 @@ from rest_framework import serializers
 from rest_framework.utils import html
 
 from core import models
-from core.models import Feedback
+from core.models import Feedback, UserAccount
 from util.factories import GradyUserFactory
 
 from .generic import DynamicFieldsModelSerializer
@@ -121,8 +121,12 @@ class FeedbackSerializer(DynamicFieldsModelSerializer):
         submission = validated_data.pop('of_submission')
         feedback_lines = validated_data.pop('feedback_lines', [])
         labels = validated_data.pop('labels', [])
+        user = UserAccount.objects.get(username=str(self.context['request'].user))
         feedback = Feedback.objects.create(of_submission=submission,
                                            **validated_data)
+        if user.role == UserAccount.REVIEWER:
+            feedback.final_by_reviewer = self.context['request'].data['is_final']
+
         for label in labels:
             feedback.labels.add(label)
 
@@ -141,6 +145,11 @@ class FeedbackSerializer(DynamicFieldsModelSerializer):
 
     @transaction.atomic
     def update(self, feedback, validated_data):
+        user = UserAccount.objects.get(username=str(self.context['request'].user))
+
+        if user.role == UserAccount.REVIEWER:
+            feedback.final_by_reviewer = self.context['request'].data['is_final']
+
         for comment in validated_data.pop('feedback_lines', []):
             labels = comment.pop('labels', [])
             comment_instance, _ = models.FeedbackComment.objects.update_or_create(
diff --git a/core/views/feedback.py b/core/views/feedback.py
index 113e1cc8..e7ccfb22 100644
--- a/core/views/feedback.py
+++ b/core/views/feedback.py
@@ -32,10 +32,6 @@ class FeedbackApiView(
         user_is_tutor = self.request.user.role == models.UserAccount.TUTOR
         return feedback_final_by_reviewer and user_is_tutor
 
-    def _set_final_by_reviewer(self, serializer):
-        feedback_final_by_reviewer = serializer.validated_data.get('is_final', True)
-        serializer.save(final_by_reviewer=feedback_final_by_reviewer)
-
     def _get_implicit_assignment_for_user(self, submission):
         """ Check for tutor if it exists. Not relevant for reviewer """
         try:
@@ -97,8 +93,6 @@ class FeedbackApiView(
                 {'For tutors it is not allowed to create feedback final.'},
                 status=status.HTTP_403_FORBIDDEN)
 
-        self._set_final_by_reviewer(serializer)
-
         self.perform_create(serializer)
         return Response(serializer.data,
                         status=status.HTTP_201_CREATED)
@@ -119,8 +113,6 @@ class FeedbackApiView(
             raise PermissionDenied(
                 detail='Cannot set the first feedback final.')
 
-        self._set_final_by_reviewer(serializer)
-
         serializer.save()
         return Response(serializer.data)
 
-- 
GitLab