From b37c8bb58fe03e1af6b3f261bd667fd6d9756407 Mon Sep 17 00:00:00 2001 From: Scheianu Ionut Date: Wed, 10 Sep 2025 22:37:42 +0300 Subject: [PATCH] saved the creation of warehows locations --- .../app/__pycache__/warehouse.cpython-312.pyc | Bin 6281 -> 7480 bytes py_app/app/templates/create_locations.html | 16 ++-- .../app/templates/import_locations_csv.html | 86 ++++++++++++------ py_app/app/templates/main_page_warehouse.html | 2 +- py_app/app/warehouse.py | 55 +++++++---- 5 files changed, 103 insertions(+), 56 deletions(-) diff --git a/py_app/app/__pycache__/warehouse.cpython-312.pyc b/py_app/app/__pycache__/warehouse.cpython-312.pyc index 563fc06b271ec6796963e14603e523c0c5e61ede..82cd5f005352ebfac6ae2f3a3d2bb522abcd22da 100644 GIT binary patch delta 3052 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 diff --git a/py_app/app/templates/create_locations.html b/py_app/app/templates/create_locations.html index 469ac09..05d5649 100644 --- a/py_app/app/templates/create_locations.html +++ b/py_app/app/templates/create_locations.html @@ -17,6 +17,14 @@
+ +
+

Import Locations from CSV

+
+ Bulk import warehouse locations using a CSV file. + Go to Import Page +
+
@@ -42,13 +50,5 @@
- -
-

Import Locations from CSV

-
- Bulk import warehouse locations using a CSV file. - Go to Import Page -
-
{% endblock %} diff --git a/py_app/app/templates/import_locations_csv.html b/py_app/app/templates/import_locations_csv.html index 5cc3a16..6bd6635 100644 --- a/py_app/app/templates/import_locations_csv.html +++ b/py_app/app/templates/import_locations_csv.html @@ -2,20 +2,69 @@ {% block title %}Import Warehouse Locations from CSV{% endblock %} {% block content %}
- +

Import Locations from CSV

-
+ -
- - {% if locations %} - + {% if not locations %} +
+ + {% else %} +
+ {% endif %} + +
+

CSV File Format

+ + + + + + + + + + + + + + + + +
Location CodeSizeDescription
EX123100Zona depozitare A
+
+ + +
- -
+ +

Preview Table

@@ -46,26 +95,5 @@

{{ report }}

{% endif %} - -
-

CSV File Format

- -
- - - - - - - - - - - - - - -
Location CodeSizeDescription
EX123100Zona depozitare A
-
{% endblock %} diff --git a/py_app/app/templates/main_page_warehouse.html b/py_app/app/templates/main_page_warehouse.html index 56dcc6e..7b7cbfa 100644 --- a/py_app/app/templates/main_page_warehouse.html +++ b/py_app/app/templates/main_page_warehouse.html @@ -20,7 +20,7 @@

Create Warehouse Locations

Define and manage storage locations in the warehouse.

- Go to Locations + Go to Locations
diff --git a/py_app/app/warehouse.py b/py_app/app/warehouse.py index ad70b1f..e6ed2b5 100644 --- a/py_app/app/warehouse.py +++ b/py_app/app/warehouse.py @@ -1,6 +1,6 @@ import mariadb -from flask import current_app, request, render_template -import csv +from flask import current_app, request, render_template, session, redirect, url_for +import csv, os, tempfile def get_db_connection(): settings_file = current_app.instance_path + '/external_server.conf' @@ -90,23 +90,42 @@ def import_locations_csv_handler(): report = None locations = [] errors = [] + temp_dir = tempfile.gettempdir() if request.method == 'POST': file = request.files.get('csv_file') if file and file.filename.endswith('.csv'): - content = file.read().decode('utf-8').splitlines() - reader = csv.DictReader(content) - locations = [(row.get('location_code'), row.get('size'), row.get('description')) for row in reader] - if request.form.get('create_locations'): - added = 0 - failed = 0 - errors = [] - for loc in locations: - location_code, size, description = loc - result = add_location(location_code, size, description) - if result and 'success' in result.lower(): - added += 1 - else: - failed += 1 - errors.append(location_code) - report = f"{added} locations were added to warehouse_locations table. {failed} locations failed: {', '.join(errors)}" + temp_path = os.path.join(temp_dir, file.filename) + file.save(temp_path) + session['csv_filename'] = file.filename + session['csv_filepath'] = temp_path + with open(temp_path, 'r', encoding='utf-8') as f: + reader = csv.DictReader(f) + locations = [] + for row in reader: + location_code = row.get('Location Code') or row.get('location_code') or '' + size = row.get('Size') or row.get('size') or '' + description = row.get('Description') or row.get('description') or '' + locations.append((location_code, size, description)) + session['csv_locations'] = locations + elif 'csv_locations' in session: + locations = session['csv_locations'] + if request.form.get('create_locations') and locations: + added = 0 + failed = 0 + errors = [] + for loc in locations: + location_code, size, description = loc + result = add_location(location_code, size, description) + if result and 'success' in result.lower(): + added += 1 + else: + failed += 1 + errors.append(location_code or '') + report = f"{added} locations were added to warehouse_locations table. {failed} locations failed: {', '.join(errors)}" + session.pop('csv_locations', None) + session.pop('csv_filename', None) + session.pop('csv_filepath', None) + return redirect(url_for('warehouse.import_locations_csv') + '#created') + elif 'csv_locations' in session: + locations = session['csv_locations'] return render_template('import_locations_csv.html', report=report, locations=locations)