diff --git a/application/items/__pycache__/database_items.cpython-313.pyc b/application/items/__pycache__/database_items.cpython-313.pyc index 15865c0..49e3d4f 100644 Binary files a/application/items/__pycache__/database_items.cpython-313.pyc and b/application/items/__pycache__/database_items.cpython-313.pyc differ diff --git a/application/items/__pycache__/items_API.cpython-313.pyc b/application/items/__pycache__/items_API.cpython-313.pyc index 288fd8f..edd7e52 100644 Binary files a/application/items/__pycache__/items_API.cpython-313.pyc and b/application/items/__pycache__/items_API.cpython-313.pyc differ diff --git a/application/items/database_items.py b/application/items/database_items.py index c5c0bc6..1837c0a 100644 --- a/application/items/database_items.py +++ b/application/items/database_items.py @@ -64,6 +64,26 @@ def getItemAllByID(site:str, payload: tuple, convert:bool=True): except Exception as error: postsqldb.DatabaseError(error, payload, sql) +def getItemsAll(site:str, convert:bool=True): + database_config = config.config() + with open('application/items/sql/getItemsAll.sql', 'r+') as file: + sql = file.read().replace("%%site_name%%", site) + record = () + try: + with psycopg2.connect(**database_config) as conn: + with conn.cursor() as cur: + cur.execute(sql) + rows = cur.fetchall() + headers = [desc[0] for desc in cur.description] + types = [desc[1] for desc in cur.description] + if rows and convert: + record = postsqldb.tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + record = rows + return record, headers, types + except Exception as error: + postsqldb.DatabaseError(error, (), sql) + def getItemAllByBarcode(site:str, payload: tuple, convert:bool=True): database_config = config.config() with open('application/items/sql/getItemAllByBarcode.sql', 'r+') as file: diff --git a/application/items/items_API.py b/application/items/items_API.py index 6ab288a..ab96e2c 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -3,7 +3,10 @@ from flask import ( Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response ) import psycopg2 -import math +import math +import io +import csv +import datetime # APPLICATION IMPORTS from config import config @@ -472,4 +475,24 @@ def deleteBarcode(): return jsonify(status=201, message=f"{barcode} was deleted successfully.") except Exception as error: return jsonify(status=400, message=str(error)) + return jsonify(status=405, message=f"The request method: {request.method} is not allowed on this endpoint!") + +@items_api.route('/download_csv', methods=["GET"]) +def downloadItemsCSV(): + if request.method == "GET": + site_name = session['selected_site'] + records, headers, types = database_items.getItemsAll(site_name, convert=False) + si = io.StringIO() + writer = csv.writer(si) + writer.writerow(headers) + writer.writerow(types) + writer.writerows(records) + output = si.getvalue() + filename = f"{site_name}_items_{str(datetime.datetime.now())}.csv" + response = Response( + output, + mimetype='text/csv', + headers={"Content-Disposition": f"attachment;filename={filename}"} + ) + return response return jsonify(status=405, message=f"The request method: {request.method} is not allowed on this endpoint!") \ No newline at end of file diff --git a/application/items/sql/getItemsAll.sql b/application/items/sql/getItemsAll.sql new file mode 100644 index 0000000..b323140 --- /dev/null +++ b/application/items/sql/getItemsAll.sql @@ -0,0 +1,4 @@ +SELECT * FROM %%site_name%%_items items +LEFT JOIN %%site_name%%_item_info item_info ON item_info.id = items.item_info_id +LEFT JOIN %%site_name%%_food_info food_info ON food_info.id = items.food_info_id +LEFT JOIN %%site_name%%_logistics_info logistics_info ON logistics_info.id = items.logistics_info_id; diff --git a/application/items/templates/index.html b/application/items/templates/index.html index fc7867b..1931405 100644 --- a/application/items/templates/index.html +++ b/application/items/templates/index.html @@ -109,8 +109,7 @@