-
Notifications
You must be signed in to change notification settings - Fork 0
/
ordering.py
40 lines (27 loc) · 1.01 KB
/
ordering.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from sqlalchemy import desc
from nanohttp import context
class OrderingMixin:
@classmethod
def _sort_by_key_value(cls, query, column, descending=False):
expression = column
if column.info.get('collation'):
expression = expression.collate(column.info['collation'])
if descending:
expression = desc(expression)
return query.order_by(expression)
@classmethod
def sort_by_request(cls, query=None):
# noinspection PyUnresolvedReferences
query = query or cls.query
sort_exp = context.query.get('sort', '').strip()
if not sort_exp:
return query
sort_columns = [
(c[1:] if c.startswith('-') else c, c.startswith('-'))
for c in sort_exp.split(',')
]
# noinspection PyUnresolvedReferences
criteria = cls.create_sort_criteria(sort_columns)
for criterion in criteria:
query = cls._sort_by_key_value(query, *criterion)
return query