From e89378060cbfab73036a006c08c1fade2770bb69 Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Sun, 27 Apr 2025 18:28:39 -0500 Subject: [PATCH] items_API.updateItem was updated to new schema --- .../__pycache__/postsqldb.cpython-312.pyc | Bin 91618 -> 92633 bytes .../database_items.cpython-312.pyc | Bin 13846 -> 18794 bytes .../__pycache__/items_API.cpython-312.pyc | Bin 39024 -> 36933 bytes application/items/database_items.py | 87 +++++++++++++++++- application/items/items_API.py | 70 ++++---------- .../items/sql/insertTransactionsTuple.sql | 5 + application/postsqldb.py | 26 ++++++ database.log | 29 +++++- 8 files changed, 164 insertions(+), 53 deletions(-) create mode 100644 application/items/sql/insertTransactionsTuple.sql diff --git a/application/__pycache__/postsqldb.cpython-312.pyc b/application/__pycache__/postsqldb.cpython-312.pyc index 8875f31320cd6077301e47ea1cef6273ebe2993b..38faa62eaa84b8534ad8fd75e953a948a7bb8dc1 100644 GIT binary patch delta 762 zcmZWmOK1~87@pZ|8nfBWqlt+Ptt8PPfi#K_>_J3D&^~=%0uq+&S{Kq}o!uVxVym&> z=F-*`_u5l0ITgWr6TDWCu!U}dhw5EO&B2>E{}%P&zdiR29cS@}inXEiI>`a5 z4S5>a0-#xu@$n_TAoPas6S1y|Rmgu^G-?e|>IHRWLDqC}LG8tAjd?}Wm8w=z>W>-~ zMItOlh`gdXdQtsfY(+Ozxp(BrqFC1z-5@n^2rOzcftXFoNQ(wm>HTv;C`45sy@MaN zIEEiunbI{&Ff-QkQo=r%#>cH`le-Wim@bJh0Do%}pGN_p5}_+ah^_-DRXK~w~ckf;j{fX7v=hh3v$H%$lz2y4gK5&xC0;n+yh_%@&GMtJ!_?w5X=Bj zgywG2mld=hN$o{4ok+%EGj1yFuxVF_HfLN;XimDx5r-Xd!|~=VH4iRL!V1)cLda_bT3G5M!@Nc$5oLXZS1a i^7cCkXL0@jJ*DIHuM8n3^pi{_>()2ayjQgh-WH3r{F)}eQFak{}R@pu|gHe%@`x8SQ6Qg*M HC{PRlepVcK diff --git a/application/items/__pycache__/database_items.cpython-312.pyc b/application/items/__pycache__/database_items.cpython-312.pyc index b2b8c139aec8aba5c58a0e9ab8a7c9ecd7fc4006..fd32af6fd312808a3cd3b511dc05f341d17551bf 100644 GIT binary patch delta 4344 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 delta 398 zcmaDgiE&yE-)UZ6E(RcA-^7=3TyY|w1mnGl>Pq$eDa@%XDJ-e1DXgh%X>2KMEv!-O zDd?i?Kv511Q4XLeCx$2|P?QTplnW@zjUmeI1Qg~$2&b{6@Bl@4QABuwB76uDs6+XH zqWqOingW|O7#FcHvTZ)i>cPS;4fJ909frvlStT|baTT(#>3{^-Cm$3M-Mo+QFDs+n z<~<_mY;0j5;VEEYJ85Y)#=Ol@iUDklEt^-XPi14Awb@bcE(_y^&GN?c8Raw?Lo@|$ zaVHiOd>GM!_~iBbA0-tf;ID?=8Es>|5`9D<2Yw z(qdY*2|d(d5=}InNlk30IPZ_9Q`1UjTJupywq}~i3vKLlCjTTe;xvDmKiYHdqwFRV zGu;_}+&colHH@vZ3eOJ7%uM_UU^>xn+2lTGm&+NW1 z@>o4VB|#NIC-l~>7rON4>;C2t4#AOz-X+mRF^N_(eA=*6i0SLMU9xeB?ci%#BOHeM zrY%B3Pc^L;pti^*)(LR!nYAK|!hePj7TNJA|4G(w;QyyY%>_3cW#1bXhx3L7Ez7nM zTe6?CTo%m(LY`J&u8{7KoRaIDcv&zhZMi(RVn7{c);Jfr!DAD zr=*A``!&TM*W^BbJPF5_lorrB9GBMlkr{!R9oyjMBPSkh>@E zYVmBqACn`J%od4$e=^c12e=wH%#@cdC52>d!7kcsY1{_WWmb54#0NL>9d&(p7q$Yy zu#zwhjte<2U#s0??9+_Fe|M$AQ(>cHGEiA zlFUK0B}DV46jclH`#0l#85PHZex|^oWj=VjrC?Q8a;blzuGdCtOiDDgci!3h$7dhkJG=e|nWBBSJRP&v4i-Rr`qC%; zmV?=dc)FG3(Qq`l2a#l^u?o~=xOh$}9fm#B zx@%|f+dW9m%Y**V=HhCX;nL!LvZ_V;Qe2)5fOGf8RTN*QAQ*qEhk0J?pPd?7?&8oGS$49N3?rJ-el)77>2jxRi1@R#*I!TsNYzAtW zRwoF?2!2TLO9aDyR8C4%Hu69!&SaHcBC0o`^u$#y-mQkY#^&heQ8H#&Db+mn+$F=# z^RF6Cru2uk!IaE?O{&KU&J!?#mk1gVs(sn+V_z%|mJMP%iBlw5BZ6U1r5H|x&!dgP z8Q9)aQ!_!VXA!Ck8O4eHf`Er88(LnYlQ7w{+0NyE1+zVm+ODGHZ*_0%x@{8=GmqeL zBpMDi-9;C`USA}#Kak>_urqKczq^_{K25B}($4Yz3aH6PR#123B--?bXf@E|7iiln@4PlQ^T9E}eI zBV7sEaI{7S6G}wl(KYhpNt}>cSfdtVJPy}L;S2$vY_=RHF4%B2`o(tFKcC9Q! zGTAzrgqdR%?psJ~z_(O=8Fr3V>czuNqL1I6OCO;lybQ)6G4kM6et-5CqVlTt{6AG~ z`UaViRYC^lM@l`pKF}Db99?F6A9XhC4WkcO{Mq2UQar&Ff9}LSGCU4rCn{{*6Sxy9 zfj3Y1&BDBYa6lN_R)ICapK%-%r0@gMmE#F*_hE_pAUWo?-NtRZ{?yn;%L?w!N5tkw zavgbRyb7~(cf4Wi{R@E(8U!CA7{R_7}`m-l5TkPCs zC+s-2nopl0JO6G7Fq&pVjxH8SN`Zi3;|ty?L#~A}hGbV%QE+zRJ=tp{@BZJ23Iy11 zh~VLYpq?k`#SMD}nT%pQ1k|;RT87;wpvqws4|WHZPnNsy;Zndqb*=u`WU07xxv*dOwrA2I4(cc delta 4876 zcmb_f3s6+o8NT=K-hJ@e1$KGtF6@H%SV4U75=BKp1p}yvw#MLQ;aGb?(c?GM} znf4BR_niOy=ltLK&wu~_?CZna^cWZO+vw;BhCF*-j(KdN{iT@kEVdiJk@XyVBv7|z zMrAxo#!vyka)1>8wYWJqn{@`B%Y9ePI`FZgX1zGCRu3%!e_XVkZ46{@8R4nMR%|Ru zV_mqQWFy-gXe+U@kx@iZLH<9hQQ?1lC6oOEkJYcl{_=c$;8 znu#k=746S)$ercD_mFASIzP*SCmgg39LRVCjPz=Kv3UKulr>;lL3AQ7aXs2O8$#4~ zI7)^GDnvU%h+a%aB#P0C$kfvQ9GU7xWT+N#7FmQiAk=g;R$hozza$yT#u2LXTK79dXKw9L_S&T@`a4}G`hS#SG||2 zq70y+b1ab-gOsmBPPZVds7bG^u5+S#k3bAj3T|hsD60U_8eENNBP^!(5kGjH z^*)!!?Eno~LCncK0mlYeNmSjam?$D200QU&I1T{*MJEWzJYB|1GBsmcc+zPTSwSNr z%o$vOE)l__EW>y$O8i1q27an6&i{eQHngfwH)Svn?3D~zecC(bl%OVQGCuLy!V86X z^QR1_EoJ*kCX-VJ>IaiArw*pxO16K>u+gP#KR=mMFs^v1aQvW@QxeqMhIbAZjARU_ z-qf%AL;)Jp3Ya~kVPX~u}sP-pQyf>vzItFXj?~o z8Zzfg=KNdcjo{h+Vb2CP?IB*BD3S8^-Rs)@?468NL3@#uu_dTao6;MD2`fho!R)P) zecNq)@l={UlvW_66^tv#T@&RKn}dhMV0i=aW}Bbg4qmO~_QR{1s{>b8a`o_Xu>uI) z90HH0d%6CYNu6=Pa5;G}dB`m3GDZv|4WpLvxSRIP5EQDxqL4X@M8++1_NR<8wgi|b zng$v#o}4V)GT!)V$_<}XSP@KGHBvH?H>Mo1+)VQ4-yuWwuO@#qd$2dQ!=iYOtViWTP7`Qr;@D0 zS}AGuq;dI7e1tKkZ|6(`6KxDdWl2$4BQ;}%WaHypn~FXl5VF=o1GH z2D8d;>&kL`2xzqlmwV!;L0R(XMOY51^&)OV`1M2S{L4f*5%~Df8r5=I(o;xZ*3>`dBIn=|5ZxKn_PL|L zTWj-FbgPf!uG-XkS|Ffmczwu7^mfUSEuMNOEiNvBIH(pT)3Ons1>J7~^Z`5x@G}Ck zszY=O9we*9<83Y^deJxxL8-x!NAp`@vaEzNrnN0h>?8;^$kXZYb+w7;7cip(-~|8( z0yG9dYpf9|p}iJhNk}aC5K1e03cqx8KYIZy9GRK)tl{YGIt0E!uK-ZDESwgt_(S-x zBVR@JU&GHh3i&sQ<~xB~jyL!`>RP)0Cx}p1d)w=Pv0V|48W5tl01^PgQGW)%E$*>W zroRGd6aZWg7RBv#ys=?}5$+m`4tAD}zhNaGBqO%K)rR*J7D@q@mzC}9GbRP7#e4I6;jFiAq|J64xM{M8^C1T+96|C;~|TPAblShzl6r#F5% zk6`_JyO{y-NgWFJ$%~pEmOUB)z8t zZ=AlRhzxHIM#u3F`!Wd=sjsN^{!C!uI4D{bvq|>>pNcBXjpo%w1aZ@o8~M9rq0zvV zC)3$*LCJ-Ml}%ocJ6tc#v|sOO>mvD9Jl0Nr^?1>BBBZ4g(F8>j=Gjtq6qlXdcjyQV zIRP30ngK2WTmiTS0F?*52>@9Ng#h4VMeuPUh-3tjhT!NCxCq_Fe?OZN!LtlQ{ur-4 dU_6(|#pScx+0PUVS1`>%bGnTUY&oyt{tckfJiGt^ diff --git a/application/items/database_items.py b/application/items/database_items.py index 527150e..0a28425 100644 --- a/application/items/database_items.py +++ b/application/items/database_items.py @@ -1,6 +1,7 @@ from application import postsqldb import config -import psycopg2 +import psycopg2 +import datetime def getTransactions(site:str, payload: tuple, convert:bool=True): @@ -190,4 +191,86 @@ def paginateBrands(site:str, payload:tuple, convert:bool=True): count = cur.fetchone()[0] return recordset, count except Exception as error: - raise postsqldb.DatabaseError(error, payload, sql) \ No newline at end of file + raise postsqldb.DatabaseError(error, payload, sql) + +def postUpdateItem(site:str, payload:dict, convert:bool=True): + def postUpdateData(conn, table, payload, convert=True): + updated = () + + set_clause, values = postsqldb.updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {table} SET {set_clause} WHERE id=%s RETURNING *;" + try: + with conn.cursor() as cur: + cur.execute(sql, values) + rows = cur.fetchone() + if rows and convert: + updated = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + return updated + + def postAddTransaction(conn, site, payload, convert=False): + transaction = () + with open(f"sql/INSERT/insertTransactionsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + transaction = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + transaction = rows + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + return transaction + + transaction_data = {} + database_config = config.config() + data = payload['update'] + for key in data.keys(): + for key_2 in data[key].keys(): + transaction_data[f"{key_2}_new"] = data[key][key_2] + try: + with psycopg2.connect(**database_config) as conn: + item = getItemAllByID(site, (payload['id'], )) + if 'item_info' in data.keys() and data['item_info'] != {}: + for key in data['item_info'].keys(): + transaction_data[f"{key}_old"] = item['item_info'][key] + postUpdateData(conn, f"{site}_item_info", {'id': item['item_info_id'], 'update': data['item_info']}) + + if 'food_info' in data.keys() and data['food_info'] != {}: + for key in data['food_info'].keys(): + transaction_data[f"{key}_old"] = item['food_info'][key] + postUpdateData(conn, f"{site}_food_info", {'id': item['food_info_id'], 'update': data['food_info']}) + + if 'logistics_info' in data.keys() and data['logistics_info'] != {}: + for key in data['logistics_info'].keys(): + transaction_data[f"{key}_old"] = item['logistics_info'][key] + postUpdateData(conn, f"{site}_logistics_info", {'id': item['logistics_info_id'], 'update': data['logistics_info']}) + + if 'item' in data.keys() and data['item'] != {}: + for key in data['item'].keys(): + if key == "brand": + transaction_data[f"{key}_old"] = item['brand']['id'] + else: + transaction_data[f"{key}_old"] = item[key] + postUpdateData(conn, f"{site}_items", {'id': payload['id'], 'update': data['item']}) + + trans = postsqldb.TransactionPayload( + timestamp=datetime.datetime.now(), + logistics_info_id=item['logistics_info_id'], + barcode=item['barcode'], + name=item['item_name'], + transaction_type="UPDATE", + quantity=0.0, + description="Item was updated!", + user_id=payload['user_id'], + data=transaction_data + ) + postAddTransaction(conn, site, trans.payload()) + except Exception as error: + raise postsqldb.DatabaseError(error, payload, "MULTICALL!") \ No newline at end of file diff --git a/application/items/items_API.py b/application/items/items_API.py index d26cb85..93e2298 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -351,60 +351,30 @@ def getBrands(): @items_api.route('/item/updateItem', methods=['POST']) def updateItem(): + """ POST update to item in the system by passing item_id, data + --- + parameters: + - in: query + name: item_id + schema: + type: integer + minimum: 1 + default: 1 + description: item_id that the POST targets + - in: header + name: data + description: data to update in system + responses: + 200: + description: item updated successfully. + """ if request.method == "POST": id = request.get_json()['id'] data = request.get_json()['data'] - - database_config = config() site_name = session['selected_site'] - - transaction_data = {} - for key in data.keys(): - for key_2 in data[key].keys(): - transaction_data[f"{key_2}_new"] = data[key][key_2] - - with psycopg2.connect(**database_config) as conn: - item = database.getItemAllByID(conn, site_name, (id, ), convert=True) - if 'item_info' in data.keys() and data['item_info'] != {}: - for key in data['item_info'].keys(): - transaction_data[f"{key}_old"] = item['item_info'][key] - item_info_id = item['item_info_id'] - item_info = database.__updateTuple(conn, site_name, f"{site_name}_item_info", {'id': item_info_id, 'update': data['item_info']}, convert=True) - if 'food_info' in data.keys() and data['food_info'] != {}: - for key in data['food_info'].keys(): - transaction_data[f"{key}_old"] = item['food_info'][key] - food_info_id = item['food_info_id'] - print(food_info_id, data['food_info']) - food_info = database.__updateTuple(conn, site_name, f"{site_name}_food_info", {'id': food_info_id, 'update': data['food_info']}, convert=True) - if 'logistics_info' in data.keys() and data['logistics_info'] != {}: - for key in data['logistics_info'].keys(): - transaction_data[f"{key}_old"] = item['logistics_info'][key] - logistics_info_id = item['logistics_info_id'] - print(logistics_info_id, data['logistics_info']) - logistics_info = database.__updateTuple(conn, site_name, f"{site_name}_logistics_info", {'id': logistics_info_id, 'update': data['logistics_info']}, convert=True) - if 'item' in data.keys() and data['item'] != {}: - for key in data['item'].keys(): - if key == "brand": - transaction_data[f"{key}_old"] = item['brand']['id'] - else: - transaction_data[f"{key}_old"] = item[key] - item = database.__updateTuple(conn, site_name, f"{site_name}_items", {'id': id, 'update': data['item']}, convert=True) - - trans = MyDataclasses.TransactionPayload( - timestamp=datetime.datetime.now(), - logistics_info_id=item['logistics_info_id'], - barcode=item['barcode'], - name=item['item_name'], - transaction_type="UPDATE", - quantity=0.0, - description="Item was updated!", - user_id=session['user_id'], - data=transaction_data - ) - database.insertTransactionsTuple(conn, site_name, trans.payload()) - - return jsonify(error=False, message="Item updated successfully!") - return jsonify(error=True, message="Unable to save, ERROR!") + database_items.postUpdateItem(site_name, {'id': id, 'update': data, 'user_id': session['user_id']}) + return jsonify({'error': False, 'message': f'Item was updated successfully!'}) + return jsonify({'error': True, 'message': f'method {request.method} is not allowed!'}) @items_api.route('/item/updateItemLink', methods=['POST']) def updateItemLink(): diff --git a/application/items/sql/insertTransactionsTuple.sql b/application/items/sql/insertTransactionsTuple.sql new file mode 100644 index 0000000..d8ee48d --- /dev/null +++ b/application/items/sql/insertTransactionsTuple.sql @@ -0,0 +1,5 @@ +INSERT INTO %%site_name%%_transactions +(timestamp, logistics_info_id, barcode, name, transaction_type, +quantity, description, user_id, data) +VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/application/postsqldb.py b/application/postsqldb.py index 81ee6bf..d194610 100644 --- a/application/postsqldb.py +++ b/application/postsqldb.py @@ -2344,3 +2344,29 @@ class LoginsTable: except Exception as error: raise DatabaseError(error, payload, sql) return updated + +@dataclass +class TransactionPayload: + timestamp: datetime.datetime + logistics_info_id: int + barcode: str + name: str + transaction_type: str + quantity: float + description: str + user_id: int + data: dict = field(default_factory=dict) + + def payload(self): + return ( + self.timestamp, + self.logistics_info_id, + self.barcode, + self.name, + self.transaction_type, + self.quantity, + self.description, + self.user_id, + json.dumps(self.data) + ) + \ No newline at end of file diff --git a/database.log b/database.log index b750bd7..5cf6446 100644 --- a/database.log +++ b/database.log @@ -1904,4 +1904,31 @@ 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 + sql='SELECT * FROM test_brands LIMIT %s OFFSET %s;') +2025-04-27 18:14:06.368648 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload=(,), + sql='WITH passed_id AS (SELECT %s AS passed_id), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix as p WHERE p.id = ANY(test_item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_item_locations.location_id WHERE part_id = (SELECT passed_id FROM passed_id) ), cte_logistics_info AS ( SELECT li.*, row_to_json(pl) AS primary_location, row_to_json(ail) AS auto_issue_location, row_to_json(pz) AS primary_zone, row_to_json(aiz) AS auto_issue_zone FROM test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_zones AS aiz ON li.auto_issue_zone = aiz.id WHERE li.id=(SELECT logistics_info_id FROM logistics_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-04-27 18:16:25.663980 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload=(,), + sql='WITH passed_id AS (SELECT %s AS passed_id), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix as p WHERE p.id = ANY(test_item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_item_locations.location_id WHERE part_id = (SELECT passed_id FROM passed_id) ), cte_logistics_info AS ( SELECT li.*, row_to_json(pl) AS primary_location, row_to_json(ail) AS auto_issue_location, row_to_json(pz) AS primary_zone, row_to_json(aiz) AS auto_issue_zone FROM test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_zones AS aiz ON li.auto_issue_zone = aiz.id WHERE li.id=(SELECT logistics_info_id FROM logistics_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-04-27 18:16:52.992559 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload=(,), + sql='WITH passed_id AS (SELECT %s AS passed_id), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix as p WHERE p.id = ANY(test_item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_item_locations.location_id WHERE part_id = (SELECT passed_id FROM passed_id) ), cte_logistics_info AS ( SELECT li.*, row_to_json(pl) AS primary_location, row_to_json(ail) AS auto_issue_location, row_to_json(pz) AS primary_zone, row_to_json(aiz) AS auto_issue_zone FROM test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_zones AS aiz ON li.auto_issue_zone = aiz.id WHERE li.id=(SELECT logistics_info_id FROM logistics_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-04-27 18:17:17.600118 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload=(,), + sql='WITH passed_id AS (SELECT %s AS passed_id), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix as p WHERE p.id = ANY(test_item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_item_locations.location_id WHERE part_id = (SELECT passed_id FROM passed_id) ), cte_logistics_info AS ( SELECT li.*, row_to_json(pl) AS primary_location, row_to_json(ail) AS auto_issue_location, row_to_json(pz) AS primary_zone, row_to_json(aiz) AS auto_issue_zone FROM test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_zones AS aiz ON li.auto_issue_zone = aiz.id WHERE li.id=(SELECT logistics_info_id FROM logistics_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-04-27 18:18:01.277027 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload=(,), + sql='WITH passed_id AS (SELECT %s AS passed_id), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix as p WHERE p.id = ANY(test_item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_item_locations.location_id WHERE part_id = (SELECT passed_id FROM passed_id) ), cte_logistics_info AS ( SELECT li.*, row_to_json(pl) AS primary_location, row_to_json(ail) AS auto_issue_location, row_to_json(pz) AS primary_zone, row_to_json(aiz) AS auto_issue_zone FROM test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_zones AS aiz ON li.auto_issue_zone = aiz.id WHERE li.id=(SELECT logistics_info_id FROM logistics_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-04-27 18:18:08.507049 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload=(,), + sql='WITH passed_id AS (SELECT %s AS passed_id), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix as p WHERE p.id = ANY(test_item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_item_locations.location_id WHERE part_id = (SELECT passed_id FROM passed_id) ), cte_logistics_info AS ( SELECT li.*, row_to_json(pl) AS primary_location, row_to_json(ail) AS auto_issue_location, row_to_json(pz) AS primary_zone, row_to_json(aiz) AS auto_issue_zone FROM test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_zones AS aiz ON li.auto_issue_zone = aiz.id WHERE li.id=(SELECT logistics_info_id FROM logistics_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-04-27 18:18:39.724692 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload={'id': , 'update': {'brand': 1066, 'item_type': 'FOOD_PLU'}}, + sql='UPDATE test_items SET brand = %s, item_type = %s WHERE id=%s RETURNING *;') +2025-04-27 18:19:35.001736 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload={'id': , 'update': {'brand': 1066, 'item_type': 'FOOD_PLU'}}, + sql='UPDATE test_items SET brand = %s, item_type = %s WHERE id=%s RETURNING *;') +2025-04-27 18:20:02.983151 --- ERROR --- DatabaseError(message='can't adapt type 'builtin_function_or_method'', + payload={'id': , 'update': {'brand': 1066, 'item_type': 'FOOD_PLU'}}, + sql='UPDATE test_items SET brand = %s, item_type = %s WHERE id=%s RETURNING *;') \ No newline at end of file