Esempio n. 1
0
def test_invalid_eval_expression(self, source_doc, statement, context):
    with self.assertRaises(BadSpecError):
        ExpressionFactory.from_spec({
            "type": "evaluator",
            "statement": statement,
            "context_variables": context
        })
def test_diff_days_expression(self, source_doc, to_date_expression, expected_value):
    from_date_expression = {
        'type': 'property_name',
        'property_name': 'dob',
    }
    expression = ExpressionFactory.from_spec({
        'type': 'diff_days',
        'from_date_expression': from_date_expression,
        'to_date_expression': to_date_expression
    })
    self.assertEqual(expected_value, expression(source_doc))

    # test named_expression for 'from_date_expression'
    context = FactoryContext(
        {"from_date_name": ExpressionFactory.from_spec(from_date_expression)},
        {}
    )
    named_expression = ExpressionFactory.from_spec({
        'type': 'diff_days',
        'from_date_expression': {
            "type": "named",
            "name": "from_date_name"
        },
        'to_date_expression': to_date_expression
    }, context)
    self.assertEqual(expected_value, named_expression(source_doc))
Esempio n. 3
0
def _build_boolean_expression_filter(spec, context):
    wrapped = BooleanExpressionFilterSpec.wrap(spec)
    return SinglePropertyValueFilter(
        expression=ExpressionFactory.from_spec(wrapped.expression, context),
        operator=get_operator(wrapped.operator),
        reference_expression=ExpressionFactory.from_spec(wrapped.property_value, context),
    )
Esempio n. 4
0
def diff_calendar_months(spec, context):
    wrapped = DiffCalendarMonthsExpressionSpec.wrap(spec)
    wrapped.configure(
        from_date_expression=ExpressionFactory.from_spec(wrapped.from_date_expression, context),
        to_date_expression=ExpressionFactory.from_spec(wrapped.to_date_expression, context),
    )
    return wrapped
 def test_property_path_empty_path(self):
     for empty_path in ([], None):
         with self.assertRaises(BadSpecError):
             ExpressionFactory.from_spec({
                 'type': 'property_path',
                 'property_path': empty_path,
             })
Esempio n. 6
0
 def setUp(self):
     # we have to set the fake database before any other calls
     self.orig_db = CommCareCase.get_db()
     self.database = FakeCouchDb()
     CommCareCase.set_db(self.database)
     self.spec = {
         "type": "related_doc",
         "related_doc_type": "CommCareCase",
         "doc_id_expression": {"type": "property_name", "property_name": "parent_id"},
         "value_expression": {"type": "property_name", "property_name": "related_property"},
     }
     self.expression = ExpressionFactory.from_spec(self.spec)
     self.nested_expression = ExpressionFactory.from_spec(
         {
             "type": "related_doc",
             "related_doc_type": "CommCareCase",
             "doc_id_expression": {"type": "property_name", "property_name": "parent_id"},
             "value_expression": {
                 "type": "related_doc",
                 "related_doc_type": "CommCareCase",
                 "doc_id_expression": {"type": "property_name", "property_name": "parent_id"},
                 "value_expression": {"type": "property_name", "property_name": "related_property"},
             },
         }
     )
Esempio n. 7
0
def ancestor_location(spec, context):
    wrapped = AncestorLocationExpression.wrap(spec)
    wrapped.configure(
        ExpressionFactory.from_spec(wrapped.location_id, context),
        ExpressionFactory.from_spec(wrapped.location_type, context),
    )
    return wrapped
Esempio n. 8
0
 def test_non_string_keys(self):
     with self.assertRaises(BadSpecError):
         ExpressionFactory.from_spec({
             "type": "dict",
             "properties": {
                 (1, 2): 2
             },
         })
Esempio n. 9
0
 def test_datatype(self):
     spec = {
         "type": "evaluator",
         "statement": '1.0 + a',
         "context_variables": {'a': 1.0}
     }
     self.assertEqual(type(ExpressionFactory.from_spec(spec)({})), float)
     spec['datatype'] = 'integer'
     self.assertEqual(type(ExpressionFactory.from_spec(spec)({})), int)
 def test_bad_order_raises_badspec(self):
     expression = {
         'type': 'sort_items',
         'items_expression': [1, 6, 2, 3],
         'sort_expression': {'type': 'identity'},
         'order': 'complex'
     }
     with self.assertRaises(BadSpecError):
         ExpressionFactory.from_spec(expression)
Esempio n. 11
0
 def test_fail_on_bad_doc_type(self):
     spec = {
         "type": "related_doc",
         "related_doc_type": "BadDocument",
         "doc_id_expression": {"type": "property_name", "property_name": "parent_id"},
         "value_expression": {"type": "property_name", "property_name": "related_property"},
     }
     with self.assertRaises(BadSpecError):
         ExpressionFactory.from_spec(spec)
Esempio n. 12
0
def get_case_history(spec, context):
    wrapped = GetCaseHistorySpec.wrap(spec)
    wrapped.configure(
        case_id_expression=ExpressionFactory.from_spec(wrapped.case_id_expression, context),
        case_forms_expression=ExpressionFactory.from_spec({
            'type': 'get_case_forms',
            'case_id_expression': wrapped.case_id_expression
        }, context)
    )
    return wrapped
def test_reduce_items_bad_spec(self, items_ex, reduce_ex):
    expression = {
        'type': 'reduce_items',
    }
    if items_ex is not None:
        expression['items_expression'] = items_ex
    if reduce_ex is not None:
        expression['aggregation_fn'] = reduce_ex

    with self.assertRaises(BadSpecError):
        ExpressionFactory.from_spec(expression)(items_ex, reduce_ex)
def test_filter_items_bad_spec(self, items_ex, filter_ex):
    expression = {
        'type': 'filter_items',
    }
    if items_ex is not None:
        expression['items_expression'] = items_ex
    if filter_ex is not None:
        expression['filter_expression'] = filter_ex

    with self.assertRaises(BadSpecError):
        ExpressionFactory.from_spec(expression)
def test_sort_items_bad_spec(self, items_ex, sort_ex):
    expression = {
        'type': 'sort_items',
    }
    if items_ex is not None:
        expression['items_expression'] = items_ex
    if sort_ex is not None:
        expression['sort_expression'] = sort_ex

    with self.assertRaises(BadSpecError):
        ExpressionFactory.from_spec(expression)(items_ex, sort_ex)
Esempio n. 16
0
 def test_name_in_value(self):
     expression = ExpressionFactory.from_spec(
         {
             "type": "nested",
             "argument_expression": {
                 "type": "identity",
             },
             "value_expression": {
                 "type": "named",
                 "name": "three"
             }
         },
         context=FactoryContext({'three': ExpressionFactory.from_spec(3)}, {})
     )
     self.assertEqual(3, expression({}))
Esempio n. 17
0
 def test_property_path_expression(self):
     getter = ExpressionFactory.from_spec({
         'type': 'property_path',
         'property_path': ['path', 'to', 'foo'],
     })
     self.assertEqual(PropertyPathGetterSpec, type(getter))
     self.assertEqual(['path', 'to', 'foo'], getter.property_path)
def test_reduce_items_basic(self, doc, items_ex, reduce_ex, expected):
    expression = ExpressionFactory.from_spec({
        'type': 'reduce_items',
        'items_expression': items_ex,
        'aggregation_fn': reduce_ex
    })
    self.assertEqual(expression(doc), expected)
Esempio n. 19
0
 def setUp(self):
     # this expression is the equivalent to:
     #   doc.true_value if doc.test == 'match' else doc.false_value
     spec = {
         'type': 'conditional',
         'test': {
             # any valid filter can go here
             'type': 'boolean_expression',
             'expression': {
                 'type': 'property_name',
                 'property_name': 'test',
             },
             'operator': 'eq',
             'property_value': 'match',
         },
         'expression_if_true': {
             'type': 'property_name',
             'property_name': 'true_value',
         },
         'expression_if_false': {
             'type': 'property_name',
             'property_name': 'false_value',
         },
     }
     self.expression = ExpressionFactory.from_spec(spec)
Esempio n. 20
0
 def test_end(self):
     context = EvaluationContext(
         {"domain": self.domain, "end_date": "2015-02-28"},
         0)
     expression = ExpressionFactory.from_spec({
         "type": "reduce_items",
         "aggregation_fn": "count",
         "items_expression": {
             "type": "ext_get_case_history_by_date",
             "case_id_expression": {
                 "type": "constant",
                 "constant": self.test_case_id
             },
             "end_date": {
                 "type": "ext_root_property_name",
                 "property_name": "end_date",
                 "datatype": "date",
             },
         }
     })
     self.assertEqual(
         5,
         expression(
             {"some_item": "item_value"},
             context=context,
         )
     )
Esempio n. 21
0
 def test_property_name_expression(self):
     getter = ExpressionFactory.from_spec({
         'type': 'property_name',
         'property_name': 'foo',
     })
     self.assertEqual(PropertyNameGetterSpec, type(getter))
     self.assertEqual('foo', getter.property_name)
Esempio n. 22
0
    def setUpClass(cls):
        cls.domain_name = "test-domain"
        cls.domain_obj = create_domain(cls.domain_name)
        cls.location_type = LocationType(
            domain=cls.domain_name,
            name="state",
            code="state",
        )
        cls.location_type.save()

        cls.location = SQLLocation(
            domain="test-domain",
            name="Braavos",
            location_type=cls.location_type
        )
        cls.location.save()
        cls.unique_id = cls.location.location_id

        cls.spec = {
            "type": "location_type_name",
            "location_id_expression": {
                "type": "property_name",
                "property_name": "_id"
            }
        }

        cls.expression = ExpressionFactory.from_spec(cls.spec)
Esempio n. 23
0
 def test_parent_case_id(self):
     expression = ExpressionFactory.from_spec({
         "type": "nested",
         "argument_expression": {
             "type": "array_index",
             "array_expression": {
                 "type": "property_name",
                 "property_name": "indices"
             },
             "index_expression": {
                 "type": "constant",
                 "constant": 0
             }
         },
         "value_expression": {
             "type": "property_name",
             "property_name": "referenced_id"
         }
     })
     self.assertEqual(
         'my_parent_id',
         expression({
             "indices": [
                 {
                     "doc_type": "CommCareCaseIndex",
                     "identifier": "parent",
                     "referenced_type": "pregnancy",
                     "referenced_id": "my_parent_id"
                 }
             ],
         })
     )
Esempio n. 24
0
 def test_filter(self):
     expression = ExpressionFactory.from_spec({
         "type": "reduce_items",
         "aggregation_fn": "count",
         "items_expression": {
             "type": "ext_get_case_history_by_date",
             "case_id_expression": {
                 "type": "constant",
                 "constant": self.test_case_id
             },
             "filter": {
                 "type": "boolean_expression",
                 "operator": "eq",
                 "expression": {
                     "type": "property_path",
                     "property_path": ["update", "foo"]
                 },
                 "property_value": "a"
             }
         }
     })
     self.assertEqual(
         2,
         expression(
             {"some_item": "item_value"},
             context=EvaluationContext({"domain": self.domain}, 0),
         )
     )
Esempio n. 25
0
 def test_datatype(self):
     for expected, datatype, original in [
         (5, "integer", "5"),
         (5, "integer", "5.3"),
         (None, "integer", "five"),
         (Decimal(5), "decimal", "5"),
         (Decimal("5.3"), "decimal", "5.3"),
         ("5", "string", "5"),
         ("5", "string", 5),
         (u"fo\u00E9", "string", u"fo\u00E9"),
         (date(2015, 9, 30), "date", "2015-09-30"),
         (None, "date", "09/30/2015"),
         (datetime(2015, 9, 30, 19, 4, 27), "datetime", "2015-09-30T19:04:27Z"),
         (datetime(2015, 9, 30, 19, 4, 27, 113609), "datetime", "2015-09-30T19:04:27.113609Z"),
         (None, "datetime", "2015-09-30 19:04:27Z"),
         (date(2015, 9, 30), "date", "2015-09-30T19:04:27Z"),
         (date(2015, 9, 30), "date", datetime(2015, 9, 30)),
         (None, "datetime", "2015-09-30"),
     ]:
         getter = ExpressionFactory.from_spec({
             'type': 'property_name',
             'property_name': 'foo',
             'datatype': datatype
         })
         self.assertEqual(expected, getter({'foo': original}))
Esempio n. 26
0
def parent_id(spec, context):
    spec = {
        'type': 'nested',
        'argument_expression': {
            'type': 'array_index',
            'array_expression': {
                'type': 'filter_items',
                'items_expression': {
                    'type': 'ext_root_property_name',
                    'property_name': 'indices',
                    'datatype': 'array',
                },
                'filter_expression': {
                    'type': 'boolean_expression',
                    'operator': 'eq',
                    'property_value': 'parent',
                    'expression': {
                        'type': 'property_name',
                        'property_name': 'identifier'
                    }
                }
            },
            'index_expression': {
                'type': 'constant',
                'constant': 0
            }
        },
        'value_expression': {
            'type': 'property_name',
            'property_name': 'referenced_id'
        }
    }
    return ExpressionFactory.from_spec(spec, context)
 def test_latest_property(self):
     doc = {
         "forms": [
             {"received_on": datetime.date(2015, 4, 5), "weight": 21},
             {"received_on": datetime.date(2015, 1, 5), "weight": 18},
             {"received_on": datetime.date(2015, 3, 5), "weight": 20},
         ]
     }
     # nested(weight) <- reduce(last_item) <- sort(by received_on) <- forms
     expression = ExpressionFactory.from_spec({
         "type": "nested",
         "argument_expression": {
             "type": "reduce_items",
             "items_expression": {
                 "type": "sort_items",
                 "items_expression": {"type": "property_name", "property_name": "forms"},
                 "sort_expression": {"type": "property_name", "property_name": "received_on"}
             },
             "aggregation_fn": "last_item"
         },
         "value_expression": {
             "type": "property_name",
             "property_name": "weight"
         }
     })
     self.assertEqual(expression(doc), doc["forms"][0]["weight"])
def test_filter_items_basic(self, doc, items_ex, filter_ex, expected):
    expression = ExpressionFactory.from_spec({
        'type': 'filter_items',
        'items_expression': items_ex,
        'filter_expression': filter_ex
    })
    self.assertEqual(expression(doc), expected)
def test_sort_items_basic(self, doc, items_ex, sort_ex, expected):
    expression = ExpressionFactory.from_spec({
        'type': 'sort_items',
        'items_expression': items_ex,
        'sort_expression': sort_ex
    })
    self.assertEqual(expression(doc), expected)
Esempio n. 30
0
 def test_filtered_child_cases(self):
     context = EvaluationContext({"domain": self.domain}, 0)
     expression = ExpressionFactory.from_spec({
         "type": "reduce_items",
         "aggregation_fn": "count",
         "items_expression": {
             "type": "filter_items",
             "filter_expression": {
                 "type": "boolean_expression",
                 "operator": "eq",
                 "expression": {
                     "type": "property_name",
                     "property_name": "type"
                 },
                 "property_value": "child_1"
             },
             "items_expression": {
                 "type": "icds_get_child_cases",
                 "case_id_expression": {
                     "type": "constant",
                     "constant": self.test_case_id
                 }
             }
         }
     })
     self.assertEqual(1, expression({"some_field", "some_value"}, context))
Esempio n. 31
0
def open_in_month(spec, context):
    spec = {
        'type': 'conditional',
        'test': {
            'type': 'and',
            'filters': [
                {
                    'type': 'boolean_expression',
                    'operator': 'gte',
                    'expression': {
                        'type': 'diff_days',
                        'from_date_expression': {
                            'type': 'ext_root_property_name',
                            'property_name': 'opened_on',
                            'datatype': 'date',
                        },
                        'to_date_expression': {
                            'type': 'ext_month_end',
                        }
                    },
                    'property_value': 0
                },
                {
                    'type': 'or',
                    'filters': [
                        {
                            'type': 'boolean_expression',
                            'operator': 'eq',
                            'expression': {
                                'type': 'ext_root_property_name',
                                'property_name': 'closed',
                                'datatype': 'string',
                            },
                            'property_value': 'False'
                        },
                        {
                            'type': 'boolean_expression',
                            'operator': 'gte',
                            'expression': {
                                'type': 'diff_days',
                                'from_date_expression': {
                                    'type': 'ext_month_start',
                                },
                                'to_date_expression': {
                                    'type': 'ext_root_property_name',
                                    'property_name': 'closed_on',
                                    'datatype': 'date',
                                }
                            },
                            'property_value': 0
                        }
                    ]
                }
            ]
        },
        'expression_if_true': {
            'type': 'constant',
            'constant': 'yes'
        },
        'expression_if_false': {
            'type': 'constant',
            'constant': 'no'
        }
    }
    return ExpressionFactory.from_spec(spec, context)
Esempio n. 32
0
 def test_constant_datetime_conversion(self):
     self.assertEqual(datetime(2015, 2, 4, 11, 5, 24), ExpressionFactory.from_spec('2015-02-04T11:05:24Z')({}))
Esempio n. 33
0
def count_case_forms_with_xmlns_expression(spec, context):
    wrapped = CountCaseFormsWithXmlns.wrap(spec)
    wrapped.configure(
        ExpressionFactory.from_spec(wrapped.case_id_expression, context))
    return wrapped
Esempio n. 34
0
 def setUpClass(cls):
     super(TestIterationNumberExpression, cls).setUpClass()
     cls.spec = ExpressionFactory.from_spec({'type': 'base_iteration_number'})
Esempio n. 35
0
 def parsed_expression(self):
     if self.base_item_expression:
         return ExpressionFactory.from_spec(
             self.base_item_expression, context=self.get_factory_context())
     return None
Esempio n. 36
0
def icds_user_location(spec, context):
    wrapped = ICDSUserLocation.wrap(spec)
    wrapped.configure(user_id_expression=ExpressionFactory.from_spec(
        wrapped.user_id_expression, context))
    return wrapped
Esempio n. 37
0
def get_app_version(spec, context):
    wrapped = GetAppVersion.wrap(spec)
    wrapped.configure(app_version_string=ExpressionFactory.from_spec(
        wrapped.app_version_string, context))
    return wrapped
Esempio n. 38
0
def get_case_history_by_date(spec, context):
    GetCaseHistoryByDateSpec.wrap(spec)

    if spec['case_id_expression'] is None:
        case_id_expression = {
            'expression': {
                'type': 'property_name',
                'property_name': '_id'
            },
            'type': 'root_doc'
        }
    else:
        case_id_expression = spec['case_id_expression']

    case_history_spec = {
        "type": "icds_get_case_history",
        "case_id_expression": case_id_expression
    }

    if spec['xmlns']:
        case_history_spec['xmlns'] = spec['xmlns']

    filters = []
    if spec['start_date'] is not None:
        start_date_filter = {
            'operator': 'gte',
            'expression': {
                'datatype': 'integer',
                'from_date_expression': spec['start_date'],
                'type': 'diff_days',
                'to_date_expression': {
                    'datatype': 'date',
                    'type': 'property_name',
                    'property_name': '@date_modified'
                }
            },
            'type': 'boolean_expression',
            'property_value': 0
        }
        filters.append(start_date_filter)
        case_history_spec['start_date'] = spec['start_date']
    if spec['end_date'] is not None:
        end_date_filter = {
            'operator': 'gte',
            'expression': {
                'datatype': 'integer',
                'from_date_expression': {
                    'datatype': 'date',
                    'type': 'property_name',
                    'property_name': '@date_modified'
                },
                'type': 'diff_days',
                'to_date_expression': spec['end_date']
            },
            'type': 'boolean_expression',
            'property_value': 0
        }
        filters.append(end_date_filter)
        case_history_spec['end_date'] = spec['end_date']
    if spec['filter'] is not None:
        filters.append(spec['filter'])

    if len(filters) > 0:
        case_history_spec = {
            "filter_expression": {
                "type": "and",
                "filters": filters
            },
            "type": "filter_items",
            "items_expression": case_history_spec
        }
    spec = {
        'type': 'sort_items',
        'sort_expression': {
            'datatype': 'date',
            'type': 'property_name',
            'property_name': '@date_modified',
        },
        "items_expression": case_history_spec
    }
    return ExpressionFactory.from_spec(spec, context)
def test_flatten_basic(self, doc, items_ex, expected):
    expression = ExpressionFactory.from_spec({
        'type': 'flatten',
        'items_expression': items_ex
    })
    self.assertEqual(expression(doc), expected)
Esempio n. 40
0
def village_owner_id(spec, context):
    wrapped = VillageOwnerId.wrap(spec)
    wrapped.configure(
        case_id_expression=ExpressionFactory.from_spec(wrapped.case_id_expression, context)
    )
    return wrapped
Esempio n. 41
0
def location_type_name(spec, context):
    wrapped = LocationTypeSpec.wrap(spec)
    wrapped.configure(location_id_expression=ExpressionFactory.from_spec(
        wrapped.location_id_expression, context))
    return wrapped
def test_flatten_bad_spec(self, items_ex):
    with self.assertRaises(BadSpecError):
        ExpressionFactory.from_spec({
            'type': 'flatten',
            'items_expression': items_ex
        })
Esempio n. 43
0
 def test_invalid_type(self):
     with self.assertRaises(BadSpecError):
         ExpressionFactory.from_spec({
             'type': 'not_a_valid_type',
         })
Esempio n. 44
0
 def test_repeat_calculation(self):
     _rations1, _rations2, _rations3 = 3, 4, 5
     doc = {
         "forms": [
             {
                 "id":
                 "f1",
                 "child_repeat": [{
                     "name": "a",
                     "rations": _rations1
                 }, {
                     "name": "b",
                     "rations": 3
                 }, {
                     "name": "c",
                     "rations": 3
                 }]
             },
             {
                 "id":
                 "f2",
                 "child_repeat": [{
                     "name": "c",
                     "rations": 3
                 }, {
                     "name": "a",
                     "rations": _rations2
                 }, {
                     "name": "b",
                     "rations": 3
                 }]
             },
             {
                 "id":
                 "f3",
                 "child_repeat": [{
                     "name": "a",
                     "rations": _rations3
                 }, {
                     "name": "b",
                     "rations": 3
                 }, {
                     "name": "c",
                     "rations": 3
                 }]
             },
         ]
     }
     #  reduce(to sum ) <- map(weight) <- filter(by name) <- flatten(child_repeat) <- map(child_repeat) <- forms
     expression = ExpressionFactory.from_spec({
         "type": "reduce_items",
         "items_expression": {
             "type": "map_items",
             "items_expression": {
                 "type": "filter_items",
                 "items_expression": {
                     "type": "flatten",
                     "items_expression": {
                         "type": "map_items",
                         "items_expression": {
                             "type": "property_name",
                             "property_name": "forms"
                         },
                         "map_expression": {
                             "type": "property_name",
                             "property_name": "child_repeat"
                         }
                     }
                 },
                 "filter_expression": {
                     "type": "boolean_expression",
                     "operator": "eq",
                     "expression": {
                         "type": "property_name",
                         "property_name": "name"
                     },
                     "property_value": "a"
                 }
             },
             "map_expression": {
                 "type": "property_name",
                 "property_name": "rations"
             }
         },
         "aggregation_fn": "sum"
     })
     self.assertEqual(expression(doc), _rations1 + _rations2 + _rations3)
Esempio n. 45
0
 def test_property_name_no_name(self):
     with self.assertRaises(BadSpecError):
         ExpressionFactory.from_spec({
             'type': 'property_name',
         })
Esempio n. 46
0
def concatenate_strings_expression(spec, context):
    wrapped = ConcatenateStrings.wrap(spec)
    wrapped.configure(
        [ExpressionFactory.from_spec(e, context)
         for e in wrapped.expressions], )
    return wrapped
Esempio n. 47
0
    def test_microbiological_endofip_test_requested_date(self):
        episode_case = {
            '_id': 'episode_case_id',
            'domain': 'enikshay-test',
            'treatment_initiation_date': '2017-09-28',
            'archive_reason': None,
            'treatment_outcome': 'test',
            'indices': [
                {'referenced_id': 'occurrence_case_id'}
            ]
        }

        occurrence_case = {
            '_id': 'occurrence_case_id',
            'domain': 'enikshay-test',
            'indices': [
                {'referenced_id': 'person_case_id'}
            ]
        }

        person_case = {
            '_id': 'person_case_id',
            'domain': 'enikshay-test',
            'owner_id': 'owner-id'
        }

        subcases = [
            {
                'domain': 'enikshay-test',
                'type': 'test',
                'is_direct_test_entry': 'no',
                'rft_dstb_followup': 'end_of_ip',
                'test_requested_date': '2017-09-28',
                'date_tested': '2017-08-10',
                'test_type_value': 'microscopy-zn',
                'result_recorded': 'yes'
            },
            {
                'domain': 'enikshay-test',
                'type': 'test',
                'is_direct_test_entry': 'yes',
                'rft_dstb_followup': 'end_of_cp',
                'test_requested_date': '2017-09-28',
                'date_tested': '2017-08-10',
                'test_type_value': 'microscopy-zn',
                'result_recorded': 'yes'
            },
            {
                'domain': 'enikshay-test',
                'type': 'test',
                'rft_dstb_followup': 'end_of_cp',
                'test_requested_date': '2017-09-28',
                'test_type_value': 'microscopy-zn',
            }
        ]

        self.database.mock_docs = {
            'episode_case_id': episode_case,
            'occurrence_case_id': occurrence_case,
            'person_case_id': person_case
        }

        endofip_test_requested_date = self._get_column('endofip_test_requested_date')
        self.assertEqual(endofip_test_requested_date['datatype'], 'date')
        endofip_test_requested_date_expression = ExpressionFactory.from_spec(
            endofip_test_requested_date['expression'],
            context=FactoryContext(self.named_expressions, {})
        )

        endofcp_test_requested_date = self._get_column('endofcp_test_requested_date')
        self.assertEqual(endofcp_test_requested_date['datatype'], 'date')
        endofcp_test_requested_date_expression = ExpressionFactory.from_spec(
            endofcp_test_requested_date['expression'],
            context=FactoryContext(self.named_expressions, {})
        )

        with mock.patch.object(SubcasesExpressionSpec, '__call__', lambda *args: subcases):
            self.assertEqual(
                endofip_test_requested_date_expression(episode_case, EvaluationContext(episode_case, 0)),
                '2017-09-28'
            )
            self.assertEqual(
                endofcp_test_requested_date_expression(episode_case, EvaluationContext(episode_case, 0)),
                '2017-08-10'
            )
Esempio n. 48
0
def month_expression(spec, context):
    wrapped = MonthExpression.wrap(spec)
    wrapped.configure(
        ExpressionFactory.from_spec(wrapped.month_expression, context))
    return wrapped
Esempio n. 49
0
 def get_case_id_expression(self, context=None):
     from corehq.apps.userreports.expressions.factory import ExpressionFactory
     return ExpressionFactory.from_spec(self.case_id_expression, context)
Esempio n. 50
0
def get_case_forms_by_date(spec, context):
    GetCaseFormsByDateSpec.wrap(spec)
    if spec['case_id_expression'] is None:
        case_id_expression = {
            "type": "ext_root_property_name",
            "property_name": "_id",
        }
    else:
        case_id_expression = spec['case_id_expression']

    case_forms_expression = {
        "type": "get_case_forms",
        "case_id_expression": case_id_expression
    }

    if spec['xmlns']:
        case_forms_expression['xmlns'] = spec['xmlns']

    filters = []
    if spec['start_date'] is not None:
        start_date_filter = {
            'operator': 'gte',
            'expression': {
                'datatype': 'integer',
                'from_date_expression': spec['start_date'],
                'type': 'diff_days',
                'to_date_expression': {
                    'datatype': 'date',
                    'type': 'property_path',
                    'property_path': [
                        'form',
                        'meta',
                        'timeEnd'
                    ]
                }
            },
            'type': 'boolean_expression',
            'property_value': 0
        }
        filters.append(start_date_filter)
    if spec['end_date'] is not None:
        end_date_filter = {
            'operator': 'gte',
            'expression': {
                'datatype': 'integer',
                'from_date_expression': {
                    'datatype': 'date',
                    'type': 'property_path',
                    'property_path': [
                        'form',
                        'meta',
                        'timeEnd'
                    ]
                },
                'type': 'diff_days',
                'to_date_expression': spec['end_date']
            },
            'type': 'boolean_expression',
            'property_value': 0
        }
        filters.append(end_date_filter)
    if spec['form_filter'] is not None:
        filters.append(spec['form_filter'])

    if len(filters) > 0:
        case_forms_expression = {
            "filter_expression": {
                "type": "and",
                "filters": filters
            },
            "type": "filter_items",
            "items_expression": case_forms_expression
        }
    spec = {
        "type": "sort_items",
        "sort_expression": {
            "type": "property_path",
            "property_path": [
                "form",
                "meta",
                "timeEnd"
            ],
            "datatype": "date"
        },
        "items_expression": case_forms_expression
    }
    return ExpressionFactory.from_spec(spec, context)
Esempio n. 51
0
def ccs_lactating(spec, context):
    spec = {
        'type': 'conditional',
        'test': {
            'type':
            'and',
            'filters': [{
                'type': 'boolean_expression',
                'operator': 'eq',
                'expression': {
                    'type': 'icds_open_in_month'
                },
                'property_value': 'yes'
            }, {
                'type': 'boolean_expression',
                'operator': 'eq',
                'expression': {
                    'type': 'icds_alive_in_month'
                },
                'property_value': 'yes'
            }, {
                'type': 'not',
                'filter': {
                    'operator': 'in',
                    'type': 'boolean_expression',
                    'expression': {
                        'type': 'root_doc',
                        'expression': {
                            'datatype': 'date',
                            'type': 'property_name',
                            'property_name': 'add'
                        }
                    },
                    'property_value': ['', None]
                }
            }, {
                'type': 'boolean_expression',
                'operator': 'gte',
                'property_value': 0,
                'expression': {
                    'type': 'diff_days',
                    'to_date_expression': {
                        'type': 'icds_month_end'
                    },
                    'from_date_expression': {
                        'type': 'root_doc',
                        'expression': {
                            'datatype': 'date',
                            'type': 'property_name',
                            'property_name': 'add'
                        }
                    }
                }
            }, {
                'type': 'boolean_expression',
                'operator': 'lte',
                'property_value': 183,
                'expression': {
                    'type': 'diff_days',
                    'from_date_expression': {
                        'type': 'root_doc',
                        'expression': {
                            'datatype': 'date',
                            'type': 'property_name',
                            'property_name': 'add'
                        }
                    },
                    'to_date_expression': {
                        'type': 'icds_month_start'
                    }
                }
            }]
        },
        'expression_if_true': {
            'type': 'constant',
            'constant': 'yes'
        },
        'expression_if_false': {
            'type': 'constant',
            'constant': 'no'
        }
    }
    return ExpressionFactory.from_spec(spec, context)
Esempio n. 52
0
 def test_constant_date_conversion(self):
     self.assertEqual(date(2015, 2, 4), ExpressionFactory.from_spec('2015-02-04')({}))
Esempio n. 53
0
 def test_constant_auto_detection_invalid_types(self):
     for invalid_constant in ({}):
         with self.assertRaises(BadSpecError):
             ExpressionFactory.from_spec(invalid_constant)
Esempio n. 54
0
    def test_not_microbiological_result(self):
        episode_case = {
            '_id': 'episode_case_id',
            'domain': 'enikshay-test',
            'treatment_initiation_date': '2017-09-28',
            'archive_reason': None,
            'treatment_outcome': 'test',
            'indices': [
                {'referenced_id': 'occurrence_case_id'}
            ]
        }

        occurrence_case = {
            '_id': 'occurrence_case_id',
            'domain': 'enikshay-test',
            'indices': [
                {'referenced_id': 'person_case_id'}
            ]
        }

        person_case = {
            '_id': 'person_case_id',
            'domain': 'enikshay-test',
            'owner_id': 'owner-id'
        }

        subcases = [
            {
                'domain': 'enikshay-test',
                'type': 'test',
                'is_direct_test_entry': 'no',
                'rft_dstb_followup': 'end_of_ip',
                'test_requested_date': '2017-09-28',
                'date_tested': '2017-08-10',
                'date_reported': '2017-08-10',
                'test_type_value': 'cytopathology',
                'test_type_label': 'Cytopathology',
                'result_grade': 'result_grade',
                'result_recorded': 'yes',
                'result_summary_display': 'result_cytopathology',
                'result': 'result_cytopathology',
            },
            {
                'domain': 'enikshay-test',
                'type': 'test',
                'is_direct_test_entry': 'yes',
                'rft_dstb_followup': 'end_of_cp',
                'test_requested_date': '2017-09-28',
                'date_tested': '2017-09-10',
                'date_reported': '2017-09-10',
                'test_type_value': 'igra',
                'result': 'result',
                'result_recorded': 'yes',
                'result_summary_display': 'result_igra'
            },
            {
                'domain': 'enikshay-test',
                'type': 'test',
                'rft_dstb_followup': 'end_of_cp',
                'test_requested_date': '2017-10-10',
                'date_reported': '2017-10-10',
                'test_type_value': 'other_clinical',
                'test_type_label': 'Other clinical',
                'result_summary_display': 'result_other_clinical'
            }
        ]

        self.database.mock_docs = {
            'episode_case_id': episode_case,
            'occurrence_case_id': occurrence_case,
            'person_case_id': person_case
        }

        not_microbiological = self._get_column('not_microbiological_result')
        self.assertEqual(not_microbiological['datatype'], 'string')
        not_microbiological_result_expression = ExpressionFactory.from_spec(
            not_microbiological['expression'],
            context=FactoryContext(self.named_expressions, {})
        )

        with mock.patch.object(SubcasesExpressionSpec, '__call__', lambda *args: subcases):
            self.assertEqual(
                not_microbiological_result_expression(episode_case, EvaluationContext(episode_case, 0)),
                'Cytopathology, result_cytopathology'
            )
Esempio n. 55
0
 def setUp(self):
     self.expression = ExpressionFactory.from_spec({'type': 'identity'})
Esempio n. 56
0
def iterate_from_opened_date(spec, context):
    spec = {
        'type': 'evaluator',
        'datatype': 'array',
        'context_variables': {
            'count': {
                'type': 'conditional',
                'datatype': 'integer',
                'test': {
                    'type': 'boolean_expression',
                    'operator': 'eq',
                    'expression': {
                        'type': 'property_name',
                        'property_name': 'closed',
                        'datatype': 'string',
                    },
                    'property_value': 'True'
                },
                'expression_if_true': {
                    'type': 'evaluator',
                    'datatype': 'integer',
                    'context_variables': {
                        'difference': {
                            'type': 'ext_diff_calendar_months',
                            'from_date_expression': {
                                'type': 'month_start_date',
                                'date_expression': {
                                    'type': 'property_name',
                                    'datatype': 'date',
                                    'property_name': 'opened_on'
                                },
                            },
                            'to_date_expression': {
                                'type': 'month_start_date',
                                'date_expression': {
                                    'type': 'property_name',
                                    'datatype': 'date',
                                    'property_name': 'closed_on'
                                },
                            }
                        }
                    },
                    'statement': 'difference + 1'
                },
                'expression_if_false': {
                    'type': 'evaluator',
                    'datatype': 'integer',
                    'context_variables': {
                        'difference': {
                            'type': 'ext_diff_calendar_months',
                            'from_date_expression': {
                                'type': 'month_start_date',
                                'date_expression': {
                                    'type': 'property_name',
                                    'datatype': 'date',
                                    'property_name': 'opened_on'
                                },
                            },
                            'to_date_expression': {
                                'type': 'month_start_date',
                                'date_expression': {
                                    'type': 'property_name',
                                    'datatype': 'date',
                                    'property_name': 'modified_on'
                                },
                            }
                        }
                    },
                    'statement': 'difference + 1 + ' + str(NUM_FUTURE_MONTHS)
                }
            }
        },
        'statement': 'range(count)'
    }
    return ExpressionFactory.from_spec(spec, context)
Esempio n. 57
0
 def readable_output(self, context):
     from corehq.apps.userreports.expressions.factory import ExpressionFactory
     expression_object = ExpressionFactory.from_spec(
         self.expression, context)
     return str(expression_object)
Esempio n. 58
0
 def test_invalid_constant(self):
     with self.assertRaises(BadSpecError):
         ExpressionFactory.from_spec({
             'type': 'constant',
         })
Esempio n. 59
0
    spec = {
        "type": "switch",
        "switch_on": spec['boolean_property'],
        "cases": {
            case: {
                "type": "constant",
                "constant": value
            }
            for case, value in case_tuples
        },
        "default": {
            "type": "constant",
            "constant": None if spec['nullable'] else 0
        }
    }
    return ExpressionFactory.from_spec(spec, context)


def icds_user_location(spec, context):
    wrapped = ICDSUserLocation.wrap(spec)
    wrapped.configure(user_id_expression=ExpressionFactory.from_spec(
        wrapped.user_id_expression, context))
    return wrapped


def icds_get_related_docs_ids(case_id):
    """gets a related case id from an ICDS ccs_record or child_health case. Expects the hierarchy:
                                      /---->  ccs_record
         household -----> person  --<
                                      \---->  child_health
Esempio n. 60
0
 def test_custom_expression(self):
     """Confirm that plugin framework is being bootstrapped."""
     ExpressionFactory.from_spec({
         "type": "abt_supervisor"
     })