summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commitb91bb6906160f007da0235dad4c6fb0b5172affa (patch)
treec736a00ded1434d8dd0b1da77be0402f44f9037b
parentb585ea7210cca61558c7130af5fa33083cbc25a4 (diff)
downloadIshtar-b91bb6906160f007da0235dad4c6fb0b5172affa.tar.bz2
Ishtar-b91bb6906160f007da0235dad4c6fb0b5172affa.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.
-rw-r--r--ishtar_common/views.py29
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":