diff --git a/core/serializers/feedback.py b/core/serializers/feedback.py index e5095da56b76ca01eec746ed30048a8b2eb7c7b0..92416e1ecfd3a38fe3a5b37c9b68e9dcee42b5d5 100644 --- a/core/serializers/feedback.py +++ b/core/serializers/feedback.py @@ -70,11 +70,14 @@ class FeedbackCommentSerializer(DynamicFieldsModelSerializer): fields = ('pk', 'text', 'created', + 'modified', 'of_tutor', 'of_line', 'labels', 'visible_to_student') - read_only_fields = ('created', 'of_tutor') + # visible_to_student is kept in sync with modified, such that the latest modified + # comment is the one that is visible + read_only_fields = ('created', 'of_tutor', 'visible_to_student') extra_kwargs = { 'of_feedback': {'write_only': True}, 'of_line': {'write_only': True}, @@ -219,7 +222,7 @@ class VisibleCommentFeedbackSerializer(FeedbackSerializer): serializer = FeedbackCommentSerializer( comments, many=True, - fields=('pk', 'text', 'created', 'of_line',) + fields=('pk', 'text', 'created', 'modified', 'of_line',) ) # this is a weird hack because, for some reason, serializer.data # just won't contain the correct data. Instead .data returns a list diff --git a/core/signals.py b/core/signals.py index d5d32b8ff9e404dc833eab78fe36a70da40cd34c..342532e7e96d887a2291b2e5778b68f501d46f19 100644 --- a/core/signals.py +++ b/core/signals.py @@ -80,3 +80,5 @@ def set_comment_visibility_after_conflict(sender, instance, **kwargs): of_feedback=instance.of_feedback, ) comments_on_the_same_line.update(visible_to_student=False) + instance.visible_to_student = True + diff --git a/core/tests/test_feedback.py b/core/tests/test_feedback.py index def5acb1ae72f03bb12654dcd3e50493a92493f3..dea21a728a6556da10f7cfdb0dd57d225e936dbe 100644 --- a/core/tests/test_feedback.py +++ b/core/tests/test_feedback.py @@ -585,19 +585,3 @@ class FeedbackCommentApiEndpointTest(APITestCase): pass else: self.fail('No exception raised') - - def test_reviewer_can_set_comment_visibility(self): - reviewer = self.data['reviewers'][0] - self.client.force_authenticate(user=reviewer) - comment = FeedbackComment.objects.get(of_tutor=self.tutor01) - self.assertTrue(comment.visible_to_student) - - data = { - 'visible_to_student': False - } - - response = self.client.patch(self.url % comment.pk, data) - - self.assertFalse(response.data['visible_to_student']) - comment.refresh_from_db() - self.assertFalse(comment.visible_to_student) diff --git a/core/views/feedback.py b/core/views/feedback.py index f633009615a01ed2ad4db448ffe1e3e41ea03cc8..27211eb78eac54d51cc91405b0bda14b33212419 100644 --- a/core/views/feedback.py +++ b/core/views/feedback.py @@ -134,17 +134,6 @@ class FeedbackCommentApiView( return self.queryset return self.queryset.filter(of_tutor=user) - def partial_update(self, request, **kwargs): - keys = self.request.data.keys() - if keys - {'visible_to_student', 'of_line', 'text'}: - raise PermissionDenied('These fields cannot be changed.') - - comment = self.get_object() - serializer = self.get_serializer(comment, request.data, partial=True) - serializer.is_valid() - serializer.save() - return Response(serializer.data) - def destroy(self, request, *args, **kwargs): with Lock(): instance = self.get_object() diff --git a/frontend/src/api.ts b/frontend/src/api.ts index e34d47a3196f4b44edef05ac91be395ae492ac03..57bd8deda577ee33d53eae9374b0d09b4f9df682 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -189,11 +189,6 @@ export async function deleteComment (comment: FeedbackComment): Promise<AxiosRes return ax.delete(url) } -export async function patchComment (comment: FeedbackComment): Promise<FeedbackComment> { - const url = `/api/feedback-comment/${comment.pk}/` - return (await ax.patch(url, comment)).data -} - export async function activateAllStudentAccess (): Promise<AxiosResponse<void>> { return ax.post('/api/student/activate/') }