api/rest.py | 9 +++++++-- tests/test_rest.py | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-)
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
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
© 2016 - 2023 Red Hat, Inc.