[Patchew-devel] [PATCH v2] rest: add support for series DELETE in the REST API, and a corresponding unit test

Shubham Jain posted 1 patch 5 years, 12 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/patchew-ci tags/patchew/20180331122557.44970-1-shubhamjain7495@gmail.com
There is a newer version of this series
api/rest.py        |  9 +++++++--
tests/test_rest.py | 19 +++++++++++++++++++
2 files changed, 26 insertions(+), 2 deletions(-)
[Patchew-devel] [PATCH v2] rest: add support for series DELETE in the REST API, and a corresponding unit test
Posted by Shubham Jain 5 years, 12 months ago
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 7c131a4..16810bb 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -14,7 +14,7 @@ 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
@@ -231,7 +231,7 @@ 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]
@@ -265,6 +265,11 @@ 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 28ca10b..d64e047 100755
--- a/tests/test_rest.py
+++ b/tests/test_rest.py
@@ -218,6 +218,25 @@ 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
Re: [Patchew-devel] [PATCH v2] rest: add support for series DELETE in the REST API, and a corresponding unit test
Posted by Paolo Bonzini 5 years, 11 months ago
On 31/03/2018 14:25, Shubham Jain wrote:
> @@ -265,6 +265,11 @@ 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)

There are still some issues:

- if you override perform_destroy, rather than destroy, you have
slightly shorter code.  (If you override destroy it's fine, but then you
don't need to include the mixin.  I prefer using it and overriding
perform_destroy).

- deletion must not be public, so you need to change the
permission_classes (for example in BaseMessageViewSet).  You can then
add another unit test that looks for failures when you don't login.
Sorry for not spotting this in v1.

Thanks,

Paolo

>  # Messages
>  
>  # TODO: add POST endpoint connected to email plugin?
> diff --git a/tests/test_rest.py b/tests/test_rest.py
> index 28ca10b..d64e047 100755
> --- a/tests/test_rest.py
> +++ b/tests/test_rest.py
> @@ -218,6 +218,25 @@ 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')
> 

_______________________________________________
Patchew-devel mailing list
Patchew-devel@redhat.com
https://www.redhat.com/mailman/listinfo/patchew-devel