def generate_lineage(self, leaf_type, leaf_item_id): leaf_fdi = FixtureDataItem.get(leaf_item_id) index = None for i, h in enumerate(self.hierarchy[::-1]): if h["type"] == leaf_type: index = i if index is None: raise Exception( "Could not generate lineage for AsyncDrillableFilter due to a nonexistent leaf_type (%s)" % leaf_type) lineage = [leaf_fdi] for i, h in enumerate(self.full_hierarchy[::-1]): if i < index or i >= len(self.hierarchy) - 1: continue real_index = len(self.hierarchy) - (i + 1) lineage.insert( 0, FixtureDataItem.by_field_value( self.domain, self.data_types(real_index - 1), h["references"], lineage[0].fields_without_attributes[h["parent_ref"]] ).one()) return lineage
def filter_context(self): root_fdis = [self.fdi_to_json(f) for f in FixtureDataItem.by_data_type(self.domain, self.data_types(0).get_id)] f_id = self.request.GET.get("fixture_id", None) selected_fdi_type = f_id.split(":")[0] if f_id else None selected_fdi_id = f_id.split(":")[1] if f_id else None if selected_fdi_id: index = 0 lineage = self.generate_lineage(selected_fdi_type, selected_fdi_id) parent = {"children": root_fdis} for i, fdi in enumerate(lineage[:-1]): this_fdi = [f for f in parent["children"] if f["id"] == fdi.get_id][0] next_h = self.hierarchy[i + 1] this_fdi["children"] = [ self.fdi_to_json(f) for f in FixtureDataItem.by_field_value( self.domain, self.data_types(i + 1), next_h["parent_ref"], fdi.fields[next_h["references"]] ) ] parent = this_fdi return { "api_root": self.api_root, "control_name": self.label, "control_slug": self.slug, "selected_fdi_id": selected_fdi_id, "fdis": json.dumps(root_fdis), "hierarchy": self.full_hierarchy, }
def filter_context(self): root_fdis = [self.fdi_to_json(f) for f in FixtureDataItem.by_data_type(self.domain, self.data_types(0).get_id)] f_id = self.request.GET.get('fixture_id', None) selected_fdi_type = f_id.split(':')[0] if f_id else None selected_fdi_id = f_id.split(':')[1] if f_id else None if selected_fdi_id: index = 0 lineage = self.generate_lineage(selected_fdi_type, selected_fdi_id) parent = {'children': root_fdis} for i, fdi in enumerate(lineage[:-1]): this_fdi = [f for f in parent['children'] if f['id'] == fdi.get_id][0] next_h = self.hierarchy[i+1] this_fdi['children'] = [self.fdi_to_json(f) for f in FixtureDataItem.by_field_value(self.domain, self.data_types(i+1), next_h["parent_ref"], fdi.fields_without_attributes[next_h["references"]])] parent = this_fdi return { 'api_root': self.api_root, 'control_name': self.label, 'control_slug': self.slug, 'selected_fdi_id': selected_fdi_id, 'fdis': json.dumps(root_fdis), 'hierarchy': self.full_hierarchy }
def drilldown_map(self): diseases = [] disease_fixtures = FixtureDataItem.by_data_type( self.domain, FixtureDataType.by_domain_tag(self.domain, "diseases").one() ) for d in disease_fixtures: disease = dict( val="%(name)s:%(uid)s" % {'name': d.fields_without_attributes["disease_id"], 'uid': d.get_id}, text=d.fields_without_attributes["disease_name"] ) tests = [] test_fixtures = FixtureDataItem.by_field_value( self.domain, FixtureDataType.by_domain_tag(self.domain, "test").one(), "disease_id", d.fields_without_attributes["disease_id"] ) for t in test_fixtures: tests.append(dict( val="%(name)s:%(uid)s" % {'name': t.fields_without_attributes["test_name"], 'uid': t.get_id}, text=t.fields_without_attributes["visible_test_name"]) ) disease['next'] = tests diseases.append(disease) return diseases
def generate_lineage(self, leaf_type, leaf_item_id): leaf_fdi = FixtureDataItem.get(leaf_item_id) index = None for i, h in enumerate(self.hierarchy[::-1]): if h["type"] == leaf_type: index = i if index is None: raise Exception( "Could not generate lineage for AsyncDrillableFilter due to a nonexistent leaf_type (%s)" % leaf_type) lineage = [leaf_fdi] for i, h in enumerate(self.full_hierarchy[::-1]): if i < index or i >= len(self.hierarchy) - 1: continue real_index = len(self.hierarchy) - (i + 1) lineage.insert( 0, FixtureDataItem.by_field_value( self.domain, self.data_types(real_index - 1), h["references"], lineage[0].fields_without_attributes[ h["parent_ref"]]).one()) return lineage
def province(self): case = self.care_case fixture_type = FixtureDataType.by_domain_tag("care-ihapc-live", "province").first() fixture_item = FixtureDataItem.by_field_value("care-ihapc-live", fixture_type, "id", case.province).first() return fixture_item._id
def _generic_message_bank_content(fixture_name, reminder, handler, recipient): domain = reminder.domain message_bank = FixtureDataType.by_domain_tag(domain, fixture_name).first() if not message_bank: message = "Lookup Table {} not found in {}".format( fixture_name, domain) notify_dimagi_project_admins(domain, message=message) return None fields = message_bank.fields_without_attributes if any(field not in fields for field in REQUIRED_FIXTURE_FIELDS): message = "{} in {} must have {}".format( fixture_name, domain, ','.join(REQUIRED_FIXTURE_FIELDS)) notify_dimagi_project_admins(domain, message=message) return None if not is_commcarecase(recipient): recipient_id = getattr(recipient, '_id') if hasattr( recipient, '_id') else 'id_unknown' message = "recipient {} must be a case in domain {}".format( recipient_id, domain) notify_dimagi_project_admins(domain, message=message) return None try: risk_profile = recipient.dynamic_case_properties()[RISK_PROFILE_FIELD] except KeyError: message = "case {} does not include risk_profile".format( recipient.case_id) notify_dimagi_project_admins(domain, message=message) return None current_message_seq_num = str(( (reminder.schedule_iteration_num - 1) * len(handler.events)) + reminder.current_event_sequence_num + 1) custom_messages = FixtureDataItem.by_field_value(domain, message_bank, RISK_PROFILE_FIELD, risk_profile) custom_messages = [ m for m in custom_messages if m.fields_without_attributes['sequence'] == current_message_seq_num ] if len(custom_messages) != 1: if not custom_messages: message = "No message for case {}, risk {}, seq {} in domain {} in fixture {}" else: message = "Multiple messages for case {}, risk {}, seq {} in domain {} in fixture {}" message = message.format(recipient.case_id, risk_profile, current_message_seq_num, domain, fixture_name) notify_dimagi_project_admins(domain, message=message) return None return custom_messages[0].fields_without_attributes['message']
def lookup_province_id_from_form_id(form_id): case = CommCareCase.get_by_xform_id(form_id).first() fixture_type = FixtureDataType.by_domain_tag('care-ihapc-live', 'province').first() fixture_item = FixtureDataItem.by_field_value( 'care-ihapc-live', fixture_type, 'id', case.province ).first() return fixture_item.get_id
def _get_message_bank_content(fixture_name, domain, schedule_iteration_num, current_event_num, num_events, recipient): message_bank = FixtureDataType.by_domain_tag(domain, fixture_name).first() if not message_bank: message = "Lookup Table {} not found in {}".format(fixture_name, domain) notify_dimagi_project_admins(domain, message=message) return None fields = message_bank.fields_without_attributes if any(field not in fields for field in REQUIRED_FIXTURE_FIELDS): message = "{} in {} must have {}".format( fixture_name, domain, ','.join(REQUIRED_FIXTURE_FIELDS) ) notify_dimagi_project_admins(domain, message=message) return None if not is_commcarecase(recipient): recipient_id = getattr(recipient, '_id') if hasattr(recipient, '_id') else 'id_unknown' message = "recipient {} must be a case in domain {}".format(recipient_id, domain) notify_dimagi_project_admins(domain, message=message) return None try: risk_profile = recipient.dynamic_case_properties()[RISK_PROFILE_FIELD] except KeyError: message = "case {} does not include risk_profile".format(recipient.case_id) notify_dimagi_project_admins(domain, message=message) return None current_message_seq_num = str( ((schedule_iteration_num - 1) * num_events) + current_event_num + 1 ) custom_messages = FixtureDataItem.by_field_value( domain, message_bank, RISK_PROFILE_FIELD, risk_profile ) custom_messages = [m for m in custom_messages if m.fields_without_attributes['sequence'] == current_message_seq_num] if len(custom_messages) != 1: if not custom_messages: message = "No message for case {}, risk {}, seq {} in domain {} in fixture {}" else: message = "Multiple messages for case {}, risk {}, seq {} in domain {} in fixture {}" message = message.format(recipient.case_id, risk_profile, current_message_seq_num, domain, fixture_name) notify_dimagi_project_admins(domain, message=message) return None return custom_messages[0].fields_without_attributes['message']
def province(self): case = self.care_case fixture_type = FixtureDataType.by_domain_tag('care-ihapc-live', 'province').first() fixture_item = FixtureDataItem.by_field_value( 'care-ihapc-live', fixture_type, 'id', case.province ).first() return fixture_item._id
def generate_lineage(self, leaf_type, leaf_item_id): leaf_fdi = FixtureDataItem.get(leaf_item_id) for i, h in enumerate(self.hierarchy[::-1]): if h["type"] == leaf_type: index = i lineage = [leaf_fdi] for i, h in enumerate(self.full_hierarchy[::-1]): if i < index or i >= len(self.hierarchy)-1: continue real_index = len(self.hierarchy) - (i+1) lineage.insert(0, FixtureDataItem.by_field_value(self.domain, self.data_types(real_index - 1), h["references"], lineage[0].fields[h["parent_ref"]]).one()) return lineage
def selected_tests(self): disease = self.request.GET.get("test_type_disease", "") test = self.request.GET.get("test_type_test", "") disease = disease.split(":") if disease else None test = test.split(":") if test else None if test: return [test[0]] elif disease: test_fixtures = FixtureDataItem.by_field_value( self.domain, FixtureDataType.by_domain_tag(self.domain, "test").one(), "disease_id", disease[0] ) return [t.fields["test_name"] for t in test_fixtures] else: return self.test_types
def selected_tests(self): disease = self.request.GET.get('test_type_disease', '') test = self.request.GET.get('test_type_test', '') disease = disease.split(':') if disease else None test = test.split(':') if test else None if test: return [test[0]] elif disease: test_fixtures = FixtureDataItem.by_field_value( self.domain, FixtureDataType.by_domain_tag(self.domain, "test").one(), "disease_id", disease[0]) return [ t.fields_without_attributes["test_name"] for t in test_fixtures ] else: return self.test_types
def obj_get_list(self, bundle, **kwargs): domain = kwargs['domain'] parent_id = bundle.request.GET.get("parent_id", None) parent_ref_name = bundle.request.GET.get("parent_ref_name", None) references = bundle.request.GET.get("references", None) child_type = bundle.request.GET.get("child_type", None) type_id = bundle.request.GET.get("fixture_type_id", None) type_tag = bundle.request.GET.get("fixture_type", None) if parent_id and parent_ref_name and child_type and references: parent_fdi = FixtureDataItem.get(parent_id) fdis = list(FixtureDataItem.by_field_value(domain, child_type, parent_ref_name, parent_fdi.fields_without_attributes[references])) elif type_id or type_tag: type_id = type_id or FixtureDataType.by_domain_tag(domain, type_tag).one() fdis = list(FixtureDataItem.by_data_type(domain, type_id)) else: fdis = list(FixtureDataItem.by_domain(domain)) return [convert_fdt(fdi) for fdi in fdis] or []
def obj_get_list(self, bundle, **kwargs): domain = kwargs['domain'] parent_id = bundle.request.GET.get("parent_id", None) parent_ref_name = bundle.request.GET.get("parent_ref_name", None) references = bundle.request.GET.get("references", None) child_type = bundle.request.GET.get("child_type", None) type_id = bundle.request.GET.get("fixture_type_id", None) type_tag = bundle.request.GET.get("fixture_type", None) if parent_id and parent_ref_name and child_type and references: parent_fdi = FixtureDataItem.get(parent_id) fdis = list( FixtureDataItem.by_field_value( domain, child_type, parent_ref_name, parent_fdi.fields_without_attributes[references])) elif type_id or type_tag: type_id = type_id or FixtureDataType.by_domain_tag( domain, type_tag).one() fdis = list(FixtureDataItem.by_data_type(domain, type_id)) else: fdis = list(FixtureDataItem.by_domain(domain)) return [convert_fdt(fdi) for fdi in fdis] or []
def test_get_item_by_field_value(self): self.assertEqual( FixtureDataItem.by_field_value(self.domain, self.data_type, 'state_name', 'Delhi_state').one().get_id, self.data_item.get_id )
def get_village(req, id): village_fdt = get_village_fdt(req.domain) return FixtureDataItem.by_field_value(req.domain, village_fdt, 'id', float(id)).one()
def get_village(self, id): village_fdt = self.get_village_fdt(self.domain) return FixtureDataItem.by_field_value(self.domain, village_fdt, 'id', float(id)).one()