Exemple #1
0
    def activity_summary(self, message, period=None):
        '''Get a reporters activity summary'''
        reporter = message.persistant_connection.reporter
        duration_end = datetime.datetime.now()
        if period is None or period.lower() == "all":
            ml = MessageLog.objects.filter(sent_by=reporter)\
                    .order_by('created_at')
            if ml:
                duration_start = ml[0].created_at
        elif period.lower() == "month":
            last_30_days = datetime.timedelta(30)
            duration_start = duration_end - last_30_days
        elif period.lower() == "week":
            last_seven_days = datetime.timedelta(7)
            duration_start = duration_end - last_seven_days
        elif period.lower() == "day":
            duration_start = day_start(datetime.datetime.today())
        else:
            duration_start = None
            msg = "No Summary"

        if duration_start is not None:
            summary = ReportCHWStatus.reporter_summary(duration_start, \
                                                duration_end, reporter)

            msg = _("%(reporter)s: %(num_cases)s children, "\
                "#new %(num_new_cases)s, #dead %(num_dead)s, "\
                "#inactive %(num_cases_inactive)s" \
                ", #mrdt %(num_malaria_reports)s, #muac %(num_muac)s. ")\
                 % summary

        message.respond(_("%s") % msg)
        return True
Exemple #2
0
def malnut(request, object_id=None, per_page="0", rformat="pdf"):
    '''List @Risk Malnutrition Cases per clinic '''
    pdfrpt = PDFReport()

    fourteen_days = timedelta(days=30)
    today = datetime.now()

    duration_start = day_start(today - fourteen_days)
    duration_end = today

    pdfrpt.setTitle(_("%(app_name)s: @Risk Malnutrition Cases from"\
                     " %(start_date)s to %(end_date)s"\
                     % {'start_date': duration_start.date(),
                        'end_date': duration_end.date(),
                        'app_name': Cfg.get("app_name")}))
    #pdfrpt.setRowsPerPage(66)
    pdfrpt.setNumOfColumns(2)
    pdfrpt.setLandscape(True)

    if object_id is None and not request.POST:
        clinics = Location.objects.filter(type__name="Clinic")
        for clinic in clinics:
            queryset, fields = \
                ReportAllPatients.malnutrition_at_risk(duration_start, \
                                                       duration_end, clinic)
            c = clinic
            subtitle = _("%(clinic)s: @Risk Malnutrition Cases from "\
                "%(start_date)s to %(end_date)s" % \
                {'clinic': c.name, 'start_date': duration_start.date(), \
                 'end_date': duration_end.date()})
            pdfrpt.setTableData(queryset, fields, subtitle, \
                        [0.2 * inch, 0.4 * inch, 1 * inch, 0.3 * inch, \
                         .3 * inch, .8 * inch, .5 * inch, .2 * inch, \
                         0.5 * inch, 0.8 * inch, 1 * inch])
            if (int(per_page) == 1) is True:
                pdfrpt.setPageBreak()
                pdfrpt.setFilename("/tmp/malnutrition_at_risk")
    else:
        if request.POST['clinic']:
            object_id = request.POST['clinic']
            object_id = Location.objects.get(id=object_id)
        queryset, fields = \
            ReportAllPatients.malnutrition_at_risk(duration_start, \
                                                   duration_end, object_id)

        subtitle = _("%(clinic)s: @Risk Malnutrition Cases from "\
                "%(start_date)s to %(end_date)s" % \
                {'clinic': object_id.name, \
                 'start_date': duration_start.date(), \
                 'end_date': duration_end.date()})
        pdfrpt.setTableData(queryset, fields, subtitle, \
                        [0.2 * inch, 0.4 * inch, 1 * inch, 0.3 * inch, \
                         .3 * inch, .8 * inch, .5 * inch, .2 * inch, \
                         0.5 * inch, 0.8 * inch, 1 * inch])
        pdfrpt.setFilename("/tmp/malnutrition_at_risk")

    return pdfrpt.render()
Exemple #3
0
def report_monitoring_csv(request, object_id, file_name):
    '''Generate a monthly monitoring report in csv format

    object_id - a date string e.g 112009 - November, 2009
    file_name - csv filename

    return csv stream
    '''
    output = StringIO.StringIO()
    csvio = csv.writer(output)
    header = False

    # parse parameter
    month = datetime(int(object_id[2:6]), int(object_id[:2]), 1)

    # Header Line (days of month)
    eom = month_end(month)
    days = range(-1, eom.day + 1)
    days.remove(0)
    # store that good list
    gdays = days
    csvio.writerow([d.__str__().replace("-1", \
                            month.strftime("%B")) for d in days])

    # Initialize Rows
    sms_num = ["# SMS Sent"]
    sms_process = ["Processed"]
    sms_refused = ["Refused"]

    chw_tot = ["Total CHWs in System"]
    chw_reg = ["New CHWs Registered"]
    chw_reg_err = ["Failed Registration"]

    chw_on = ["Active CHWS"]

    patient_reg = ["New Patients Registered"]
    patient_reg_err = ["Registration Failed"]

    malaria_tot = ["Total Malaria Reports"]
    malaria_err = ["Malaria Reports (Failed)"]

    malaria_pos = ["Malaria Tests Positive"]
    bednet_y_pos = ["Bednet Yes"]
    bednet_n_pos = ["Bednet No"]
    malaria_neg = ["Malaria Tests False"]
    bednet_y_neg = ["Bednet Yes"]
    bednet_n_neg = ["Bednet No"]

    malnut_tot = ["Total Malnutrition Reports"]
    malnut_err = ["Malnutrition Reports (Failed)"]

    samp_tot = ["Total SAM+"]
    sam_tot = ["Total SAM"]
    mam_tot = ["Total MAM"]

    samp_new = ["New SAM+"]
    sam_new = ["New SAM"]
    mam_new = ["New MAM"]

    user_msg = ["User Messaging"]

    blank = []

    # List all rows
    rows = [blank, sms_num, sms_process, sms_refused, blank, chw_tot, \
               chw_reg, chw_reg_err, blank, \
               chw_on, blank, patient_reg, patient_reg_err, blank, \
               malaria_tot, malaria_err, blank, malaria_pos, bednet_y_pos, \
               bednet_n_pos, malaria_neg, bednet_y_neg, bednet_n_neg, blank, \
               malnut_tot, malnut_err, blank, samp_tot, sam_tot, mam_tot, \
               blank, samp_new, sam_new, mam_new, blank, user_msg]

    # Loop on days
    for d in gdays:
        if d == -1:
            continue
        ref_date = datetime(month.year, month.month, d)
        morning = day_start(ref_date)
        evening = day_end(ref_date)

        # Number of SMS Sent
        sms_num.append(MessageLog.objects.filter(created_at__gte=morning, \
                                        created_at__lte=evening).count())

        # Number of SMS Processed
        sms_process.append(MessageLog.objects.filter(created_at__gte=morning, \
                        created_at__lte=evening, was_handled=True).count())

        # Number of SMS Refused
        sms_refused.append(MessageLog.objects.filter(created_at__gte=morning, \
                        created_at__lte=evening, was_handled=False).count())

        # Total # of CHW in System
        chwrole = Role.objects.get(code="chw")
        chw_tot.append(Reporter.objects.filter(role=chwrole).count())

        # New Registered CHW
        #chw_reg.append(Provider.objects.filter(role=Provider.CHW_ROLE, \
        #user__in=User.objects.filter(date_joined__gte=morning, \
        #date_joined__lte=evening)).count())
        chw_reg.append(0)
        # Failed CHW Registration
        chw_reg_err.append(EventLog.objects.filter(created_at__gte=morning, \
            created_at__lte=evening, message="provider_registered").count() - \
            EventLog.objects.filter(created_at__gte=morning, \
            created_at__lte=evening, message="confirmed_join").count())

        # Active CHWs
        a = Case.objects.filter(created_at__gte=morning, \
                                created_at__lte=evening)
        a.query.group_by = ['childcount_case.reporter_id']
        chw_on.append(a.__len__())

        # New Patient Registered
        patient_reg.append(EventLog.objects.filter(created_at__gte=morning, \
                created_at__lte=evening, message="patient_created").count())

        # Failed Patient Registration
        patient_reg_err.append(MessageLog.objects.filter(\
                created_at__gte=morning, created_at__lte=evening, \
                text__istartswith="new").count() + \
                MessageLog.objects.filter(created_at__gte=morning, \
                created_at__lte=evening, text__istartswith="birth").\
                count() - patient_reg[-1])

        # Total Malaria Reports
        malaria_tot.append(EventLog.objects.filter(created_at__gte=morning, \
                created_at__lte=evening, message="mrdt_taken").count())

        # Failed Malaria Reports
        malaria_err.append(MessageLog.objects.filter(created_at__gte=morning, \
            created_at__lte=evening, text__istartswith="mrdt").count() - \
            malaria_tot[-1])

        # Malaria Test Positive
        malaria_pos.append(ReportMalaria.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, \
             result=True).count())

        # Malaria Positive with Bednets
        bednet_y_pos.append(ReportMalaria.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, result=True, \
             bednet=True).count())

        # Malaria Positive without Bednets
        bednet_n_pos.append(ReportMalaria.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, result=True, \
             bednet=False).count())

        # Malaria Test Negative
        malaria_neg.append(ReportMalaria.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, \
             result=False).count())

        # Malaria Negative with Bednets
        bednet_y_neg.append(ReportMalaria.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, \
            result=False, bednet=True).count())

        # Malaria Negative without Bednets
        bednet_n_neg.append(ReportMalaria.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, \
            result=False, bednet=False).count())

        # Total Malnutrition Reports
        malnut_tot.append(EventLog.objects.filter(created_at__gte=morning, \
                    created_at__lte=evening, message="muac_taken").count())

        # Failed Malnutrition Reports
        malnut_err.append(MessageLog.objects.filter(created_at__gte=morning, \
            created_at__lte=evening, text__istartswith="muac").count() - \
            malnut_tot[-1])

        # Total SAM+
        samp_tot.append(ReportMalnutrition.objects.filter(\
            entered_at__lte=evening, \
             status=ReportMalnutrition.SEVERE_COMP_STATUS).count())

        # Total SAM
        sam_tot.append(ReportMalnutrition.objects.filter(\
            entered_at__lte=evening, \
             status=ReportMalnutrition.SEVERE_STATUS).count())

        # Total MAM
        mam_tot.append(ReportMalnutrition.objects.filter(\
            entered_at__lte=evening, \
             status=ReportMalnutrition.MODERATE_STATUS).count())

        # New SAM+
        samp_new.append(ReportMalnutrition.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, \
             status=ReportMalnutrition.SEVERE_COMP_STATUS).count())

        # New SAM
        sam_new.append(ReportMalnutrition.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, \
             status=ReportMalnutrition.SEVERE_STATUS).count())

        # New MAM
        mam_new.append(ReportMalnutrition.objects.filter(\
            entered_at__gte=morning, entered_at__lte=evening, \
             status=ReportMalnutrition.MODERATE_STATUS).count())

        # User Messaging
        user_msg.append(MessageLog.objects.filter(created_at__gte=morning, \
                created_at__lte=evening, text__startswith="@").count())

    # Write rows on CSV
    for row in rows:
        csvio.writerow([cell for cell in row])

    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = "attachment; filename=%s" % file_name
    response.write(output.getvalue())
    return response