8
8
import email .parser
9
9
10
10
from django .core .exceptions import ValidationError
11
+ from django .utils import timezone
11
12
from django .utils .text import slugify
12
13
from django .utils .translation import gettext_lazy as _
13
14
from rest_framework .exceptions import APIException
29
30
from patchwork .api .embedded import UserSerializer
30
31
from patchwork .api .filters import PatchFilterSet
31
32
from patchwork .models import Patch
33
+ from patchwork .models import PatchReviewIntention
32
34
from patchwork .models import PatchRelation
33
35
from patchwork .models import State
34
36
from patchwork .models import User
@@ -78,12 +80,41 @@ class PatchConflict(APIException):
78
80
)
79
81
80
82
83
+ class PatchReviewIntentionSerializer (BaseHyperlinkedModelSerializer ):
84
+ user = UserSerializer ()
85
+ patch = PatchSerializer ()
86
+ is_stale = SerializerMethodField ()
87
+
88
+ def get_is_stale (self , review_intention ):
89
+ expiration_time = (
90
+ review_intention .patch .state .review_intention_expiration_time
91
+ )
92
+ valid_until = (
93
+ review_intention .last_time_marked_for_review + expiration_time
94
+ )
95
+
96
+ return timezone .now () > valid_until
97
+
98
+ class Meta :
99
+ model = PatchReviewIntention
100
+ fields = [
101
+ 'id' ,
102
+ 'user' ,
103
+ 'patch' ,
104
+ 'last_time_marked_for_review' ,
105
+ 'is_stale' ,
106
+ ]
107
+
108
+
81
109
class PatchListSerializer (BaseHyperlinkedModelSerializer ):
82
110
web_url = SerializerMethodField ()
83
111
project = ProjectSerializer (read_only = True )
84
112
state = StateField ()
85
113
submitter = PersonSerializer (read_only = True )
86
114
delegate = UserSerializer (allow_null = True )
115
+ planning_to_review = PatchReviewIntentionSerializer (
116
+ source = 'patchreviewintention_set' , many = True
117
+ )
87
118
mbox = SerializerMethodField ()
88
119
series = SeriesSerializer (read_only = True )
89
120
comments = SerializerMethodField ()
@@ -172,6 +203,8 @@ class Meta:
172
203
'hash' ,
173
204
'submitter' ,
174
205
'delegate' ,
206
+ 'planning_to_review' ,
207
+ 'has_planned_review' ,
175
208
'mbox' ,
176
209
'series' ,
177
210
'comments' ,
@@ -190,6 +223,7 @@ class Meta:
190
223
'name' ,
191
224
'hash' ,
192
225
'submitter' ,
226
+ 'has_planned_review' ,
193
227
'mbox' ,
194
228
'series' ,
195
229
'comments' ,
@@ -230,16 +264,11 @@ def get_headers(self, patch):
230
264
def get_prefixes (self , instance ):
231
265
return clean_subject (instance .name )[1 ]
232
266
233
- def update (self , instance , validated_data ):
234
- # d-r-f cannot handle writable nested models, so we handle that
235
- # specifically ourselves and let d-r-f handle the rest
236
- if 'related' not in validated_data :
237
- return super (PatchDetailSerializer , self ).update (
238
- instance , validated_data
239
- )
240
-
241
- related = validated_data .pop ('related' )
267
+ def update_planning_to_review (self , instance , patchreviewintention_set ):
268
+ intereted_user = patchreviewintention_set .pop ()['user' ]
269
+ instance .planning_to_review .add (intereted_user .id )
242
270
271
+ def update_related (self , instance , related ):
243
272
# Validation rules
244
273
# ----------------
245
274
#
@@ -280,9 +309,7 @@ def update(self, instance, validated_data):
280
309
if instance .related and instance .related .patches .count () == 2 :
281
310
instance .related .delete ()
282
311
instance .related = None
283
- return super (PatchDetailSerializer , self ).update (
284
- instance , validated_data
285
- )
312
+ return
286
313
287
314
# break before make
288
315
relations = {patch .related for patch in patches if patch .related }
@@ -306,6 +333,20 @@ def update(self, instance, validated_data):
306
333
instance .related = relation
307
334
instance .save ()
308
335
336
+ def update (self , instance , validated_data ):
337
+ # d-r-f cannot handle writable nested models, so we handle that
338
+ # specifically ourselves and let d-r-f handle the rest
339
+
340
+ if 'related' in validated_data :
341
+ related = validated_data .pop ('related' )
342
+ self .update_related (instance , related )
343
+
344
+ if 'patchreviewintention_set' in validated_data :
345
+ patchreviewintention_set = validated_data .pop (
346
+ 'patchreviewintention_set'
347
+ )
348
+ self .update_planning_to_review (instance , patchreviewintention_set )
349
+
309
350
return super (PatchDetailSerializer , self ).update (
310
351
instance , validated_data
311
352
)
0 commit comments