示例#1
0
    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
示例#2
0
    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,
        }
示例#3
0
    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
        }
示例#4
0
    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
示例#5
0
    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
示例#6
0
    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
        }
示例#7
0
    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
示例#8
0
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']
示例#9
0
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
示例#10
0
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']
示例#11
0
    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
示例#12
0
    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
示例#13
0
    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
示例#14
0
    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
示例#15
0
    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
示例#16
0
    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 []
示例#17
0
    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 []
示例#18
0
 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
     )
示例#19
0
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()
示例#20
0
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()
示例#21
0
 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()
示例#22
0
 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
     )
示例#23
0
 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()