From 69e0f7f8b1ea9c4d1c8c09bb8ae951cbb6fcf018 Mon Sep 17 00:00:00 2001 From: Quality App Developer Date: Fri, 6 Feb 2026 08:25:27 +0200 Subject: [PATCH] Add logging functionality: log print actions to logs folder with 5-day auto-cleanup --- label_printer_gui.py | 104 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/label_printer_gui.py b/label_printer_gui.py index 495f24b..17a3b8e 100644 --- a/label_printer_gui.py +++ b/label_printer_gui.py @@ -20,6 +20,8 @@ import os import threading import platform import time +import datetime +import glob from print_label import print_label_standalone, get_available_printers from kivy.clock import Clock @@ -39,6 +41,8 @@ class LabelPrinterApp(App): self.available_printers = self.get_available_printers() # Clean old PDF backup files on startup self.cleanup_old_pdfs() + # Clean old log files on startup + self.cleanup_old_logs() def get_available_printers(self): """Get list of available printers (cross-platform)""" @@ -81,6 +85,87 @@ class LabelPrinterApp(App): except Exception as e: print(f"Error during PDF cleanup: {e}") + def cleanup_old_logs(self, days=5): + """ + Delete log files older than specified days from logs folder. + + Args: + days (int): Delete files older than this many days (default: 5) + """ + logs_dir = 'logs' + + # Create folder if it doesn't exist + if not os.path.exists(logs_dir): + os.makedirs(logs_dir, exist_ok=True) + return + + try: + current_time = time.time() + cutoff_time = current_time - (days * 24 * 3600) # Convert days to seconds + + for filename in os.listdir(logs_dir): + file_path = os.path.join(logs_dir, filename) + + # Only process log files + if not filename.endswith('.log'): + continue + + # Check if file is older than cutoff + if os.path.isfile(file_path): + file_mtime = os.path.getmtime(file_path) + if file_mtime < cutoff_time: + try: + os.remove(file_path) + print(f"Deleted old log: {filename}") + except Exception as e: + print(f"Failed to delete {filename}: {e}") + except Exception as e: + print(f"Error during log cleanup: {e}") + + def log_print_action(self, sap_nr, quantity, cable_id, printer, pdf_filename, success): + """ + Log the print action to a log file. + + Args: + sap_nr (str): SAP article number + quantity (str): Quantity value + cable_id (str): Cable ID + printer (str): Printer name + pdf_filename (str): Path to the generated PDF file + success (bool): Whether the print was successful + """ + logs_dir = 'logs' + + # Create logs folder if it doesn't exist + os.makedirs(logs_dir, exist_ok=True) + + try: + # Create log filename with date + log_date = datetime.datetime.now().strftime("%Y%m%d") + log_filename = os.path.join(logs_dir, f"print_log_{log_date}.log") + + # Create log entry + timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + status = "SUCCESS" if success else "FAILED" + + log_entry = ( + f"[{timestamp}] {status}\n" + f" SAP-Nr: {sap_nr}\n" + f" Quantity: {quantity}\n" + f" Cable ID: {cable_id}\n" + f" Printer: {printer}\n" + f" PDF File: {pdf_filename}\n" + f" ---\n" + ) + + # Append to log file + with open(log_filename, 'a', encoding='utf-8') as f: + f.write(log_entry) + + print(f"Log entry saved to: {log_filename}") + except Exception as e: + print(f"Error saving log entry: {e}") + def build(self): """Build the simplified single-column UI""" self.title = "Label Printing" @@ -246,18 +331,37 @@ class LabelPrinterApp(App): # Print in background thread (using PDF by default) def print_thread(): + pdf_filename = None + success = False try: success = print_label_standalone(label_text, printer, preview=0, use_pdf=True) + + # Get the PDF filename that was created + # Files are saved to pdf_backup/ with timestamp + pdf_files = glob.glob('pdf_backup/final_label_*.pdf') + if pdf_files: + # Get the most recently created PDF file + pdf_filename = max(pdf_files, key=os.path.getctime) + if success: + # Log the successful print action + self.log_print_action(sap_nr, quantity, cable_id, printer, pdf_filename or "unknown", True) + # Use Clock.schedule_once to update UI from main thread Clock.schedule_once(lambda dt: popup.dismiss(), 0) Clock.schedule_once(lambda dt: self.show_popup("Success", "Label printed successfully!"), 0.1) # Clear inputs after successful print (but keep printer selection) Clock.schedule_once(lambda dt: self.clear_inputs(), 0.2) else: + # Log the failed print action + self.log_print_action(sap_nr, quantity, cable_id, printer, pdf_filename or "unknown", False) + Clock.schedule_once(lambda dt: popup.dismiss(), 0) Clock.schedule_once(lambda dt: self.show_popup("Error", "Failed to print label"), 0.1) except Exception as e: + # Log the error + self.log_print_action(sap_nr, quantity, cable_id, printer, pdf_filename or "unknown", False) + Clock.schedule_once(lambda dt: popup.dismiss(), 0) Clock.schedule_once(lambda dt: self.show_popup("Error", f"Print error: {str(e)}"), 0.1)