diff --git a/application/items/__pycache__/database_items.cpython-312.pyc b/application/items/__pycache__/database_items.cpython-312.pyc index fc4df48..7649bef 100644 Binary files a/application/items/__pycache__/database_items.cpython-312.pyc and b/application/items/__pycache__/database_items.cpython-312.pyc differ diff --git a/application/items/__pycache__/items_API.cpython-312.pyc b/application/items/__pycache__/items_API.cpython-312.pyc index ab7aa34..b9dcd7a 100644 Binary files a/application/items/__pycache__/items_API.cpython-312.pyc and b/application/items/__pycache__/items_API.cpython-312.pyc differ diff --git a/application/items/database_items.py b/application/items/database_items.py index a1c8bb5..978a6c6 100644 --- a/application/items/database_items.py +++ b/application/items/database_items.py @@ -128,3 +128,48 @@ def getPrefixes(site:str, payload:tuple, convert:bool=True): return recordset, count except (Exception, psycopg2.DatabaseError) as error: raise postsqldb.DatabaseError(error, payload, sql) + +def paginateZonesBySku(site: str, payload: tuple, convert=True): + database_config = config.config() + zones, count = (), 0 + with open(f"application/items/sql/paginateZonesBySku.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + with open(f"application/items/sql/paginateZonesBySkuCount.sql", "r+") as file: + sql_count = 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: + zones = [postsqldb.tupleDictionaryFactory(cur.description, row) for row in rows] + elif rows and not convert: + zones = rows + cur.execute(sql_count, payload) + count = cur.fetchone()[0] + return zones, count + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + +def paginateLocationsBySkuZone(site: str, payload: tuple, convert=True): + database_config = config.config() + locations, count = (), 0 + with open(f"application/items/sql/paginateLocationsBySkuZone.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + with open(f"application/items/sql/paginateLocationsBySkuZoneCount.sql", "r+") as file: + sql_count = 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: + locations = [postsqldb.tupleDictionaryFactory(cur.description, row) for row in rows] + elif rows and not convert: + locations = rows + cur.execute(sql_count, payload) + count = cur.fetchone()[0] + return locations, count + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + diff --git a/application/items/items_API.py b/application/items/items_API.py index dd15fb9..49601d6 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -223,56 +223,97 @@ def getModalPrefixes(): 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":f"method {request.method} is not allowed!"}) - -@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"]) +@login_required def getZonesbySku(): + """ GET zones by sku by passing page, limit, item_id + --- + 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 + - in: query + name: item_id + schema: + type: integer + minimum: 1 + default: 1 + description: item_id to pull zones for + responses: + 200: + description: Zones received successfully. + """ + zones, count = [], 0 if request.method == "GET": page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 1)) + limit = int(request.args.get('limit', 10)) 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 = db.ZonesTable.paginateZonesBySku(conn, site_name, payload) - print(zones, count) - return jsonify(zones=zones, endpage=math.ceil(count/limit)) + zones, count = database_items.paginateZonesBySku(site_name, (item_id, limit, offset)) + 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']) +@login_required 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 = db.LocationsTable.paginateLocationsBySkuZone(conn, site_name, payload) - return jsonify(locations=locations, endpage=math.ceil(count/limit)) + """ GET locations by sku by passing page, limit, item_id, zone_id + --- + 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 + - in: query + name: item_id + schema: + type: integer + minimum: 1 + default: 1 + description: item_id to pull locations for zone_id + - in: query + name: zone_id + schema: + type: integer + minimum: 1 + default: 1 + description: zone_id to pull locations for item_id + responses: + 200: + description: Zones received successfully. + """ + locations, count = [], 0 + if request.method == "GET": + 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 + site_name = session['selected_site'] + locations, count = database_items.paginateLocationsBySkuZone(site_name, (part_id, zone_id, limit, offset)) + 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']) diff --git a/application/items/sql/paginateLocationsBySkuZone.sql b/application/items/sql/paginateLocationsBySkuZone.sql new file mode 100644 index 0000000..6574408 --- /dev/null +++ b/application/items/sql/paginateLocationsBySkuZone.sql @@ -0,0 +1,15 @@ +WITH passed_id AS (SELECT %s AS passed_id), + cte_item_locations AS ( + SELECT DISTINCT ils.location_id FROM %%site_name%%_item_locations ils + WHERE ils.part_id = (SELECT passed_id FROM passed_id) + ), + cte_locations AS ( + SELECT DISTINCT locations.zone_id FROM %%site_name%%_locations locations + WHERE locations.id IN (SELECT location_id FROM cte_item_locations) + ) + + +SELECT DISTINCT location.* FROM cte_item_locations cil +JOIN %%site_name%%_locations location ON cil.location_id = location.id +WHERE location.zone_id = %s +LIMIT %s OFFSET %s; diff --git a/application/items/sql/paginateLocationsBySkuZoneCount.sql b/application/items/sql/paginateLocationsBySkuZoneCount.sql new file mode 100644 index 0000000..9a2fb9d --- /dev/null +++ b/application/items/sql/paginateLocationsBySkuZoneCount.sql @@ -0,0 +1,15 @@ +WITH passed_id AS (SELECT %s AS passed_id), + cte_item_locations AS ( + SELECT DISTINCT ils.location_id FROM %%site_name%%_item_locations ils + WHERE ils.part_id = (SELECT passed_id FROM passed_id) + ), + cte_locations AS ( + SELECT DISTINCT locations.zone_id FROM %%site_name%%_locations locations + WHERE locations.id IN (SELECT location_id FROM cte_item_locations) + ) + + +SELECT COUNT(DISTINCT location.*) FROM cte_item_locations cil +JOIN %%site_name%%_locations location ON cil.location_id = location.id +WHERE location.zone_id = %s +LIMIT %s OFFSET %s; diff --git a/application/items/sql/paginateZonesBySku.sql b/application/items/sql/paginateZonesBySku.sql new file mode 100644 index 0000000..16f8cb3 --- /dev/null +++ b/application/items/sql/paginateZonesBySku.sql @@ -0,0 +1,15 @@ +WITH passed_id AS (SELECT %s AS passed_id), + cte_item_locations AS ( + SELECT DISTINCT ils.location_id FROM %%site_name%%_item_locations ils + WHERE ils.part_id = (SELECT passed_id FROM passed_id) + ), + cte_locations AS ( + SELECT DISTINCT locations.zone_id FROM %%site_name%%_locations locations + WHERE locations.id IN (SELECT location_id FROM cte_item_locations) + ) + + +SELECT DISTINCT zone.* FROM cte_locations cil +JOIN %%site_name%%_zones zone ON cil.zone_id = zone.id +LIMIT %s OFFSET %s; + diff --git a/application/items/sql/paginateZonesBySkuCount.sql b/application/items/sql/paginateZonesBySkuCount.sql new file mode 100644 index 0000000..4174fba --- /dev/null +++ b/application/items/sql/paginateZonesBySkuCount.sql @@ -0,0 +1,13 @@ +WITH passed_id AS (SELECT %s AS passed_id), + cte_item_locations AS ( + SELECT DISTINCT ils.location_id FROM %%site_name%%_item_locations ils + WHERE ils.part_id = (SELECT passed_id FROM passed_id) + ), + cte_locations AS ( + SELECT DISTINCT locations.zone_id FROM %%site_name%%_locations locations + WHERE locations.id IN (SELECT location_id FROM cte_item_locations) + ) + +SELECT COUNT(DISTINCT zone.*) FROM cte_locations cil +JOIN %%site_name%%_zones zone ON cil.zone_id = zone.id +LIMIT %s OFFSET %s;