From dfc60a9725086a8d1ce89bc03e4c50fd34a633eb Mon Sep 17 00:00:00 2001 From: Scheianu Ionut Date: Wed, 17 Sep 2025 22:45:54 +0300 Subject: [PATCH] updated print module --- py_app/app/__pycache__/routes.cpython-312.pyc | Bin 58358 -> 59071 bytes py_app/app/print_module.py | 99 ++++++++++ py_app/app/routes.py | 14 ++ py_app/app/templates/print_module.html | 182 +++++++++++++++++- 4 files changed, 291 insertions(+), 4 deletions(-) create mode 100644 py_app/app/print_module.py diff --git a/py_app/app/__pycache__/routes.cpython-312.pyc b/py_app/app/__pycache__/routes.cpython-312.pyc index b71b5fbd5ca0be304f843d29258a969639b4077d..256aa1f820e349cf7d686a0ea8b9e6ae80d71b48 100644 GIT binary patch delta 7532 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 Q8kVl5(#QVPsl{FVZx4(%xBvhE delta 6971 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 diff --git a/py_app/app/print_module.py b/py_app/app/print_module.py new file mode 100644 index 0000000..62f35e5 --- /dev/null +++ b/py_app/app/print_module.py @@ -0,0 +1,99 @@ +import mariadb +from flask import current_app + +def get_db_connection(): + """Get database connection using external server configuration""" + settings_file = current_app.instance_path + '/external_server.conf' + settings = {} + with open(settings_file, 'r') as f: + for line in f: + key, value = line.strip().split('=', 1) + settings[key] = value + return mariadb.connect( + user=settings['username'], + password=settings['password'], + host=settings['server_domain'], + port=int(settings['port']), + database=settings['database_name'] + ) + +def get_unprinted_orders_data(limit=100): + """ + Retrieve unprinted orders from the database for display + Returns list of order dictionaries where printed_labels != 1 + """ + try: + conn = get_db_connection() + cursor = conn.cursor() + + # Check if printed_labels column exists + cursor.execute("SHOW COLUMNS FROM order_for_labels LIKE 'printed_labels'") + column_exists = cursor.fetchone() + + if column_exists: + # Use printed_labels column + cursor.execute(""" + SELECT id, comanda_productie, cod_articol, descr_com_prod, cantitate, + com_achiz_client, nr_linie_com_client, customer_name, + customer_article_number, open_for_order, line_number, + printed_labels, created_at, updated_at + FROM order_for_labels + WHERE printed_labels != 1 + ORDER BY created_at DESC + LIMIT %s + """, (limit,)) + else: + # Fallback: get all orders if no printed_labels column + cursor.execute(""" + SELECT id, comanda_productie, cod_articol, descr_com_prod, cantitate, + com_achiz_client, nr_linie_com_client, customer_name, + customer_article_number, open_for_order, line_number, + created_at, updated_at + FROM order_for_labels + ORDER BY created_at DESC + LIMIT %s + """, (limit,)) + + orders = [] + for row in cursor.fetchall(): + if column_exists: + orders.append({ + 'id': row[0], + 'comanda_productie': row[1], + 'cod_articol': row[2], + 'descr_com_prod': row[3], + 'cantitate': row[4], + 'com_achiz_client': row[5], + 'nr_linie_com_client': row[6], + 'customer_name': row[7], + 'customer_article_number': row[8], + 'open_for_order': row[9], + 'line_number': row[10], + 'printed_labels': row[11], + 'created_at': row[12], + 'updated_at': row[13] + }) + else: + orders.append({ + 'id': row[0], + 'comanda_productie': row[1], + 'cod_articol': row[2], + 'descr_com_prod': row[3], + 'cantitate': row[4], + 'com_achiz_client': row[5], + 'nr_linie_com_client': row[6], + 'customer_name': row[7], + 'customer_article_number': row[8], + 'open_for_order': row[9], + 'line_number': row[10], + 'printed_labels': 0, # Default to not printed + 'created_at': row[11], + 'updated_at': row[12] + }) + + conn.close() + return orders + + except Exception as e: + print(f"Error retrieving unprinted orders: {e}") + return [] \ No newline at end of file diff --git a/py_app/app/routes.py b/py_app/app/routes.py index d45cf74..0da6f38 100644 --- a/py_app/app/routes.py +++ b/py_app/app/routes.py @@ -21,6 +21,7 @@ from app.settings import ( delete_user_handler, save_external_db_handler ) +from .print_module import get_unprinted_orders_data bp = Blueprint('main', __name__) warehouse_bp = Blueprint('warehouse', __name__) @@ -1148,6 +1149,19 @@ def view_orders(): orders = get_orders_from_database(200) # Get last 200 orders return render_template('view_orders.html', orders=orders) +@bp.route('/get_unprinted_orders', methods=['GET']) +def get_unprinted_orders(): + """Get all rows from order_for_labels where printed != 1""" + if 'role' not in session or session['role'] not in ['superadmin', 'warehouse_manager', 'etichete']: + return jsonify({'error': 'Access denied'}), 403 + + try: + data = get_unprinted_orders_data() + return jsonify(data) + + except Exception as e: + return jsonify({'error': str(e)}), 500 + @warehouse_bp.route('/create_locations', methods=['GET', 'POST']) def create_locations(): from app.warehouse import create_locations_handler diff --git a/py_app/app/templates/print_module.html b/py_app/app/templates/print_module.html index 1974a9b..4eabcbb 100644 --- a/py_app/app/templates/print_module.html +++ b/py_app/app/templates/print_module.html @@ -1,10 +1,184 @@ {% extends "base.html" %} -{% block title %}Print Module{% endblock %} +{% block head %} + +{% endblock %} {% block content %} -