:p
atchew
Login
rest: Imporoved series DELETE in the REST API - Fixed the char limit in line to make code more readable - overrode perform_destroy function so that that endpoint accepts any message id and not just the series head - wrote tests for the same --- api/rest.py | 9 +++++++-- tests/test_rest.py | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/api/rest.py b/api/rest.py index XXXXXXX..XXXXXXX 100644 --- a/api/rest.py +++ b/api/rest.py @@ -XXX,XX +XXX,XX @@ from django.template import loader from mod import dispatch_module_hook from .models import Project, Message from .search import SearchEngine -from rest_framework import permissions, serializers, viewsets, filters, mixins, renderers +from rest_framework import permissions, serializers, viewsets, filters, mixins, renderers, status from rest_framework.decorators import detail_route from rest_framework.fields import SerializerMethodField from rest_framework.relations import HyperlinkedIdentityField @@ -XXX,XX +XXX,XX @@ class SeriesViewSet(BaseMessageViewSet): search_fields = (SEARCH_PARAM,) class ProjectSeriesViewSet(ProjectMessagesViewSetMixin, - SeriesViewSet): + SeriesViewSet, mixins.DestroyModelMixin): def collect_patches(self, series): if series.is_patch: patches = [series] @@ -XXX,XX +XXX,XX @@ class ProjectSeriesViewSet(ProjectMessagesViewSetMixin, self.collect_replies(i, series.replies) return series + def destroy(self, request, *args, **kwargs): + instance = self.get_object() + Message.objects.delete_subthread(instance) + return Response(status=status.HTTP_204_NO_CONTENT) + # Messages # TODO: add POST endpoint connected to email plugin? diff --git a/tests/test_rest.py b/tests/test_rest.py index XXXXXXX..XXXXXXX 100755 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -XXX,XX +XXX,XX @@ class RestTest(PatchewTestCase): resp = self.api_client.get(self.REST_BASE + 'projects/12345/series/?q=project:QEMU') self.assertEqual(resp.data['count'], 0) + def test_series_delete(self): + test_message_id = '1469192015-16487-1-git-send-email-berrange@redhat.com' + series = self.apply_and_retrieve('0004-multiple-patch-reviewed.mbox.gz',self.p.id, + test_message_id) + message = series.data['message'] + resp_before = self.api_client.get(self.REST_BASE + 'projects/' + str(self.p.id) + + '/series/' + test_message_id + '/') + resp_reply_before = self.api_client.get(message + 'replies/') + resp = self.api_client.delete(self.REST_BASE + 'projects/' + str(self.p.id) + + '/series/' + test_message_id + '/') + resp_after = self.api_client.get(self.REST_BASE + 'projects/' + str(self.p.id) + + '/series/' + test_message_id + '/') + resp_reply_after = self.api_client.get(message + 'replies/') + self.assertEqual(resp_before.status_code, 200) + self.assertEqual(resp_reply_before.status_code, 200) + self.assertEqual(resp.status_code, 204) + self.assertEqual(resp_after.status_code, 404) + self.assertEqual(resp_reply_after.status_code, 404) + def test_message(self): series = self.apply_and_retrieve('0001-simple-patch.mbox.gz', self.p.id, '20160628014747.20971-1-famz@redhat.com') -- 2.14.3 (Apple Git-98) _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel
rest: Imporoved series DELETE in the REST API - Fixed the char limit in line to make code more readable - overrode perform_destroy function so that that endpoint accepts any message id and not just the series head - wrote tests for the same Message-Id: <20180331122557.44970-1-shubhamjain7495@gmail.com> rest: Added permission class - Added permission to deletion and restricted it to avoid public deletion. - Added a corresponding unit test to it. - Also overrode perform_destroy instead of destory to perform series deletion. --- api/rest.py | 7 ++++++- tests/test_rest.py | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/api/rest.py b/api/rest.py index XXXXXXX..XXXXXXX 100644 --- a/api/rest.py +++ b/api/rest.py @@ -XXX,XX +XXX,XX @@ class SeriesViewSet(BaseMessageViewSet): queryset = Message.objects.filter(is_series_head=True).order_by('-last_reply_date') filter_backends = (PatchewSearchFilter,) search_fields = (SEARCH_PARAM,) + permission_classes = (IsAdminUserOrReadOnly,) + class ProjectSeriesViewSet(ProjectMessagesViewSetMixin, - SeriesViewSet): + SeriesViewSet, mixins.DestroyModelMixin): def collect_patches(self, series): if series.is_patch: patches = [series] @@ -XXX,XX +XXX,XX @@ class ProjectSeriesViewSet(ProjectMessagesViewSetMixin, self.collect_replies(i, series.replies) return series + def perform_destroy(self, instance): + Message.objects.delete_subthread(instance) + # Messages # TODO: add POST endpoint connected to email plugin? diff --git a/tests/test_rest.py b/tests/test_rest.py index XXXXXXX..XXXXXXX 100755 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -XXX,XX +XXX,XX @@ class RestTest(PatchewTestCase): resp = self.api_client.get(self.REST_BASE + 'projects/12345/series/?q=project:QEMU') self.assertEqual(resp.data['count'], 0) + def test_series_delete(self): + test_message_id = '1469192015-16487-1-git-send-email-berrange@redhat.com' + series = self.apply_and_retrieve('0004-multiple-patch-reviewed.mbox.gz',self.p.id, + test_message_id) + message = series.data['message'] + resp_before = self.api_client.get(self.REST_BASE + 'projects/' + str(self.p.id) + + '/series/' + test_message_id + '/') + resp_reply_before = self.api_client.get(message + 'replies/') + resp_without_login = self.api_client.delete(self.REST_BASE + 'projects/' + str(self.p.id) + + '/series/' + test_message_id + '/') + self.api_client.login(username=self.user, password=self.password) + resp = self.api_client.delete(self.REST_BASE + 'projects/' + str(self.p.id) + + '/series/' + test_message_id + '/') + self.api_client.logout() + resp_after = self.api_client.get(self.REST_BASE + 'projects/' + str(self.p.id) + + '/series/' + test_message_id + '/') + resp_reply_after = self.api_client.get(message + 'replies/') + + self.assertEqual(resp_before.status_code, 200) + self.assertEqual(resp_reply_before.status_code, 200) + self.assertEqual(resp_without_login.status_code, 403) + self.assertEqual(resp.status_code, 204) + self.assertEqual(resp_after.status_code, 404) + self.assertEqual(resp_reply_after.status_code, 404) + def test_message(self): series = self.apply_and_retrieve('0001-simple-patch.mbox.gz', self.p.id, '20160628014747.20971-1-famz@redhat.com') -- 2.14.3 (Apple Git-98) _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel