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
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