From 4b1349b748e8dbd1ace541cc55562dba6bd9fe6f Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 6 Oct 2015 00:31:12 +0200 Subject: Specific context record table for operation window --- ishtar_common/templatetags/window_tables.py | 8 ++- ishtar_common/views.py | 92 +++++++++++++++++++---------- ishtar_common/widgets.py | 11 +++- 3 files changed, 74 insertions(+), 37 deletions(-) (limited to 'ishtar_common') diff --git a/ishtar_common/templatetags/window_tables.py b/ishtar_common/templatetags/window_tables.py index 36d9dd236..0b744c1e5 100644 --- a/ishtar_common/templatetags/window_tables.py +++ b/ishtar_common/templatetags/window_tables.py @@ -28,6 +28,9 @@ try: ContextRecordSource ASSOCIATED_MODELS['context_records'] = (ContextRecord, 'get-contextrecord', 'get-contextrecord-full') + ASSOCIATED_MODELS['context_records_for_ope'] = ( + ContextRecord, + 'get-contextrecord-for-ope', 'get-contextrecord-full') ASSOCIATED_MODELS['context_records_docs'] = (ContextRecordSource, 'get-contextrecordsource', '') except: @@ -41,9 +44,10 @@ except: @register.inclusion_tag('ishtar/blocks/window_tables/dynamic_documents.html') -def dynamic_table_document(caption, associated_model, key, value): +def dynamic_table_document(caption, associated_model, key, value, + table_cols='TABLE_COLS'): model, url, url_full = ASSOCIATED_MODELS[associated_model] - grid = JQueryJqGrid(None, None, model) + grid = JQueryJqGrid(None, None, model, table_cols=table_cols) source = unicode(reverse_lazy(url)) source_full = unicode(reverse_lazy(url_full)) if url_full else '' source_attrs = '?{}={}'.format(key, value) diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 81f394bbb..10c62d465 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -303,7 +303,7 @@ PRIVATE_FIELDS = ('id', 'history_modifier', 'order') def get_item(model, func_name, default_name, extra_request_keys=[], base_request={}, bool_fields=[], reversed_bool_fields=[], dated_fields=[], associated_models=[], relative_session_names={}, - specific_perms=[]): + specific_perms=[], own_table_cols=None): """ Generic treatment of tables """ @@ -441,9 +441,12 @@ def get_item(model, func_name, default_name, extra_request_keys=[], 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 + if own_table_cols: + table_cols = own_table_cols + else: + 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') @@ -461,9 +464,11 @@ def get_item(model, func_name, default_name, extra_request_keys=[], orders.append(sign + k) items = items.order_by(*orders) elif q: - for k in table_cols: - if k.endswith(q): - manual_sort_key = k + for ke in table_cols: + if type(ke) in (list, tuple): + ke = ke[0] + if ke.endswith(q): + manual_sort_key = ke break if not manual_sort_key and model._meta.ordering: orders = [sign + k for k in model._meta.ordering] @@ -494,33 +499,53 @@ def get_item(model, func_name, default_name, extra_request_keys=[], items = [item.get_previous(old) for item in items] for item in items: data = [item.pk] - for k in table_cols: - vals = [item] - for ky in k.split('.'): - new_vals = [] - for val in vals: - if hasattr(val, 'all'): # manage related objects - val = list(val.all()) - for v in val: - new_vals.append(getattr(v, ky)) - elif val: - new_vals.append(getattr(val, ky)) - vals = new_vals - # manage last related objects - if vals and hasattr(vals[0], 'all'): - new_vals = [] - for val in vals: - new_vals += list(val.all()) - vals = new_vals - data.append(", ".join([format_val(v) for v in vals]) or u"") + for keys in table_cols: + if type(keys) not in (list, tuple): + keys = [keys] + my_vals = [] + for k in keys: + vals = [item] + for ky in k.split('.'): + new_vals = [] + for val in vals: + if hasattr(val, 'all'): # manage related objects + val = list(val.all()) + for v in val: + new_vals.append(getattr(v, ky)) + elif val: + new_vals.append(getattr(val, ky)) + vals = new_vals + # manage last related objects + if vals and hasattr(vals[0], 'all'): + new_vals = [] + for val in vals: + new_vals += list(val.all()) + vals = new_vals + if not my_vals: + my_vals = [format_val(v) for v in vals] + else: + new_vals = [] + for idx, v in enumerate(vals): + new_vals.append("{}{}{}".format( + my_vals[idx], settings.JOINT, format_val(v))) + my_vals = new_vals[:] + data.append(", ".join(my_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 = list(datas)[start:end] + idx_col = None + if manual_sort_key in table_cols: + idx_col = table_cols.index(manual_sort_key) + 1 + else: + for idx, col in enumerate(table_cols): + if type(col) in (list, tuple) and \ + manual_sort_key in col: + idx_col = idx + 1 + if idx_col is not None: + datas = sorted(datas, key=lambda x: x[idx_col]) + if sign == '-': + datas = reversed(datas) + datas = list(datas)[start:end] link_template = "%s" % \ (unicode(_("Details"))) @@ -537,7 +562,10 @@ def get_item(model, func_name, default_name, extra_request_keys=[], res = {'id': data[0], 'link': lnk} for idx, value in enumerate(data[1:]): if value: - res[table_cols[idx].split('.')[-1]] = value + table_col = table_cols[idx] + if type(table_col) in (list, tuple): + table_col = table_col[0] + res[table_col.split('.')[-1]] = value rows.append(res) data = json.dumps({ "records": items_nb, diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 6ffb84084..509907034 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -528,22 +528,27 @@ class JQueryJqGrid(forms.RadioSelect): col_names, extra_cols = [], [] for field_name in getattr(self.associated_model, self.table_cols): field = self.associated_model + if type(field_name) in (list, tuple): + field_name = field_name[0] + field_verbose_names = [] keys = field_name.split('.') field_verbose_name = "" for key in keys: - if hasattr(field, 'rel'): + if hasattr(field, 'rel') and field.rel: field = field.rel.to try: field = field._meta.get_field(key) field_verbose_name = field.verbose_name field_name = field.name - except fields.FieldDoesNotExist: + except (fields.FieldDoesNotExist, AttributeError): if hasattr(field, key + '_lbl'): field_name = key field_verbose_name = getattr(field, key + '_lbl') else: continue - col_names.append(u'"%s"' % field_verbose_name) + field_verbose_names.append(unicode(field_verbose_name)) + col_names.append(u'"%s"' % settings.JOINT.join( + [f for f in field_verbose_names if f])) extra_cols.append(self.COL_TPL % {'idx': field_name}) col_names = col_names and ", ".join(col_names) or "" extra_cols = extra_cols and ", ".join(extra_cols) or "" -- cgit v1.2.3