diff options
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 125 |
1 files changed, 89 insertions, 36 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 613e02a61..e8a7efb40 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 DataTable call and can be ambiguous for some models +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,9 @@ 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 + request_items = dict( + [(k, request_items[k]) + for k in request_items if k not in EXCLUDED_FIELDS]) dct = my_base_request if full == 'shortcut': dct['cached_label__icontains'] = request.GET.get('term', None) @@ -965,55 +997,72 @@ 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')) + 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 +1193,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 +1310,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 +1545,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 +1680,7 @@ def merge_action(model, form, key): return merge + person_merge = merge_action(models.Person, forms.MergePersonForm, 'person') organization_merge = merge_action( models.Organization, |