diff options
Diffstat (limited to 'ishtar_common/views.py')
| -rw-r--r-- | ishtar_common/views.py | 142 | 
1 files changed, 103 insertions, 39 deletions
| diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 613e02a61..8db0e9460 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -204,7 +204,9 @@ account_deletion_wizard = wizards.IshtarUserDeletionWizard.as_view(      url_name='account_deletion',) -def get_autocomplete_generic(model, extra={'available': True}): +def get_autocomplete_generic(model, extra=None): +    if not extra: +        extra = {'available': True}      def func(request):          q = request.GET.get('term')          query = Q(**extra) @@ -281,10 +283,18 @@ def shortcut_menu(request):              if 'SHORTCUT_SHOW' in request.session else 'on'          } +        current_selected_labels = []          for lbl, model in CURRENT_ITEMS:              model_name = model.SLUG              current = model_name in request.session \                  and request.session[model_name] +            if current: +                try: +                    item = model.objects.get(pk=int(current)) +                    item_label = shortify(unicode(item), 60) +                    current_selected_labels.append(item_label) +                except model.DoesNotExist: +                    pass              dct['menu'].append((                  lbl, model_name, current or 0,                  JQueryAutoComplete( @@ -292,6 +302,7 @@ def shortcut_menu(request):                      model).render(                          model.SLUG + '-shortcut', value=current,                          attrs={'id': 'current_' + model.SLUG}))) +        dct['current_selected_labels'] = current_selected_labels          return render(              request, 'ishtar/blocks/advanced_shortcut_menu.html', dct          ) @@ -300,7 +311,9 @@ def shortcut_menu(request):          'SHORTCUT_SHOW': request.session['SHORTCUT_SHOW']          if 'SHORTCUT_SHOW' in request.session else 'off'      } +    current_selected_labels = []      current_selected_item = {} +    labels = {}      for lbl, model in CURRENT_ITEMS:          new_selected_item = None          model_name = model.SLUG @@ -308,6 +321,7 @@ def shortcut_menu(request):          current = model_name in request.session and request.session[model_name]          items = []          current_items = [] +        labels[model_name] = {}          for item, shortmenu_class in model.get_owns(                  request.user, menu_filtr=current_selected_item, limit=100,                  values=['id', 'cached_label'], get_short_menu_class=True): @@ -319,17 +333,21 @@ def shortcut_menu(request):                  continue              current_items.append(pk)              selected = pk == current +            item_label = shortify(item['cached_label'], 60)              if selected:                  cls = shortmenu_class                  new_selected_item = pk -            items.append((pk, shortify(item['cached_label'], 60), +            labels[model_name][str(pk)] = item_label +            items.append((pk, item_label,                            selected, shortmenu_class))          # selected is not in owns - add it to the list          if not new_selected_item and current:              try:                  item = model.objects.get(pk=int(current))                  new_selected_item = item.pk -                items.append((item.pk, shortify(unicode(item), 60), +                item_label = shortify(unicode(item), 60) +                labels[model_name][str(item.pk)] = item_label +                items.append((item.pk, item_label,                                True, item.get_short_menu_class(item.pk)))              except (model.DoesNotExist, ValueError):                  pass @@ -337,8 +355,13 @@ def shortcut_menu(request):              dct['current_menu'].append((lbl, model_name, cls, items))          if new_selected_item:              current_selected_item[model_name] = new_selected_item +            if str(new_selected_item) in labels[model_name]: +                current_selected_labels.append( +                    labels[model_name][str(new_selected_item)]) +    dct['current_selected_labels'] = current_selected_labels      return render(request, 'ishtar/blocks/shortcut_menu.html', dct) +  CURRENT_ITEM_KEYS = (('file', File),                       ('operation', Operation),                       ('contextrecord', ContextRecord), @@ -585,6 +608,7 @@ def format_val(val):          val = val.decode('utf-8')      return unicode(val) +  HIERARCHIC_LEVELS = 5  HIERARCHIC_FIELDS = ['periods', 'period', 'unit', 'material_types',                       'material_type', 'conservatory_state', 'object_types'] @@ -607,6 +631,11 @@ def _get_values(request, val):      return new_vals +DEFAULT_ROW_NUMBER = 10 +# length is used by ajax DataTables requests +EXCLUDED_FIELDS = ['length'] + +  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=[], @@ -699,6 +728,24 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          request_keys.update(my_extra_request_keys)          request_items = request.method == 'POST' and request.POST \              or request.GET + +        # pager +        try: +            row_nb = int(request_items.get('length')) +        except (ValueError, TypeError): +            row_nb = DEFAULT_ROW_NUMBER +        dct_request_items = {} + +        # filter requested fields +        for k in request_items: +            if k in EXCLUDED_FIELDS: +                continue +            key = k[:] +            if key.startswith('searchprefix_'): +                key = key[len('searchprefix_'):] +            dct_request_items[key] = request_items[k] +        request_items = dct_request_items +          dct = my_base_request          if full == 'shortcut':              dct['cached_label__icontains'] = request.GET.get('term', None) @@ -965,55 +1012,68 @@ 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: +                    ks = request_keys[k] +                    if type(ks) not in (tuple, list): +                        ks = [ks] +                    for k in ks: +                        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')) -        except (ValueError, TypeError): -            row_nb = None -        if row_nb: +        if row_nb and data_type == "json":              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 +1204,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 +1321,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'): @@ -1494,6 +1556,7 @@ def dashboard_main(request, dct, obj_id=None, *args, **kwargs):      dct = {'app_list': app_list}      return render(request, 'ishtar/dashboards/dashboard_main.html', dct) +  DASHBOARD_FORMS = {      'files': DashboardFormFile, 'operations': DashboardFormOpe,      'treatments': DashboardTreatmentForm, @@ -1628,6 +1691,7 @@ def merge_action(model, form, key):      return merge +  person_merge = merge_action(models.Person, forms.MergePersonForm, 'person')  organization_merge = merge_action(      models.Organization, | 
