Skip to content

Commit a9deec9

Browse files
committed
serializers: Add 'related_versions' field to series serializer
For two series to be linked togheter they must belong to the same project Closes getpatchwork#506 Signed-off-by: andrepapoti <[email protected]>
1 parent f44254c commit a9deec9

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

patchwork/api/series.py

+24-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
from rest_framework.generics import ListAPIView
77
from rest_framework.generics import RetrieveAPIView
8+
from rest_framework.generics import UpdateAPIView
89
from rest_framework.serializers import SerializerMethodField
10+
from rest_framework.exceptions import ValidationError
911

1012
from patchwork.api.base import BaseHyperlinkedModelSerializer
1113
from patchwork.api.base import PatchworkPermission
@@ -14,6 +16,7 @@
1416
from patchwork.api.embedded import PatchSerializer
1517
from patchwork.api.embedded import PersonSerializer
1618
from patchwork.api.embedded import ProjectSerializer
19+
from patchwork.api.embedded import SeriesSerializer as RelatedSeriesSerializer
1720
from patchwork.models import Series
1821

1922

@@ -24,6 +27,14 @@ class SeriesSerializer(BaseHyperlinkedModelSerializer):
2427
mbox = SerializerMethodField()
2528
cover_letter = CoverSerializer(read_only=True)
2629
patches = PatchSerializer(read_only=True, many=True)
30+
related_series = RelatedSeriesSerializer(many=True)
31+
32+
def get_related_series(self, obj):
33+
urls = []
34+
for related_series in obj.related_series.all():
35+
url = self.get_web_url(related_series)
36+
urls.append(url)
37+
return urls
2738

2839
def get_web_url(self, instance):
2940
request = self.context.get('request')
@@ -33,6 +44,16 @@ def get_mbox(self, instance):
3344
request = self.context.get('request')
3445
return request.build_absolute_uri(instance.get_mbox_url())
3546

47+
def validate_related_series(self, related_series):
48+
for series in related_series:
49+
if self.instance.id == series.id:
50+
raise ValidationError('A series cannot be linked to itself.')
51+
if self.instance.project.id != series.project.id:
52+
raise ValidationError(
53+
'Series must belong to the same project.'
54+
)
55+
return related_series
56+
3657
class Meta:
3758
model = Series
3859
fields = (
@@ -44,6 +65,7 @@ class Meta:
4465
'date',
4566
'submitter',
4667
'version',
68+
'related_series',
4769
'total',
4870
'received_total',
4971
'received_all',
@@ -90,7 +112,7 @@ class SeriesList(SeriesMixin, ListAPIView):
90112
ordering = 'id'
91113

92114

93-
class SeriesDetail(SeriesMixin, RetrieveAPIView):
94-
"""Show a series."""
115+
class SeriesDetail(SeriesMixin, RetrieveAPIView, UpdateAPIView):
116+
"""Show and update a series."""
95117

96118
pass

0 commit comments

Comments
 (0)