diff --git a/core/migrations/0018_auto_20190709_1526.py b/core/migrations/0018_auto_20190709_1526.py new file mode 100644 index 0000000000000000000000000000000000000000..468d24424520ecc7a31f8df4c7277e6568e5f670 --- /dev/null +++ b/core/migrations/0018_auto_20190709_1526.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2 on 2019-07-09 15:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0017_auto_20190604_1631'), + ] + + operations = [ + migrations.AddField( + model_name='feedback', + name='final_by_reviewer', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='feedbacklabel', + name='name', + field=models.CharField(max_length=50, unique=True), + ), + ] diff --git a/core/models/feedback.py b/core/models/feedback.py index 15eea22cd2b8a60570659d216ada68795df79b51..742f94289011a95fe7c5ff4fbd913c7059fc993e 100644 --- a/core/models/feedback.py +++ b/core/models/feedback.py @@ -25,10 +25,13 @@ class Feedback(models.Model): points a student receives for his submission. origin : IntegerField Of whom was this feedback originally created. She below for the choices + final_by_reviewer: BooleanField + Whether or not this feedback was set to final by a reviewer once """ score = models.DecimalField(max_digits=5, decimal_places=2, default=0) created = models.DateTimeField(auto_now_add=True) is_final = models.BooleanField(default=False) + final_by_reviewer = models.BooleanField(default=False) of_submission = models.OneToOneField( Submission, diff --git a/core/serializers/feedback.py b/core/serializers/feedback.py index 92416e1ecfd3a38fe3a5b37c9b68e9dcee42b5d5..da0d45e5501cbd03f39b2101cd65344bcb4da80f 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 = 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 = 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 27211eb78eac54d51cc91405b0bda14b33212419..e7ccfb228514dbcad9bce0f407708c545620a745 100644 --- a/core/views/feedback.py +++ b/core/views/feedback.py @@ -28,12 +28,9 @@ class FeedbackApiView( lookup_url_kwarg = 'submission_pk' def _tutor_attempts_to_change_final_feedback_of_reviewer(self, serializer): - feedback_is_final = serializer.instance.is_final + feedback_final_by_reviewer = serializer.instance.final_by_reviewer user_is_tutor = self.request.user.role == models.UserAccount.TUTOR - authors = serializer.instance.of_submission.meta.feedback_authors - set_by_reviewer = authors.filter( - role=models.UserAccount.REVIEWER).exists() - return feedback_is_final and set_by_reviewer and user_is_tutor + return feedback_final_by_reviewer and user_is_tutor def _get_implicit_assignment_for_user(self, submission): """ Check for tutor if it exists. Not relevant for reviewer """