diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-03-09 23:08:51 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-03-09 23:08:51 +0100 | 
| commit | c2d86b659a9ad00b1e2cb0485e1310504c8fd03c (patch) | |
| tree | d95d1ca9e9971b465f235cbb86091cd2cf3c7325 /ishtar_common/views.py | |
| parent | 1c381564ea9ed133f73e0b330468b204e7a034f1 (diff) | |
| parent | 53f0a5c95c34c0db67528422583dc3e90f20f705 (diff) | |
| download | Ishtar-c2d86b659a9ad00b1e2cb0485e1310504c8fd03c.tar.bz2 Ishtar-c2d86b659a9ad00b1e2cb0485e1310504c8fd03c.zip | |
Merge branch 'master' into v0.9
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): | 
