def submission_or_completion_time(self): time = iso_string_to_datetime(safe_index(self.form, self.report.time_field.split('.'))) if self.report.by_submission_time: user_time = ServerTime(time).user_time(self.report.timezone) else: user_time = PhoneTime(time, self.report.timezone).user_time(self.report.timezone) return user_time.ui_string(USER_DATETIME_FORMAT_WITH_SEC)
def rows(self): def form_data_link(instance_id): return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": absolute_reverse('render_form_data', args=[self.domain, instance_id]), "text": _("View Form") } submissions = [res['_source'] for res in self.es_results.get('hits', {}).get('hits', [])] for form in submissions: uid = form["form"]["meta"]["userID"] username = form["form"]["meta"].get("username") try: if username not in ['demo_user', 'admin']: full_name = get_cached_property(CouchUser, uid, 'full_name', expiry=7*24*60*60) name = '"%s"' % full_name if full_name else "" else: name = "" except (ResourceNotFound, IncompatibleDocument): name = "<b>[unregistered]</b>" init_cells = [ form_data_link(form["_id"]), (username or _('No data for username')) + (" %s" % name if name else ""), DateTimeProperty().wrap(safe_index(form, self.time_field.split('.'))).strftime("%Y-%m-%d %H:%M:%S"), xmlns_to_name(self.domain, form.get("xmlns"), app_id=form.get("app_id")), ] def cell(field): return form["form"].get(field) init_cells.extend([cell(field) for field in self.other_fields]) yield init_cells
def rows(self): def form_data_link(instance_id): return "<a class='ajax_dialog' target='_new' href='%(url)s'>%(text)s</a>" % { "url": absolute_reverse('render_form_data', args=[self.domain, instance_id]), "text": _("View Form") } submissions = [ res['_source'] for res in self.es_results.get('hits', {}).get('hits', []) ] for form in submissions: uid = form["form"]["meta"]["userID"] username = form["form"]["meta"].get("username") try: if username not in ['demo_user', 'admin']: full_name = get_cached_property(CouchUser, uid, 'full_name', expiry=7 * 24 * 60 * 60) name = '"%s"' % full_name if full_name else "" else: name = "" except (ResourceNotFound, IncompatibleDocument): name = "<b>[unregistered]</b>" time = iso_string_to_datetime( safe_index(form, self.time_field.split('.'))) if self.by_submission_time: user_time = ServerTime(time).user_time(self.timezone) else: user_time = PhoneTime(time, self.timezone).user_time(self.timezone) init_cells = [ form_data_link(form["_id"]), (username or _('No data for username')) + (" %s" % name if name else ""), user_time.ui_string(USER_DATETIME_FORMAT_WITH_SEC), xmlns_to_name(self.domain, form.get("xmlns"), app_id=form.get("app_id")), ] def cell(field): return form["form"].get(field) init_cells.extend([cell(field) for field in self.other_fields]) yield init_cells
def from_bhoma_case(cls, case): if not case.patient: logging.warning("No patient found found inside %s, will not be downloaded to phone" % case) return None # complicated logic, but basically a case is open based on the conditions # below which amount to it not being closed, and if it has a start date, # that start date being before or up to today open_inner_cases = [cinner for cinner in case.commcare_cases if not cinner.closed] if len(open_inner_cases) == 0: logging.warning("No open case found inside %s, will not be downloaded to phone" % case) return None elif len(open_inner_cases) > 1: logging.warning("More than one open case found inside %s. Only the most recent will not be downloaded to phone" % case) ccase = sorted(open_inner_cases, key=lambda case: case.opened_on)[0] else: ccase = open_inner_cases[0] return PhoneCase(**{"case_id": ccase._id, "date_modified": case.modified_on, "case_type_id": const.CASE_TYPE_BHOMA_FOLLOWUP, "user_id": ccase.user_id, "case_name": ccase.name, "external_id": ccase.external_id, "patient_id": case.patient.get_id, "patient_rev": case.patient.get_rev, "first_name": case.patient.first_name, "last_name": case.patient.last_name, "birth_date": case.patient.birthdate, "birth_date_est": case.patient.birthdate_estimated, "age": case.patient.formatted_age, "sex": case.patient.gender, "village": ', '.join(filter(lambda s: s, [case.patient.address.address, case.patient.address.village])), "contact": case.patient.default_phone, "bhoma_case_id": case.get_id, # TODO: remove? duplicate with external_id "bhoma_patient_id": case.patient.get_id, "followup_type": phonehacks.followup_type_transform(ccase.followup_type), # (post-hospital, missed appt, chw followup, etc.) "orig_visit_type": phonehacks.original_visit_type_transform(case.get_encounter().type), # (general, under-5, etc.) "orig_visit_diagnosis": case.type, "orig_visit_date": case.get_encounter().visit_date, "activation_date": ccase.activation_date, "due_date": ccase.due_date, "missed_appt_date": safe_index(ccase, ["missed_appointment_date",]), "start_date": ccase.start_date, "ltfu_date": case.ltfu_date, "visit_number": ccase.visit_number, })
def rows(self): def form_data_link(instance_id): return "<a class='ajax_dialog' href='%(url)s'>%(text)s</a>" % { "url": reverse('render_form_data', args=[self.domain, instance_id]), "text": _("View Form") } submissions = [ res['_source'] for res in self.es_results.get('hits', {}).get('hits', []) ] for form in submissions: uid = form["form"]["meta"]["userID"] username = form["form"]["meta"].get("username") try: if username not in ['demo_user', 'admin']: full_name = get_cached_property(CouchUser, uid, 'full_name', expiry=7 * 24 * 60 * 60) name = '"%s"' % full_name if full_name else "" else: name = "" except (ResourceNotFound, IncompatibleDocument): name = "<b>[unregistered]</b>" init_cells = [ form_data_link(form["_id"]), (username or _('No data for username')) + (" %s" % name if name else ""), DateTimeProperty().wrap( safe_index(form, self.time_field.split('.'))).strftime( "%Y-%m-%d %H:%M:%S"), xmlns_to_name(self.domain, form.get("xmlns"), app_id=form.get("app_id")), ] def cell(field): return form["form"].get(field) init_cells.extend([cell(field) for field in self.other_fields]) yield init_cells
def not_on_haart(visit_data): haart = safe_index(visit_data, ["on_haart"]) if haart is not None: return haart == "n" return False
def get_hiv_result(healthy_visit): hiv = safe_index(healthy_visit, ["hiv_result"]) if hiv: return hiv return None
def xpath(self, path): """ Evaluates an xpath expression like: path/to/node and returns the value of that element, or None if there is no value. """ return safe_index(self, path.split("/"))