diff options
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 65 |
1 files changed, 54 insertions, 11 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py index d8c5b1997..bae1c8464 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,13 +968,50 @@ 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) + else: + orders = [] + 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: + items = items.order_by(*orders) + + """ elif q and q in request_keys: ks = request_keys[q] if type(ks) not in (list, tuple): @@ -996,24 +1036,27 @@ def get_item(model, func_name, default_name, extra_request_keys=[], if not manual_sort_key and model._meta.ordering: orders = [sign + k for k in model._meta.ordering] 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() |