From 780c43cd73fab173e5d7c3bc1be1c2270544c8bf Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Mon, 28 Apr 2025 07:05:25 -0500 Subject: [PATCH] items_API.getPossLocations updated to new schema --- .../database_items.cpython-312.pyc | Bin 22785 -> 24420 bytes .../__pycache__/items_API.cpython-312.pyc | Bin 37075 -> 37666 bytes application/items/database_items.py | 31 ++++++++++++++++-- application/items/items_API.py | 30 ++++++++++++++--- .../items/sql/getLocationsWithZone.sql | 5 +++ 5 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 application/items/sql/getLocationsWithZone.sql diff --git a/application/items/__pycache__/database_items.cpython-312.pyc b/application/items/__pycache__/database_items.cpython-312.pyc index 56e5d99b133f348cbf968e842f7131358fd9f1ea..192f4896abf132076c9d42389afff262ea42a8d0 100644 GIT binary patch delta 1755 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 Vp72( diff --git a/application/items/database_items.py b/application/items/database_items.py index b252c9d..ec25403 100644 --- a/application/items/database_items.py +++ b/application/items/database_items.py @@ -169,7 +169,27 @@ def paginateZonesBySku(site: str, payload: tuple, convert=True): return zones, count except Exception as error: raise postsqldb.DatabaseError(error, payload, sql) - + +def paginateLocationsWithZone(site:str, payload:tuple, convert:bool=True): + recordset, count = (), 0 + database_config = config.config() + with open(f"application/items/sql/getLocationsWithZone.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + 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] + elif rows and not convert: + recordset = rows + cur.execute(f"SELECT COUNT(*) FROM {site}_locations;") + count = cur.fetchone()[0] + return recordset, count + except Exception as error: + raise postsqldb.DatabaseError(error, (), sql) + def paginateLocationsBySkuZone(site: str, payload: tuple, convert=True): database_config = config.config() locations, count = (), 0 @@ -306,6 +326,12 @@ def postUpdateItem(site:str, payload:dict): raise postsqldb.DatabaseError(error, payload, "MULTICALL!") def postUpdateItemLink(site: str, payload: dict): + """ POST update to ItemLink + + Args: + site (str): _description_ + payload (dict): {id, update, old_conv_factor, user_id} + """ def postUpdateData(conn, table, payload, convert=True): updated = () set_clause, values = postsqldb.updateStringFactory(payload['update']) @@ -358,4 +384,5 @@ def postUpdateItemLink(site: str, payload: dict): ) postUpdateData(conn, f"{site}_itemlinks", {'id': payload['id'], 'update': {'conv_factor': payload['update']['conv_factor']}}) - postAddTransaction(conn, site, transaction.payload()) \ No newline at end of file + postAddTransaction(conn, site, transaction.payload()) + diff --git a/application/items/items_API.py b/application/items/items_API.py index 9fef416..737851b 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -379,6 +379,7 @@ def updateItem(): return jsonify({'error': True, 'message': f'method {request.method} is not allowed!'}) @items_api.route('/item/updateItemLink', methods=['POST']) +@login_required def updateItemLink(): """ UPDATE item link by passing id, conv_factor, barcode, old_conv --- @@ -428,15 +429,36 @@ def updateItemLink(): @items_api.route('/item/getPossibleLocations', methods=["GET"]) @login_required def getPossibleLocations(): + """ GET locations with zones by passing a page and limit + --- + parameters: + - in: query + name: page + schema: + type: interger + minimum: 1 + default: 1 + description: page in the records to GET + - in: query + name: limit + schema: + type: interger + minimum: 1 + default: 1 + description: number of records to GET + responses: + 200: + description: Locations GET successful. + """ + locations, count = (), 0 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 = db.LocationsTable.paginateLocationsWithZone(conn, site_name, (limit, offset)) - return jsonify(locations=locations, end=math.ceil(count/limit)) + locations, count = database_items.paginateLocationsWithZone(site_name, (limit, offset)) + return jsonify({'locations': locations, 'end':math.ceil(count/limit), 'error':False, 'message': f'Locations received successfully!'}) + return jsonify({'locations': locations, 'end':math.ceil(count/limit), 'error':True, 'message': f'method {request.method} not allowed.'}) @items_api.route('/item/getLinkedItem', methods=["GET"]) @login_required diff --git a/application/items/sql/getLocationsWithZone.sql b/application/items/sql/getLocationsWithZone.sql new file mode 100644 index 0000000..9584475 --- /dev/null +++ b/application/items/sql/getLocationsWithZone.sql @@ -0,0 +1,5 @@ +SELECT %%site_name%%_locations.*, +row_to_json(%%site_name%%_zones.*) as zone +FROM %%site_name%%_locations +LEFT JOIN %%site_name%%_zones ON %%site_name%%_zones.id = %%site_name%%_locations.zone_id +LIMIT %s OFFSET %s; \ No newline at end of file