diff options
Diffstat (limited to 'patchwork/api/patch.py')
-rw-r--r-- | patchwork/api/patch.py | 86 |
1 files changed, 52 insertions, 34 deletions
diff --git a/patchwork/api/patch.py b/patchwork/api/patch.py index 811ba1e..8427450 100644 --- a/patchwork/api/patch.py +++ b/patchwork/api/patch.py @@ -19,30 +19,22 @@ import email.parser +from django.core.urlresolvers import reverse from rest_framework.serializers import HyperlinkedModelSerializer -from rest_framework.serializers import ListSerializer +from rest_framework.generics import ListAPIView +from rest_framework.generics import RetrieveUpdateAPIView from rest_framework.serializers import SerializerMethodField from patchwork.api.base import PatchworkPermission -from patchwork.api.base import PatchworkViewSet from patchwork.models import Patch -class PatchListSerializer(ListSerializer): - """Semi hack to make the list of patches more efficient""" - def to_representation(self, data): - del self.child.fields['content'] - del self.child.fields['headers'] - del self.child.fields['diff'] - return super(PatchListSerializer, self).to_representation(data) - - -class PatchSerializer(HyperlinkedModelSerializer): +class PatchListSerializer(HyperlinkedModelSerializer): mbox = SerializerMethodField() state = SerializerMethodField() tags = SerializerMethodField() - headers = SerializerMethodField() check = SerializerMethodField() + checks = SerializerMethodField() def get_state(self, instance): return instance.state.name @@ -58,39 +50,65 @@ class PatchSerializer(HyperlinkedModelSerializer): else: return None - 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 + def get_checks(self, instance): + return self.context.get('request').build_absolute_uri( + reverse('api-check-list', kwargs={'patch_id': instance.id})) class Meta: model = Patch - list_serializer_class = PatchListSerializer fields = ('url', 'project', 'msgid', 'date', 'name', 'commit_ref', 'pull_url', 'state', 'archived', 'hash', 'submitter', - 'delegate', 'mbox', 'check', 'checks', 'tags', 'headers', - 'content', 'diff') - read_only_fields = ('project', 'name', 'date', 'submitter', 'diff', - 'content', 'hash', 'msgid') + 'delegate', 'mbox', 'check', 'checks', 'tags') + read_only_fields = ('project', 'msgid', 'date', 'name', 'hash', + 'submitter', 'mbox', 'mbox', 'series', 'check', + 'checks', 'tags') + extra_kwargs = { + 'url': {'view_name': 'api-patch-detail'}, + 'project': {'view_name': 'api-project-detail'}, + 'submitter': {'view_name': 'api-person-detail'}, + 'delegate': {'view_name': 'api-user-detail'}, + } + + +class PatchDetailSerializer(PatchListSerializer): + headers = SerializerMethodField() + + def get_headers(self, patch): + if patch.headers: + return email.parser.Parser().parsestr(patch.headers, True) + + class Meta: + model = Patch + fields = PatchListSerializer.Meta.fields + ( + 'headers', 'content', 'diff') + read_only_fields = PatchListSerializer.Meta.read_only_fields + ( + 'headers', 'content', 'diff') + extra_kwargs = PatchListSerializer.Meta.extra_kwargs + + +class PatchList(ListAPIView): + """List patches.""" + + permission_classes = (PatchworkPermission,) + serializer_class = PatchListSerializer + + def get_queryset(self): + return Patch.objects.all().with_tag_counts()\ + .prefetch_related('check_set')\ + .select_related('state', 'submitter', 'delegate')\ + .defer('content', 'diff', 'headers') + +class PatchDetail(RetrieveUpdateAPIView): + """Show a patch.""" -class PatchViewSet(PatchworkViewSet): permission_classes = (PatchworkPermission,) - serializer_class = PatchSerializer + serializer_class = PatchDetailSerializer def get_queryset(self): - qs = super(PatchViewSet, self).get_queryset().with_tag_counts()\ + return Patch.objects.all().with_tag_counts()\ .prefetch_related('check_set')\ .select_related('state', 'submitter', 'delegate') - if 'pk' not in self.kwargs: - # we are doing a listing, we don't need these fields - qs = qs.defer('content', 'diff', 'headers') - return qs |