From a8e6fe14ec995bcfb333e69e5dfebfd8e2951ba3 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 5 Sep 2013 00:02:51 +0200 Subject: Better management of table sort (refs #1301) If the database sort doesn't work a python sort is operated. Far more inefficient (especially as all data are queried) but a fallback mode to do the job. --- ishtar_common/views.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'ishtar_common/views.py') diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 0aa10de93..4d746ba62 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -271,7 +271,14 @@ def get_item(model, func_name, default_name, extra_request_keys=[], items = model.objects.filter(query).distinct() q = request_items.get('sidx') + # table cols + table_cols = full and [field.name for field in model._meta.fields + if field.name not in PRIVATE_FIELDS] \ + or model.TABLE_COLS # manage sort tables + manual_sort_key = None + order = request_items.get('sord') + sign = order and order == u'desc' and "-" or '' if q and q in request_keys: ks = request_keys[q] if type(ks) not in (list, tuple): @@ -280,12 +287,15 @@ def get_item(model, func_name, default_name, extra_request_keys=[], for k in ks: if k.endswith("__pk"): k = k[:-len("__pk")] + "__label" - q = request_items.get('sord') - sign = q and q == u'desc' and "-" or '' if '__' in k: k = k.split('__')[0] orders.append(sign+k) items = items.order_by(*orders) + elif q: + for k in table_cols: + if k.endswith(q): + manual_sort_key = k + break # pager management start, end = 0, None @@ -303,14 +313,14 @@ def get_item(model, func_name, default_name, extra_request_keys=[], start = (page_nb-1)*row_nb end = page_nb*row_nb items_nb = items.count() - items = items[start:end] + if manual_sort_key: + items = items.all() + else: + items = items[start:end] datas = [] if old: items = [item.get_previous(old) for item in items] - table_cols = full and [field.name for field in model._meta.fields - if field.name not in PRIVATE_FIELDS] \ - or model.TABLE_COLS for item in items: data = [item.pk] for k in table_cols: @@ -332,6 +342,13 @@ def get_item(model, func_name, default_name, extra_request_keys=[], vals = new_vals data.append(", ".join([format_val(v) for v in vals]) or u"") datas.append(data) + if manual_sort_key: + # +1 because the id is added as a first col + idx_col = table_cols.index(manual_sort_key) + 1 + datas = sorted(datas, key=lambda x:x[idx_col]) + if sign == '-': + datas = reversed(datas) + datas = datas[start:end] link_template = "%s" % \ (unicode(_("Details"))) if data_type == "json": -- cgit v1.2.3