in services/ui_backend_service/api/utils.py [0:0]
def pagination_query(request: web.BaseRequest, allowed_order: List[str] = [], allowed_group: List[str] = []):
# Page
try:
page = max(int(request.query.get("_page", 1)), 1)
except:
page = 1
# Limit
try:
# Default limit is 10, maximum is 1000
limit = min(int(request.query.get("_limit", 10)), 1000)
except:
limit = 10
# Group limit
try:
# default rows per group 10. Cap at 1000
group_limit = min(int(request.query.get("_group_limit", 10)), 1000)
except:
group_limit = 10
# Offset
offset = limit * (page - 1)
# Order by
try:
_order = request.query.get("_order")
if _order is not None:
_orders = []
for order in _order.split(","):
if order.startswith("+"):
column = order[1:]
direction = "ASC"
elif order.startswith("-"):
column = order[1:]
direction = "DESC"
else:
column = order
direction = "DESC"
if column in allowed_order:
_orders.append("\"{}\" {}".format(column, direction))
order = _orders
else:
order = None
except:
order = None
# Grouping (partitioning)
# Allows single or multiple grouping rules (nested grouping)
# Limits etc. will be applied to each group
_group = request.query.get("_group")
if _group is not None:
groups = []
for g in _group.split(","):
if g in allowed_group:
groups.append("\"{}\"".format(g))
else:
groups = None
return page, limit, offset, \
order if order else None, \
groups if groups else None, \
group_limit