66from rest_framework .generics import ListAPIView
77from rest_framework .generics import RetrieveAPIView
88from rest_framework .serializers import SerializerMethodField
9+ from rest_framework .exceptions import ValidationError
910
1011from patchwork .api .base import BaseHyperlinkedModelSerializer
1112from patchwork .api .base import PatchworkPermission
1415from patchwork .api .embedded import PatchSerializer
1516from patchwork .api .embedded import PersonSerializer
1617from patchwork .api .embedded import ProjectSerializer
18+ from patchwork .api .embedded import SeriesSerializer as RelatedSeriesSerializer
1719from patchwork .models import Series
1820
1921
@@ -24,6 +26,14 @@ class SeriesSerializer(BaseHyperlinkedModelSerializer):
2426 mbox = SerializerMethodField ()
2527 cover_letter = CoverSerializer (read_only = True )
2628 patches = PatchSerializer (read_only = True , many = True )
29+ related_series = RelatedSeriesSerializer (many = True )
30+
31+ def get_related_series (self , obj ):
32+ urls = []
33+ for related_series in obj .related_series .all ():
34+ url = self .get_web_url (related_series )
35+ urls .append (url )
36+ return urls
2737
2838 def get_web_url (self , instance ):
2939 request = self .context .get ('request' )
@@ -33,6 +43,16 @@ def get_mbox(self, instance):
3343 request = self .context .get ('request' )
3444 return request .build_absolute_uri (instance .get_mbox_url ())
3545
46+ def validate_related_series (self , related_series ):
47+ for series in related_series :
48+ if self .instance .id != series .id :
49+ raise ValidationError ('A series cannot be linked to itself.' )
50+ if self .instance .project .id != series .project .id :
51+ raise ValidationError (
52+ 'Series must belong to the same project.'
53+ )
54+ return related_series
55+
3656 class Meta :
3757 model = Series
3858 fields = (
@@ -44,6 +64,7 @@ class Meta:
4464 'date' ,
4565 'submitter' ,
4666 'version' ,
67+ 'related_series' ,
4768 'total' ,
4869 'received_total' ,
4970 'received_all' ,
0 commit comments