From a8811b94b7c47a64cbd86903fed109063cc69676 Mon Sep 17 00:00:00 2001 From: scheianu ionut Date: Tue, 7 Oct 2025 22:07:06 +0300 Subject: [PATCH] Major updates: Setup environment, database, permissions and admin access - Created virtual environment and installed requirements - Set up MariaDB database with user 'sa' and database 'recticel' - Created order_for_labels table for printing functionality - Implemented role-based permissions system with admin role - Added admin access to print label modules and etichete functionality - Fixed template routing issues in main_page_etichete.html - Updated app to run on port 8781 with network access (0.0.0.0) - Added systemd service file for background deployment - Created installation documentation --- app.log | 25 ++ .../app/__pycache__/__init__.cpython-311.pyc | Bin 1427 -> 1520 bytes py_app/app/__pycache__/models.cpython-311.pyc | Bin 1110 -> 1106 bytes py_app/app/__pycache__/routes.cpython-311.pyc | Bin 27287 -> 123679 bytes .../recreate_order_for_labels_table.py | 6 +- py_app/app/routes.py | 219 ++++++++---------- py_app/app/templates/main_page_etichete.html | 6 +- py_app/instance/external_server.conf | 6 +- py_app/run.py | 2 +- recticel-app.service | 15 ++ to_do_install.txt | 27 +++ 11 files changed, 170 insertions(+), 136 deletions(-) create mode 100644 app.log mode change 100755 => 100644 py_app/app/__pycache__/__init__.cpython-311.pyc mode change 100755 => 100644 py_app/app/__pycache__/models.cpython-311.pyc mode change 100755 => 100644 py_app/app/__pycache__/routes.cpython-311.pyc create mode 100644 recticel-app.service create mode 100644 to_do_install.txt diff --git a/app.log b/app.log new file mode 100644 index 0000000..8b32a01 --- /dev/null +++ b/app.log @@ -0,0 +1,25 @@ +nohup: ignoring input + * Serving Flask app 'app' + * Debug mode: on +WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:8781 + * Running on http://192.168.0.132:8781 +Press CTRL+C to quit + * Restarting with stat + * Debugger is active! + * Debugger PIN: 869-443-054 +172.18.0.2 - - [07/Oct/2025 22:03:14] "GET /quality HTTP/1.1" 200 - +172.18.0.2 - - [07/Oct/2025 22:03:19] "GET /logout HTTP/1.1" 302 - +172.18.0.2 - - [07/Oct/2025 22:03:19] "GET / HTTP/1.1" 200 - +172.18.0.2 - - [07/Oct/2025 22:03:19] "GET /static/logo_login.jpg HTTP/1.1" 304 - +172.18.0.2 - - [07/Oct/2025 22:03:24] "POST / HTTP/1.1" 302 - +172.18.0.2 - - [07/Oct/2025 22:03:24] "GET /dashboard HTTP/1.1" 200 - +172.18.0.2 - - [07/Oct/2025 22:03:30] "GET /logout HTTP/1.1" 302 - +172.18.0.2 - - [07/Oct/2025 22:03:30] "GET / HTTP/1.1" 200 - +172.18.0.2 - - [07/Oct/2025 22:03:34] "POST / HTTP/1.1" 302 - +172.18.0.2 - - [07/Oct/2025 22:03:34] "GET /dashboard HTTP/1.1" 200 - +172.18.0.2 - - [07/Oct/2025 22:03:38] "GET /logout HTTP/1.1" 302 - +172.18.0.2 - - [07/Oct/2025 22:03:38] "GET / HTTP/1.1" 200 - +172.18.0.2 - - [07/Oct/2025 22:03:56] "POST / HTTP/1.1" 302 - +172.18.0.2 - - [07/Oct/2025 22:03:56] "GET /dashboard HTTP/1.1" 200 - diff --git a/py_app/app/__pycache__/__init__.cpython-311.pyc b/py_app/app/__pycache__/__init__.cpython-311.pyc old mode 100755 new mode 100644 index d24961c1fa45760a36037a053e882592868fea39..d43ed2824f65256688dfa78225eeb187240e4f61 GIT binary patch delta 414 zcmbQt{ehczIWI340}xmoc$9HyBJV=RLlf68=gMWTWnyHgVOYR1`6Hw7Nk;z3*O|S&Xl+7++v9Mo8FPWYM_7qH%#mW3n;JBmq4sXA$PZ zA}r1l?1!Zpoh2q;Wzkgx1xOLd#+3}8fh0qb43PN6VUwGmQks)$SEMvqnKeX4h>`yT L113?V2viIJ_~B*X delta 357 zcmeysJ(-(#IWI340}xDkD45Ybk#`~El!@z?voSK%Ff3r7oX99VxtLMhtV95$1Ol=+ zVXPX4EU;D(KZ_eCn!;@ZWCFGGfVKZ+RAA(VviK)EFs+bfyv3AM@QYDjlkpZ;X;Dsm zK~ZX2X2mV$y!>)azRAMOW|RGxr5O1pXEGaVFx_HKEGW3eo|~AN7oSv6%mg%ALE)E$ zenx(7s(wMHzDsIxc1eE0Md}iZ)C}_# z#TQtlF0vS3VKKhIVmx^Q%OnADDJNUzL$)l=jO>S57@Zj>8?ovt3IdHQ0-3v#;WLnA kD3S&ezc_4i^HWN5QtgTqCpWN$$Otm>e_+5QiWGo~0oD~*uK)l5 diff --git a/py_app/app/__pycache__/models.cpython-311.pyc b/py_app/app/__pycache__/models.cpython-311.pyc old mode 100755 new mode 100644 index 9ed0bdeb56045fc433a435788df8a32603380e18..1b9f37ed6cba29359476351b88c8b557c92485a9 GIT binary patch delta 39 tcmcb{afyR_IWI340}xmoc(jpQfr-~hKO;XkRlhhp)xg4hvkj9J69Cq23VZ+n delta 43 xcmcb_agBp}IWI340}v!kXV}QCz$9p|m{3!MM} diff --git a/py_app/app/__pycache__/routes.cpython-311.pyc b/py_app/app/__pycache__/routes.cpython-311.pyc old mode 100755 new mode 100644 index a2bc35c7bf121358a2e043d5d4ebd649ef163207..decbc86052ee0ce0591ce40bb6697a565e70ee1d GIT binary patch literal 123679 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', methods=['GET']) def get_table_columns(table_name): """Get column names and descriptions for a specific table""" - if 'role' not in session or session['role'] not in ['superadmin', 'warehouse_manager', 'etichete']: + if 'role' not in session or session['role'] not in ['superadmin', 'admin', 'administrator', 'warehouse_manager', 'etichete']: return jsonify({'error': 'Access denied'}), 403 try: @@ -2002,41 +2003,7 @@ def generate_pdf(): return jsonify({'message': 'PDF generated successfully!', 'pdf_path': f'/static/label_templates/label_template.pdf'}) # Order Labels Upload Module Routes -@bp.route('/upload_orders', methods=['GET', 'POST']) -def upload_orders(): - """Route for uploading orders CSV files for label generation""" - if 'role' not in session or session['role'] not in ['superadmin', 'warehouse', 'warehouse_manager']: - flash('Access denied: Warehouse management permissions required.') - return redirect(url_for('main.dashboard')) - - from app.order_labels import upload_orders_handler - return upload_orders_handler() - -@bp.route('/view_orders') -def view_orders(): - """Route for viewing uploaded orders""" - if 'role' not in session or session['role'] not in ['superadmin', 'warehouse', 'warehouse_manager', 'warehouse_worker']: - flash('Access denied: Warehouse access required.') - return redirect(url_for('main.dashboard')) - - from app.order_labels import get_orders_from_database - orders = get_orders_from_database(200) # Get last 200 orders - return render_template('view_orders.html', orders=orders) - -@bp.route('/print_lost_labels') -def print_lost_labels(): - """Route for printing lost labels - allows searching and reprinting specific orders""" - if 'role' not in session or session['role'] not in ['superadmin', 'warehouse', 'warehouse_manager', 'warehouse_worker']: - flash('Access denied: Warehouse access required.') - return redirect(url_for('main.dashboard')) - - from app.order_labels import get_orders_from_database - orders = get_orders_from_database(500) # Get more orders for searching - return render_template('print_lost_labels.html', orders=orders) - -@bp.route('/db_test') -def db_test(): - """Simple database test page""" + # ...existing code... return render_template('db_test.html') @bp.route('/get_unprinted_orders', methods=['GET']) @@ -2067,9 +2034,9 @@ def generate_labels_pdf(order_id, paper_saving_mode='true'): """Generate PDF labels for a specific order""" print(f"DEBUG: generate_labels_pdf called for order_id: {order_id}") - if 'role' not in session or session['role'] not in ['superadmin', 'warehouse_manager', 'etichete']: + if 'role' not in session or session['role'] not in ['superadmin', 'admin', 'administrator', 'warehouse_manager', 'etichete']: print(f"DEBUG: Access denied for role: {session.get('role')}") - return jsonify({'error': 'Access denied. Required roles: superadmin, warehouse_manager, etichete'}), 403 + return jsonify({'error': 'Access denied. Required roles: superadmin, admin, administrator, warehouse_manager, etichete'}), 403 try: from .pdf_generator import generate_order_labels_pdf, update_order_printed_status @@ -2148,8 +2115,8 @@ def generate_labels_pdf(order_id, paper_saving_mode='true'): def generate_label_pdf(): """Generate a single label PDF for thermal printing via QZ Tray""" - if 'role' not in session or session['role'] not in ['superadmin', 'warehouse_manager', 'etichete']: - return jsonify({'error': 'Access denied. Required roles: superadmin, warehouse_manager, etichete'}), 403 + if 'role' not in session or session['role'] not in ['superadmin', 'admin', 'administrator', 'warehouse_manager', 'etichete']: + return jsonify({'error': 'Access denied. Required roles: superadmin, admin, administrator, warehouse_manager, etichete'}), 403 try: from .pdf_generator import LabelPDFGenerator @@ -2197,9 +2164,9 @@ def update_printed_status(order_id): """Update printed status for direct printing (without PDF generation)""" print(f"DEBUG: update_printed_status called for order_id: {order_id}") - if 'role' not in session or session['role'] not in ['superadmin', 'warehouse_manager', 'etichete']: + if 'role' not in session or session['role'] not in ['superadmin', 'admin', 'administrator', 'warehouse_manager', 'etichete']: print(f"DEBUG: Access denied for role: {session.get('role')}") - return jsonify({'error': 'Access denied. Required roles: superadmin, warehouse_manager, etichete'}), 403 + return jsonify({'error': 'Access denied. Required roles: superadmin, admin, administrator, warehouse_manager, etichete'}), 403 try: from .pdf_generator import update_order_printed_status @@ -2312,7 +2279,7 @@ def get_order_data(order_id): """Get specific order data for preview""" print(f"DEBUG: get_order_data called for order_id: {order_id}") - if 'role' not in session or session['role'] not in ['superadmin', 'warehouse_manager', 'etichete']: + if 'role' not in session or session['role'] not in ['superadmin', 'admin', 'administrator', 'warehouse_manager', 'etichete']: return jsonify({'error': 'Access denied'}), 403 try: diff --git a/py_app/app/templates/main_page_etichete.html b/py_app/app/templates/main_page_etichete.html index 86994e5..25083fc 100755 --- a/py_app/app/templates/main_page_etichete.html +++ b/py_app/app/templates/main_page_etichete.html @@ -14,8 +14,8 @@

View Orders

Upload new orders or view existing orders and manage label data for printing.

@@ -25,7 +25,7 @@

Access the print module to print labels.

diff --git a/py_app/instance/external_server.conf b/py_app/instance/external_server.conf index 271cc7b..a03a8b9 100755 --- a/py_app/instance/external_server.conf +++ b/py_app/instance/external_server.conf @@ -1,5 +1,5 @@ server_domain=localhost port=3602 -database_name=trasabilitate_database -username=trasabilitate -password=Initial01! +database_name=recticel +username=sa +password=12345678 diff --git a/py_app/run.py b/py_app/run.py index a3fdaf3..21b7df3 100755 --- a/py_app/run.py +++ b/py_app/run.py @@ -3,4 +3,4 @@ from app import create_app app = create_app() if __name__ == '__main__': - app.run(debug=True) + app.run(debug=True, port=8781, host='0.0.0.0') diff --git a/recticel-app.service b/recticel-app.service new file mode 100644 index 0000000..46b9361 --- /dev/null +++ b/recticel-app.service @@ -0,0 +1,15 @@ +[Unit] +Description=Recticel Quality App +After=network.target mariadb.service + +[Service] +Type=simple +User=ske087 +WorkingDirectory=/home/ske087/quality_recticel +Environment=PATH=/home/ske087/quality_recticel/recticel/bin +ExecStart=/home/ske087/quality_recticel/recticel/bin/python py_app/run.py +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/to_do_install.txt b/to_do_install.txt new file mode 100644 index 0000000..22a570a --- /dev/null +++ b/to_do_install.txt @@ -0,0 +1,27 @@ + +# Steps to Prepare Environment for Installing Python Requirements + +1. Change ownership of the project directory (if needed): + sudo chown -R $USER:$USER /home/ske087/quality_recticel + +2. Install Python venv module: + sudo apt install -y python3-venv + +3. Create and activate the virtual environment: + python3 -m venv recticel + source recticel/bin/activate + +4. Install MariaDB server and development libraries: + sudo apt install -y mariadb-server libmariadb-dev + +5. Create MariaDB database and user: + sudo mysql -e "CREATE DATABASE recticel; CREATE USER 'sa'@'localhost' IDENTIFIED BY '12345678'; GRANT ALL PRIVILEGES ON recticel.* TO 'sa'@'localhost'; FLUSH PRIVILEGES;" + +6. Install build tools (for compiling Python packages): + sudo apt install -y build-essential + +7. Install Python development headers: + sudo apt install -y python3-dev + +8. Install Python requirements: + pip install -r py_app/requirements.txt