diff options
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 85 |
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'): |