diff mbox

[v3,04/16] REST: Use SerializerMethod field

Message ID 1480097915-12158-5-git-send-email-stephen@that.guru
State Accepted
Headers show

Commit Message

Stephen Finucane Nov. 25, 2016, 6:18 p.m. UTC
Use 'SerializerMethodField' to override how we generate fields, rather
than hacking the 'to_representation' method. This is the more idiomatic
way to do this.

The Meta class for the Project and Patch serializers are moved to the
bottom of the serializers and some variables renamed, both for
consistency's sake.

Signed-off-by: Stephen Finucane <stephen@that.guru>
---
 patchwork/api/patch.py   | 46 ++++++++++++++++++++++++++++------------------
 patchwork/api/project.py |  8 ++++----
 2 files changed, 32 insertions(+), 22 deletions(-)

Comments

Daniel Axtens Nov. 29, 2016, 9:56 p.m. UTC | #1
> +    def to_representation(self, instance):
> +        data = super(PatchSerializer, self).to_representation(instance)
> +        data['checks'] = data['url'] + 'checks/'
Should this URL be constructed with a method, rather than string concatenation?
> +        return data

Apart from that, looks good to me but I'm not a DRF expert so I hesitate
to formally review it.

Regards,
Daniel
>      class Meta:
>          model = Patch
> @@ -50,24 +78,6 @@ class PatchSerializer(HyperlinkedModelSerializer):
>          # render this field
>          exclude = ('tags',)
>  
> -    def get_state(self, obj):
> -        return obj.state.name
> -
> -    def get_mbox(self, patch):
> -        request = self.context.get('request', None)
> -        return request.build_absolute_uri(patch.get_mbox_url())
> -
> -    def to_representation(self, instance):
> -        data = super(PatchSerializer, self).to_representation(instance)
> -        data['checks'] = data['url'] + 'checks/'
> -        data['check'] = instance.combined_check_state
> -        headers = data.get('headers')
> -        if headers is not None:
> -            data['headers'] = email.parser.Parser().parsestr(headers, True)
> -        data['tags'] = [{'name': x.tag.name, 'count': x.count}
> -                        for x in instance.patchtag_set.all()]
> -        return data
> -
>  
>  class PatchViewSet(PatchworkViewSet):
>      permission_classes = (PatchworkPermission,)
> diff --git a/patchwork/api/project.py b/patchwork/api/project.py
> index 7def2ed..b4debb6 100644
> --- a/patchwork/api/project.py
> +++ b/patchwork/api/project.py
> @@ -25,10 +25,6 @@ from patchwork.models import Project
>  
>  
>  class ProjectSerializer(HyperlinkedModelSerializer):
> -    class Meta:
> -        model = Project
> -        exclude = ('send_notifications', 'use_tags')
> -
>      def to_representation(self, instance):
>          data = super(ProjectSerializer, self).to_representation(instance)
>          data['link_name'] = data.pop('linkname')
> @@ -36,6 +32,10 @@ class ProjectSerializer(HyperlinkedModelSerializer):
>          data['list_id'] = data.pop('listid')
>          return data
>  
> +    class Meta:
> +        model = Project
> +        exclude = ('send_notifications', 'use_tags')
> +
>  
>  class ProjectViewSet(PatchworkViewSet):
>      permission_classes = (PatchworkPermission,)
> -- 
> 2.7.4
>
> _______________________________________________
> Patchwork mailing list
> Patchwork@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/patchwork
diff mbox

Patch

diff --git a/patchwork/api/patch.py b/patchwork/api/patch.py
index 2dc77d1..3f464b2 100644
--- a/patchwork/api/patch.py
+++ b/patchwork/api/patch.py
@@ -40,6 +40,34 @@  class PatchListSerializer(ListSerializer):
 class PatchSerializer(HyperlinkedModelSerializer):
     mbox = SerializerMethodField()
     state = SerializerMethodField()
+    tags = SerializerMethodField()
+    headers = SerializerMethodField()
+    check = SerializerMethodField()
+
+    def get_state(self, instance):
+        return instance.state.name
+
+    def get_mbox(self, instance):
+        request = self.context.get('request')
+        return request.build_absolute_uri(instance.get_mbox_url())
+
+    def get_tags(self, instance):
+        # TODO(stephenfin): I don't think this is correct - too many queries
+        return [{'name': x.tag.name, 'count': x.count}
+                for x in instance.patchtag_set.all()]
+
+    def get_headers(self, instance):
+        if instance.headers:
+            return
+        email.parser.Parser().parsestr(instance.headers, True)
+
+    def get_check(self, instance):
+        return instance.combined_check_state
+
+    def to_representation(self, instance):
+        data = super(PatchSerializer, self).to_representation(instance)
+        data['checks'] = data['url'] + 'checks/'
+        return data
 
     class Meta:
         model = Patch
@@ -50,24 +78,6 @@  class PatchSerializer(HyperlinkedModelSerializer):
         # render this field
         exclude = ('tags',)
 
-    def get_state(self, obj):
-        return obj.state.name
-
-    def get_mbox(self, patch):
-        request = self.context.get('request', None)
-        return request.build_absolute_uri(patch.get_mbox_url())
-
-    def to_representation(self, instance):
-        data = super(PatchSerializer, self).to_representation(instance)
-        data['checks'] = data['url'] + 'checks/'
-        data['check'] = instance.combined_check_state
-        headers = data.get('headers')
-        if headers is not None:
-            data['headers'] = email.parser.Parser().parsestr(headers, True)
-        data['tags'] = [{'name': x.tag.name, 'count': x.count}
-                        for x in instance.patchtag_set.all()]
-        return data
-
 
 class PatchViewSet(PatchworkViewSet):
     permission_classes = (PatchworkPermission,)
diff --git a/patchwork/api/project.py b/patchwork/api/project.py
index 7def2ed..b4debb6 100644
--- a/patchwork/api/project.py
+++ b/patchwork/api/project.py
@@ -25,10 +25,6 @@  from patchwork.models import Project
 
 
 class ProjectSerializer(HyperlinkedModelSerializer):
-    class Meta:
-        model = Project
-        exclude = ('send_notifications', 'use_tags')
-
     def to_representation(self, instance):
         data = super(ProjectSerializer, self).to_representation(instance)
         data['link_name'] = data.pop('linkname')
@@ -36,6 +32,10 @@  class ProjectSerializer(HyperlinkedModelSerializer):
         data['list_id'] = data.pop('listid')
         return data
 
+    class Meta:
+        model = Project
+        exclude = ('send_notifications', 'use_tags')
+
 
 class ProjectViewSet(PatchworkViewSet):
     permission_classes = (PatchworkPermission,)