From 37b2a2da980b921026b5c7bdfd1d4a146c641e7b Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Sat, 24 May 2025 09:02:55 -0500 Subject: [PATCH] test --- .gitignore | 1 + __pycache__/MyDataclasses.cpython-312.pyc | Bin 17654 -> 17677 bytes __pycache__/api.cpython-312.pyc | Bin 23020 -> 23045 bytes __pycache__/api_admin.cpython-312.pyc | Bin 18590 -> 18613 bytes __pycache__/config.cpython-312.pyc | Bin 3534 -> 3557 bytes __pycache__/database.cpython-312.pyc | Bin 85819 -> 85842 bytes __pycache__/database_admin.cpython-312.pyc | Bin 1468 -> 1491 bytes __pycache__/external_API.cpython-312.pyc | Bin 8596 -> 8619 bytes __pycache__/group_api.cpython-312.pyc | Bin 2924 -> 2947 bytes __pycache__/main.cpython-312.pyc | Bin 44086 -> 44109 bytes __pycache__/manage.cpython-312.pyc | Bin 6857 -> 6880 bytes __pycache__/postsqldb.cpython-312.pyc | Bin 91610 -> 91633 bytes __pycache__/process.cpython-312.pyc | Bin 16498 -> 16521 bytes __pycache__/receipts_API.cpython-312.pyc | Bin 28210 -> 28233 bytes __pycache__/shopping_list_API.cpython-312.pyc | Bin 12758 -> 12781 bytes __pycache__/user_api.cpython-312.pyc | Bin 7845 -> 7868 bytes __pycache__/webpush.cpython-312.pyc | Bin 2967 -> 2990 bytes __pycache__/workshop_api.cpython-312.pyc | Bin 20549 -> 20572 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 194 bytes .../__pycache__/postsqldb.cpython-312.pyc | Bin 94447 -> 94470 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 177 -> 200 bytes .../database_items.cpython-312.pyc | Bin 40469 -> 40492 bytes .../__pycache__/items_API.cpython-312.pyc | Bin 36455 -> 39244 bytes .../items_processes.cpython-312.pyc | Bin 6816 -> 6839 bytes application/items/items_API.py | 41 +- .../items/static}/ItemListHandler.js | 2 +- .../items/static}/itemEditHandler.js | 0 .../items/static}/transactionHandler.js | 0 .../items/static}/transactionsHandler.js | 0 .../items/templates}/index.html | 2 +- .../items/templates}/item_new.html | 0 .../items/templates}/itemlink.html | 0 .../items/templates}/transaction.html | 0 .../items/templates}/transactions.html | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 175 -> 202 bytes .../database_recipes.cpython-312.pyc | Bin 14360 -> 14383 bytes .../__pycache__/recipes_api.cpython-312.pyc | Bin 16402 -> 16425 bytes item_API.py | 546 ------------------ webserver.py | 31 +- 39 files changed, 43 insertions(+), 580 deletions(-) create mode 100644 .gitignore rename {static/handlers => application/items/static}/ItemListHandler.js (99%) rename {static/handlers => application/items/static}/itemEditHandler.js (100%) rename {static/handlers => application/items/static}/transactionHandler.js (100%) rename {static/handlers => application/items/static}/transactionsHandler.js (100%) rename {templates/items => application/items/templates}/index.html (99%) rename {templates/items => application/items/templates}/item_new.html (100%) rename {templates/items => application/items/templates}/itemlink.html (100%) rename {templates/other => application/items/templates}/transaction.html (100%) rename {templates/items => application/items/templates}/transactions.html (100%) delete mode 100644 item_API.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba0430d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ \ No newline at end of file diff --git a/__pycache__/MyDataclasses.cpython-312.pyc b/__pycache__/MyDataclasses.cpython-312.pyc index 1ac8066f7ab562dccf8dba7279f10deba35e244c..cbdb3e31acd5e4c70bf9527eda175ade907f2a1f 100644 GIT binary patch delta 84 zcmey?$=KV)$bFiZmx}=iW*;-$$SuZV5tVEe6Iz^FR2-9)n37)}XBj0IWUM>b82tRI^A?&)5Zz79DK(bX#XmM&$aZFZXN`85aUus23a!!6} z3WQ&omm1@opOTuCSe#lM6Ofo!QdAjIl$e}7`2dR+BiH8FES?-}LO>&n_fM|1a@}0d ztIx{lxOu%$IV*b*NZ5jLa-EgfW@iaSHnvQVz^};;PKukmb8h_<_({?BD2-$WKgOINEHztoD7ie;?!cG zSb0EVUP)2qKOr^`#Kx| diff --git a/__pycache__/api_admin.cpython-312.pyc b/__pycache__/api_admin.cpython-312.pyc index c3af222ee26d512c485ffafed6f645b223d85ba2..a5f9c1a8c9b270c10c6c2162c8ed7262149f361d 100644 GIT binary patch delta 84 zcmbO?k#XxpM()$Ryj%=GF#DL{Ms6QAi?C#?n9$r1iH75XEf)vdF diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc index 7cae4092b76aeb831e9409b9f64779f806375fc4..ff7546005cc5266d30ca21b4a784cce06d0bf39f 100644 GIT binary patch delta 83 zcmX>n{ZyLgG%qg~0}#wUW|*;&hlj}`IN2&Dv^ce>I3_DGCBHnzFSVj1IVZm~1;Ve) hOO0{PPf1NmEKV(s2}sNmuFSVj1IVZm~CB`{FB{eCrIJFokRvwU; NS5j2DIe=*@Hvm}^6vO}k diff --git a/__pycache__/database.cpython-312.pyc b/__pycache__/database.cpython-312.pyc index 3aa5ad58815f8733e8670be75c3a6ef5d3e726d1..85fb83d8828dd10f96ee4ad701b35c47d618bf3a 100644 GIT binary patch delta 88 zcmdlzkM+_#R_@chyj%=GF#DL{Ms8MCi_m1Nn9$W diff --git a/__pycache__/database_admin.cpython-312.pyc b/__pycache__/database_admin.cpython-312.pyc index 0b0b2278fa25070222dc8f2cf106604bf3e1e9ec..7bddf549a9341783b06a36a724722a9beb4b14dc 100644 GIT binary patch delta 81 zcmdnPeVLp4G%qg~0}#wUX1I}i0<%SQvQvYDGzMPJU?$gkPDL f8snUwlA4rQoLU?ckeF9eR2fo~n4GJ=0ZE78N delta 58 zcmcc2y@#9oG%qg~0}#00WZTF+fmzWd)hfm>wW1_BC%-f$#yLMFH7T(;wHPQ?9*~$< LQdGJ4GBXnZ3p5jr diff --git a/__pycache__/external_API.cpython-312.pyc b/__pycache__/external_API.cpython-312.pyc index 98e1ac37e2a3ebff31e7b364150eb8628a8910bb..417bbd57d2e8c97fc11535457b3112a61a1b4ca5 100644 GIT binary patch delta 82 zcmbQ@yxN)jG%qg~0}#wUX1I|%n%yEY*(xTqIJKxaCMz)|zdXh-wW1_BC%-fW!mrFr gjd9LTNli*DPA!fJNX#oKsthSgOwQii&dw_Z0EdemXaE2J delta 59 zcmZ4OJjI#&G%qg~0}zB=W8TOe&93N_Y8B&`T2YdmlV6$=4B_?NYp2>Wf9RQ!59&`Wz delta 60 zcmZn`eLI{;LM6=DDY diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index 534163c09fa5f56313dc1538ad9abcae2b136d51..b66feb956185d03353209313ba554cc4d4830d4e 100644 GIT binary patch delta 84 zcmdmXgX!!IChpU`yj%=G5O>;eBX=W{MPRa3OlWaxQE^OGVoH8_j9+R+NpenpX$pj2 inU@;loS%}Klvtcv921b3S5j0NQk0mSy?HHD=Sl$igdgVs delta 61 zcmX?mgK66hChpU`yj%=GaCI*0M(#!?MXOY+7{AntlH{EH(v%qI{FKzB#NyOqpjdf8 OVqQs6<>n(yoht!}_!fu& diff --git a/__pycache__/manage.cpython-312.pyc b/__pycache__/manage.cpython-312.pyc index 659efe45357add6aa12e1dc8629e7f2141f7ea13..39cfe1a57f3551afb7cea728dea7c38d29446e55 100644 GIT binary patch delta 83 zcmX?U`oNUuG%qg~0}#wUW|*;&$AH5kIN2&Dv^ce>I3_DGCBHnzFSVj1IVZm~1;Ve) hOO0{PPf1NmEKV(s2}sNmuFSVj1IVZm~CB`{FB{eCrIJFokRvwU; NS5j2Dxr8G}2moo<6(Ils diff --git a/__pycache__/postsqldb.cpython-312.pyc b/__pycache__/postsqldb.cpython-312.pyc index 94f16ee855e7136216baa77ddad2ee3da8624d38..f9b71ec2903ff3df6dd473ae5f7ea0e06c061605 100644 GIT binary patch delta 88 zcmcb0n)TypR_@chyj%=GF#DL{M((rB7GcR&F`>n&Ma3~$i7ENzF@C8PCCNGYr6~}8 nWnOBGbAC!{QetsxaZEsBUP)19NKs;PcJoi>?LV0rA0`3-whie;?!cGSb0EV RUP)19vjEF>0T#xGi2%>b7B~O^ diff --git a/__pycache__/process.cpython-312.pyc b/__pycache__/process.cpython-312.pyc index a5ac356d5cebadcb8d80385d3de07e0c72c4ce51..e224feb4897e12e6c639bcac4a91beaf2d5ee346 100644 GIT binary patch delta 84 zcmey=z}VTy$bFiZmx}=iW*;-$$i1A|A|%-=CbT%Us5mAoF(tn|#xJ#^BsnL)GzG%1 i%u9`N&QD2AN-Rz-jtNN2D=DfBDN0Pv-h7#Pz6}7`L?2)P delta 61 zcmeBdWc<{?$bFiZmx}=irY#lP$i19d(Kgj8#xJ#^BsnL)G$qD4KP5FOu{gCDC{`Yj Om{(F%x%n0Id>a5>Nfn;} diff --git a/__pycache__/receipts_API.cpython-312.pyc b/__pycache__/receipts_API.cpython-312.pyc index eff152328572c360162ab701e1012f3930ca81f6..84170dbd6c2b75880da0c7509547d3b18e6d6157 100644 GIT binary patch delta 84 zcmdmVhw delta 61 zcmX?khjG&#M()$Ryj%=Guxq=(M(!dGMWsv%Q&ItndKOIp diff --git a/__pycache__/shopping_list_API.cpython-312.pyc b/__pycache__/shopping_list_API.cpython-312.pyc index 6af6dfdd92ca57d593dc8c6d33aaa42898e0e456..e00d284d923c1a6b11791292f76b47f1dcf99745 100644 GIT binary patch delta 83 zcmcbX{5F~AG%qg~0}#wUW|*;&N1N3mF4-z3v^ce>I3_DGCBHnzFSVj1IVZm~1;Ve) hOO0{PPf1NmEKV(s2}sNvYDGzMPJU?$gkPDL g8snUwlA4rQoLU?ckeF9eR2fo~n4G=&5A#YX0Ib~}_y7O^ delta 59 zcmdmEyVREZG%qg~0}u!=VBN@lfmzWm)hfm>wW1_BC%-f$#yLMFH7T(;wHPQ?9*~$< MQdGHFm}R9D03U-BqW}N^ diff --git a/__pycache__/webpush.cpython-312.pyc b/__pycache__/webpush.cpython-312.pyc index 34fe0561a5a15e2d3266d29a5d57256b3b67b4e5..852bad033ad17eab760ff09bb5b5103e86eeca25 100644 GIT binary patch delta 82 zcmbO(zD}I`G%qg~0}#wUX1I}iHlsyIvQvYDGzMPJU?$gkPDL g8snUwlA4rQoLU?ckeF9eR2fo~n4G=&IO7FQ0DY+*Hvj+t delta 59 zcmZ1{K3$yqG%qg~0}%YZz`T)rHlw0#s#T0%YDGzMPJU@hjB|cUYEoixYB5l(JRmWz Mq^NT9J;n>105s4P`2YX_ diff --git a/__pycache__/workshop_api.cpython-312.pyc b/__pycache__/workshop_api.cpython-312.pyc index 431faa64c39c6544cc27bbe6211882c5551f7c0a..477bf616e001134e3f84f387d5fd7cd39bff0498 100644 GIT binary patch delta 84 zcmX@Qfbq@(M()$Ryj%=GF#DL{M(!yb7LmzTF`>n&Ma3~$i7ENzF@C8PCCNGYr6~}8 iWnOBGbAC!{QetsxaZEsBUP)19NKs;P_T~c|t?mH!86Tej delta 61 zcmcb!fbr-8M()$Ryj%=GpgV_kBli>zMWu=gt?mF_s1;uT diff --git a/application/__pycache__/__init__.cpython-312.pyc b/application/__pycache__/__init__.cpython-312.pyc index d3088b4e4bb24734908180565efeaba6449edef2..8386f227c2e1cd4a85e1560dd4d3e431805938c5 100644 GIT binary patch delta 109 zcmZ3^c!-hvG%qg~0}#wUW;l`CI4m*QDkiizwWv5ID={U%JjO4zq9i#dzcdBHugpu0 zan4UkO-d|IEshCD%quCX3@J)X&Wb8n0?G}Beyz>MN+a=OlWaxQE^OGVoH8_j9+R+NpenpX$pj2 mnU@;loS%}Klvtcv921b3S5j0NQk0mS-5kuaJ(z`YP7VNf9Uwpe delta 65 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 diff --git a/application/items/__pycache__/items_processes.cpython-312.pyc b/application/items/__pycache__/items_processes.cpython-312.pyc index 9d67cee5c36a62b470c78fcdaecfefcb1d1edefc..e04e4360a05a6fe14a0c09ae9f5a5b68c050b7fa 100644 GIT binary patch delta 82 zcmZ2ry4{rfG%qg~0}#wUX1I~tk;5V{*(xTqIJKxaCMz)|zdXh-wW1_BC%-fW!mrFr gjd9LTNli*DPA!fJNX#oKsthSgOwQh%%V8`80EGe_WdHyG delta 59 zcmdmPy1wW1_BC%-f$#yLMFH7T(;wHPQ?9*~$< MQdGIQg~M0~049(Vxc~qF diff --git a/application/items/items_API.py b/application/items/items_API.py index f53b3c0..55499aa 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -7,13 +7,48 @@ import application.postsqldb as db from application.items import database_items from application.items import items_processes -items_api = Blueprint('items_api', __name__) +items_api = Blueprint('items_api', __name__, template_folder="templates", static_folder="static") + + +def update_session_user(): + database_config = config() + with psycopg2.connect(**database_config) as conn: + user = db.LoginsTable.get_washed_tuple(conn, (session['user_id'],)) + session['user'] = user + +@items_api.route("/") +@login_required +def items(): + update_session_user() + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + return render_template("index.html", + current_site=session['selected_site'], + sites=sites) + +@items_api.route("/item/") +@login_required +def item(id): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + database_config = config() + with psycopg2.connect(**database_config) as conn: + units = db.UnitsTable.getAll(conn) + return render_template("items/item_new.html", id=id, units=units, current_site=session['selected_site'], sites=sites) + +@items_api.route("/transaction") +@login_required +def transaction(): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + database_config = config() + with psycopg2.connect(**database_config) as conn: + units = db.UnitsTable.getAll(conn) + return render_template("transaction.html", units=units, current_site=session['selected_site'], sites=sites, proto={'referrer': request.referrer}) + @items_api.route("/item//itemLink/") @login_required def itemLink(parent_id, id): sites = [site[1] for site in main.get_sites(session['user']['sites'])] - return render_template("items/itemlink.html", current_site=session['selected_site'], sites=sites, proto={'referrer': request.referrer}, id=id) + return render_template("itemlink.html", current_site=session['selected_site'], sites=sites, proto={'referrer': request.referrer}, id=id) @items_api.route("/item/getTransactions", methods=["GET"]) @login_required @@ -87,7 +122,7 @@ 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']) +@items_api.route("/getItemsWithQOH", methods=['GET']) @login_required def pagninate_items(): """ GET items from the system by passing a page, limit, search_string, sort, and order diff --git a/static/handlers/ItemListHandler.js b/application/items/static/ItemListHandler.js similarity index 99% rename from static/handlers/ItemListHandler.js rename to application/items/static/ItemListHandler.js index 3173ab3..3c6e326 100644 --- a/static/handlers/ItemListHandler.js +++ b/application/items/static/ItemListHandler.js @@ -296,7 +296,7 @@ async function setOrder(order_string) { } async function getItems(){ - const url = new URL('/item/getItemsWithQOH', window.location.origin); + const url = new URL('/items/getItemsWithQOH', window.location.origin); url.searchParams.append('page', current_page); url.searchParams.append('limit', limit); url.searchParams.append('search_text', searchText); diff --git a/static/handlers/itemEditHandler.js b/application/items/static/itemEditHandler.js similarity index 100% rename from static/handlers/itemEditHandler.js rename to application/items/static/itemEditHandler.js diff --git a/static/handlers/transactionHandler.js b/application/items/static/transactionHandler.js similarity index 100% rename from static/handlers/transactionHandler.js rename to application/items/static/transactionHandler.js diff --git a/static/handlers/transactionsHandler.js b/application/items/static/transactionsHandler.js similarity index 100% rename from static/handlers/transactionsHandler.js rename to application/items/static/transactionsHandler.js diff --git a/templates/items/index.html b/application/items/templates/index.html similarity index 99% rename from templates/items/index.html rename to application/items/templates/index.html index 1141082..39f3116 100644 --- a/templates/items/index.html +++ b/application/items/templates/index.html @@ -222,5 +222,5 @@ - + \ No newline at end of file diff --git a/templates/items/item_new.html b/application/items/templates/item_new.html similarity index 100% rename from templates/items/item_new.html rename to application/items/templates/item_new.html diff --git a/templates/items/itemlink.html b/application/items/templates/itemlink.html similarity index 100% rename from templates/items/itemlink.html rename to application/items/templates/itemlink.html diff --git a/templates/other/transaction.html b/application/items/templates/transaction.html similarity index 100% rename from templates/other/transaction.html rename to application/items/templates/transaction.html diff --git a/templates/items/transactions.html b/application/items/templates/transactions.html similarity index 100% rename from templates/items/transactions.html rename to application/items/templates/transactions.html diff --git a/application/recipes/__pycache__/__init__.cpython-312.pyc b/application/recipes/__pycache__/__init__.cpython-312.pyc index 553789b86530b87ecb40d17f9338ad802b402eda..3b6993a33f5dd685f8816f419fc1fc670b612e9c 100644 GIT binary patch delta 109 zcmZ3_c#4txG%qg~0}#wUW;l`CI4m>SDkiizwWv5ID={U%JjO4zq9i#dzcdBHugpu0 zan4UkO-d|IEshCD%quCX3@J)X&W$7@BGo/itemLink/") -@login_required -def itemLink(parent_id, id): - sites = [site[1] for site in main.get_sites(session['user']['sites'])] - 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"]) -def getTransactions(): - if request.method == "GET": - recordset = [] - count = 0 - logistics_info_id = int(request.args.get('logistics_info_id', 1)) - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 50)) - site_name = session['selected_site'] - offset = (page - 1) * limit - database_config = config() - with psycopg2.connect(**database_config) as conn: - sql = f"SELECT * FROM {site_name}_transactions WHERE logistics_info_id=%s LIMIT %s OFFSET %s;" - recordset = database.queryTuples(conn, sql, (logistics_info_id, limit, offset), convert=True) - sql = f"SELECT COUNT(*) FROM {site_name}_transactions WHERE logistics_info_id=%s;" - count = database.queryTuple(conn, sql, payload=(logistics_info_id, )) - return jsonify({"transactions": recordset, "end": math.ceil(count[0]/limit), "error": False, "message": ""}) - return jsonify({"transactions": recordset, "end": math.ceil(count[0]/limit), "error": True, "message": "There was an error in your GET request!"}) - -@items_api.route("/item/getTransaction", methods=["GET"]) -def getTransaction(): - transaction = {} - if request.method == "GET": - id = int(request.args.get('id', 1)) - database_config = config() - site_name = session['selected_site'] - with psycopg2.connect(**database_config) as conn: - transaction = database.__selectTuple(conn, site_name, f"{site_name}_transactions", payload=(id, ), convert=True) - return jsonify({"transaction": transaction, "error": False, "message": ""}) - return jsonify({"transaction": transaction, "error": True, "message": "There was an error in your GET request!"}) - -@items_api.route("/item/getItem") -def get_item(): - id = int(request.args.get('id', 1)) - database_config = config() - site_name = session['selected_site'] - item = [] - with psycopg2.connect(**database_config) as conn: - item = database.getItemAllByID(conn, site_name, payload=(id, ), convert=True) - return jsonify(item=item) - -@items_api.route("/item/getItemsWithQOH", methods=['GET']) -@login_required -def pagninate_items(): - pantry_inventory = [] - count = {'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) - - 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_api.route('/item/getModalItems', methods=["GET"]) -@login_required -def getModalItems(): - recordset = [] - count = {'count': 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"}) - -@items_api.route('/item/getPrefixes', methods=["GET"]) -@login_required -def getModalPrefixes(): - recordset = [] - count = {'count': 0} - if request.method == "GET": - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 10)) - site_name = session['selected_site'] - offset = (page - 1) * limit - database_config = config() - with psycopg2.connect(**database_config) as conn: - payload = (limit, offset) - recordset, count = postsqldb.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"}) - - -@items_api.route('/item/getZones', methods=['GET']) -def getZones(): - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 1)) - database_config = config() - site_name = session['selected_site'] - zones = [] - offset = (page - 1) * limit - payload = (limit, offset) - count = 0 - with psycopg2.connect(**database_config) as conn: - zones, count = database.getZonesWithCount(conn, site_name, payload, convert=True) - print(count, len(zones)) - return jsonify(zones=zones, endpage=math.ceil(count[0]/limit)) - - -@items_api.route('/item/getZonesBySku', methods=["GET"]) -def getZonesbySku(): - if request.method == "GET": - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 1)) - item_id = int(request.args.get('item_id')) - database_config = config() - site_name = session['selected_site'] - zones = [] - offset = (page - 1) * limit - payload = (item_id, limit, offset) - count = 0 - with psycopg2.connect(**database_config) as conn: - zones, count = postsqldb.ZonesTable.paginateZonesBySku(conn, site_name, payload) - print(zones, count) - return jsonify(zones=zones, endpage=math.ceil(count/limit)) - -@items_api.route('/item/getLocationsBySkuZone', methods=['get']) -def getLocationsBySkuZone(): - 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: - payload = (part_id, zone_id, limit, offset) - locations, count = postsqldb.LocationsTable.paginateLocationsBySkuZone(conn, site_name, payload) - return jsonify(locations=locations, endpage=math.ceil(count/limit)) - - -@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)) - -@items_api.route('/item/updateItem', methods=['POST']) -def updateItem(): - 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!") - -@items_api.route('/item/updateItemLink', methods=['POST']) -def updateItemLink(): - if request.method == "POST": - id = request.get_json()['id'] - conv_factor = request.get_json()['conv_factor'] - barcode = request.get_json()['barcode'] - old_conv_factor = request.get_json()['old_conv'] - - - database_config = config() - site_name = session['selected_site'] - user_id = session['user_id'] - transaction_time = datetime.datetime.now() - with psycopg2.connect(**database_config) as conn: - linkedItem = database.getItemAllByBarcode(conn, site_name, (barcode, ), convert=True) - - transaction = MyDataclasses.TransactionPayload( - timestamp=transaction_time, - logistics_info_id=linkedItem['logistics_info_id'], - barcode=barcode, - name=linkedItem['item_name'], - transaction_type='UPDATE', - quantity=0.0, - description='Link updated!', - user_id=user_id, - data={'new_conv_factor': conv_factor, 'old_conv_factor': old_conv_factor} - ) - - database.__updateTuple(conn, site_name, f"{site_name}_itemlinks", {'id': id, 'update': {'conv_factor': conv_factor}}) - database.insertTransactionsTuple(conn, site_name, transaction.payload()) - return jsonify(error=False, message="Linked Item was updated successfully") - return jsonify(error=True, message="Unable to save this change, ERROR!") - - -@items_api.route('/item/getPossibleLocations', methods=["GET"]) -@login_required -def getPossibleLocations(): - if request.method == "GET": - 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'] - with psycopg2.connect(**database_config) as conn: - locations, count = postsqldb.LocationsTable.paginateLocationsWithZone(conn, site_name, (limit, offset)) - return jsonify(locations=locations, end=math.ceil(count/limit)) - -@items_api.route('/item/getLinkedItem', methods=["GET"]) -@login_required -def getLinkedItem(): - linked_item = {} - if request.method == "GET": - id = int(request.args.get('id', 1)) - database_config = config() - site_name = session['selected_site'] - with psycopg2.connect(**database_config) as conn: - linked_item = database.__selectTuple(conn, site_name, f"{site_name}_itemlinks", (id, ), convert=True) - return jsonify({'linked_item': linked_item, 'error': False, 'message': 'Linked Item added!!'}) - return jsonify({'linked_item': linked_item, 'error': True, 'message': 'These was an error with adding to the linked list!'}) - -@items_api.route('/item/addLinkedItem', methods=["POST"]) -def addLinkedItem(): - if request.method == "POST": - parent_id = request.get_json()['parent_id'] - child_id = request.get_json()['child_id'] - conv_factor = request.get_json()['conv_factor'] - - database_config = config() - site_name = session['selected_site'] - user_id = session['user_id'] - with psycopg2.connect(**database_config) as conn: - print(parent_id, child_id, conv_factor) - parent_item = database.getItemAllByID(conn, site_name, (parent_id, ), convert=True) - child_item = database.getItemAllByID(conn, site_name, (child_id, ), convert=True) - - # i need to transact out ALL locations for child item. - pprint.pprint(child_item) - sum_child_qoh = 0 - for location in child_item['item_locations']: - print(location) - sum_child_qoh += location['quantity_on_hand'] - payload = { - 'item_id': child_item['id'], - 'logistics_info_id': child_item['logistics_info_id'], - 'barcode': child_item['barcode'], - 'item_name': child_item['item_name'], - 'transaction_type': 'Adjust Out', - 'quantity': location['quantity_on_hand'], - 'description': f'Converted to {parent_item['barcode']}', - 'cost': child_item['item_info']['cost'], - 'vendor': 1, - 'expires': False, - 'location_id': location['location_id'] - } - process.postTransaction(conn, site_name, user_id, payload) - - print(sum_child_qoh) - - primary_location = database.selectItemLocationsTuple(conn, site_name, (parent_item['id'], parent_item['logistics_info']['primary_location']['id']), convert=True) - - - payload = { - 'item_id': parent_item['id'], - 'logistics_info_id': parent_item['logistics_info_id'], - 'barcode': parent_item['barcode'], - 'item_name': parent_item['item_name'], - 'transaction_type': 'Adjust In', - 'quantity': (float(sum_child_qoh)*float(conv_factor)), - 'description': f'Converted from {child_item['barcode']}', - 'cost': child_item['item_info']['cost'], - 'vendor': 1, - 'expires': None, - 'location_id': primary_location['location_id'] - } - - pprint.pprint(payload) - result = process.postTransaction(conn, site_name, user_id, payload) - - if result['error']: - return jsonify(result) - - itemLink = MyDataclasses.ItemLinkPayload( - barcode=child_item['barcode'], - link=parent_item['id'], - data=child_item, - conv_factor=conv_factor - ) - - database.insertItemLinksTuple(conn, site_name, itemLink.payload()) - - database.__updateTuple(conn, site_name, f"{site_name}_items", {'id': child_item['id'], 'update': {'row_type': 'link'}}) - - return jsonify({'error': False, 'message': 'Linked Item added!!'}) - return jsonify({'error': True, 'message': 'These was an error with adding to the linked list!'}) - -@items_api.route('/items/addBlankItem', methods=["POST"]) -def addBlankItem(): - if request.method == "POST": - data = { - 'barcode': request.get_json()['barcode'], - 'name': request.get_json()['name'], - 'subtype': request.get_json()['subtype'] - } - pprint.pprint(data) - database_config = config() - site_name = session['selected_site'] - user_id = session['user_id'] - try: - with psycopg2.connect(**database_config) as conn: - process.postNewBlankItem(conn, site_name, user_id, data) - except Exception as error: - conn.rollback() - return jsonify({'error': True, 'message': error}) - return jsonify({'error': False, 'message': 'Item added!!'}) - return jsonify({'error': True, 'message': 'These was an error with adding Item!'}) - -@items_api.route('/items/addSKUPrefix', methods=["POST"]) -def addSKUPrefix(): - if request.method == "POST": - database_config = config() - site_name = session['selected_site'] - try: - with psycopg2.connect(**database_config) as conn: - prefix = postsqldb.SKUPrefixTable.Payload( - request.get_json()['uuid'], - request.get_json()['name'], - request.get_json()['description'] - ) - postsqldb.SKUPrefixTable.insert_tuple(conn, site_name, prefix.payload()) - except Exception as error: - conn.rollback() - return jsonify({'error': True, 'message': error}) - return jsonify({'error': False, 'message': 'Prefix added!!'}) - return jsonify({'error': True, 'message': 'These was an error with adding this Prefix!'}) - -@items_api.route('/item/addConversion', methods=['POST']) -def addConversion(): - if request.method == "POST": - item_id = request.get_json()['parent_id'] - uom_id = request.get_json()['uom_id'] - conv_factor = request.get_json()['conv_factor'] - - database_config = config() - site_name = session['selected_site'] - with psycopg2.connect(**database_config) as conn: - conversion = postsqldb.ConversionsTable.Payload( - item_id, uom_id, conv_factor - ) - postsqldb.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!") - -@items_api.route('/item/deleteConversion', methods=['POST']) -def deleteConversion(): - if request.method == "POST": - conversion_id = request.get_json()['conversion_id'] - print(conversion_id) - 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,)) - - return jsonify(error=False, message="Conversion was deleted successfully") - return jsonify(error=True, message="Unable to delete this conversion, ERROR!") - -@items_api.route('/item/updateConversion', methods=['POST']) -def updateConversion(): - if request.method == "POST": - conversion_id = request.get_json()['conversion_id'] - update_dictionary = request.get_json()['update'] - - 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}) - return jsonify(error=False, message="Conversion was updated successfully") - return jsonify(error=True, message="Unable to save this conversion, ERROR!") - -@items_api.route('/item/addPrefix', methods=['POST']) -def addPrefix(): - if request.method == "POST": - item_info_id = request.get_json()['parent_id'] - prefix_id = request.get_json()['prefix_id'] - print(item_info_id) - print(prefix_id) - 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'] - print(prefixes) - prefixes.append(prefix_id) - postsqldb.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!") - -@items_api.route('/item/deletePrefix', methods=['POST']) -def deletePrefix(): - if request.method == "POST": - item_info_id = request.get_json()['item_info_id'] - prefix_id = request.get_json()['prefix_id'] - - 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.remove(prefix_id) - postsqldb.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!") - -@items_api.route('/item/refreshSearchString', methods=['POST']) -def refreshSearchString(): - if request.method == "POST": - item_id = request.get_json()['item_id'] - - database_config = config() - site_name = session['selected_site'] - with psycopg2.connect(**database_config) as conn: - item = postsqldb.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']}"] - - for prefix in item['item_info']['prefixes']: - 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}}) - - return jsonify(error=False, message="Search String was updated successfully") - return jsonify(error=True, message="Unable to update this search string, ERROR!") - -@items_api.route('/item/postNewItemLocation', methods=['POST']) -def postNewItemLocation(): - if request.method == "POST": - item_id = request.get_json()['item_id'] - location_id = request.get_json()['location_id'] - database_config = config() - site_name = session['selected_site'] - with psycopg2.connect(**database_config) as conn: - item_location = postsqldb.ItemLocationsTable.Payload( - item_id, - location_id - ) - postsqldb.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/webserver.py b/webserver.py index b21de11..0345489 100644 --- a/webserver.py +++ b/webserver.py @@ -27,7 +27,7 @@ app.secret_key = '11gs22h2h1a4h6ah8e413a45' app.register_blueprint(api.database_api) app.register_blueprint(user_api.login_app) app.register_blueprint(api_admin.admin_api) -app.register_blueprint(items_API.items_api) +app.register_blueprint(items_API.items_api, url_prefix='/items') app.register_blueprint(external_api) app.register_blueprint(workshop_api) app.register_blueprint(receipts_API.receipt_api) @@ -86,33 +86,6 @@ def transactions(id): return render_template("items/transactions.html", id=id, current_site=session['selected_site'], sites=sites) -@app.route("/item/") -@login_required -def item(id): - sites = [site[1] for site in main.get_sites(session['user']['sites'])] - database_config = config.config() - with psycopg2.connect(**database_config) as conn: - units = postsqldb.UnitsTable.getAll(conn) - return render_template("items/item_new.html", id=id, units=units, current_site=session['selected_site'], sites=sites) - -@app.route("/transaction") -@login_required -def transaction(): - sites = [site[1] for site in main.get_sites(session['user']['sites'])] - database_config = config.config() - with psycopg2.connect(**database_config) as conn: - units = postsqldb.UnitsTable.getAll(conn) - return render_template("other/transaction.html", units=units, current_site=session['selected_site'], sites=sites, proto={'referrer': request.referrer}) - -@app.route("/items") -@login_required -def items(): - update_session_user() - sites = [site[1] for site in main.get_sites(session['user']['sites'])] - return render_template("items/index.html", - current_site=session['selected_site'], - sites=sites) - @app.route("/api/push-subscriptions", methods=["POST"]) def create_push_subscription(): json_data = request.get_json() @@ -139,4 +112,4 @@ def home(): session['selected_site'] = sites[0] return redirect("/items") -app.run(host="0.0.0.0", port=5810, debug=True) \ No newline at end of file +app.run(host="0.0.0.0", port=5811, debug=True) \ No newline at end of file