def measles_mini_summary(cls): ps = [] fields = [] tcounter = 0 teligible_cases = 0 tvaccinated_cases = 0 tclinic_cases = 0 clinics = Facility.objects.all() for clinic in clinics: providers = Provider.list_by_clinic(clinic) p = {} eligible_cases = 0 vaccinated_cases = 0 clinic_cases = 0 counter = 0 p["clinic"] = clinic p["num_cases"] = 0 p["eligible_cases"] = 0 p["vaccinated_cases"] = 0 for provider in providers: counter = counter + 1 # p['counter'] = "%d"%counter cases = Case.list_e_4_measles(provider) eligible_cases += cases.count() clinic_cases = clinic_cases + Case.count_by_provider(provider) mcases = ReportMeasles.get_vaccinated(provider) # slow count slowcount = 0 for case in cases: if ReportMeasles.is_vaccinated(case): slowcount += 1 # vaccinated_cases += mcases.count() vaccinated_cases += slowcount # Summary p = {} p["clinic"] = clinic p["counter"] = "" p["num_cases"] = clinic_cases p["eligible_cases"] = eligible_cases p["vaccinated_cases"] = vaccinated_cases ps.append(p) tcounter += counter teligible_cases += eligible_cases tvaccinated_cases += vaccinated_cases tclinic_cases += clinic_cases # caseid +|Y lastname firstname | sex | dob/age | guardian | provider | date p = {} p["clinic"] = "Total:" p["counter"] = "" p["num_cases"] = tclinic_cases p["eligible_cases"] = teligible_cases p["vaccinated_cases"] = tvaccinated_cases ps.append(p) return ps
def measles_summary(cls, duration_start, duration_end, muac_duration_start, clinic_id=None): ps = [] fields = [] counter = 0 eligible_cases = 0 vaccinated_cases = 0 clinic_cases = 0 if clinic_id is not None: providers = Provider.list_by_clinic(clinic_id) for provider in providers: p = {} counter = counter + 1 p["counter"] = "%d" % counter p["provider"] = provider p["num_cases"] = Case.count_by_provider(provider) cases = Case.list_e_4_measles(provider) p["eligible_cases"] = cases.count() eligible_cases += p["eligible_cases"] clinic_cases = clinic_cases + p["num_cases"] # slow count slowcount = 0 for case in cases: if ReportMeasles.is_vaccinated(case): slowcount += 1 mcases = ReportMeasles.get_vaccinated(provider) # p['vaccinated_cases'] = mcases.count() p["vaccinated_cases"] = slowcount p["not_vaccinated_cases"] = p["eligible_cases"] - p["vaccinated_cases"] vaccinated_cases += p["vaccinated_cases"] p["sms_sent"] = int(round(float(float(p["vaccinated_cases"]) / float(p["eligible_cases"])) * 100, 0)) ps.append(p) # ps = sorted(ps) # Summary p = {} p["counter"] = "" p["provider"] = "Summary" p["num_cases"] = clinic_cases p["eligible_cases"] = eligible_cases p["vaccinated_cases"] = vaccinated_cases p["not_vaccinated_cases"] = eligible_cases - vaccinated_cases sms_sent = int(round(float(float(vaccinated_cases) / float(eligible_cases)) * 100, 0)) p["sms_sent"] = sms_sent ps.append(p) # caseid +|Y lastname firstname | sex | dob/age | guardian | provider | date fields.append({"name": "#", "column": None, "bit": "{{ object.counter }}"}) fields.append({"name": "PROVIDER", "column": None, "bit": "{{ object.provider }}"}) fields.append({"name": "TOTAL CASES", "column": None, "bit": "{{ object.num_cases}}"}) fields.append({"name": "# ELIGIBLE CASES", "column": None, "bit": "{{ object.eligible_cases}}"}) fields.append({"name": "# VACCINATED", "column": None, "bit": "{{ object.vaccinated_cases }}"}) fields.append({"name": "# NOT VACCINATED", "column": None, "bit": "{{ object.not_vaccinated_cases }}"}) fields.append({"name": "%", "column": None, "bit": "{{ object.sms_sent }}%"}) return ps, fields
def get_providers_by_clinic(cls, duration_start, duration_end, muac_duration_start, clinic_id=None): ps = [] fields = [] counter = 0 clinic_cases = 0 clinic_mrdt = 0 clinic_muac = 0 clinic_sent = 0 clinic_processed = 0 clinic_refused = 0 if clinic_id is not None: providers = Provider.list_by_clinic(clinic_id) for provider in providers: p = {} counter = counter + 1 p['counter'] = "%d"%counter p['provider'] = provider p['num_cases'] = Case.count_by_provider(provider) p_muac = ReportMalaria.count_by_provider(provider, duration_end, duration_start) p['num_malaria_reports'] = p_muac clinic_mrdt = clinic_mrdt + p_muac num_cases = Case.count_by_provider(provider) clinic_cases = clinic_cases + num_cases num_muac = ReportMalnutrition.count_by_provider(provider, duration_end, muac_duration_start) clinic_muac = clinic_muac + num_muac if num_cases == 0: muac_percentage = 0 else: muac_percentage = round(float(float(num_muac)/float(num_cases))*100, 0) p['num_muac_reports'] = "%d %% (%s/%s)"%(muac_percentage, num_muac, num_cases) sms_sent = MessageLog.count_by_provider(provider, duration_end, duration_start) clinic_sent = clinic_sent + sms_sent p['sms_sent'] = sms_sent sms_processed = MessageLog.count_processed_by_provider(provider, duration_end, duration_start) clinic_processed = clinic_processed + sms_processed p['sms_processed'] = sms_processed sms_refused = MessageLog.count_refused_by_provider(provider, duration_end, duration_start) clinic_refused = clinic_refused + sms_refused p['sms_refused'] = sms_refused if p['sms_sent'] != 0: p['sms_rate'] = int(float(float(p['sms_processed'])/float(p['sms_sent'])*100)) else: p['sms_rate'] = 0 #p['sms_rate'] = "%s%%"%p['sms_rate'] last_activity = MessageLog.days_since_last_activity(provider) if last_activity == "": p['days_since_last_activity'] = "No Activity" else: p['days_since_last_activity'] = "%s days ago"%last_activity ps.append(p) #ps = sorted(ps) # Summary p = {} p['counter'] = "" p['provider'] = "Summary" p['num_cases'] = clinic_cases p['num_malaria_reports'] = clinic_mrdt num_cases = clinic_cases num_muac = clinic_muac if num_cases == 0: muac_percentage = 0 else: muac_percentage = round(float(float(num_muac)/float(num_cases))*100, 0) p['num_muac_reports'] = "%d %% (%s/%s)"%(muac_percentage, num_muac, num_cases) p['sms_sent'] = clinic_sent p['sms_processed'] = clinic_processed p['sms_refused'] = clinic_refused if p['sms_sent'] != 0: p['sms_rate'] = int(float(float(p['sms_processed'])/float(p['sms_sent'])*100)) else: p['sms_rate'] = 0 #p['sms_rate'] = "%s%%"%p['sms_rate'] p['days_since_last_activity'] = "" ps.append(p) # caseid +|Y lastname firstname | sex | dob/age | guardian | provider | date fields.append({"name": '#', "column": None, "bit": "{{ object.counter }}" }) fields.append({"name": 'PROVIDER', "column": None, "bit": "{{ object.provider }}" }) fields.append({"name": 'NUMBER OF CASES', "column": None, "bit": "{{ object.num_cases}}" }) fields.append({"name": 'MRDT', "column": None, "bit": "{{ object.num_malaria_reports }}" }) fields.append({"name": 'MUAC', "column": None, "bit": "{{ object.num_muac_reports }}" }) fields.append({"name": 'RATE', "column": None, "bit": "{{ object.sms_rate }}% ({{ object.sms_processed }}/{{ object.sms_sent }})" }) fields.append({"name": 'LAST ACTVITY', "column": None, "bit": "{{ object.days_since_last_activity }}" }) return ps, fields
def measles_by_provider(cls, provider_id=None): qs = [] fields = [] counter = 0 if provider_id is not None: provider = Provider.objects.get(id=provider_id) cases = Case.list_e_4_measles(provider) for case in cases: q = {} q["case"] = case counter = counter + 1 q["counter"] = "%d" % counter try: muacc = ReportMalnutrition.objects.filter(case=case).latest() # q['malnut'] = u"%(diag)s on %(date)s" % {'diag': muacc.diagnosis_msg(), 'date': muacc.entered_at.strftime("%Y-%m-%d")} q["malnut_muac"] = "%s (%smm)" % (muacc.get_status_display(), muacc.muac) q["malnut_symptoms"] = muacc.symptoms() q["malnut_days_since_last_update"] = muacc.days_since_last_activity() except ObjectDoesNotExist: q["malnut_muac"] = "" q["malnut_symptoms"] = "" q["malnut_days_since_last_update"] = "" try: orsc = ReportDiarrhea.objects.filter(case=case).latest() q["diarrhea"] = u"%(diag)s on %(date)s" % { "diag": orsc.diagnosis_msg(), "date": orsc.entered_at.strftime("%Y-%m-%d"), } except ObjectDoesNotExist: q["diarrhea"] = None try: twoweeksago = date.today() - timedelta(14) mrdtc = ReportMalaria.objects.filter(case=case, entered_at__gte=twoweeksago).latest() mrdtcd = mrdtc.get_dictionary() # q['malaria'] = u"result:%(res)s bednet:%(bed)s obs:%(obs)s on %(date)s" % {'res': mrdtcd['result_text'], 'bed': mrdtcd['bednet_text'], 'obs': mrdtcd['observed'], 'date': mrdtc.entered_at.strftime("%Y-%m-%d")} q["malaria_result"] = mrdtc.results_for_malaria_result() q["malaria_bednet"] = mrdtc.results_for_malaria_bednet() except ObjectDoesNotExist: q["malaria_result"] = "" q["malaria_bednet"] = "" num_of_malaria_cases = ReportMalaria.num_reports_by_case(case) if num_of_malaria_cases is not None and num_of_malaria_cases > 1: q["malaria_result"] = q["malaria_result"] + "(%sX)" % num_of_malaria_cases last_mrdt = ReportMalaria.days_since_last_mrdt(case) if last_mrdt is not "" and last_mrdt < 15: q["malaria_result"] = q["malaria_result"] + " %s days ago" % last_mrdt try: dc = ReportDiagnosis.objects.filter(case=case).latest("entered_at") dcd = dc.get_dictionary() q["diagnosis"] = u"diag:%(diag)s labs:%(lab)s on %(date)s" % { "diag": dcd["diagnosis"], "lab": dcd["labs_text"], "date": dc.entered_at.strftime("%Y-%m-%d"), } except ObjectDoesNotExist: q["diagnosis"] = None q["vaccinated"] = ReportMeasles.is_vaccinated(case) if q["vaccinated"]: q["sent"] = u"Yes" q["vaccinated"] = u"Yes" else: q["vaccinated"] = u"No" q["sent"] = u"No" qs.append(q) # caseid +|Y lastname firstname | sex | dob/age | guardian | provider | date fields.append({"name": "#", "column": None, "bit": "{{ object.case.zone }}"}) fields.append({"name": "PID#", "column": None, "bit": "{{ object.case.ref_id }}"}) fields.append( {"name": "NAME", "column": None, "bit": "{{ object.case.last_name }} {{ object.case.first_name }}"} ) fields.append({"name": "SEX", "column": None, "bit": "{{ object.case.gender }}"}) fields.append({"name": "AGE", "column": None, "bit": "{{ object.case.age }}"}) fields.append({"name": "VACCINATED?", "column": None, "bit": "{{ object.vaccinated }}"}) fields.append({"name": "SENT?", "column": None, "bit": "{{ object.sent }}"}) return qs, fields
def report_birth(self, message, last, first, gender, dob, weight,where, guardian, complications=""): if len(dob) != 6: # There have been cases where a date like 30903 have been sent and # when saved it gives some date that is way off raise HandlerFailed(_("Date must be in the format ddmmyy: %s") % dob) else: dob = re.sub(r'\D', '', dob) try: dob = time.strptime(dob, "%d%m%y") except ValueError: try: dob = time.strptime(dob, "%d%m%Y") except ValueError: raise HandlerFailed(_("Couldn't understand date: %s") % dob) dob = datetime.date(*dob[:3]) reporter = message.persistant_connection.reporter location = None if not location: if reporter.location: location = reporter.location info = { "first_name" : first.title(), "last_name" : last.title(), "gender" : gender.upper(), "dob" : dob, "guardian" : guardian.title(), "mobile" : "", "reporter" : reporter, "location" : location } abirth = ReportBirth(where=where.upper()) #Perform Location checks if abirth.get_where() is None: raise HandlerFailed(_("Location `%s` is not known. Please try again with a known location") % where) iscase = Case.objects.filter(first_name=info['first_name'], last_name=info['last_name'], reporter=info['reporter'], dob=info['dob']) if iscase: info["PID"] = iscase[0].ref_id self.info(iscase[0].id) self.info(info) #message.respond(_( #"%(last_name)s, %(first_name)s (+%(PID)s) has already been registered by %(provider)s.") % info) # TODO: log this message case = iscase[0] else: case = Case(**info) case.save() log(case, "patient_created") info.update({ "id": case.ref_id, "last_name": last.upper(), "age": case.age(), "dob": dob.strftime("%d/%m/%y") }) info2 = { "case":case, "weight": weight, "where": where, "reporter": reporter, "complications": complications } #check if birth has already been reported rbirth = ReportBirth.objects.filter(case=case) if rbirth: raise HandlerFailed(_( "The birth of %(last_name)s, %(first_name)s (+%(PID)s) has already been reported by %(reporter)s.") % info) abirth = ReportBirth(**info2) abirth.save() info.update({"where":abirth.get_where()}) message.respond(_( "Birth +%(id)s: %(last_name)s, %(first_name)s %(gender)s/%(dob)s " + "(%(guardian)s) %(location)s at %(where)s") % info) return True