summaryrefslogtreecommitdiff
path: root/ishtar_common/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r--ishtar_common/views.py100
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):