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
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()
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