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)))
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)
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)])
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
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)
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'])
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)
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))
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)) )