Beispiel #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)))
Beispiel #2
0
 def to_es_filter(self):
     if self.show_all:
         return None
     if self.is_null:
         return filters.missing(self.filter.field)
     terms = [v.value for v in self.value]
     return filters.term(self.filter.field, terms)
Beispiel #3
0
 def to_es_filter(self):
     if self.show_all:
         return None
     if self.is_null:
         return filters.missing(self.filter.field)
     terms = [v.value for v in self.value]
     return filters.term(self.filter.field, terms)
Beispiel #4
0
 def to_es_filter(self):
     if self.show_all:
         return None
     if self.is_null:
         return filters.OR(
             *[filters.missing(field) for field in self.filter['fields']])
     terms = [v.value for v in self.value]
     return filters.OR(*[filters.term(self.filter['field'], terms)])
Beispiel #5
0
def get_last_form_submissions_by_user(domain, user_ids, app_id=None):

    missing_users = None in user_ids

    user_ids = filter(None, user_ids)

    if not missing_users:
        user_filter = user_id_filter(user_ids)
    else:
        user_filter = filters.OR(
            user_id_filter(user_ids),
            filters.missing('form.meta.userID'),
        )

    query = (
        FormES()
        .domain(domain)
        .filter(user_filter)
        .remove_default_filter('has_user')
        .aggregation(
            TermsAggregation('user_id', 'form.meta.userID').aggregation(
                TopHitsAggregation(
                    'top_hits_last_form_submissions',
                    'received_on',
                    is_ascending=False,
                )
            )
        )
        .size(0)
    )

    if app_id:
        query = query.app(app_id)

    result = {}
    if missing_users:
        query = query.aggregation(
            MissingAggregation('missing_user_id', 'form.meta.userID').aggregation(
                TopHitsAggregation(
                    'top_hits_last_form_submissions',
                    'received_on',
                    is_ascending=False,
                )
            )
        )

    aggregations = query.run().aggregations

    if missing_users:
        result[MISSING_KEY] = aggregations.missing_user_id.bucket.top_hits_last_form_submissions.hits

    buckets_dict = aggregations.user_id.buckets_dict
    for user_id, bucket in buckets_dict.iteritems():
        result[user_id] = bucket.top_hits_last_form_submissions.hits

    return result
Beispiel #6
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)
Beispiel #7
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'])
Beispiel #8
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)
Beispiel #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, domains_submitted_today))
Beispiel #10
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))
    )