5
5
6
6
from rest_framework .generics import ListAPIView
7
7
from rest_framework .generics import RetrieveAPIView
8
+ from rest_framework .generics import UpdateAPIView
8
9
from rest_framework .serializers import SerializerMethodField
10
+ from rest_framework .exceptions import ValidationError
9
11
10
12
from patchwork .api .base import BaseHyperlinkedModelSerializer
11
13
from patchwork .api .base import PatchworkPermission
14
16
from patchwork .api .embedded import PatchSerializer
15
17
from patchwork .api .embedded import PersonSerializer
16
18
from patchwork .api .embedded import ProjectSerializer
19
+ from patchwork .api .embedded import SeriesSerializer as RelatedSeriesSerializer
17
20
from patchwork .models import Series
18
21
19
22
@@ -24,6 +27,14 @@ class SeriesSerializer(BaseHyperlinkedModelSerializer):
24
27
mbox = SerializerMethodField ()
25
28
cover_letter = CoverSerializer (read_only = True )
26
29
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
27
38
28
39
def get_web_url (self , instance ):
29
40
request = self .context .get ('request' )
@@ -33,6 +44,16 @@ def get_mbox(self, instance):
33
44
request = self .context .get ('request' )
34
45
return request .build_absolute_uri (instance .get_mbox_url ())
35
46
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
+
36
57
class Meta :
37
58
model = Series
38
59
fields = (
@@ -44,6 +65,7 @@ class Meta:
44
65
'date' ,
45
66
'submitter' ,
46
67
'version' ,
68
+ 'related_series' ,
47
69
'total' ,
48
70
'received_total' ,
49
71
'received_all' ,
@@ -90,7 +112,7 @@ class SeriesList(SeriesMixin, ListAPIView):
90
112
ordering = 'id'
91
113
92
114
93
- class SeriesDetail (SeriesMixin , RetrieveAPIView ):
94
- """Show a series."""
115
+ class SeriesDetail (SeriesMixin , RetrieveAPIView , UpdateAPIView ):
116
+ """Show and update a series."""
95
117
96
118
pass
0 commit comments