@@ -176,11 +176,6 @@ def days_needed_to_fulfill_min_interval_for_reviewers(team):
176176 "late_days" ,
177177 "request_to_assignment_days" , "assignment_to_closure_days" , "request_to_closure_days" ])
178178
179- # TODO - see if this becomes dead
180- ReviewRequestData = namedtuple ("ReviewRequestData" , [
181- "req_pk" , "doc" , "doc_pages" , "req_time" , "state" , "assigned_time" , "deadline" , "reviewed_rev" , "result" , "team" , "reviewer" ,
182- "late_days" ,
183- "request_to_assignment_days" , "assignment_to_closure_days" , "request_to_closure_days" ])
184179
185180def extract_review_assignment_data (teams = None , reviewers = None , time_from = None , time_to = None , ordering = []):
186181 """Yield data on each review assignment, sorted by (*ordering, assigned_on)
@@ -208,7 +203,7 @@ def extract_review_assignment_data(teams=None, reviewers=None, time_from=None, t
208203 "reviewer__person" , "assigned_on" , "completed_on"
209204 )
210205
211- event_qs = event_qs .order_by (* [o .replace ("reviewer" , "reviewer__person" ) for o in ordering ] + ["assigned_on" , "pk" , "completed_on" ])
206+ event_qs = event_qs .order_by (* [o .replace ("reviewer" , "reviewer__person" ). replace ( "team" , "review_request__team" ) for o in ordering ] + ["assigned_on" , "pk" , "completed_on" ])
212207
213208 def positive_days (time_from , time_to ):
214209 if time_from is None or time_to is None :
@@ -242,83 +237,19 @@ def positive_days(time_from, time_to):
242237
243238 yield d
244239
245- # TODO - see if this is dead code
246- def extract_review_request_data (teams = None , reviewers = None , time_from = None , time_to = None , ordering = []):
247- """Yield data on each review request, sorted by (*ordering, time)
248- for easy use with itertools.groupby. Valid entries in *ordering are "team" and "reviewer"."""
249-
250- filters = Q ()
251-
252- if teams :
253- filters &= Q (team__in = teams )
254-
255- if reviewers :
256- filters &= Q (reviewer__person__in = reviewers )
257-
258- if time_from :
259- filters &= Q (time__gte = time_from )
260-
261- if time_to :
262- filters &= Q (time__lte = time_to )
263-
264- # we may be dealing with a big bunch of data, so treat it carefully
265- event_qs = ReviewRequest .objects .filter (filters )
266-
267- # left outer join with RequestRequestDocEvent for request/assign/close time
268- event_qs = event_qs .values_list (
269- "pk" , "doc" , "doc__pages" , "time" , "state" , "deadline" , "reviewassignment__reviewed_rev" , "reviewassignment__result" , "team" ,
270- "reviewassignment__reviewer__person" , "reviewrequestdocevent__time" , "reviewrequestdocevent__type"
271- )
272-
273- event_qs = event_qs .order_by (* [o .replace ("reviewer" , "reviewassignment__reviewer__person" ) for o in ordering ] + ["time" , "pk" , "-reviewrequestdocevent__time" ])
274-
275- def positive_days (time_from , time_to ):
276- if time_from is None or time_to is None :
277- return None
278-
279- delta = time_to - time_from
280- seconds = delta .total_seconds ()
281- if seconds > 0 :
282- return seconds / float (24 * 60 * 60 )
283- else :
284- return 0.0
285-
286- for _ , events in itertools .groupby (event_qs .iterator (), lambda t : t [0 ]):
287- requested_time = assigned_time = closed_time = None
288-
289- for e in events :
290- req_pk , doc , doc_pages , req_time , state , deadline , reviewed_rev , result , team , reviewer , event_time , event_type = e
291-
292- if event_type == "requested_review" and requested_time is None :
293- requested_time = event_time
294- elif event_type == "assigned_review_request" and assigned_time is None :
295- assigned_time = event_time
296- elif event_type == "closed_review_request" and closed_time is None :
297- closed_time = event_time
298-
299- late_days = positive_days (datetime .datetime .combine (deadline , datetime .time .max ), closed_time )
300- request_to_assignment_days = positive_days (requested_time , assigned_time )
301- assignment_to_closure_days = positive_days (assigned_time , closed_time )
302- request_to_closure_days = positive_days (requested_time , closed_time )
303-
304- d = ReviewRequestData (req_pk , doc , doc_pages , req_time , state , assigned_time , deadline , reviewed_rev , result , team , reviewer ,
305- late_days , request_to_assignment_days , assignment_to_closure_days ,
306- request_to_closure_days )
307240
308- yield d
309-
310- def aggregate_raw_period_review_request_stats (review_request_data , count = None ):
241+ def aggregate_raw_period_review_assignment_stats (review_assignment_data , count = None ):
311242 """Take a sequence of review request data from
312- extract_review_request_data and aggregate them."""
243+ extract_review_assignment_data and aggregate them."""
313244
314245 state_dict = defaultdict (int )
315246 late_state_dict = defaultdict (int )
316247 result_dict = defaultdict (int )
317248 assignment_to_closure_days_list = []
318249 assignment_to_closure_days_count = 0
319250
320- for (req_pk , doc , doc_pages , req_time , state , assigned_time , deadline , reviewed_rev , result , team , reviewer ,
321- late_days , request_to_assignment_days , assignment_to_closure_days , request_to_closure_days ) in review_request_data :
251+ for (assignment_pk , doc , doc_pages , req_time , state , assigned_time , deadline , reviewed_rev , result , team , reviewer ,
252+ late_days , request_to_assignment_days , assignment_to_closure_days , request_to_closure_days ) in review_assignment_data :
322253 if count == "pages" :
323254 c = doc_pages
324255 else :
@@ -337,19 +268,19 @@ def aggregate_raw_period_review_request_stats(review_request_data, count=None):
337268
338269 return state_dict , late_state_dict , result_dict , assignment_to_closure_days_list , assignment_to_closure_days_count
339270
340- def sum_period_review_request_stats (raw_aggregation ):
271+ def sum_period_review_assignment_stats (raw_aggregation ):
341272 """Compute statistics from aggregated review request data for one aggregation point."""
342273 state_dict , late_state_dict , result_dict , assignment_to_closure_days_list , assignment_to_closure_days_count = raw_aggregation
343274
344275 res = {}
345276 res ["state" ] = state_dict
346277 res ["result" ] = result_dict
347278
348- res ["open" ] = sum (state_dict .get (s , 0 ) for s in ("requested " , "accepted" ))
279+ res ["open" ] = sum (state_dict .get (s , 0 ) for s in ("assigned " , "accepted" ))
349280 res ["completed" ] = sum (state_dict .get (s , 0 ) for s in ("completed" , "part-completed" ))
350281 res ["not_completed" ] = sum (state_dict .get (s , 0 ) for s in state_dict if s in ("rejected" , "withdrawn" , "overtaken" , "no-response" ))
351282
352- res ["open_late" ] = sum (late_state_dict .get (s , 0 ) for s in ("requested " , "accepted" ))
283+ res ["open_late" ] = sum (late_state_dict .get (s , 0 ) for s in ("assigned " , "accepted" ))
353284 res ["open_in_time" ] = res ["open" ] - res ["open_late" ]
354285 res ["completed_late" ] = sum (late_state_dict .get (s , 0 ) for s in ("completed" , "part-completed" ))
355286 res ["completed_in_time" ] = res ["completed" ] - res ["completed_late" ]
@@ -358,7 +289,7 @@ def sum_period_review_request_stats(raw_aggregation):
358289
359290 return res
360291
361- def sum_raw_review_request_aggregations (raw_aggregations ):
292+ def sum_raw_review_assignment_aggregations (raw_aggregations ):
362293 """Collapse a sequence of aggregations into one aggregation."""
363294 state_dict = defaultdict (int )
364295 late_state_dict = defaultdict (int )
@@ -397,36 +328,6 @@ def latest_review_assignments_for_reviewers(team, days_back=365):
397328
398329 return assignment_data_for_reviewers
399330
400- # TODO - see if this is dead code
401- def latest_review_requests_for_reviewers (team , days_back = 365 ):
402- """Collect and return stats for reviewers on latest requests, in
403- extract_review_request_data format."""
404-
405- extracted_data = extract_review_request_data (
406- teams = [team ],
407- time_from = datetime .date .today () - datetime .timedelta (days = days_back ),
408- ordering = ["reviewer" ],
409- )
410-
411- req_data_for_reviewers = {
412- reviewer : list (reversed (list (req_data_items )))
413- for reviewer , req_data_items in itertools .groupby (extracted_data , key = lambda data : data .reviewer )
414- }
415-
416- return req_data_for_reviewers
417-
418- def make_new_review_request_from_existing (review_req ):
419- obj = ReviewRequest ()
420- obj .time = review_req .time
421- obj .type = review_req .type
422- obj .doc = review_req .doc
423- obj .team = review_req .team
424- obj .deadline = review_req .deadline
425- obj .requested_rev = review_req .requested_rev
426- obj .requested_by = review_req .requested_by
427- obj .state = ReviewRequestStateName .objects .get (slug = "requested" )
428- return obj
429-
430331def email_review_assignment_change (request , review_assignment , subject , msg , by , notify_secretary , notify_reviewer , notify_requested_by ):
431332
432333 system_email = Person .objects .get (name = "(System)" ).formatted_email ()
0 commit comments