diff options
Diffstat (limited to 'ishtar_common/views.py')
| -rw-r--r-- | ishtar_common/views.py | 65 | 
1 files changed, 54 insertions, 11 deletions
| diff --git a/ishtar_common/views.py b/ishtar_common/views.py index d8c5b1997..bae1c8464 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,13 +968,50 @@ 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) +        else: +            orders = [] +            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: +                items = items.order_by(*orders) + +        """          elif q and q in request_keys:              ks = request_keys[q]              if type(ks) not in (list, tuple): @@ -996,24 +1036,27 @@ def get_item(model, func_name, default_name, extra_request_keys=[],              if not manual_sort_key and model._meta.ordering:                  orders = [sign + k for k in model._meta.ordering]                  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() | 
