Implemented CSV download of items

This commit is contained in:
Jadowyne Ulve 2025-08-10 07:12:06 -05:00
parent 34fa11fa0f
commit 62cd4af78e
6 changed files with 49 additions and 3 deletions

View File

@ -64,6 +64,26 @@ def getItemAllByID(site:str, payload: tuple, convert:bool=True):
except Exception as error: except Exception as error:
postsqldb.DatabaseError(error, payload, sql) 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): def getItemAllByBarcode(site:str, payload: tuple, convert:bool=True):
database_config = config.config() database_config = config.config()
with open('application/items/sql/getItemAllByBarcode.sql', 'r+') as file: with open('application/items/sql/getItemAllByBarcode.sql', 'r+') as file:

View File

@ -4,6 +4,9 @@ from flask import (
) )
import psycopg2 import psycopg2
import math import math
import io
import csv
import datetime
# APPLICATION IMPORTS # APPLICATION IMPORTS
from config import config from config import config
@ -473,3 +476,23 @@ def deleteBarcode():
except Exception as error: except Exception as error:
return jsonify(status=400, message=str(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!") 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!")

View File

@ -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;

View File

@ -109,8 +109,7 @@
<div class="uk-width-1-1@m"> <div class="uk-width-1-1@m">
<ul class="uk-iconnav uk-flex-center uk-flex-left@m"> <ul class="uk-iconnav uk-flex-center uk-flex-left@m">
<li><a onclick="openAddItemModal()" uk-icon="icon: plus">Add Item</a></li> <li><a onclick="openAddItemModal()" uk-icon="icon: plus">Add Item</a></li>
<li><a onclick="openAddPrefixModal()" uk-icon="icon: plus">Add Prefix</a></li> <li><a href="/items/download_csv" uk-icon="icon: cloud-download" uk-tooltip="Downloads a CSV of your items.">download</a></li>
<li><a href="#" uk-icon="icon: cloud-download">download</a></li>
</ul> </ul>
<ul class="uk-iconnav uk-flex-center uk-flex-right@m"> <ul class="uk-iconnav uk-flex-center uk-flex-right@m">
<li><a id="view_mode_toggle" onclick="setViewMode()" uk-icon="icon: thumbnails">Cards</a></li> <li><a id="view_mode_toggle" onclick="setViewMode()" uk-icon="icon: thumbnails">Cards</a></li>