Example #1
0
    def to_es_filter(self):
        if self.value is None:
            return None

        return filters.date_range(self.filter.field,
                                  lt=self.value.startdate,
                                  gt=self.value.enddate)
Example #2
0
def _get_case_counts_by_user(domain,
                             datespan,
                             case_types=None,
                             is_opened=True,
                             user_ids=None,
                             export=False):
    date_field = 'opened_on' if is_opened else 'closed_on'
    user_field = 'opened_by' if is_opened else 'closed_by'

    es_instance = ES_EXPORT_INSTANCE if export else ES_DEFAULT_INSTANCE
    case_query = (CaseES(es_instance_alias=es_instance).domain(domain).filter(
        filters.date_range(
            date_field,
            gte=datespan.startdate.date(),
            lte=datespan.enddate.date(),
        )).terms_aggregation(user_field, 'by_user').size(0))

    if case_types:
        case_query = case_query.case_type(case_types)
    else:
        case_query = case_query.filter(
            filters.NOT(case_type_filter('commcare-user')))

    if user_ids:
        case_query = case_query.filter(filters.term(user_field, user_ids))

    return case_query.run().aggregations.by_user.counts_by_bucket()
Example #3
0
    def test_nested_filter(self):
        json_output = {
            "query": {
                "filtered": {
                    "filter": {
                        "and": [
                            {"nested": {
                                "path": "actions",
                                "filter": {
                                    "range": {
                                        "actions.date": {
                                            "gte": "2015-01-01",
                                            "lt": "2015-02-01"
                                        }
                                    }
                                }
                            }},
                            {"match_all": {}}
                        ]
                    },
                    "query": {"match_all": {}}
                }
            },
            "size": SIZE_LIMIT
        }

        start, end = date(2015, 1, 1), date(2015, 2, 1)
        query = (HQESQuery('cases')
                 .nested("actions",
                         filters.date_range("actions.date", gte=start, lt=end)))

        self.checkQuery(query, json_output)
Example #4
0
    def test_nested_filter(self):
        json_output = {
            "query": {
                "filtered": {
                    "filter": {
                        "and": [{
                            "nested": {
                                "path": "actions",
                                "filter": {
                                    "range": {
                                        "actions.date": {
                                            "gte": "2015-01-01",
                                            "lt": "2015-02-01"
                                        }
                                    }
                                }
                            }
                        }, {
                            "match_all": {}
                        }]
                    },
                    "query": {
                        "match_all": {}
                    }
                }
            },
            "size": SIZE_LIMIT
        }

        start, end = date(2015, 1, 1), date(2015, 2, 1)
        query = (HQESQuery('cases').nested(
            "actions", filters.date_range("actions.date", gte=start, lt=end)))

        self.checkQuery(query, json_output)
Example #5
0
def _get_case_counts_by_user(domain, datespan, case_types=None, is_opened=True, user_ids=None, export=False):
    date_field = 'opened_on' if is_opened else 'closed_on'
    user_field = 'opened_by' if is_opened else 'closed_by'

    es_instance = ES_EXPORT_INSTANCE if export else ES_DEFAULT_INSTANCE
    case_query = (CaseES(es_instance_alias=es_instance)
        .domain(domain)
        .filter(
            filters.date_range(
                date_field,
                gte=datespan.startdate.date(),
                lte=datespan.enddate.date(),
            )
        )
        .terms_aggregation(user_field, 'by_user')
        .size(0))

    if case_types:
        case_query = case_query.case_type(case_types)
    else:
        case_query = case_query.filter(filters.NOT(case_type_filter('commcare-user')))

    if user_ids:
        case_query = case_query.filter(filters.term(user_field, user_ids))

    return case_query.run().aggregations.by_user.counts_by_bucket()
Example #6
0
def _get_case_counts_by_user(domain, datespan, case_types=None, is_opened=True, owner_ids=None):
    date_field = 'opened_on' if is_opened else 'closed_on'
    user_field = 'opened_by' if is_opened else 'closed_by'

    case_query = (CaseES()
        .domain(domain)
        .filter(
            filters.date_range(
                date_field,
                gte=datespan.startdate.date(),
                lte=datespan.enddate.date(),
            )
        )
        .terms_aggregation(user_field, 'by_user')
        .size(0))

    if case_types:
        case_query = case_query.case_type(case_types)
    else:
        case_query = case_query.filter(filters.NOT(case_type_filter('commcare-user')))

    if owner_ids:
        case_query = case_query.filter(filters.term(user_field, owner_ids))

    return case_query.run().aggregations.by_user.counts_by_bucket()
Example #7
0
def _get_case_counts_by_user(domain, datespan, case_types=None, is_opened=True, owner_ids=None):
    date_field = 'opened_on' if is_opened else 'closed_on'
    user_field = 'opened_by' if is_opened else 'closed_by'

    case_query = (CaseES()
        .domain(domain)
        .filter(
            filters.date_range(
                date_field,
                gte=datespan.startdate.date(),
                lte=datespan.enddate.date(),
            )
        )
        .terms_aggregation(user_field, 'by_user')
        .size(0))

    if case_types:
        case_query = case_query.case_type(case_types)
    else:
        case_query = case_query.filter(filters.NOT(case_type_filter('commcare-user')))

    if owner_ids:
        case_query = case_query.filter(filters.term(user_field, owner_ids))

    return case_query.run().aggregations.by_user.counts_by_bucket()
Example #8
0
def get_domains_to_update_es_filter():
    """
    Returns ES filter to filter domains that are never updated or
        domains that haven't been updated since a week or domains that
        have been updated within last week but have new form submissions
        in the last day.
    """
    last_week = datetime.utcnow() - timedelta(days=7)
    more_than_a_week_ago = filters.date_range('cp_last_updated', lt=last_week)
    less_than_a_week_ago = filters.date_range('cp_last_updated', gte=last_week)
    not_updated = filters.missing('cp_last_updated')
    domains_submitted_today = (FormES().submitted(
        gte=datetime.utcnow() - timedelta(days=1)).terms_aggregation(
            'domain', 'domain').size(0).run().aggregations.domain.keys)
    return filters.OR(
        not_updated, more_than_a_week_ago,
        filters.AND(less_than_a_week_ago, domains_submitted_today))
Example #9
0
def get_domains_to_update_es_filter():
    """
    Returns ES filter to filter domains that are never updated or
        domains that haven't been updated since a week or domains that
        have been updated within last week but have new form submissions
        in the last day.
    """
    last_week = datetime.utcnow() - timedelta(days=7)
    more_than_a_week_ago = filters.date_range('cp_last_updated', lt=last_week)
    less_than_a_week_ago = filters.date_range('cp_last_updated', gte=last_week)
    not_updated = filters.missing('cp_last_updated')
    domains_submitted_today = (FormES().submitted(gte=datetime.utcnow() - timedelta(days=1))
        .terms_aggregation('domain', 'domain').size(0).run().aggregations.domain.keys)
    return filters.OR(
        not_updated,
        more_than_a_week_ago,
        filters.AND(less_than_a_week_ago, filters.term('name', domains_submitted_today))
    )
Example #10
0
 def to_es_filter(self):
     # TODO: support the array and null operators defined at top of class
     if self._is_dyn_date():
         start_date, end_date = get_daterange_start_end_dates(self.value['operator'], *self.value['operand'])
         return filters.date_range(self.filter.field, gt=start_date, lt=end_date)
     elif self._is_null():
         return filters.missing(self.filter.field)
     else:
         terms = [v.value.lower() for v in self.value]
         return filters.term(self.filter.field, terms)
Example #11
0
    def consume_params(self, raw_params):
        start = raw_params.pop(self.start_param, None)
        end = raw_params.pop(self.end_param, None)
        if start:
            start = validate_date(start)
        if end:
            end = validate_date(end)

        if start or end:
            # Note that dates are already in a string format when they arrive as query params
            return filters.date_range(self.term, gte=start, lte=end)
Example #12
0
    def consume_params(self, raw_params):
        start = raw_params.pop(self.start_param, None)
        end = raw_params.pop(self.end_param, None)
        if start:
            validate_date(start)
        if end:
            validate_date(end)

        if start or end:
            # Note that dates are already in a string format when they arrive as query params
            return filters.date_range(self.field, gte=start, lte=end)
Example #13
0
 def to_es_filter(self):
     # TODO: support the array and null operators defined at top of class
     if self._is_dyn_date():
         start_date, end_date = get_daterange_start_end_dates(self.value['operator'], *self.value['operand'])
         return filters.date_range(self.filter.field, gt=start_date, lt=end_date)
     elif self._is_null():
         return filters.missing(self.filter.field)
     elif self._is_list():
         terms = [v.value for v in self.value['operand']]
         return filters.term(self.filter.field, terms)
     else:
         return self._scalar_filter.es(self.filter.field, self.value['operand'])
Example #14
0
 def deactivate_mobile_workers_by_inactivity(self, domain):
     date_of_inactivity = datetime.datetime.utcnow() - datetime.timedelta(
         days=self.inactivity_period)
     user_query = (UserES().domain(domain).mobile_users().is_active(
     ).created(lte=date_of_inactivity).filter(
         filters.OR(
             filters.date_range(
                 "reporting_metadata.last_submission_for_user.submission_date",
                 lte=date_of_inactivity),
             filters.missing(
                 "reporting_metadata.last_submission_for_user.submission_date"
             ))).source(['_id']))
     user_ids = [u['_id'] for u in user_query.run().hits]
     for chunked_ids in chunked(user_ids, 100):
         bulk_auto_deactivate_commcare_users(chunked_ids, domain)
Example #15
0
def _get_case_counts_by_user(domain, datespan, case_types=None, is_opened=True):
    date_field = 'opened_on' if is_opened else 'closed_on'
    user_field = 'opened_by' if is_opened else 'closed_by'

    case_query = (CaseES()
        .domain(domain)
        .filter(
            filters.date_range(
                date_field,
                gte=datespan.startdate.date(),
                lte=datespan.enddate.date(),
            )
        )
        .terms_aggregation(user_field, 'by_user')
        .size(1))

    if case_types:
        case_query = case_query.filter({"terms": {"type.exact": case_types}})

    return case_query.run().aggregations.by_user.counts_by_bucket()
Example #16
0
    def to_es_filter(self):
        if self.value is None:
            return None

        return filters.date_range(self.filter.field, lt=self.value.startdate, gt=self.value.enddate)