Ejemplo n.º 1
0
 def consume_params(self, raw_params):
     value = raw_params.pop(self.param, None)
     if value:
         return filters.OR(
             filters.AND(filters.NOT(filters.missing(self.param)),
                         filters.range_filter(self.param, **value)),
             filters.AND(filters.missing(self.param),
                         filters.range_filter("received_on", **value)))
Ejemplo n.º 2
0
class NumericFilterValue(FilterValue):
    DBSpecificFilter = namedtuple('DBSpecificFilter', ['sql', 'es'])
    operators_to_filters = {
        '=':
        DBSpecificFilter(EQFilter, filters.term),
        '!=':
        DBSpecificFilter(NOTEQFilter, filters.not_term),
        'distinct from':
        DBSpecificFilter(IsDistinctFromFilter, filters.not_term),
        '>=':
        DBSpecificFilter(
            GTEFilter,
            lambda field, val: filters.range_filter(field, gte=val)),
        '>':
        DBSpecificFilter(
            GTFilter, lambda field, val: filters.range_filter(field, gt=val)),
        '<=':
        DBSpecificFilter(
            LTEFilter,
            lambda field, val: filters.range_filter(field, lte=val)),
        '<':
        DBSpecificFilter(
            LTFilter, lambda field, val: filters.range_filter(field, lt=val)),
    }

    def __init__(self, filter, value):
        assert filter.type == "numeric"
        assert (isinstance(value, dict) and "operator" in value
                and "operand" in value) or value is None
        if value:
            assert value['operator'] in self.operators_to_filters
            assert isinstance(value['operand'], int) or isinstance(
                value['operand'], float)
        super(NumericFilterValue, self).__init__(filter, value)

    def to_sql_filter(self):
        if self.value is None:
            return None
        filter_class = self.operators_to_filters[self.value['operator']].sql
        return filter_class(self.filter.field, self.filter.slug)

    def to_sql_values(self):
        if self.value is None:
            return {}
        return {
            self.filter.slug: self.value["operand"],
        }

    def to_es_filter(self):
        if self.value is None:
            return None

        filter_class = self.operators_to_filters[self.value['operator']].es
        return filter_class(self.filter.field, self.value['operand'])
Ejemplo n.º 3
0
def _get_cursor_query(domain, params, last_date, last_id):
    query = _get_query(domain, params)
    return query.filter(
        filters.OR(
            filters.AND(
                filters.term('@indexed_on', last_date),
                filters.range_filter('_id', gt=last_id),
            ),
            case_search.indexed_on(gt=last_date),
        )
    )
Ejemplo n.º 4
0
def dots_submissions_by_case(case_id, query_date, username=None):
    """
    Actually run query for username submissions
    todo: do terms for the pact_ids instead of individual term?
    """
    xform_es = ReportFormESView(PACT_DOMAIN)
    script_fields = {
        "doc_id":
        get_report_script_field('_id', is_known=True),
        "pact_id":
        get_report_script_field("form.pact_id"),
        "encounter_date":
        get_report_script_field('form.encounter_date'),
        "username":
        get_report_script_field('form.meta.username', is_known=True),
        "visit_type":
        get_report_script_field('form.visit_type'),
        "visit_kept":
        get_report_script_field('form.visit_kept'),
        "contact_type":
        get_report_script_field('form.contact_type'),
        "observed_art":
        get_report_script_field('form.observed_art'),
        "observed_non_art":
        get_report_script_field('form.observed_non_art'),
        "observer_non_art_dose":
        get_report_script_field('form.observed_non_art_dose'),
        "observed_art_dose":
        get_report_script_field('form.observed_art_dose'),
        "pillbox_check":
        get_report_script_field('form.pillbox_check.check'),
        "scheduled":
        get_report_script_field('form.scheduled'),
    }

    term_block = {'form.#type': 'dots_form'}
    if username is not None:
        term_block['form.meta.username'] = username
    query = (get_by_case_id_form_es_query(0, 1, case_id).filter(
        filters.range_filter('form.encounter_date.#value',
                             gte=query_date,
                             lte=query_date)).sort('received_on').raw_query)
    query['script_fields'] = script_fields
    res = xform_es.run_query(query)
    print(json.dumps(res, indent=2))
    return res