Beispiel #1
0
 def user_query(self, pagination=True):
     mobile_user_and_group_slugs = set(
         # Cater for old ReportConfigs
         self.request.GET.getlist('location_restricted_mobile_worker') +
         self.request.GET.getlist(ExpandedMobileWorkerFilter.slug))
     user_query = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.request.couch_user,
     )
     user_query = (user_query.set_sorting_block(self.get_sorting_block()))
     if pagination:
         user_query = (user_query.size(self.pagination.count).start(
             self.pagination.start))
     if self.selected_app_id:
         # adding nested filter for reporting_metadata.last_submissions.app_id
         # and reporting_metadata.last_syncs.app_id when app is selected
         last_submission_filter = filters.nested(
             'reporting_metadata.last_submissions',
             filters.term('reporting_metadata.last_submissions.app_id',
                          self.selected_app_id))
         last_sync_filter = filters.nested(
             'reporting_metadata.last_syncs',
             filters.term("reporting_metadata.last_syncs.app_id",
                          self.selected_app_id))
         user_query = user_query.OR(last_submission_filter,
                                    last_sync_filter)
     return user_query
Beispiel #2
0
 def user_query(self, pagination=True):
     mobile_user_and_group_slugs = set(
         # Cater for old ReportConfigs
         self.request.GET.getlist('location_restricted_mobile_worker') +
         self.request.GET.getlist(ExpandedMobileWorkerFilter.slug)
     )
     user_query = ExpandedMobileWorkerFilter.user_es_query(
         self.domain,
         mobile_user_and_group_slugs,
         self.request.couch_user,
     )
     user_query = (user_query
                   .set_sorting_block(self.get_sorting_block()))
     if pagination:
         user_query = (user_query
                       .size(self.pagination.count)
                       .start(self.pagination.start))
     if self.selected_app_id:
         # adding nested filter for reporting_metadata.last_submissions.app_id
         # and reporting_metadata.last_syncs.app_id when app is selected
         last_submission_filter = filters.nested('reporting_metadata.last_submissions',
                                                 filters.term('reporting_metadata.last_submissions.app_id',
                                                              self.selected_app_id)
                                                 )
         last_sync_filter = filters.nested('reporting_metadata.last_syncs',
                                           filters.term("reporting_metadata.last_syncs.app_id",
                                                        self.selected_app_id)
                                           )
         user_query = user_query.OR(last_submission_filter,
                                    last_sync_filter
                                    )
     return user_query
Beispiel #3
0
def get_by_case_id_form_es_query(start, size, case_id):
    base_query = get_base_form_es_query(start, size)
    return (base_query.filter(
        filters.nested(
            'form.case',
            filters.OR(filters.term('form.case.@case_id', case_id),
                       filters.term('form.case.case_id', case_id)))))
def login_as_user_query(domain,
                        couch_user,
                        search_string,
                        limit,
                        offset,
                        user_data_fields=None):
    '''
    Takes in various parameters to determine which users to populate the login as screen.

    :param domain: String domain
    :param couch_user: The CouchUser that is using the Login As feature
    :param search_string: The query that filters the users returned. Filters based on the
        `search_fields` as well as any fields defined in `user_data_fields`.
    :param limit: The max amount of users returned.
    :param offset: From where to start the query.
    :param user_data_fields: A list of custom user data fields that should also be searched
        by the `search_string`

    :returns: An EsQuery instance.
    '''
    search_fields = [
        "base_username", "last_name", "first_name", "phone_numbers"
    ]

    should_criteria_query = [
        queries.search_string_query(search_string, search_fields),
    ]

    if user_data_fields:
        or_criteria = []
        for field in user_data_fields:
            or_criteria.append(
                filters.AND(
                    filters.term('user_data_es.key', field),
                    filters.term('user_data_es.value', search_string),
                ), )

        should_criteria_query.append(
            queries.nested_filter('user_data_es', filters.OR(*or_criteria)))

    user_es = (
        UserES().domain(domain).start(offset).size(limit).
        sort('username.exact').set_query(
            queries.BOOL_CLAUSE(
                queries.SHOULD_CLAUSE(
                    should_criteria_query,
                    # It should either match on the search fields like username or it
                    # should match on the custom user data fields. If this were 2, then
                    # it would require the search string to match both on the search fields and
                    # the custom user data fields.
                    minimum_should_match=1,
                ), )))

    if not couch_user.has_permission(domain, 'access_all_locations'):
        loc_ids = SQLLocation.objects.accessible_to_user(
            domain, couch_user).location_ids()
        user_es = user_es.location(list(loc_ids))

    if not couch_user.has_permission(
            domain, get_permission_name(Permissions.login_as_all_users)):
        user_es = user_es.filter(
            filters.nested(
                'user_data_es',
                filters.AND(
                    filters.term('user_data_es.key', 'login_as_user'),
                    filters.term('user_data_es.value', couch_user.username),
                )))
    return user_es.mobile_users()