3030from ietf .utils .fields import DatepickerDateField
3131from ietf .ietfauth .utils import user_is_person
3232
33+ def get_open_review_requests_for_team (team , assignment_status = None ):
34+ open_review_requests = ReviewRequest .objects .filter (
35+ team = team ,
36+ state__in = ("requested" , "accepted" )
37+ ).prefetch_related (
38+ "reviewer__person" , "type" , "state"
39+ ).order_by ("-time" , "-id" )
40+
41+ if assignment_status == "unassigned" :
42+ open_review_requests = suggested_review_requests_for_team (team ) + list (open_review_requests .filter (reviewer = None ))
43+ elif assignment_status == "assigned" :
44+ open_review_requests = list (open_review_requests .exclude (reviewer = None ))
45+ else :
46+ open_review_requests = suggested_review_requests_for_team (team ) + list (open_review_requests )
47+
48+ today = datetime .date .today ()
49+ unavailable_periods = current_unavailable_periods_for_reviewers (team )
50+ for r in open_review_requests :
51+ if r .reviewer :
52+ r .reviewer_unavailable = any (p .availability == "unavailable"
53+ for p in unavailable_periods .get (r .reviewer .person_id , []))
54+ r .due = max (0 , (today - r .deadline ).days )
55+
56+ return open_review_requests
3357
3458def review_requests (request , acronym , group_type = None ):
3559 group = get_group_or_404 (acronym , group_type )
3660 if not group .features .has_reviews :
3761 raise Http404
3862
39- open_review_requests = list (ReviewRequest .objects .filter (
40- team = group , state__in = ("requested" , "accepted" )
41- ).prefetch_related ("reviewer" , "type" , "state" ).order_by ("-time" , "-id" ))
42-
43- unavailable_periods = current_unavailable_periods_for_reviewers (group )
44- for review_req in open_review_requests :
45- if review_req .reviewer :
46- review_req .reviewer_unavailable = any (p .availability == "unavailable"
47- for p in unavailable_periods .get (review_req .reviewer .person_id , []))
63+ assigned_review_requests = []
64+ unassigned_review_requests = []
4865
49- open_review_requests = suggested_review_requests_for_team (group ) + open_review_requests
66+ for r in get_open_review_requests_for_team (group ):
67+ if r .reviewer :
68+ assigned_review_requests .append (r )
69+ else :
70+ unassigned_review_requests .append (r )
5071
51- today = datetime .date .today ()
52- for r in open_review_requests :
53- r .due = max (0 , (today - r .deadline ).days )
72+ open_review_requests = [
73+ ("Unassigned" , unassigned_review_requests ),
74+ ("Assigned" , assigned_review_requests ),
75+ ]
5476
5577 closed_review_requests = ReviewRequest .objects .filter (
5678 team = group ,
5779 ).exclude (
5880 state__in = ("requested" , "accepted" )
59- ).prefetch_related ("reviewer " , "type" , "state" , "doc" ).order_by ("-time" , "-id" )
81+ ).prefetch_related ("reviewer__person " , "type" , "state" , "doc" , "result " ).order_by ("-time" , "-id" )
6082
6183 since_choices = [
6284 (None , "1 month" ),
@@ -192,26 +214,15 @@ def __init__(self, review_req, *args, **kwargs):
192214
193215
194216@login_required
195- def manage_review_requests (request , acronym , group_type = None ):
217+ def manage_review_requests (request , acronym , group_type = None , assignment_status = None ):
196218 group = get_group_or_404 (acronym , group_type )
197219 if not group .features .has_reviews :
198220 raise Http404
199221
200222 if not can_manage_review_requests_for_team (request .user , group ):
201223 return HttpResponseForbidden ("You do not have permission to perform this action" )
202224
203- unavailable_periods = current_unavailable_periods_for_reviewers (group )
204-
205- open_review_requests = list (ReviewRequest .objects .filter (
206- team = group , state__in = ("requested" , "accepted" )
207- ).prefetch_related ("reviewer" , "type" , "state" ).order_by ("-time" , "-id" ))
208-
209- for review_req in open_review_requests :
210- if review_req .reviewer :
211- review_req .reviewer_unavailable = any (p .availability == "unavailable"
212- for p in unavailable_periods .get (review_req .reviewer .person_id , []))
213-
214- review_requests = suggested_review_requests_for_team (group ) + open_review_requests
225+ review_requests = get_open_review_requests_for_team (group , assignment_status = assignment_status )
215226
216227 document_requests = extract_revision_ordered_review_requests_for_documents_and_replaced (
217228 ReviewRequest .objects .filter (state__in = ("part-completed" , "completed" ), team = group ).prefetch_related ("result" ),
@@ -221,10 +232,12 @@ def manage_review_requests(request, acronym, group_type=None):
221232 # we need a mutable query dict for resetting upon saving with
222233 # conflicts
223234 query_dict = request .POST .copy () if request .method == "POST" else None
235+
224236 for req in review_requests :
237+ # add previous requests
225238 l = []
226- # take all on the latest reviewed rev
227239 for r in document_requests .get (req .doc_id , []):
240+ # take all on the latest reviewed rev
228241 if l and l [0 ].reviewed_rev :
229242 if r .doc_id == l [0 ].doc_id and r .reviewed_rev :
230243 if int (r .reviewed_rev ) > int (l [0 ].reviewed_rev ):
@@ -292,18 +305,28 @@ def manage_review_requests(request, acronym, group_type=None):
292305 kwargs ["group_type" ] = group_type
293306
294307 if form_action == "save-continue" :
308+ if assignment_status :
309+ kwargs ["assignment_status" ] = assignment_status
310+
295311 return redirect (manage_review_requests , ** kwargs )
296312 else :
297313 import ietf .group .views_review
298314 return redirect (ietf .group .views_review .review_requests , ** kwargs )
299315
316+ other_assignment_status = {
317+ "unassigned" : "assigned" ,
318+ "assigned" : "unassigned" ,
319+ }.get (assignment_status )
320+
300321 return render (request , 'group/manage_review_requests.html' , {
301322 'group' : group ,
302323 'review_requests' : review_requests ,
303324 'newly_closed' : newly_closed ,
304325 'newly_opened' : newly_opened ,
305326 'newly_assigned' : newly_assigned ,
306327 'saving' : saving ,
328+ 'assignment_status' : assignment_status ,
329+ 'other_assignment_status' : other_assignment_status ,
307330 })
308331
309332class EmailOpenAssignmentsForm (forms .Form ):
@@ -327,16 +350,21 @@ def email_open_review_assignments(request, acronym, group_type=None):
327350 reviewer = None ,
328351 ).prefetch_related ("reviewer" , "type" , "state" , "doc" ).distinct ().order_by ("deadline" , "reviewer" ))
329352
353+ back_url = request .GET .get ("next" )
354+ if not back_url :
355+ kwargs = { "acronym" : group .acronym }
356+ if group_type :
357+ kwargs ["group_type" ] = group_type
358+
359+ import ietf .group .views_review
360+ back_url = urlreverse (ietf .group .views_review .review_requests , kwargs = kwargs )
361+
330362 if request .method == "POST" and request .POST .get ("action" ) == "email" :
331363 form = EmailOpenAssignmentsForm (request .POST )
332364 if form .is_valid ():
333365 send_mail_text (request , form .cleaned_data ["to" ], None , form .cleaned_data ["subject" ], form .cleaned_data ["body" ])
334366
335- kwargs = { "acronym" : group .acronym }
336- if group_type :
337- kwargs ["group_type" ] = group_type
338-
339- return redirect (manage_review_requests , ** kwargs )
367+ return HttpResponseRedirect (back_url )
340368 else :
341369 to = group .list_email
342370 subject = "Open review assignments in {}" .format (group .acronym )
@@ -356,6 +384,7 @@ def email_open_review_assignments(request, acronym, group_type=None):
356384 'group' : group ,
357385 'review_requests' : review_requests ,
358386 'form' : form ,
387+ 'back_url' : back_url ,
359388 })
360389
361390
0 commit comments