diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-09-05 00:02:51 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-09-05 00:02:51 +0200 |
commit | a8e6fe14ec995bcfb333e69e5dfebfd8e2951ba3 (patch) | |
tree | c736a00ded1434d8dd0b1da77be0402f44f9037b /ishtar_common/views.py | |
parent | 000aecd21076875aa0cc732a93a61b9e8a8dfed0 (diff) | |
download | Ishtar-a8e6fe14ec995bcfb333e69e5dfebfd8e2951ba3.tar.bz2 Ishtar-a8e6fe14ec995bcfb333e69e5dfebfd8e2951ba3.zip |
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.
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 29 |
1 files changed, 23 insertions, 6 deletions
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 = "<a href='#' onclick='load_window(\"%%s\")'>%s</a>" % \ (unicode(_("Details"))) if data_type == "json": |