diff --git a/patchwork/api/series.py b/patchwork/api/series.py index b88ed1f5..ab44ee70 100644 --- a/patchwork/api/series.py +++ b/patchwork/api/series.py @@ -5,7 +5,9 @@ from rest_framework.generics import ListAPIView from rest_framework.generics import RetrieveAPIView +from rest_framework.generics import UpdateAPIView from rest_framework.serializers import SerializerMethodField +from rest_framework.exceptions import ValidationError from patchwork.api.base import BaseHyperlinkedModelSerializer from patchwork.api.base import PatchworkPermission @@ -14,6 +16,7 @@ from patchwork.api.embedded import PatchSerializer from patchwork.api.embedded import PersonSerializer from patchwork.api.embedded import ProjectSerializer +from patchwork.api.embedded import SeriesSerializer as RelatedSeriesSerializer from patchwork.models import Series @@ -24,6 +27,14 @@ class SeriesSerializer(BaseHyperlinkedModelSerializer): mbox = SerializerMethodField() cover_letter = CoverSerializer(read_only=True) patches = PatchSerializer(read_only=True, many=True) + related_series = RelatedSeriesSerializer(many=True) + + def get_related_series(self, obj): + urls = [] + for related_series in obj.related_series.all(): + url = self.get_web_url(related_series) + urls.append(url) + return urls def get_web_url(self, instance): request = self.context.get('request') @@ -33,6 +44,16 @@ def get_mbox(self, instance): request = self.context.get('request') return request.build_absolute_uri(instance.get_mbox_url()) + def validate_related_series(self, related_series): + for series in related_series: + if self.instance.id == series.id: + raise ValidationError('A series cannot be linked to itself.') + if self.instance.project.id != series.project.id: + raise ValidationError( + 'Series must belong to the same project.' + ) + return related_series + class Meta: model = Series fields = ( @@ -44,6 +65,7 @@ class Meta: 'date', 'submitter', 'version', + 'related_series', 'total', 'received_total', 'received_all', @@ -90,7 +112,7 @@ class SeriesList(SeriesMixin, ListAPIView): ordering = 'id' -class SeriesDetail(SeriesMixin, RetrieveAPIView): - """Show a series.""" +class SeriesDetail(SeriesMixin, RetrieveAPIView, UpdateAPIView): + """Show and update a series.""" pass