From 7f48c0c08c16b1a69f6b987cbd873dd9a568f462 Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Sun, 27 Apr 2025 17:41:57 -0500 Subject: [PATCH] items_API.paginateBrands updated to new schema --- .../database_items.cpython-312.pyc | Bin 12542 -> 13846 bytes .../__pycache__/items_API.cpython-312.pyc | Bin 39988 -> 39024 bytes application/items/database_items.py | 18 +++++ application/items/items_API.py | 65 +++++++++--------- database.log | 5 +- 5 files changed, 55 insertions(+), 33 deletions(-) diff --git a/application/items/__pycache__/database_items.cpython-312.pyc b/application/items/__pycache__/database_items.cpython-312.pyc index 7649beff351a6d4068b8d987789015d0287ff618..b2b8c139aec8aba5c58a0e9ab8a7c9ecd7fc4006 100644 GIT binary patch delta 1986 zcmah}T}&KR6ux(Uc6WC62f7Q(pUW&Q!oosJQ7pxh01I(zkyfZy64Gv&fv#QH&7CC_ zvMa=3;)AKdn`onHQWGEAG%?hT#up!uCO-JWgAa9Et$j0%57qWTO>8`8fVNOlZZhAT z``vrb`R3d+=VAQgq~}Ms+eu*9zw(^+tM^(j^b*7cYjlXMp_?oEsv7!NX~n{;`A_Ra|5qH7O2 zM0zE^PdZI$O`gl&i2SCne9jM_#zcf&2tI@ogi?U8lSydH2sVTOLK#58#*EPv(^(ZV z&mja6GyoG5rac-g1k-|N+{g^E_@o&h%_LHjtQN>hlE0(e7O9IbyUY1+KK~AK)a~RH zq_ITOutc#v;B;F>>Lx|nV@a`$G0~MwcF)A3tcm0&Ja;8q9eSzfBfgVC7n)&&282d{ zf|N{{nSz*3rTJ}N$-!b=*pfjjtB=xn#j~Am7U9kQMuBO3xgrp-a^!^^p&;|kMCQz~ zfmc{-e!>5xY^#S5vtjP8(D;dp(!p&+F*mC4Ab0@^a+)P3Gpq=SodvS}sKIY(aDj&Y zlpaqGzIxnbZTUYcPRbh@Ii>}Rwg%_7d}XnnLxkPi=AZ%vRw6_Y%6M~KpmD8;@QWVR z5E^Tjrh>ks%ot0YGfdW=uL+%()wK(Q{j)9nzete({Csf#0horjO?*L~O-;h#C&FUv za*Vxx9Tiq8cBSLviOG1z7{>kGGlOTR*rB{xw;Y<(1}7sniLIcr`5*h6Vn4IN~2CI?c&BNf)x@Gop(Z#hi`5XAgO836d4R zpy%m}BxldsKMMHyQPtsqnIr3XTj6&czG7RJUKPM03`&4i`L%FmrIJImwDq+)%m;M9CM$ ztMqXgeze%q!adb5I7S5u-of)oB*r^MmspikdB0dar)Fu^b`^gg81GV@CWPHNV`d%OC*JeW}twnQfMLQDfj}2+H zrZ&*mH`t3-2UEaR!M?taL7S>43|m9kwL^7Ug?VbNF!2v~vM|@1$wsksqe7EKVb>Bo zW;5hup4=*}`eb5pf~V#OZUo9Nw7fqxAG_gdx~yM*W3_c?)p>lr=bpgNH=pIX62Esf z*t!&5YWp^@TGjPaQ8#~BS<56_u8c)nB;mC4t|J?-MMt+8jfyxdaP z6LfrE)(ZBDssO*@S76IZP)26A+!Ik&>g~wyb0FU?M+N&zrwI0S!9rPyHi*|ffoQFG zy;cT0Oozfn1vQ>dClhN$jIC~tFslvVFIo`I3@gZ)sdUmPNT*Y&B!e0vR)2?%3RWvZ z8$vt6A%rdjOc7oJxepJq()h3A<%yI&l{7lpVc@Ww%)0>hL`vx|By^LwZxSzmY2SBy e?h`-l_%l*WJ1&U#2)r&Gw_Z!p2RLIfIQBm!F0DrZ delta 1313 zcmbW0&ui0Q7{?ovbnCBFmv*h)+|pTAV^_gqwRBZinZq)iiWAYpG&XOyK-Ppe6`YrW z?BYcz0T25RcG)H1(X*h4=bXKHQ%@d-&(n5w?P@^-`H*~*yzl4zCV8tLD8k23$nSxz zv@dKtnraGh=0h_*6BAUHa4JW5l_%bsSM~1jk4IFY`82xSe`yph`PBZ@2dV#9>W4IN zEDb;!{FBx=H3&(lCka6!Y@Lw9j-Q!l8QEFlo-s_)+2h}_+W}Yr4I)Aa0TD)s2o`Y) zF@}gBq5#=XIXvbOUc@*e25`NUR1K=q2}~vtXAsi>3;U9~8WCQ}w&lXmC(2n5wZ_K1JGW@g*^TV;TpI4T%VOMC6H@!V z_xknq>hdPl>W%i-a1!SoDoiiJEq`?ig41n7RrLGI4=kGZIPAn4f7sW$G$jt`3rkuY zI;R{OSkh^fO&~gTtwbj6v7{(UkhuX+xl2h+dqFH(a0x-SrfA;_MM3{Mc6N2BDTJ}x= diff --git a/application/items/__pycache__/items_API.cpython-312.pyc b/application/items/__pycache__/items_API.cpython-312.pyc index b9dcd7a71f69ce918b56e3bf02acd55d286c9ecf..2d954ec8cc1c68fd65715d2d16d40ef5bf7dc4b7 100644 GIT binary patch delta 3133 zcma)8eNa@_72o%E-&}T%2U1dR+ z5JSu|4bUTEN=@3tX~SqO`s_%Orutu;wA0`awZ43{({Y-#rlsRdJCn?Gde2>zb<;TA z+4=3g=bm%V?|j^Q_xvosFvBnXZF+jDhJGG9w{+j-(D>3^uJ~;ECw!)%hdZ5iipM35 z#+fI53v#p-<^t(Hxnw@9ITcsYbW}iqU#_)Cg>XQ-E~7BfUMhySv?T>4_gm9lt@rHV zAKKz&rC(Dh1FNngt6aK&yOoE*tt-y7C5az`S9B%jiX`c`@A=SltVNEQtCBP-K@>_d zS0_o=KpmA;Tqj-Lz1)xQpJ)LwMo*tgxzZUcw4

hI$@$KT^hj#zA3q6?YPLR-Y^$ z;3Zvz)^|V~5j2{EI+@iPD<+9~6b}mU)5DgO0bxKppxets^P0!?`V$%{<;OZ`%+7{i ztXT(=aiv*zii?-|NsTSdVWw?S)cj~`Q5SLeq#(=~3*bhL0j?M~g3-EB3DjCR$Zn_- znsA-ctIi-f)PAc?r;5x5UT@f3zBJ(Iarqpwlc@y>awF>z>=bMwap8Catk{@q7wNEw zeMli4s!MvD@*Oiboo}M_f}hjDpk|>`V_JTkJM!q@R%k4*gsQ?wQZ<&ZT%i zGGra!dp`R@-r2la`z6zx_48HDb5FF*IXxeEo6UvshuuL+vD=NgCqAG{r6{P9D$5 z-7G`7%U;H!8Klxk>Sn1o6qJj0gycy2mU!DZr6Sp1Ln4mUX#S)Vy3aS_g5SLF@^>DoRVQw7$&|6W#N{SV>Wf05{Igjuv z!eTnv37LXQceTj$--cdyt?(XIx~jb4epj%w^s;meQ=zI4hPp5Yn>OAYC?vl_$U%rV zbqr2E^H?F{{u`90A+SbW4B#T9leO&peVt7!DHrCbO_4H4ZfFY_1>9cMg+jEt%qLc( zmBb(v-j&cd)9`WFydFKPX)a%o-Ugj=DBy9%`}_A)PToggoh~GJrYYE8DO{&(cEzzj zs$IsMvbGXKelKe(xE)zV&)&Y$@ z+(1aG$`oAeUz7SVUD-w-hu}>JOjwlV1B9oyUF^^%J$6iMWF?Hpa^U76tCi7d!;St| zs*w}<5LQJk#!qp$Sp6w@I%-Y*6BTx#pV#2Sp;F~cbPI1{;WO?1Xu^sc265=2dghy` zC}r(x_~n^dnyxi(a;r9uDac?%Z? z^RSiXziGHG-do=sFiZ_^GO=6xFUT`7;J*)BQ@@}>83XkvP46`WF2SC0J~73;2;@VSx^xS8OAvFs7?7S(~F& z5D|S2ud}X>4B|x3UUWJ;NN23oBTMdFGgQc)p0`jh_3mv#rSCxFXaPrH7sW6{MzKrZ z7~S&J1L>+u@L`CzC*C3CuM|{WuixccvLIEU|Dfns6SOIxOy1!5Jsf=cvMI~LweYvK S8s5IZ<8YygQ-mL_=Kl-k^)=D} delta 4763 zcmbtX3s6+o8NQFb`-I))DJrxS6Q zbYZ@^=Rg1X&wu{MckZ1T<6a%-jK4@s)HCFF_Ofx`lZOY48Eo^F6~E(>mUgh05=J?g zVi;+$n2FQ*f~+j@Ho3U$1T(6rFuMzIC%1^Vhz8uluQ%nyt{1KN4c?lZE8Z^6JAwbf z=cMF|hFE2?*$TWyRgk&z8*h}pdkd`wysr%{B} zf;Fi)PP!JC5$U=(>3ZxDtXU;-QhUrE8|WSz;xsnm_ldPlane$(S6j2n;-uv<)=I(J z@`^Z(yJ9rTdO6$XP=mU^NI>gIGVt)8^w1~viyZsIkbl#89$#Ev5Gt=I=Tef3Tt4Yw zQHSKK^R_vCF0V%hW%CG0^F_wT&SsLqN!DfDehq%0D8<5x+*}om&ME{JR^@q-!&gix zx`piUDl*x%e8I^y>o>RH{hY}4k;?S*eFDP-RQP6p%2L5cYZd$y)r$!R)E!JfBWeO# z{EFMM)Z}9P!i((VtepwyM6F-_3?u5E;{$qM5_WcF=KFPiy`Px$tJ--{f5|YaQjSba zBv9osHxdi4Nv8bFS8L%o7Zz#LcYECtw2czXS4oTpS1E7L{&4`NO86t+(0zj>y1ON>IJXV(#j2OBONvOB+P^Vjx zBl_q7LEcaafSrKNphO`q0HtIqViKJ`=U%5QImiLpT^(o>tfJ0rgn1Padm_Bt<(5g9 zne6Bf1udYE99!R&y}L=IkW41Fkh+wM3G_3c7?TE9TwFb{dMY_*A~|Qcbi_HCTs&!9 z+rNGK4pRo>x$Yi z^Xkcj!v5-yjmhWNo^C%coqo8#W;#6+@9W<&ZC*5FnlP{Iuf1VTCZIR;S5NDbrgV!Z z;D7bd4gxcbN~jo9-7qg3>K!@|wtXjTY&peGr)Ey2uAE3+Ig&aek3BdpU2P7R)Pbg=MB4tTf@b5VPiefHfKzktrKSJ@U{`_m}cb2q`CZ*@Rg2O{+pgjNEvE* zRrM3y72SB=Rrd9jSM9H_nJlioZn!tBy7wysQKCM4Ehm!ry|Z{LTdn2a)e6-~nm*G! zmsBFBN0gze@tMuZ=4&Lv|38`J5i*(UwYgRbuzqHi6j(|M93=%lh7?qk6jX#11W^d6 zffVp?KxN=(NkO9!L8V{gSNTX+pr3ZDSZIo1^9wOZd z-7-ZUNVojAx?iyDZ``@;6HWa!Hxd%(%RU%e_pA_L$5hi9*;5(zi46OgI9_|rc5P|6 zu{FGXPuL-b+uh-Z4~DysT+i^IPCTVPFMP$rnokVLL;06-FWX+Wja84YxYBUdK2dVd zo+0sLA9>Uvvat;*ov$q=fz<(km`ZD-Wky%3Tm1R^S6BFf4UmBS--D_O!z z?)#iQgSB<*)sKVf5xlj|Yl=$&{$*XC?g&gn!111XYaZ%?;oSg1fB?V=fa3tU04MQF z^=pOilSfDB!}?}TP1G3!(7B`C+2->ibcSd|v|hIe9C=u|IKY|NI-<7Dg28hDkKyj7 zjmb~I8odMF0NgIm0T~^`SDOmh3;469(%@5|H_zqh85lkb5La0#q)2Lsg{^LPWpAYu zwRuGeJq?QA1sDQ&4&ZqJAbmph5KQzE0QikY0HSpWe&ZLLQ`jy%-dtvQg$#$F_Ig=- zvpzSp{K08nt$2a?)?J3^!Y=G=-5~sk=)Vzqw)F>`=4J9oB7kcj9w>|RJJI2gCAZY( zqphGgCZHda1&VjER=+2w;1v#&FivLQ3za(x)p;}xS!5j1w(WC~u)9R%K=jI|8NjAG8fQ_C6zyN~)KP3=RAC^3#7ezEuPp1n>GI|rHPU4#O(jcsi zs32E}RuYZiX%K3Wx7*?C?Uc~lpneSCRe%csuL002J59N*i$D;U;b?rCVHRiuRT7A( zJ3Eof(K-IDoc zQ`k-M29^}y`>Rq@5}cw~>2`V!K=q>c$%G~J2hRt5CiMz-jHnJBB59>=K!O_41^gj; zXis#b%b;c4bzjr{NNRWWP-=~6?sxXOy-tw^IFjJ<$mE^N;e$6Ir3tQ+Rp>VWdIB~f zru0d)4!o@fVo=f|3xs;dEahtcZm)rsp`M{EWGJ2N?6$+;$`7|!X z+t|w(VMjfD_|W$`1aB1xZdU|XCW6}yg#q3N01`q#0SG!1L0cdwO9XX-AQXsU@#4Wu zy@9w%{u#L;v}N!EwqY;JaE3=M$1LHbyfI;>_+KdWV*p^q~ep{-99asL6QGPU*q diff --git a/application/items/database_items.py b/application/items/database_items.py index 978a6c6..527150e 100644 --- a/application/items/database_items.py +++ b/application/items/database_items.py @@ -173,3 +173,21 @@ def paginateLocationsBySkuZone(site: str, payload: tuple, convert=True): except Exception as error: raise postsqldb.DatabaseError(error, payload, sql) +def paginateBrands(site:str, payload:tuple, convert:bool=True): + database_config = config.config() + recordset, count = [], 0 + sql = f"SELECT brand.id, brand.name FROM {site}_brands brand LIMIT %s OFFSET %s;" + 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(f"SELECT COUNT(*) FROM {site}_brands") + 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 49601d6..d26cb85 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -265,7 +265,7 @@ def getZonesbySku(): return jsonify({'zones': zones, 'endpage': math.ceil(count/limit), 'error':False, 'message': f''}) return jsonify({'zones': zones, 'endpage': math.ceil(count/limit), 'error':False, 'message': f'method {request.method} not allowed.'}) -@items_api.route('/item/getLocationsBySkuZone', methods=['get']) +@items_api.route('/item/getLocationsBySkuZone', methods=['GET']) @login_required def getLocationsBySkuZone(): """ GET locations by sku by passing page, limit, item_id, zone_id @@ -301,7 +301,7 @@ def getLocationsBySkuZone(): description: zone_id to pull locations for item_id responses: 200: - description: Zones received successfully. + description: Locations received successfully. """ locations, count = [], 0 if request.method == "GET": @@ -315,38 +315,39 @@ def getLocationsBySkuZone(): return jsonify({'locations': locations, 'endpage': math.ceil(count/limit), 'error': False, 'message': f''}) return jsonify({'locations': locations, 'endpage': math.ceil(count/limit), 'error': True, 'message': f'method {request.method} is not allowed.'}) - -@items_api.route('/item/getLocations', methods=['get']) -def getLocationsByZone(): - zone_id = int(request.args.get('zone_id', 1)) - part_id = int(request.args.get('part_id', 1)) - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 1)) - - offset = (page-1)*limit - database_config = config() - site_name = session['selected_site'] - locations = [] - count=0 - with psycopg2.connect(**database_config) as conn: - sql = f"SELECT * FROM {site_name}_locations WHERE zone_id=%s LIMIT %s OFFSET %s;" - locations = database.queryTuples(conn, sql, (zone_id, limit, offset), convert=True) - sql = f"SELECT COUNT(*) FROM {site_name}_locations WHERE zone_id=%s;" - count = database.queryTuple(conn, sql, (zone_id, )) - return jsonify(locations=locations, endpage=math.ceil(count[0]/limit)) - @items_api.route('/item/getBrands', methods=['GET']) def getBrands(): - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 1)) - offset = (page-1)*limit - database_config = config() - site_name = session['selected_site'] - brands = [] - count = 0 - with psycopg2.connect(**database_config) as conn: - brands, count = database._paginateTableTuples(conn, site_name, f"{site_name}_brands", (limit, offset), convert=True) - return jsonify(brands=brands, endpage=math.ceil(count['count']/limit)) + """ GET brands from the system by passing page, limit + --- + parameters: + - in: query + name: page + schema: + type: integer + minimum: 1 + default: 1 + description: page of the records to GET + - in: query + name: limit + schema: + type: integer + minimum: 1 + default: 10 + description: number of records to grab from the system + responses: + 200: + description: Brands received successfully. + """ + brands, count = [], 0 + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 1)) + offset = (page-1)*limit + site_name = session['selected_site'] + brands, count = database_items.paginateBrands(site_name, (limit, offset)) + return jsonify({'brands': brands, 'endpage': math.ceil(count/limit), 'error': False, 'message': f''}) + return jsonify({'brands': brands, 'endpage': math.ceil(count/limit), 'error': True, 'message': f'method {request.method} is not allowed.'}) + @items_api.route('/item/updateItem', methods=['POST']) def updateItem(): diff --git a/database.log b/database.log index 11df974..b750bd7 100644 --- a/database.log +++ b/database.log @@ -1901,4 +1901,7 @@ 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;') 2025-04-27 16:28:48.252706 --- ERROR --- DatabaseError(message='tuple index out of range', payload=(2, 0), - sql='SELECT item.id, item.barcode, item.item_name FROM test_items itemWHERE item.search_string LIKE '%%' || %s || '%%'LIMIT %s OFFSET %s;') \ No newline at end of file + sql='SELECT item.id, item.barcode, item.item_name FROM test_items itemWHERE item.search_string LIKE '%%' || %s || '%%'LIMIT %s OFFSET %s;') +2025-04-27 17:37:09.434012 --- ERROR --- DatabaseError(message='tupleDictionaryFactory() missing 1 required positional argument: 'row'', + payload=(25, 0), + sql='SELECT * FROM test_brands LIMIT %s OFFSET %s;') \ No newline at end of file