summaryrefslogtreecommitdiff
path: root/ishtar_common/views_item.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2023-01-10 13:08:48 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2023-01-12 09:50:56 +0100
commit061edbaac5a37b8e717391c3b7d804a96c041979 (patch)
tree79a9647f9e8563d44d08123dd4844a249001e63a /ishtar_common/views_item.py
parentac839d9481b863c93a9c0f92011118bb581f7c2d (diff)
downloadIshtar-061edbaac5a37b8e717391c3b7d804a96c041979.tar.bz2
Ishtar-061edbaac5a37b8e717391c3b7d804a96c041979.zip
Syndication - export external sources
Diffstat (limited to 'ishtar_common/views_item.py')
-rw-r--r--ishtar_common/views_item.py51
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