def active_communicator_threads(phone_number): "Return all phone numbers tied to a submitted report." # todo make this query more efficient one we've settled on a back-end data model comments = ReportComment.objects.filter( comment_type=ReportComment.INQUIRY_TYPE, report__reporter__identity=phone_number, ) latest_inquiry_per_report = map_reduce(comments, lambda c: [(c.report.id, c.date)], lambda v, k: max(v)) active_report_ids = [report_id for report_id, last_inquiry in latest_inquiry_per_report.iteritems() if datetime.now() - last_inquiry < settings.COMMUNICATOR_RESPONSE_WINDOW] return active_report_ids
def reimbursement(request): messages = Message.objects.filter(direction='I').select_related() by_number = map_reduce(messages, lambda m: [(m.connection.identity, m)], lambda v: sorted(v, key=lambda e: e.date)) reimbursements = map_reduce(ReimbursementLog.objects.all(), lambda e: [(e.phone, e.amount)], sum) def mk_entry(number, messages): entry = { 'number': number, 'disp_number': disp_number(number), 'network': network_for_number(number), 'total_reimbursed': reimbursements.get(number, 0), 'most_recent': messages[-1].date.strftime('%Y-%m-%d %H:%M:%S'), } if not entry['network']: return None cost_per_sms = settings.REIMBURSEMENT_RATES[entry['network']] entry['total_spent'] = cost_per_sms * len(messages) owed = entry['total_spent'] - entry['total_reimbursed'] entry['earliest_unreimbursed'] = None if owed > 0: num_unreimbursed = int(math.ceil(owed / float(cost_per_sms))) entry['earliest_unreimbursed'] = messages[-num_unreimbursed].date.strftime('%Y-%m-%d %H:%M:%S') return entry def sort_key(entry): owed = entry['total_spent'] - entry['total_reimbursed'] if owed > 0: return (False, entry['earliest_unreimbursed']) else: return (True, entry['number']) data = sorted(filter(None, [mk_entry(k, v) for k, v in by_number.iteritems()]), key=sort_key) return render(request, 'dashboard/reimbursement.html', { 'data': json.dumps(data), })