diff options
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 100 |
1 files changed, 66 insertions, 34 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py index a4ad130be..18bdc6e36 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -563,7 +563,8 @@ def get_item(model, func_name, default_name, extra_request_keys=[], """ Generic treatment of tables """ - def func(request, data_type='json', full=False, force_own=False, **dct): + def func(request, data_type='json', full=False, force_own=False, + col_names=None, **dct): # check rights own = True # more restrictive by default allowed = False @@ -880,15 +881,23 @@ def get_item(model, func_name, default_name, extra_request_keys=[], else: table_cols = model.TABLE_COLS + query_table_cols = [] + for cols in table_cols: + if type(cols) not in (list, tuple): + cols = [cols] + for col in cols: + query_table_cols += col.split('|') + # contextual (full, simple, etc.) col contxt = full and 'full' or 'simple' if hasattr(model, 'CONTEXTUAL_TABLE_COLS') and \ contxt in model.CONTEXTUAL_TABLE_COLS: for idx, col in enumerate(table_cols): if col in model.CONTEXTUAL_TABLE_COLS[contxt]: - table_cols[idx] = model.CONTEXTUAL_TABLE_COLS[contxt][col] + query_table_cols[idx] = \ + model.CONTEXTUAL_TABLE_COLS[contxt][col] if full == 'shortcut': - table_cols = ['cached_label'] + query_table_cols = ['cached_label'] # manage sort tables manual_sort_key = None @@ -912,7 +921,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], orders.append(sign + k) items = items.order_by(*orders) elif q: - for ke in table_cols: + for ke in query_table_cols: if type(ke) in (list, tuple): ke = ke[0] if ke.endswith(q): @@ -957,7 +966,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], continue c_ids.append(item.pk) data = [item.pk] - for keys in table_cols: + for keys in query_table_cols: if type(keys) not in (list, tuple): keys = [keys] my_vals = [] @@ -987,12 +996,20 @@ def get_item(model, func_name, default_name, extra_request_keys=[], v = getattr(v, ky) if callable(v): v = v() + if hasattr(v, 'url'): + v = request.is_secure() and \ + 'https' or 'http' + '://' + \ + request.get_host() + v.url new_vals.append(v) elif val: try: val = getattr(val, ky) if callable(val): val = val() + if hasattr(val, 'url'): + val = request.is_secure() and \ + 'https' or 'http' + '://' + \ + request.get_host() + val.url new_vals.append(val) except AttributeError: # must be a query key such as "contains" @@ -1022,10 +1039,10 @@ def get_item(model, func_name, default_name, extra_request_keys=[], if manual_sort_key: # +1 because the id is added as a first col idx_col = None - if manual_sort_key in table_cols: - idx_col = table_cols.index(manual_sort_key) + 1 + if manual_sort_key in query_table_cols: + idx_col = query_table_cols.index(manual_sort_key) + 1 else: - for idx, col in enumerate(table_cols): + for idx, col in enumerate(query_table_cols): if type(col) in (list, tuple) and \ manual_sort_key in col: idx_col = idx + 1 @@ -1090,32 +1107,46 @@ def get_item(model, func_name, default_name, extra_request_keys=[], response['Content-Disposition'] = 'attachment; filename=%s'\ % filename writer = csv.writer(response, **CSV_OPTIONS) - col_names = [] - for field_name in table_cols: - if type(field_name) in (list, tuple): - field_name = u" & ".join(field_name) - if hasattr(model, 'EXTRA_FULL_FIELDS_LABELS') and\ - field_name in model.EXTRA_FULL_FIELDS_LABELS: - field = model.EXTRA_FULL_FIELDS_LABELS[field_name] - col_names.append(unicode(field).encode(ENCODING)) - continue - else: - try: - field = model._meta.get_field(field_name) - except: - col_names.append(u"".encode(ENCODING)) - logger.warning( - "**WARN get_item - csv export**: no col name for " - "{}\nadd explicit label to " - "EXTRA_FULL_FIELDS_LABELS attribute of " - "{}".format(field_name, model)) + if col_names: + col_names = [name.encode(ENCODING, errors='replace') + for name in col_names] + else: + col_names = [] + for field_name in table_cols: + if type(field_name) in (list, tuple): + field_name = u" & ".join(field_name) + if hasattr(model, 'EXTRA_FULL_FIELDS_LABELS') and\ + field_name in model.EXTRA_FULL_FIELDS_LABELS: + field = model.EXTRA_FULL_FIELDS_LABELS[field_name] + col_names.append(unicode(field).encode(ENCODING)) continue - col_names.append( - unicode(field.verbose_name).encode(ENCODING)) + else: + try: + field = model._meta.get_field(field_name) + except: + col_names.append(u"".encode(ENCODING)) + logger.warning( + "**WARN get_item - csv export**: no col name " + "for {}\nadd explicit label to " + "EXTRA_FULL_FIELDS_LABELS attribute of " + "{}".format(field_name, model)) + continue + col_names.append( + unicode(field.verbose_name).encode(ENCODING)) writer.writerow(col_names) for data in datas: - writer.writerow([val.encode(ENCODING, errors='replace') - for val in data[1:]]) + row, delta = [], 0 + # regroup cols with join "|" + for idx, col_name in enumerate(table_cols): + val = data[1:][idx + delta].encode( + ENCODING, errors='replace') + if "|" in col_name[0]: + for delta_idx in range(len(col_name[0].split('|')) - 1): + delta += 1 + val += data[1:][idx + delta].encode( + ENCODING, errors='replace') + row.append(val) + writer.writerow(row) return response return HttpResponse('{}', mimetype='text/plain') @@ -1131,15 +1162,16 @@ def get_by_importer(request, slug, data_type='json', full=False, res = '{}' return HttpResponse(res, mimetype='text/plain') imp = q.all()[0].get_importer_class() - cols = [] + cols, col_names = [], [] for formater in imp.LINE_FORMAT: if not formater: continue - cols.append(formater.field_name) + cols.append(formater.export_field_name) + col_names.append(formater.label) obj_name = imp.OBJECT_CLS.__name__.lower() return get_item( imp.OBJECT_CLS, 'get_' + obj_name, obj_name, own_table_cols=cols - )(request, data_type, full, force_own, **dct) + )(request, data_type, full, force_own, col_names=col_names, **dct) def display_item(model, name, extra_dct=None): |