示例#1
0
    def get_search_query(self):
        '''Create search request'''
        queries = []
        _column_names = [
            d['data'] for d in self.columns
            if d['data'] in self.field_type_dict.keys()
        ]
        # global search for all columns
        if self.search_string:
            for col in _column_names:
                _q = self.search_string
                _obj = self.query_by_col_type(_q, col)
                queries += _obj

        # search by specific columns
        _own_col_q = []
        for column_search in self.dt_column_search:
            col = column_search['column']
            term = column_search['value']
            _obj = self.query_by_col_type(term, col)
            _own_col_q += _obj

        if self.q_obj:
            queries.append(self.q_obj)

        _search_query = QCombination(QCombination.OR, queries)
        if _own_col_q:
            _own_col_q = QCombination(QCombination.AND, _own_col_q)
            _search_query = (_search_query & _own_col_q)

        if self.custom_filter:
            _search_query = (_search_query & Q(**self.custom_filter))

        return _search_query
示例#2
0
 def get_query(document, fields, is_and=True):
     filds_name = [f.name for f in fields]
     queries = map(
         lambda i: Q(**{i[0]: i[1]}),
         [d for d in document._data.items() if d[0] in filds_name])
     query = QCombination(QCombination.AND, queries)
     if not is_and:
         query = QCombination(QCombination.OR, queries)
     return query
示例#3
0
    def get_users(user_ids=[],
                  emails=[],
                  query='',
                  page=None,
                  limit=None,
                  paginate=True,
                  data_objects=False):
        """
        :param page: page number
        :param limit: no of results per page
        :param query: query string
        :param user_ids: List of ad IDs
        :param emails: List of emails
        :param paginate: Boolean, to return paginated results if true
        :param data_objects: Boolean, to return queryset
        :return: Returns users filtered on the requirement in the specified format
        """
        if user_ids:
            users = User.objects.filter(id__in=user_ids, deleted=False)
        else:
            match_case_query = [Q(deleted=False)]
            if emails:
                match_case_query.append(Q(email__in=emails))

            match_query = QCombination(QCombination.AND, match_case_query)
            users = User.objects.filter((Q(name__icontains=query)
                                         | Q(email__icontains=query))
                                        & match_query).order_by('-created_at')

        if data_objects:
            return users  # Returns QuerySet
        if not paginate:
            return {"data": [instance.to_dict() for instance in list(users)]}
        else:
            users = users.paginate(page=page, per_page=limit)
            return {
                "data": [instance.to_dict() for instance in users.items],
                "current_page": users.page,
                "total_pages_for_query": users.pages,
                "item_per_page": users.per_page,
                "total_records": users.total,
                "next_num": users.next_num,
                "prev_num": users.prev_num,
                "has_next": users.has_next,
                "has_prev": users.has_prev
            }
示例#4
0
    def find_user(self, case_insensitive=False, **kwargs):
        from mongoengine.queryset.visitor import Q, QCombination
        from mongoengine.errors import ValidationError

        try:
            if case_insensitive:
                # While it is of course possible to pass in multiple keys to filter on
                # that isn't the normal use case. If caller asks for case_insensitive
                # AND gives multiple keys - throw an error.
                if len(kwargs) > 1:
                    raise ValueError("Case insensitive option only supports single key")
                attr, identifier = kwargs.popitem()
                query = {f"{attr}__iexact": identifier}
                return self.user_model.objects(**query).first()
            else:
                queries = map(lambda i: Q(**{i[0]: i[1]}), kwargs.items())
                query = QCombination(QCombination.AND, queries)
                return self.user_model.objects(query).first()
        except ValidationError:  # pragma: no cover
            return None
 def get_query(self, years):
     queries = [Q(**{HospitalDischargeDocument.discharge_year.name: y}) for y in years]
     result = QCombination(QCombination.OR, queries)
     return result