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 |