From 6dbe5752ad153241bc7b1d58fb9cad9c20b47c6e Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Sun, 27 Apr 2025 13:38:20 -0500 Subject: [PATCH] items_api.paginate_items updated to new schema --- .../database_items.cpython-312.pyc | Bin 4162 -> 5919 bytes .../__pycache__/items_API.cpython-312.pyc | Bin 37816 -> 38503 bytes application/items/database_items.py | 24 +++++++ application/items/items_API.py | 60 ++++++++++++++---- application/items/sql/getItemsWithQOH.sql | 16 +++++ database.log | 26 +++++++- static/handlers/ItemListHandler.js | 4 +- 7 files changed, 115 insertions(+), 15 deletions(-) create mode 100644 application/items/sql/getItemsWithQOH.sql diff --git a/application/items/__pycache__/database_items.cpython-312.pyc b/application/items/__pycache__/database_items.cpython-312.pyc index dc314a375634e3b9405887e7091aa45192c94ef6..2fb752e42a506f15f1c993ac85da70f2ec8ddab2 100644 GIT binary patch delta 1625 zcmb7EO=ufO6rR~%tya6TEX)6n*RfPt@lR@MH!TgW1KBjeCB;o4jh)m{v};?cY$>yA zJ2AUe1EDQ6q!D`wl+pxpDEQD8L+P>DQK9r=lS6|Jg+MR8lr#~boDnJ+@3cvzH z0O|o60AdtULBfH~0|)?(08JFC0x>fMVvshlv;%YibW*V3QOy?tkZ4|7YQXW;Md>%T zeVZY@+e#u~Wo>h6K0Rk962xbz64{$nT1x+)ro11`DmR_Yn?7064b=8y3VHE~)_`aT zd0R?7?pqa9f}1mtnO%{n0{g93+45$e_cZt+lM}t7+)#3`!M9M)3R8=9c>}>`caM<` zhkbGI3a)7`c5n^|>=A?Cjljqd9P~9Z#BW$vFaoY4&LLNHL-ZETVJyaxUD1Dn#PCae!b^024q^Jak@VgUbhRDW zp^4&%bh*k)yfxrEpg6e1uk6$g&Kk&7K2fgjtV?(a)m};kPcNsuCZ(ffoz2>_yUG>|#eJu>4#Is7 zFQ(O>;1?sS?l%jh7Y;&sNizV{h_nLi424cre|{mgwIPPidTBJM3e$nA;Th9D1wVZ! zV`Pw8N9fo3%nPeA_06A$9!R5)5$31xFUP$>wQ=MRb#zl5-8eSBab{v;^8DtR3lG$f zzF?oR5c8K>f9uGXbDzHRkdr?jyEb+UUqAh@KKUJYXK|zd;znKCyTq@DpG6?HcI)#e ztzM6Ctn@K`^zM+(uxngQ??r1Z5xtXLJJhR3`Sn;*R|D%u2dRF)U#9l^Z%8zz!tlB* zR#cwaD^Xr=mnzL7^;SB0y+^FXS%~TJu~#|~V=F^VC+gT=>v*cC@CPZmDyNIZd^VG| zvy+ASS}kCP{c=@V+5lDFUMS|xDtD<+$dfMc#R2*NAXk1DY*7XI3Ed7Hohuj%d2@su pp*Hw)uok^P!xQl>RELNEjW^=q+tJ5}E_W9Eb{P!rwj-+AMl%F3yvSbwBaF2xO@saSvjU{%osQ`8W z1zAK?L_?Ml4#^`+NC8=4m@@GAEg&LNL`sZA1lsk%hIOn|kSeml2(g=_5@Y zY19JC3$1SC_#V{bYw3-vjlQVkAHbnIM5OaveL$#y0k(RXgI@7n{H?!ykN5w^pV>3yj!e`WGy7aFYa0}u3W A*#H0l diff --git a/application/items/__pycache__/items_API.cpython-312.pyc b/application/items/__pycache__/items_API.cpython-312.pyc index a830ec93d51ae82cbb2220bff7c40a26517ca5b2..e03a95ae3429e9d3809eed8cb1666cacaadf3551 100644 GIT binary patch delta 4467 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 ZRZZ877vwwnmN_19J~hn8gX0^t{{x}Th}8f9 delta 4026 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 C>GyvC diff --git a/application/items/database_items.py b/application/items/database_items.py index de3fa7c..bf97b1d 100644 --- a/application/items/database_items.py +++ b/application/items/database_items.py @@ -56,5 +56,29 @@ def getItemAllByID(site:str, payload: tuple, convert:bool=True): if rows and not convert: record = rows return record + except Exception as error: + postsqldb.DatabaseError(error, payload, sql) + +def getItemsWithQOH(site:str, payload: tuple, convert:bool=True): + database_config = config.config() + with open('application/items/sql/getItemsWithQOH.sql', 'r+') as file: + sql = file.read().replace("%%site_name%%", site).replace("%%sort_order%%", payload[3]) + payload = list(payload) + payload.pop(3) + sql_count = f"SELECT COUNT(*) FROM {site}_items WHERE search_string LIKE '%%' || %s || '%%';" + recordset = () + count = 0 + try: + with psycopg2.connect(**database_config) as conn: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + recordset = [postsqldb.tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + recordset = rows + cur.execute(sql_count, (payload[0],)) + count = cur.fetchone()[0] + return recordset, count except Exception as error: postsqldb.DatabaseError(error, payload, sql) \ No newline at end of file diff --git a/application/items/items_API.py b/application/items/items_API.py index d6c2956..2e72052 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -15,6 +15,7 @@ def itemLink(parent_id, id): return render_template("items/itemlink.html", current_site=session['selected_site'], sites=sites, proto={'referrer': request.referrer}, id=id) @items_api.route("/item/getTransactions", methods=["GET"]) +@login_required def getTransactions(): """ GET a subquery of transactions by passing a logistics_info_id, limit, and page --- @@ -35,6 +36,7 @@ def getTransactions(): return jsonify({"transactions": recordset, "end": math.ceil(count/limit), "error": True, "message": f"method {request.method} is not allowed."}) @items_api.route("/item/getTransaction", methods=["GET"]) +@login_required def getTransaction(): """ GET a transaction from the system by passing an ID --- @@ -60,6 +62,7 @@ def getTransaction(): return jsonify({"transaction": transaction, "error": True, "message": f"method {request.method} is not allowed."}) @items_api.route("/item/getItem", methods=["GET"]) +@login_required def get_item(): """ GET item from system by passing its ID --- @@ -83,33 +86,66 @@ def get_item(): return jsonify({'item': item, 'error': False, 'message': ''}) return jsonify({'item': item, 'error': True, 'message': f'method {request.method} not allowed.'}) - @items_api.route("/item/getItemsWithQOH", methods=['GET']) @login_required def pagninate_items(): - pantry_inventory = [] - count = {'count': 0} + """ GET items from the system by passing a page, limit, search_string, sort, and order + --- + parameters: + - in: query + name: page + schema: + type: integer + default: 1 + description: page number for offset + - in: query + name: limit + schema: + type: integer + default: 50 + description: number of records to grab + - in: query + name: search_string + schema: + type: string + default: '' + description: string to look for in column search_string + - in: query + name: sort + schema: + type: string + default: '' + description: items table column to sort by + - in: query + name: order + schema: + type: string + enum: ['ASC', 'DESC'] + default: 'ASC' + description: Order to sort items table sort parameter by + responses: + 200: + description: Items received successfully. + """ + items = [] + count = 0 if request.method == "GET": page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) search_string = str(request.args.get('search_text', "")) sort = request.args.get('sort', "") order = request.args.get('order', "") - - view = request.args.get('view', "") site_name = session['selected_site'] offset = (page - 1) * limit if sort == 'total_qoh': sort_order = f"{sort} {order}" else: - sort_order = f"{site_name}_items.{sort} {order}" - print(sort_order) - database_config = config() - with psycopg2.connect(**database_config) as conn: - pantry_inventory, count = database.getItemsWithQOH(conn, site_name, (search_string, limit, offset, sort_order), convert=True) + sort_order = f"item.{sort} {order}" - return jsonify({'items': pantry_inventory, "end": math.ceil(count['count']/limit), 'error':False, 'message': 'Items Loaded Successfully!'}) - return jsonify({'items': pantry_inventory, "end": math.ceil(count['count']/limit), 'error':True, 'message': 'There was a problem loading the items!'}) + items, count = database_items.getItemsWithQOH(site_name, (search_string, limit, offset, sort_order)) + + return jsonify({'items': items, "end": math.ceil(count/limit), 'error':False, 'message': 'Items Loaded Successfully!'}) + return jsonify({'items': items, "end": math.ceil(count/limit), 'error':True, 'message': 'There was a problem loading the items!'}) @items_api.route('/item/getModalItems', methods=["GET"]) @login_required diff --git a/application/items/sql/getItemsWithQOH.sql b/application/items/sql/getItemsWithQOH.sql new file mode 100644 index 0000000..c7d4b8a --- /dev/null +++ b/application/items/sql/getItemsWithQOH.sql @@ -0,0 +1,16 @@ +WITH sum_cte AS ( + SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum + FROM %%site_name%%_item_locations mil + JOIN %%site_name%%_items mi ON mil.part_id = mi.id + GROUP BY mi.id + ) + +SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullname +FROM %%site_name%%_items item +LEFT JOIN sum_cte ON item.id = sum_cte.id +LEFT JOIN %%site_name%%_item_info item_info ON item.item_info_id = item_info.id +LEFT JOIN units u ON item_info.uom = u.id +WHERE item.search_string LIKE '%%' || %s || '%%' +ORDER BY %%sort_order%% +LIMIT %s OFFSET %s; + diff --git a/database.log b/database.log index d718389..e0dc025 100644 --- a/database.log +++ b/database.log @@ -1874,4 +1874,28 @@ sql='SELECT * FROM main_transactions WHERE logistics_info_id=%s LIMIT %s OFFSET %s;') 2025-04-27 12:35:10.632770 --- ERROR --- DatabaseError(message=''int' object does not support indexing', payload=(1, 50, 0), - sql='SELECT * FROM main_transactions WHERE logistics_info_id=%s LIMIT %s OFFSET %s;') \ No newline at end of file + sql='SELECT * FROM main_transactions WHERE logistics_info_id=%s LIMIT %s OFFSET %s;') +2025-04-27 13:18:16.283058 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "main_items"LINE 14: ORDER BY main_items.id ASC ^HINT: Perhaps you meant to reference the table alias "item".', + payload=['', 50, 0], + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullnameFROM main_items itemLEFT JOIN sum_cte ON item.id = sum_cte.idLEFT JOIN main_item_info item_info ON item.item_info_id = item_info.idLEFT JOIN units u ON item_info.uom = u.idWHERE item.search_string LIKE '%%' || %s || '%%'ORDER BY main_items.id ASCLIMIT %s OFFSET %s;') +2025-04-27 13:19:31.121839 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "main_items"LINE 14: ORDER BY main_items.id ASC ^HINT: Perhaps you meant to reference the table alias "item".', + payload=['', 50, 0], + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullnameFROM main_items itemLEFT JOIN sum_cte ON item.id = sum_cte.idLEFT JOIN main_item_info item_info ON item.item_info_id = item_info.idLEFT JOIN units u ON item_info.uom = u.idWHERE item.search_string LIKE '%%' || %s || '%%'ORDER BY main_items.id ASCLIMIT %s OFFSET %s;') +2025-04-27 13:19:53.062262 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "main_items"LINE 14: ORDER BY main_items.id ASC ^HINT: Perhaps you meant to reference the table alias "item".', + payload=['', 50, 0], + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullnameFROM main_items itemLEFT JOIN sum_cte ON item.id = sum_cte.idLEFT JOIN main_item_info item_info ON item.item_info_id = item_info.idLEFT JOIN units u ON item_info.uom = u.idWHERE item.search_string LIKE '%%' || %s || '%%'ORDER BY main_items.id ASCLIMIT %s OFFSET %s;') +2025-04-27 13:20:02.283977 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "main_items"LINE 14: ORDER BY main_items.id ASC ^HINT: Perhaps you meant to reference the table alias "item".', + payload=['', 50, 0], + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullnameFROM main_items itemLEFT JOIN sum_cte ON item.id = sum_cte.idLEFT JOIN main_item_info item_info ON item.item_info_id = item_info.idLEFT JOIN units u ON item_info.uom = u.idWHERE item.search_string LIKE '%%' || %s || '%%'ORDER BY main_items.id ASCLIMIT %s OFFSET %s;') +2025-04-27 13:20:51.587376 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "main_items"LINE 14: ORDER BY main_items.id ASC ^HINT: Perhaps you meant to reference the table alias "item".', + payload=['', 50, 0], + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullnameFROM main_items itemLEFT JOIN sum_cte ON item.id = sum_cte.idLEFT JOIN main_item_info item_info ON item.item_info_id = item_info.idLEFT JOIN units u ON item_info.uom = u.idWHERE item.search_string LIKE '%%' || %s || '%%'ORDER BY main_items.id ASCLIMIT %s OFFSET %s;') +2025-04-27 13:21:15.614158 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "main_items"LINE 14: ORDER BY main_items.id ASC ^HINT: Perhaps you meant to reference the table alias "item".', + payload=['', 50, 0], + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullnameFROM main_items itemLEFT JOIN sum_cte ON item.id = sum_cte.idLEFT JOIN main_item_info item_info ON item.item_info_id = item_info.idLEFT JOIN units u ON item_info.uom = u.idWHERE item.search_string LIKE '%%' || %s || '%%'ORDER BY main_items.id ASCLIMIT %s OFFSET %s;') +2025-04-27 13:22:17.783755 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "main_items"LINE 14: ORDER BY main_items.id ASC ^HINT: Perhaps you meant to reference the table alias "item".', + payload=['', 50, 0], + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullnameFROM main_items itemLEFT JOIN sum_cte ON item.id = sum_cte.idLEFT JOIN main_item_info item_info ON item.item_info_id = item_info.idLEFT JOIN units u ON item_info.uom = u.idWHERE item.search_string LIKE '%%' || %s || '%%'ORDER BY main_items.id ASCLIMIT %s OFFSET %s;') +2025-04-27 13:32:50.773052 --- ERROR --- DatabaseError(message='syntax error at or near "5"LINE 15: LIMIT 5 OFFSET 5; ^', + payload=['', 5, 5], + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT item.id, item.description, item.item_name, sum_cte.total_sum as total_qoh, u.fullnameFROM main_items itemLEFT JOIN sum_cte ON item.id = sum_cte.idLEFT JOIN main_item_info item_info ON item.item_info_id = item_info.idLEFT JOIN units u ON item_info.uom = u.idWHERE item.search_string LIKE '%%' || %s || '%%'ORDER BY item. LIMIT %s OFFSET %s;') \ No newline at end of file diff --git a/static/handlers/ItemListHandler.js b/static/handlers/ItemListHandler.js index 8e40e98..3173ab3 100644 --- a/static/handlers/ItemListHandler.js +++ b/static/handlers/ItemListHandler.js @@ -203,7 +203,7 @@ async function updateTableElements(){ descriptionCell.setAttribute('class', 'uk-text-truncate uk-table-expand uk-visible@m') let qtyUOMCell = document.createElement('td') - qtyUOMCell.innerHTML = `${parseFloat(items[i].total_qoh)} ${items[i].uom.fullname}` + qtyUOMCell.innerHTML = `${parseFloat(items[i].total_qoh)} ${items[i].fullname}` let opsCell = document.createElement('td') opsCell.setAttribute('class', 'uk-width-1-4') @@ -255,7 +255,7 @@ async function updateListElements(){ header.classList.add('uk-card-header') header.style = "border-radius: 0px, 10px, 0px, 10px;" - header.innerHTML = `

${items[i].item_name}

Quantity on Hand: ${parseFloat(items[i].total_qoh)} ${items[i].uom.fullname}
` + header.innerHTML = `

${items[i].item_name}

Quantity on Hand: ${parseFloat(items[i].total_qoh)} ${items[i].fullname}
` let content = document.createElement('div') content.classList.add('uk-card-body')