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 | b91bb6906160f007da0235dad4c6fb0b5172affa (patch) | |
| tree | c736a00ded1434d8dd0b1da77be0402f44f9037b /ishtar_common/views.py | |
| parent | b585ea7210cca61558c7130af5fa33083cbc25a4 (diff) | |
| download | Ishtar-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.
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": | 
