From 4342d738112d4b6e70b091265fe6c7234cd7e1e7 Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Tue, 15 Jul 2025 16:11:21 -0500 Subject: [PATCH] Added initial CSV export functionality. --- inventory/routes/inventory.py | 35 ++++++++++++++++++++++++++++++++-- inventory/templates/table.html | 25 ++++++++++++++++++++---- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/inventory/routes/inventory.py b/inventory/routes/inventory.py index 2b63fd6..9359ec7 100644 --- a/inventory/routes/inventory.py +++ b/inventory/routes/inventory.py @@ -1,5 +1,10 @@ +import io +import csv +import base64 + import datetime from flask import request, render_template, url_for, jsonify +from sqlalchemy.inspection import inspect from . import main from .helpers import FILTER_MAP, inventory_headers, worklog_headers @@ -207,9 +212,35 @@ def delete_inventory_item(id): db.session.rollback() return jsonify({"success": False, "error": str(e)}), 400 -@main.route("/api/inventory/export", methods=["GET"]) +@main.route("/api/inventory/export", methods=["POST"]) def get_inventory_csv(): - return jsonify({"success": True}), 200 + data = request.get_json() + ids = data.get('ids', []) + + if not ids: + return jsonify({"success": False, "error": "No IDs provided"}), 400 + + rows = db.session.query(Inventory).filter(Inventory.id.in_(ids)).all() + + output = io.StringIO() + writer = csv.writer(output) + + model = Inventory + columns = [c.key for c in inspect(model).mapper.column_attrs] + + writer.writerow(columns) + + for item in rows: + writer.writerow([getattr(item, col) for col in columns]) + + csv_string = output.getvalue() + output.close() + + return jsonify({ + "success": True, + "csv": base64.b64encode(csv_string.encode()).decode(), + "count": len(rows) + }) @main.route("/inventory_available") def inventory_available(): diff --git a/inventory/templates/table.html b/inventory/templates/table.html index 7dd44b8..0211ca7 100644 --- a/inventory/templates/table.html +++ b/inventory/templates/table.html @@ -12,17 +12,34 @@ try { const response = await fetch('/api/{{ csv_route }}/export', { - method: "GET", + method: "POST", headers: { - "Content-Type": "application/json" + "Content-Type": "application/json", + "Accept": "application/json" }, body: JSON.stringify(payload) }); const result = await response.json(); - console.log(result); + + if (result.success) { + const decodedCsv = atob(result.csv); + const blob = new Blob([decodedCsv], { type: "text/csv" }); + const url = URL.createObjectURL(blob); + + const link = document.createElement("a"); + link.href = url; + link.download = "{{ csv_route }}_export.csv"; + link.click(); + + console.log(url); + + URL.revokeObjectURL(url); + } else { + renderToast({ message: `Export failed: ${result.error}` }); + } } catch (err) { - console.log(err); + renderToast({ message: `Export failed: ${err}` }); } {% endset %} {% set toolbarButtons %}