From c9206e614d6d0a51d727660b2a877118708564d0 Mon Sep 17 00:00:00 2001 From: Hironsan Date: Mon, 24 Jan 2022 08:31:36 +0900 Subject: [PATCH] Allow CommentList API to filter comments by example id --- backend/api/tests/api/test_comment.py | 11 +++++++---- backend/api/urls.py | 2 +- backend/api/views/comment.py | 14 ++++++++++---- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/backend/api/tests/api/test_comment.py b/backend/api/tests/api/test_comment.py index ad793776..aca84d3f 100644 --- a/backend/api/tests/api/test_comment.py +++ b/backend/api/tests/api/test_comment.py @@ -11,15 +11,18 @@ class TestCommentListDocAPI(CRUDMixin): def setUpTestData(cls): cls.project = prepare_project() cls.non_member = make_user() - doc = make_doc(cls.project.item) - make_comment(doc, cls.project.users[0]) + doc1 = make_doc(cls.project.item) + doc2 = make_doc(cls.project.item) + make_comment(doc1, cls.project.users[0]) + make_comment(doc2, cls.project.users[0]) cls.data = {'text': 'example'} - cls.url = reverse(viewname='comment_list_doc', args=[cls.project.item.id, doc.id]) + cls.url = reverse(viewname='comment_list', args=[cls.project.item.id]) + cls.url += f'?example={doc1.id}' def test_allows_project_member_to_list_comments(self): for member in self.project.users: response = self.assert_fetch(member, status.HTTP_200_OK) - self.assertEqual(len(response.data), 1) + self.assertEqual(response.data['count'], 1) def test_denies_non_project_member_to_list_comments(self): self.assert_fetch(self.non_member, status.HTTP_403_FORBIDDEN) diff --git a/backend/api/urls.py b/backend/api/urls.py index dbf1e904..79885d28 100644 --- a/backend/api/urls.py +++ b/backend/api/urls.py @@ -122,7 +122,7 @@ urlpatterns_project = [ ), path( route='comments', - view=comment.CommentListProject.as_view(), + view=comment.CommentList.as_view(), name='comment_list' ), path( diff --git a/backend/api/views/comment.py b/backend/api/views/comment.py index 2871349d..168da5b7 100644 --- a/backend/api/views/comment.py +++ b/backend/api/views/comment.py @@ -27,22 +27,28 @@ class CommentListDoc(generics.ListCreateAPIView): serializer.save(example_id=self.kwargs['example_id'], user=self.request.user) -class CommentListProject(generics.ListAPIView): +class CommentList(generics.ListCreateAPIView): permission_classes = [IsAuthenticated & IsInProjectOrAdmin] serializer_class = CommentSerializer filter_backends = (DjangoFilterBackend, filters.SearchFilter) + filterset_fields = ['example'] search_fields = ('text',) - model = Comment def get_queryset(self): - queryset = self.model.objects.filter( + queryset = Comment.objects.filter( example__project_id=self.kwargs['project_id'] ) return queryset + def perform_create(self, serializer): + serializer.save( + example_id=self.request.query_params.get('example'), + user=self.request.user + ) + def delete(self, request, *args, **kwargs): delete_ids = request.data['ids'] - self.model.objects.filter(user=request.user, pk__in=delete_ids).delete() + Comment.objects.filter(user=request.user, pk__in=delete_ids).delete() return Response(status=status.HTTP_204_NO_CONTENT)