88import email .parser
99
1010from django .core .exceptions import ValidationError
11+ from django .utils import timezone
1112from django .utils .text import slugify
1213from django .utils .translation import gettext_lazy as _
1314from rest_framework .exceptions import APIException
2930from patchwork .api .embedded import UserSerializer
3031from patchwork .api .filters import PatchFilterSet
3132from patchwork .models import Patch
33+ from patchwork .models import PatchInterest
3234from patchwork .models import PatchRelation
3335from patchwork .models import State
3436from patchwork .models import User
@@ -78,12 +80,41 @@ class PatchConflict(APIException):
7880 )
7981
8082
83+ class PatchInterestSerializer (BaseHyperlinkedModelSerializer ):
84+ user = UserSerializer ()
85+ patch = PatchSerializer ()
86+ is_stale = SerializerMethodField ()
87+
88+ def get_is_stale (self , patch_interest ):
89+ expiration_time = (
90+ patch_interest .patch .state .review_interest_expiration_time
91+ )
92+ valid_until = (
93+ patch_interest .last_time_marked_for_review + expiration_time
94+ )
95+
96+ return timezone .now () > valid_until
97+
98+ class Meta :
99+ model = PatchInterest
100+ fields = [
101+ 'id' ,
102+ 'user' ,
103+ 'patch' ,
104+ 'last_time_marked_for_review' ,
105+ 'is_stale' ,
106+ ]
107+
108+
81109class PatchListSerializer (BaseHyperlinkedModelSerializer ):
82110 web_url = SerializerMethodField ()
83111 project = ProjectSerializer (read_only = True )
84112 state = StateField ()
85113 submitter = PersonSerializer (read_only = True )
86114 delegate = UserSerializer (allow_null = True )
115+ interested_users = PatchInterestSerializer (
116+ source = 'patchinterest_set' , many = True
117+ )
87118 mbox = SerializerMethodField ()
88119 series = SeriesSerializer (read_only = True )
89120 comments = SerializerMethodField ()
@@ -172,6 +203,8 @@ class Meta:
172203 'hash' ,
173204 'submitter' ,
174205 'delegate' ,
206+ 'interested_users' ,
207+ 'pending_review' ,
175208 'mbox' ,
176209 'series' ,
177210 'comments' ,
@@ -190,6 +223,7 @@ class Meta:
190223 'name' ,
191224 'hash' ,
192225 'submitter' ,
226+ 'pending_review' ,
193227 'mbox' ,
194228 'series' ,
195229 'comments' ,
@@ -230,16 +264,11 @@ def get_headers(self, patch):
230264 def get_prefixes (self , instance ):
231265 return clean_subject (instance .name )[1 ]
232266
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_interested_users (self , instance , patchinterest_set ):
268+ intereted_user = patchinterest_set .pop ()['user' ]
269+ instance .interested_users .add (intereted_user .id )
242270
271+ def update_related (self , instance , related ):
243272 # Validation rules
244273 # ----------------
245274 #
@@ -280,9 +309,7 @@ def update(self, instance, validated_data):
280309 if instance .related and instance .related .patches .count () == 2 :
281310 instance .related .delete ()
282311 instance .related = None
283- return super (PatchDetailSerializer , self ).update (
284- instance , validated_data
285- )
312+ return
286313
287314 # break before make
288315 relations = {patch .related for patch in patches if patch .related }
@@ -306,6 +333,18 @@ def update(self, instance, validated_data):
306333 instance .related = relation
307334 instance .save ()
308335
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 'patchinterest_set' in validated_data :
345+ patchinterest_set = validated_data .pop ('patchinterest_set' )
346+ self .update_interested_users (instance , patchinterest_set )
347+
309348 return super (PatchDetailSerializer , self ).update (
310349 instance , validated_data
311350 )
0 commit comments