From 5fadebb2e44f2e5b501dad59d564a4c0f629ac72 Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Sun, 27 Apr 2025 13:55:38 -0500 Subject: [PATCH] items_api.getModalSkus updated to new schema --- .../database_items.cpython-312.pyc | Bin 5919 -> 7644 bytes .../__pycache__/items_API.cpython-312.pyc | Bin 38503 -> 39041 bytes application/items/database_items.py | 26 +++++- application/items/items_API.py | 74 ++++++++++++------ application/items/sql/itemsModal.sql | 3 + application/items/sql/itemsModalCount.sql | 2 + application/recipes/sql/itemsModal.sql | 1 + 7 files changed, 79 insertions(+), 27 deletions(-) create mode 100644 application/items/sql/itemsModal.sql create mode 100644 application/items/sql/itemsModalCount.sql diff --git a/application/items/__pycache__/database_items.cpython-312.pyc b/application/items/__pycache__/database_items.cpython-312.pyc index 2fb752e42a506f15f1c993ac85da70f2ec8ddab2..de07a1162dea74cccac34d166d695767ecdd71ea 100644 GIT binary patch delta 1188 zcmah|O>7%Q7@gVmdUw1($tJt&q_#sGY}t-N)07xUEP@cMr6_7S0OhAbYLsOma)^a2lmpzIQpr+^1T$+{fpB1U_nU9t z``*l(o!zf5)-uYEvK#=UO_Y?I10Al?1@F0uzMyEaIiKaraTb^JPx~$Z=iG<9CAv3s z^E@RG3R&k-M9{#0&;UWjJ4{O2eh}$o9w~ST>A2c?9bW!!SYsIXXM?%P;$H)=Fq;rx z5MPB1eqRhL4ofZ4X0c5o&J@8W)5J=C3(%`IhF}Jic*|E3@NF@wa(Pf>AHaJs4N9np zW@UWb-gCieYl;CV!cExBAt(lBRs53}#oMa>rHJtBY8dMHFDAkUX1lN}bYfTSdqHhU z&-zt=5n8@(0!+g*A7r`^K2}4|c}z(t@hcuO*vyT9YHj^6MB zdz<|LEJNgN?w{Mc1Mqbr6biSNj{!Sek{!J@p6&6he%m3heg-X2l0TJ~;WB7Wm-1g- ziA^po&E=;io&4g$VBX2i7X}Nr=9<}+MQd{IA{p8VGT%z-|4QFj{A9uL>gjRV^kYi3 z+ak@AppV29P5Wt(Xpm`8Nce?YvhxcL{;D&1%^o5^fug zt!rc49mf+#TH-)UJZ#(14z;l_P=h7(aeK$wcvX_u%sQiRnVPI0$&mwkUn;kePzNGP zZoOGm^^K4l!jU=%$jS2awRU}d=Dvcrxm&B%U~f6TA51iKLV0|HC886mY_t(?C)D6+ z!$+3$EdBY!0MR^bh^_k5GgX7CJn6HiT|m;G5N)QW1do*Xff6t09=^9Vb*PN)3!~5K z#DC_ruv#LoryMmU_IoXAcC)*To|V9EP|X5%H~Es;&;8JoFyq2wZkXhcM-ag)3?elZ zi8Bqp(#@HDd?n5iw$jg;FQUpIPitNlNX;JLvWVZ~Sehd*N+>(T?&-no0J}H9W%(gC z1>Z?YIAe_YFB30z8m}0UK!&9BS1YXJZwx2)2QXmzr-`-XUgQ@NVgSxN;`X$ Gl>QCrPagOH delta 161 zcmca(JztOSG%qg~0}w=)@n!tsoyaG_STRvuNt`Q%Ih7@aC6zUWHI*%mErqRxHHtlj zYhr?^KDrbKP>M4JU6d0j%2mmv$-QxxtT3bIB%?0}22D*Q_J# diff --git a/application/items/__pycache__/items_API.cpython-312.pyc b/application/items/__pycache__/items_API.cpython-312.pyc index e03a95ae3429e9d3809eed8cb1666cacaadf3551..ff5c1eb2104987422a68ad056e72d433ee7d219c 100644 GIT binary patch delta 2824 zcmb7FdrVu`8NcTm8yqgqO^q?ec8n84Vq!dAfe;?TNg5s|;bp=jWME?xLjc3IA%WqP zR7po@S72Y)u&vXwhg71ZiJ7;KPSfN`)5g|Sx>vS#BbQ38rfS+BlTsyHI(6%I4kQCB zTBlvfzx$oX_xs+yf4W0oS)~>4rlswo@bitJ!uy7ARgq_e;TPrlR+^%2Pys}a$a8z^ zMY&NB1pys4z^q!9$q9kvCkIpjYivD3De#d|iBiF6QNeH3>8dZfGk!n`n#_#UXSK=6 zh0Ih_Fe$)1rFP3TSPV*MXm`>y_IpM$EyZgY7|-s7v4FH(G9w$1+b-t$%7*Nt#;$$g(%*+mw6vcO;1l zX4d&Owwzu2yd!%s;2H4)&+4HuORKbIpY(Cre$TL{Kaf4*b32Fq@CjQ5Kgs$?QgnD1 ztg6%y((-h6HoUi|6fAp>LV;PPIE~%p4id<~01DH-bO)DD)>aJWw74`dF*fXh5wjtW z#XE84yeDvq(6`y!{c-6SH#i#LNSV130*8rKGW^=KU+O2dfjv1o-5D&rj(>hNj(nDS zbcD*(!^N9uZeq3`8gs^9(3(YUsh}+lO+~8s)(*a_mp|4Q)jEZg%sKhu;f<8Exxr;s zEXA;~JL9JO$LT-StZLQ{M^x`rLw9Aw{t^`T<4BZS+R!bIbL29QV3z zb%iF@+E>34%|E{G;QP+Uygt!8DR?LO^B3{eOQ?>1pr@!_R8N0GQRxjdW?}4vMQW$H zquA^4Yq@XI`L|F!x!*TB>EQw=xmLVwPKu|Dah`#}OCCR$hc~!G1S}Y)q0m$aKkU>( z(4e>NFGmS;x4fP%cmBSR>3;=Wq9Jh14StKBddMMHsLC=d-c!C;G+*5!O# zH}CfH23yoHC@{LY`o)RIQd&L)pXQxU9zqW&EQbdU)zhdGLirVk&Jxo-7~&~zXTa%l z`aSVIxKiD|QIEf4FyKAzo4|Ey$2UM}H5&TJ{UZbh2$U0W5hx?zgf?rAjK`w?0~oVa zgx|4#Pm=l{8{9eY6q!&v%omyV^$~^t&V)~4$)JLdip1sSAaY z?klsFYj3u%oaCP?o=e`)>P4+Z&{{-ot)Q)4Pg)=3yLNOIPO8)e?;SBFyGT-{uJB)v zv`TPN>ni(q1nh;kD{J+A#O!9MiLS&Y{_$Z5m1RIdRVFP#;fAVy!g05zDuLr~HAhh& z6xx)?3D4VdP)7KI?e%2T8K&#Mg-qM&^%6Ta4Dqzy-ia|>P>+KQA=eI(h9=|!)~>=t zx%LB?=(N2P?GL|c|0*VeFSWg&U{U4BKeky`GN9&EE{ibVCGZ-7RRVnkHltd`Qk)HN z&QZU!KQQPU?F|f$cyKpdbyO$!;L-I@A$ZGf3jf8ikyxl$=ZVy99w+SYI?7%q3V*%faD8=#SxB!>vg>Y@8!RUxw82Y~yAP z-Y4q~0-M#4?#R3o8pn&!r|`nKP1%apk~TD2QIjWV@1F!9)q2N`rE8x*EG=5i}N2QzB?e?z8IUjGNkr5;{vU z*MJM0wp(Nj0%H&vi@;b`9HH{HA+fqysBVr{x5k*Z@Vk>vI%_lUR>|orlt-l_tKsY`TVQTyOlNtraC^A-o z*>WaLtZ5f&+M_icF{TrW7lY_5tS(xS7d~7(#>VAiK7RoJy}Ml;nP)h(REN$$U}+vX f!~a?;MQRhW(+?#S%@QbokVMuG8d2B|I?2BQ8Fe!r delta 2654 zcmb7FZA@F&8NSEHHpUmnV8Gahns00j0Rm18PG~|Pd^ChWz!;l=-PnK|z;JECmw_hP z7S@s$IBAQz{y^PVs$>b-oisL04PDpH+qCT-8R;UzG^NwDY1*W0NfoJ+rk!J&VXxDs zUCEE`IX>_6KJRnhbMEDPfQyEAk3IgMp3sw zyt+rCtrZZpce?_v7hQhOj$*(QXbO0S{il3P zi_h&EVu&eBB>@u#L&8d7F8qfv8?NY5psDac!g)OVCjR-G;F)3@{CeR*_^TgEu9n584FEI<4;8bsS7+2Qwr6Z^m{4a zSKm`_m^M{Es0rmGOKZ6NENAa~L{USaQSeuaN^cT8rYJ?T08dGq1-r83)u!7Wce~%~ zULW7+x;MA!K}TLl2$!7ZtaiL)0Ja`TeeS80q29rt#Bx4c%W9)oMlK`~CpOsql|5Cu%h>Rq>dv@Q5$KT}*44(9jj|6r^ zql|YX087iVfgQG$DP=uG*O7=qEG{4XkbR@u`j%J?w8xFU3-~SJ^cYd(1?^IDtJa zN{pHSdZIQYE~Q8I&Yrhk}DP@yIP#B0%}bJkpls?!F4Rnw6AAH~3;=MRhj zLNt`ERNrQkkF&(^k86*`gv(D>M}@ykD)`*jrNy*VDc*}(#x>&hGgt6m6h7>J9==^> zVLv=+m4J3u^TOL8hVTCAbZqOnxOOXNb8&7jcX5onz=U=FXDuoO(f};%$&&=I;rN|x@8JLzm)pA>mD2|A z_vXdqd^o3spic?L+0?!^G4^D@(+U*(t>`6X+u+Cjv&M)e?-EN6Fqvff0|Ivl>{qc$ zh7LF~a2R{=&4F5Qh5h4zT`b;XgpDId6<=67@g>?97#|(-FcD3pRheA^kqr|?$st$3j(G1LVT_Ped)1!|K7nugPbj;= zM%=DChgX*)bvduDLh35`cmH!RK9H58;T3wM(DMotQkd4=8%>*+emeKTT)3fYOJRGO zC{FB#%>jd?8@r9)+3A2G_LSY3$ifEvdO{Q9_LGT9!KVNgO-|R~v=vBQ!K*DuZP`|+ zR@2tBkA(t_e4!a%!-;7;U4ZBUo~}T2#d_U_VbjjnccJ>OaDDd{ZD&83bO|((%^^1_ zBOwrF9y~vzkIB3=qZdo?ch>(dRLtkY-_2C0Q=g?UBYN+faExoVZ_y66H0TmUb&V5# zZO#(I_HfQ1P9bdH#cb}(FEDX!z1&MPs5!Vr&$3JNKN5gG*mA}D-vo148lyTRa&`AX z{ncEM4NqU4?8@R*2a)O^ud*POWutD>5E=^gg;nRd-a(}DE;R1aNlW_0)@?fF_13Sp zt~PDa1-mrXm5bA|KAzY7G4(OjBmZV8k4blu`I^o@x^BGi9L%yT0EPc!7B@pvVd2bkTTMb zA<5=+SlJGZ*PrI#I(3NF@pLhwi*I(US8aB2wgJw2iR+p`HIrNP6kGdRICe|3mUFWA zFF7$YOgiWz0{iFF0WT~c1y;DWJa{ah&oHA5GoNuBWgN%-x~tOIqb%0*Muza8QUV&b diff --git a/application/items/database_items.py b/application/items/database_items.py index bf97b1d..35713ea 100644 --- a/application/items/database_items.py +++ b/application/items/database_items.py @@ -81,4 +81,28 @@ def getItemsWithQOH(site:str, payload: tuple, convert:bool=True): count = cur.fetchone()[0] return recordset, count except Exception as error: - postsqldb.DatabaseError(error, payload, sql) \ No newline at end of file + postsqldb.DatabaseError(error, payload, sql) + +def getModalSKUs(site:str, payload:tuple, convert:bool=True): + database_config = config.config() + with open("application/items/sql/itemsModal.sql") as file: + sql = file.read().replace("%%site_name%%", site) + with open("application/items/sql/itemsModalCount.sql") as file: + sql_count = file.read().replace("%%site_name%%", site) + recordset = [] + count = 0 + try: + with psycopg2.connect(**database_config) as conn: + with conn.cursor() as cur: + print(payload) + 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: + raise 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 2e72052..4edc8f4 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -150,20 +150,42 @@ def pagninate_items(): @items_api.route('/item/getModalItems', methods=["GET"]) @login_required def getModalItems(): - recordset = [] - count = {'count': 0} + """ GET items from the system by passing a page, limit, search_string. For select modals + --- + parameters: + - in: query + name: page + schema: + type: integer + default: 1 + description: page number for offset + - in: query + name: limit + schema: + type: integer + default: 25 + description: number of records to grab + - in: query + name: search_string + schema: + type: string + default: '' + description: string to look for in column search_string + responses: + 200: + description: Items received successfully. + """ + recordset, count = tuple(), 0 if request.method == "GET": page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) search_string = request.args.get('search_string', '') site_name = session['selected_site'] offset = (page - 1) * limit - database_config = config() - with psycopg2.connect(**database_config) as conn: - payload = (search_string, limit, offset) - recordset, count = database.getItemsForModal(conn, site_name, payload, convert=True) - return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":False, "message":"items fetched succesfully!"}) - return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":True, "message":"There was an error with this GET statement"}) + recordset, count = database_items.getModalSKUs(site_name, (search_string, limit, offset)) + print(recordset, count) + return jsonify({"items":recordset, "end":math.ceil(count/limit), "error":False, "message":"items fetched succesfully!"}) + return jsonify({"items":recordset, "end":math.ceil(count/limit), "error":True, "message": f"method {request.method} is not allowed."}) @items_api.route('/item/getPrefixes', methods=["GET"]) @login_required @@ -178,7 +200,7 @@ def getModalPrefixes(): database_config = config() with psycopg2.connect(**database_config) as conn: payload = (limit, offset) - recordset, count = postsqldb.SKUPrefixTable.paginatePrefixes(conn, site_name, payload, convert=True) + recordset, count = db.SKUPrefixTable.paginatePrefixes(conn, site_name, payload, convert=True) return jsonify({"prefixes":recordset, "end":math.ceil(count/limit), "error":False, "message":"items fetched succesfully!"}) return jsonify({"prefixes":recordset, "end":math.ceil(count/limit), "error":True, "message":"There was an error with this GET statement"}) @@ -212,7 +234,7 @@ def getZonesbySku(): payload = (item_id, limit, offset) count = 0 with psycopg2.connect(**database_config) as conn: - zones, count = postsqldb.ZonesTable.paginateZonesBySku(conn, site_name, payload) + zones, count = db.ZonesTable.paginateZonesBySku(conn, site_name, payload) print(zones, count) return jsonify(zones=zones, endpage=math.ceil(count/limit)) @@ -230,7 +252,7 @@ def getLocationsBySkuZone(): count=0 with psycopg2.connect(**database_config) as conn: payload = (part_id, zone_id, limit, offset) - locations, count = postsqldb.LocationsTable.paginateLocationsBySkuZone(conn, site_name, payload) + locations, count = db.LocationsTable.paginateLocationsBySkuZone(conn, site_name, payload) return jsonify(locations=locations, endpage=math.ceil(count/limit)) @@ -367,7 +389,7 @@ def getPossibleLocations(): database_config = config() site_name = session['selected_site'] with psycopg2.connect(**database_config) as conn: - locations, count = postsqldb.LocationsTable.paginateLocationsWithZone(conn, site_name, (limit, offset)) + locations, count = db.LocationsTable.paginateLocationsWithZone(conn, site_name, (limit, offset)) return jsonify(locations=locations, end=math.ceil(count/limit)) @items_api.route('/item/getLinkedItem', methods=["GET"]) @@ -486,12 +508,12 @@ def addSKUPrefix(): site_name = session['selected_site'] try: with psycopg2.connect(**database_config) as conn: - prefix = postsqldb.SKUPrefixTable.Payload( + prefix = db.SKUPrefixTable.Payload( request.get_json()['uuid'], request.get_json()['name'], request.get_json()['description'] ) - postsqldb.SKUPrefixTable.insert_tuple(conn, site_name, prefix.payload()) + db.SKUPrefixTable.insert_tuple(conn, site_name, prefix.payload()) except Exception as error: conn.rollback() return jsonify({'error': True, 'message': error}) @@ -508,10 +530,10 @@ def addConversion(): database_config = config() site_name = session['selected_site'] with psycopg2.connect(**database_config) as conn: - conversion = postsqldb.ConversionsTable.Payload( + conversion = db.ConversionsTable.Payload( item_id, uom_id, conv_factor ) - postsqldb.ConversionsTable.insert_tuple(conn, site_name, conversion.payload()) + db.ConversionsTable.insert_tuple(conn, site_name, conversion.payload()) return jsonify(error=False, message="Conversion was added successfully") return jsonify(error=True, message="Unable to save this conversion, ERROR!") @@ -524,7 +546,7 @@ def deleteConversion(): database_config = config() site_name = session['selected_site'] with psycopg2.connect(**database_config) as conn: - postsqldb.ConversionsTable.delete_item_tuple(conn, site_name, (conversion_id,)) + db.ConversionsTable.delete_item_tuple(conn, site_name, (conversion_id,)) return jsonify(error=False, message="Conversion was deleted successfully") return jsonify(error=True, message="Unable to delete this conversion, ERROR!") @@ -538,7 +560,7 @@ def updateConversion(): database_config = config() site_name = session['selected_site'] with psycopg2.connect(**database_config) as conn: - postsqldb.ConversionsTable.update_item_tuple(conn, site_name, {'id': conversion_id, 'update': update_dictionary}) + db.ConversionsTable.update_item_tuple(conn, site_name, {'id': conversion_id, 'update': update_dictionary}) return jsonify(error=False, message="Conversion was updated successfully") return jsonify(error=True, message="Unable to save this conversion, ERROR!") @@ -552,10 +574,10 @@ def addPrefix(): database_config = config() site_name = session['selected_site'] with psycopg2.connect(**database_config) as conn: - prefixes = postsqldb.ItemInfoTable.select_tuple(conn, site_name, (item_info_id,))['prefixes'] + prefixes = db.ItemInfoTable.select_tuple(conn, site_name, (item_info_id,))['prefixes'] print(prefixes) prefixes.append(prefix_id) - postsqldb.ItemInfoTable.update_tuple(conn, site_name, {'id': item_info_id, 'update':{'prefixes': prefixes}}) + db.ItemInfoTable.update_tuple(conn, site_name, {'id': item_info_id, 'update':{'prefixes': prefixes}}) return jsonify(error=False, message="Prefix was added successfully") return jsonify(error=True, message="Unable to save this prefix, ERROR!") @@ -568,9 +590,9 @@ def deletePrefix(): database_config = config() site_name = session['selected_site'] with psycopg2.connect(**database_config) as conn: - prefixes = postsqldb.ItemInfoTable.select_tuple(conn, site_name, (item_info_id,))['prefixes'] + prefixes = db.ItemInfoTable.select_tuple(conn, site_name, (item_info_id,))['prefixes'] prefixes.remove(prefix_id) - postsqldb.ItemInfoTable.update_tuple(conn, site_name, {'id': item_info_id, 'update':{'prefixes': prefixes}}) + db.ItemInfoTable.update_tuple(conn, site_name, {'id': item_info_id, 'update':{'prefixes': prefixes}}) return jsonify(error=False, message="Prefix was deleted successfully") return jsonify(error=True, message="Unable to delete this prefix, ERROR!") @@ -582,7 +604,7 @@ def refreshSearchString(): database_config = config() site_name = session['selected_site'] with psycopg2.connect(**database_config) as conn: - item = postsqldb.ItemTable.getItemAllByID(conn, site_name, (item_id,)) + item = db.ItemTable.getItemAllByID(conn, site_name, (item_id,)) parameters = [f"id::{item['id']}", f"barcode::{item['barcode']}", f"name::{item['item_name']}", f"brand::{item['brand']['name']}", f"expires::{item['food_info']['expires']}", f"row_type::{item['row_type']}", f"item_type::{item['item_type']}"] @@ -590,7 +612,7 @@ def refreshSearchString(): parameters.append(f"prefix::{prefix['name']}") search_string = "&&".join(parameters) - postsqldb.ItemTable.update_tuple(conn, site_name, {'id': item_id, 'update':{'search_string': search_string}}) + db.ItemTable.update_tuple(conn, site_name, {'id': item_id, 'update':{'search_string': search_string}}) return jsonify(error=False, message="Search String was updated successfully") return jsonify(error=True, message="Unable to update this search string, ERROR!") @@ -603,10 +625,10 @@ def postNewItemLocation(): database_config = config() site_name = session['selected_site'] with psycopg2.connect(**database_config) as conn: - item_location = postsqldb.ItemLocationsTable.Payload( + item_location = db.ItemLocationsTable.Payload( item_id, location_id ) - postsqldb.ItemLocationsTable.insert_tuple(conn, site_name, item_location.payload()) + db.ItemLocationsTable.insert_tuple(conn, site_name, item_location.payload()) return jsonify(error=False, message="Location was added successfully") return jsonify(error=True, message="Unable to save this location, ERROR!") \ No newline at end of file diff --git a/application/items/sql/itemsModal.sql b/application/items/sql/itemsModal.sql new file mode 100644 index 0000000..7af323e --- /dev/null +++ b/application/items/sql/itemsModal.sql @@ -0,0 +1,3 @@ +SELECT item.id, item.barcode, item.item_name FROM %%site_name%%_items item +WHERE item.search_string LIKE '%%' || %s || '%%' +LIMIT %s OFFSET %s; \ No newline at end of file diff --git a/application/items/sql/itemsModalCount.sql b/application/items/sql/itemsModalCount.sql new file mode 100644 index 0000000..dea7e95 --- /dev/null +++ b/application/items/sql/itemsModalCount.sql @@ -0,0 +1,2 @@ +SELECT COUNT(item.*) FROM %%site_name%%_items item +WHERE item.search_string LIKE '%%' || %s || '%%'; \ No newline at end of file diff --git a/application/recipes/sql/itemsModal.sql b/application/recipes/sql/itemsModal.sql index 7af323e..096c9a8 100644 --- a/application/recipes/sql/itemsModal.sql +++ b/application/recipes/sql/itemsModal.sql @@ -1,3 +1,4 @@ SELECT item.id, item.barcode, item.item_name FROM %%site_name%%_items item WHERE item.search_string LIKE '%%' || %s || '%%' +ORDER BY item.id LIMIT %s OFFSET %s; \ No newline at end of file