def update_request_states_from_pond_blocks(pond_blocks):
'''Update the states of requests and user_requests given a set of recently changed pond blocks.'''
blocks_with_tracking_nums = [pb for pb in pond_blocks if pb['molecules'][0]['tracking_num']]
sorted_blocks_with_tracking_nums = sorted(blocks_with_tracking_nums, key=lambda x: x['molecules'][0]['tracking_num'])
blocks_by_tracking_num = itertools.groupby(sorted_blocks_with_tracking_nums, lambda x: x['molecules'][0]['tracking_num'])
now = timezone.now()
states_changed = False
for tracking_num, blocks in blocks_by_tracking_num:
sorted_blocks_by_request = sorted(blocks, key=lambda x: x['molecules'][0]['request_num'])
blocks_by_request_num = {int(k): list(v) for k, v in itertools.groupby(sorted_blocks_by_request, key=lambda x: x['molecules'][0]['request_num'])}
user_request = UserRequest.objects.prefetch_related('requests').get(pk=tracking_num)
ur_expired = user_request.max_window_time < now
requests = user_request.requests.all()
for request in requests:
if request.id in blocks_by_request_num:
states_changed |= update_request_state(request, blocks_by_request_num[request.id], ur_expired)
states_changed |= update_user_request_state(user_request)
return states_changed
评论列表
文章目录