Exemple #1
0
 def apply_sort(self, query: ModelSelect, _sort: dict):
     for field, value in _sort.items():
         if value == 1:
             query = query.order_by(getattr(self.entity_class, field))
         elif value == -1:
             query = query.order_by(
                 getattr(self.entity_class, field).desc())
     return query
Exemple #2
0
def get_data_for_sending(query: ModelSelect, require_where=False):
    page, limit, where_count = 1, Config.DEFAULT_API_LIST_LIMIT, 0
    for arg_name, arg_value in request.args.items():
        if len(arg_value) == 0:
            continue
        if arg_name in ("order_by", "order_by_desc"):
            fields = get_fields_by_names(query.model, [arg_value])
            if len(fields) == 0:
                abort(400)
            field = fields[0] if "order_by" == arg_name else fields[0].desc()
            query = query.order_by(field)
        elif arg_name == "page":
            page = int(arg_value)
        elif arg_name == "limit":
            limit = int(arg_value)
            limit = limit if limit <= Config.MAX_API_LIST_LIMIT else Config.MAX_API_LIST_LIMIT
        elif arg_name.startswith("where:") or arg_name.startswith("or_where:"):
            operations = arg_name.split(":")
            is_or_where = operations[0] == "or_where"
            if len(operations) == 2:
                operator = "equal"
            else:
                operator = operations[1]
            fields = get_fields_by_names(query.model, [operations[-1]])
            if len(fields) == 0:
                abort(400)
            else:
                field = fields[0]
            expression = get_expression_by_operator(field, arg_value, operator)
            if expression is None:
                abort(400)
            if is_or_where:
                query = query.orwhere(expression)
            else:
                query = query.where(expression)
            where_count += 1
    if require_where and where_count == 0:
        abort(400)
    count = query.count()
    if count == 0:
        abort(404)
    pages_count = math.ceil(count / limit)
    data = [get_model_dict(sm) for sm in query.paginate(page, limit)]
    return {
        "data": data,
        "page": page,
        "pages": pages_count,
        "count": count,
        "limit": limit
    }
    def append_select(self, p_select: ModelSelect):
        if self.query_params.sort_direction == epl_imagery_pb2.ASCENDING:
            p_select = p_select.order_by(self.field)
        elif self.query_params.sort_direction == epl_imagery_pb2.DESCENDING:
            p_select = p_select.order_by(self.field.desc())

        if self.query_params.values or self.query_params.excluded_values:
            if self.query_params.values:
                p_select = p_select.where(
                    self.field << list(self.query_params.values))

            if self.query_params.excluded_values:
                p_select = p_select.where(
                    ~(self.field << list(self.query_params.excluded_values)))

        if self.query_params.include_ranges:
            p_select = p_select.where(
                self._append_ranges(self.query_params.include_ranges, False))
        if self.query_params.exclude_ranges:
            p_select = p_select.where(
                self._append_ranges(self.query_params.exclude_ranges, True))

        return p_select