diff options
Diffstat (limited to 'ishtar_common/views.py')
| -rw-r--r-- | ishtar_common/views.py | 85 | 
1 files changed, 52 insertions, 33 deletions
| diff --git a/ishtar_common/views.py b/ishtar_common/views.py index d8c5b1997..cc2443f80 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,55 +968,69 @@ 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) -        elif q and q in request_keys: -            ks = request_keys[q] -            if type(ks) not in (list, tuple): -                ks = [ks] +        else:              orders = [] -            for k in ks: -                if k.endswith("__pk"): -                    k = k[:-len("__pk")] + "__label" -                if '__' in k: -                    k = k.split('__')[0] -                orders.append(sign + k) -            items = items.order_by(*orders) -        elif q: -            for ke in query_table_cols: -                if type(ke) in (list, tuple): -                    ke = ke[0] -                if ke.endswith(q): -                    manual_sort_key = ke -                    logger.warning("**WARN get_item - {}**: manual sort key '{" -                                   "}'".format(func_name, q)) +            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 and model._meta.ordering: -                orders = [sign + k for k in model._meta.ordering] +            if not manual_sort_key:                  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() @@ -1144,7 +1161,8 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                  data = json.dumps(rows)              else:                  data = json.dumps({ -                    "records": items_nb, +                    "recordsTotal": items_nb, +                    "recordsFiltered": items_nb,                      "rows": rows,                      "pinned-search": pinned_search,                      "page": page_nb, @@ -1260,6 +1278,7 @@ def show_item(model, name, extra_dct=None):          date = None          if 'date' in dct:              date = dct.pop('date') +        dct['sheet_id'] = "%s-%d" % (name, item.pk)          dct['window_id'] = "%s-%d-%s" % (              name, item.pk, datetime.datetime.now().strftime('%M%s'))          if hasattr(item, 'history'): | 
