55
66from rest_framework .generics import ListAPIView
77from rest_framework .generics import RetrieveAPIView
8+ from rest_framework .generics import UpdateAPIView
89from rest_framework .serializers import SerializerMethodField
10+ from rest_framework .exceptions import ValidationError
911
1012from patchwork .api .base import BaseHyperlinkedModelSerializer
1113from patchwork .api .base import PatchworkPermission
1416from patchwork .api .embedded import PatchSerializer
1517from patchwork .api .embedded import PersonSerializer
1618from patchwork .api .embedded import ProjectSerializer
19+ from patchwork .api .embedded import SeriesSerializer as RelatedSeriesSerializer
1720from 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