Skip to content

Commit c6b54a4

Browse files
committed
api: Update Patch related serializers to accomodate for the new 'interested_users'field
Signed-off-by: andrepapoti <andrepapoti@gmail.com>
1 parent 29b4087 commit c6b54a4

File tree

1 file changed

+53
-12
lines changed

1 file changed

+53
-12
lines changed

patchwork/api/patch.py

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import email.parser
99

1010
from django.core.exceptions import ValidationError
11+
from django.utils import timezone
1112
from django.utils.text import slugify
1213
from django.utils.translation import gettext_lazy as _
1314
from rest_framework.exceptions import APIException
@@ -29,6 +30,7 @@
2930
from patchwork.api.embedded import UserSerializer
3031
from patchwork.api.filters import PatchFilterSet
3132
from patchwork.models import Patch
33+
from patchwork.models import PatchReviewIntention
3234
from patchwork.models import PatchRelation
3335
from patchwork.models import State
3436
from patchwork.models import User
@@ -78,12 +80,41 @@ class PatchConflict(APIException):
7880
)
7981

8082

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+
81109
class 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+
planning_to_review = PatchReviewIntentionSerializer(
116+
source='patchreviewintention_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+
'planning_to_review',
207+
'has_planned_review',
175208
'mbox',
176209
'series',
177210
'comments',
@@ -190,6 +223,7 @@ class Meta:
190223
'name',
191224
'hash',
192225
'submitter',
226+
'has_planned_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_planning_to_review(self, instance, patchreviewintention_set):
268+
intereted_user = patchreviewintention_set.pop()['user']
269+
instance.planning_to_review.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,20 @@ 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 '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+
309350
return super(PatchDetailSerializer, self).update(
310351
instance, validated_data
311352
)

0 commit comments

Comments
 (0)