Example #1
0
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
Example #2
0
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),
        })