diff options
Diffstat (limited to 'ishtar_common/views_item.py')
| -rw-r--r-- | ishtar_common/views_item.py | 51 | 
1 files changed, 51 insertions, 0 deletions
| diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index ce70559f9..673ffb46a 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -1428,6 +1428,7 @@ def _get_data_from_query(items, query_table_cols, extra_request_keys,      if hasattr(items.model, "locked"):          values.append("locked")          values.append("lock_user_id") +    values = [v for v in values if v]  # filter empty values      return items.values_list(*values) @@ -2591,3 +2592,53 @@ def get_distant_item(request, model, external_source_id, data_type=None):                  if "link" in row:                      row["link"] = row["link"].replace(str(idx), source_id)      return HttpResponse(json.dumps(dct), content_type="application/json") + + +def external_export(request, source_id, model_name, slug): +    external_sources = request.session.get("EXTERNAL_SOURCES", {}) +    url = None +    for source in external_sources: +        try: +            src_id, __ = source.split("||") +            src_id = int(src_id) +        except ValueError: +            continue +        if src_id != source_id: +            continue +        for model in external_sources[source]: +            if model_name == model.split("-")[-1]: +                url = reverse("api-export-" + model_name, args=[slug]) + +    if not url: +        return HttpResponse('Unauthorized', status=401) + +    try: +        src = models_rest.ApiExternalSource.objects.get(pk=source_id) +    except (models_rest.ApiExternalSource.DoesNotExist, ValueError): +        return HttpResponse('Unauthorized', status=401) + +    url = src.url + url +    try: +        response = requests.get( +            url, +            params=request.GET, +            timeout=20, +            headers={"Authorization": f"Token {src.key}"}, +        ) +    except requests.exceptions.Timeout: +        return HttpResponse('Gateway Timeout', status=504) +    if response.status_code != 200: +        lbl = { +            401: "Unauthorized", +            404: "Page not found", +            500: "Server error", +        } +        lbl = lbl[response.status_code] \ +            if response.status_code in lbl else "Unknown error" +        return HttpResponse(lbl, status=response.status_code) + +    response = HttpResponse(response.text, content_type="text/csv") +    n = datetime.datetime.now() +    filename = f"{model_name}-{n.strftime('%Y%m%d-%H%M%S')}.csv" +    response["Content-Disposition"] = "attachment; filename=%s" % filename +    return response | 
