summaryrefslogtreecommitdiff
path: root/ishtar_common/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r--ishtar_common/views.py85
1 files changed, 52 insertions, 33 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index d8c5b1997..cc2443f80 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -607,6 +607,9 @@ def _get_values(request, val):
return new_vals
+DEFAULT_ROW_NUMBER = 10
+
+
def get_item(model, func_name, default_name, extra_request_keys=[],
base_request=None, bool_fields=[], reversed_bool_fields=[],
dated_fields=[], associated_models=[], relative_session_names=[],
@@ -965,55 +968,69 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
# manage sort tables
manual_sort_key = None
- order = request_items.get('sord')
- sign = order and order == u'desc' and "-" or ''
- q = request_items.get('sidx')
- if q == '__default__' and model._meta.ordering:
- orders = [sign + k for k in model._meta.ordering]
+ sorts = {}
+ for k in request_items:
+ if not k.startswith('order['):
+ continue
+ num = int(k.split(']')[0][len("order["):])
+ if num not in sorts:
+ sorts[num] = ['', ''] # sign, col_num
+ if k.endswith('[dir]'):
+ order = request_items[k]
+ sign = order and order == u'desc' and "-" or ''
+ sorts[num][0] = sign
+ if k.endswith('[column]'):
+ sorts[num][1] = request_items[k]
+ sign = ""
+ if not sorts and model._meta.ordering:
+ orders = [k for k in model._meta.ordering]
items = items.order_by(*orders)
- elif q and q in request_keys:
- ks = request_keys[q]
- if type(ks) not in (list, tuple):
- ks = [ks]
+ else:
orders = []
- for k in ks:
- if k.endswith("__pk"):
- k = k[:-len("__pk")] + "__label"
- if '__' in k:
- k = k.split('__')[0]
- orders.append(sign + k)
- items = items.order_by(*orders)
- elif q:
- for ke in query_table_cols:
- if type(ke) in (list, tuple):
- ke = ke[0]
- if ke.endswith(q):
- manual_sort_key = ke
- logger.warning("**WARN get_item - {}**: manual sort key '{"
- "}'".format(func_name, q))
+ for idx in sorted(sorts.keys()):
+ signe, col_num = sorts[idx]
+ k = query_table_cols[int(col_num) - 2] # remove id and link col
+ if k in request_keys:
+ k = request_keys[k]
+ if k.endswith("__pk"):
+ k = k[:-len("__pk")] + "__label"
+ if '__' in k:
+ k = k.split('__')[0]
+ orders.append(signe + k)
+ else:
+ # not a standard request key
+ if idx: # not the first - we ignore this sort
+ continue
+ sign = signe
+ manual_sort_key = k
+ logger.warning(
+ "**WARN get_item - {}**: manual sort key '{}'".format(
+ func_name, k))
break
- if not manual_sort_key and model._meta.ordering:
- orders = [sign + k for k in model._meta.ordering]
+ if not manual_sort_key:
items = items.order_by(*orders)
+
# pager management
start, end = 0, None
page_nb = 1
try:
- row_nb = int(request_items.get('rows'))
+ row_nb = int(request_items.get('length'))
except (ValueError, TypeError):
- row_nb = None
+ row_nb = DEFAULT_ROW_NUMBER
if row_nb:
try:
- page_nb = int(request_items.get('page'))
+ start = int(request_items.get('start'))
+ page_nb = start / row_nb + 1
assert page_nb >= 1
- except (ValueError, AssertionError):
- pass
- start = (page_nb - 1) * row_nb
+ except (TypeError, ValueError, AssertionError):
+ start = 0
+ page_nb = 1
end = page_nb * row_nb
if full == 'shortcut':
start = 0
end = 20
+
items_nb = items.count()
if manual_sort_key:
items = items.all()
@@ -1144,7 +1161,8 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
data = json.dumps(rows)
else:
data = json.dumps({
- "records": items_nb,
+ "recordsTotal": items_nb,
+ "recordsFiltered": items_nb,
"rows": rows,
"pinned-search": pinned_search,
"page": page_nb,
@@ -1260,6 +1278,7 @@ def show_item(model, name, extra_dct=None):
date = None
if 'date' in dct:
date = dct.pop('date')
+ dct['sheet_id'] = "%s-%d" % (name, item.pk)
dct['window_id'] = "%s-%d-%s" % (
name, item.pk, datetime.datetime.now().strftime('%M%s'))
if hasattr(item, 'history'):