diff mbox

[v3,08/10] REST API: make patch.state a string rather than int

Message ID 1463628662-26284-9-git-send-email-andy.doan@linaro.org
State Superseded
Headers show

Commit Message

Andy Doan May 19, 2016, 3:31 a.m. UTC
The int value isn't very useful and the goal is to move this to an enum
over time.

Signed-off-by: Andy Doan <andy.doan@linaro.org>
---
 patchwork/rest_serializers.py    | 13 ++++++++++++-
 patchwork/tests/test_rest_api.py | 12 +++++++++---
 2 files changed, 21 insertions(+), 4 deletions(-)

Comments

Stephen Finucane May 19, 2016, 9:32 a.m. UTC | #1
On 18 May 22:31, Andy Doan wrote:
> The int value isn't very useful and the goal is to move this to an enum
> over time.
> 
> Signed-off-by: Andy Doan <andy.doan@linaro.org>

Reviewed-by: Stephen Finucane <stephen.finucane@intel.com>

One nit below.

> @@ -61,10 +61,21 @@ class PatchSerializer(ModelSerializer):
>                              'content', 'hash', 'msgid')
>      mbox_url = SerializerMethodField()
>  
> +    def run_validation(self, data):
> +        state = data.get('state')
> +        if state:
> +            for st in State.objects.all():
> +                if st.name == state:
> +                    data['state'] = st.id
> +                    break
> +        return super(PatchSerializer, self).run_validation(data)
> +
>      def to_representation(self, instance):
>          request = self.context.get('request', None)
>          data = super(PatchSerializer, self).to_representation(instance)
>  
> +        data['state'] = instance.state.name
> +

nit: remove this whitespace

>          data['mbox_url'] = request.build_absolute_uri(data['mbox_url'])
>          data['project'] = request.build_absolute_uri(
>              reverse('api_1.0:project-detail', args=[data['project']]))
diff mbox

Patch

diff --git a/patchwork/rest_serializers.py b/patchwork/rest_serializers.py
index 46667b0..801978c 100644
--- a/patchwork/rest_serializers.py
+++ b/patchwork/rest_serializers.py
@@ -21,7 +21,7 @@  import email.parser
 
 from django.core.urlresolvers import reverse
 
-from patchwork.models import Check, Patch, Person, Project
+from patchwork.models import Check, Patch, Person, Project, State
 
 from rest_framework.serializers import (
     CurrentUserDefault, HiddenField, ListSerializer, ModelSerializer,
@@ -61,10 +61,21 @@  class PatchSerializer(ModelSerializer):
                             'content', 'hash', 'msgid')
     mbox_url = SerializerMethodField()
 
+    def run_validation(self, data):
+        state = data.get('state')
+        if state:
+            for st in State.objects.all():
+                if st.name == state:
+                    data['state'] = st.id
+                    break
+        return super(PatchSerializer, self).run_validation(data)
+
     def to_representation(self, instance):
         request = self.context.get('request', None)
         data = super(PatchSerializer, self).to_representation(instance)
 
+        data['state'] = instance.state.name
+
         data['mbox_url'] = request.build_absolute_uri(data['mbox_url'])
         data['project'] = request.build_absolute_uri(
             reverse('api_1.0:project-detail', args=[data['project']]))
diff --git a/patchwork/tests/test_rest_api.py b/patchwork/tests/test_rest_api.py
index 5fb4650..7ac9852 100644
--- a/patchwork/tests/test_rest_api.py
+++ b/patchwork/tests/test_rest_api.py
@@ -200,7 +200,7 @@  class TestPatchAPI(APITestCase):
         self.assertEqual(patches[0].diff, resp.data['diff'])
         self.assertIn(TestPersonAPI.api_url(patches[0].submitter.id),
                       resp.data['submitter'])
-        self.assertEqual(patches[0].state.id, resp.data['state'])
+        self.assertEqual(patches[0].state.name, resp.data['state'])
         self.assertIn(patches[0].get_mbox_url(), resp.data['mbox_url'])
 
     def test_anonymous_writes(self):
@@ -247,13 +247,19 @@  class TestPatchAPI(APITestCase):
         # A maintainer can update
         user = create_maintainer(defaults.project)
         self.client.force_authenticate(user=user)
-        resp = self.client.patch(self.api_url(patches[0].id), {'state': 2})
+        resp = self.client.patch(
+            self.api_url(patches[0].id), {'state': 'Accepted'})
+        self.assertEqual(status.HTTP_200_OK, resp.status_code)
+
+        resp = self.client.patch(
+            self.api_url(patches[0].id), {'pull_url': 'foo'})
         self.assertEqual(status.HTTP_200_OK, resp.status_code)
 
         # A normal user can't
         user = create_user()
         self.client.force_authenticate(user=user)
-        resp = self.client.patch(self.api_url(patches[0].id), {'state': 2})
+        resp = self.client.patch(
+            self.api_url(patches[0].id), {'state': 'Accepted'})
         self.assertEqual(status.HTTP_403_FORBIDDEN, resp.status_code)
 
     def test_delete(self):