Major crashing bug fixed, program returned to normal operations

This commit is contained in:
2026-09-03 10:03:50 -05:00
parent edd5f2a886
commit a1b438a61f
5 changed files with 432 additions and 94 deletions
+57 -12
View File
@@ -23,6 +23,7 @@ from PyQt6.QtWidgets import (
QLabel,
QTabWidget,
QFileDialog,
QDialog,
)
from app.return_labels import is_emailed_label_order
@@ -59,6 +60,12 @@ class MainWindow(QMainWindow):
self._send_worker: SendToShipStationWorker | None = None
self._return_label_worker: CreateReturnLabelWorker | None = None
# Reused, never-destroyed dialog instances (see the WORKAROUND NOTE
# in each dialog's module docstring) - created lazily via
# set_order() rather than a fresh instance per ticket.
self._pack_ticket_dialog: PackTicketDialog | None = None
self._return_label_dialog: ReturnLabelDialog | None = None
self._build_ui()
self._refresh_everything()
@@ -105,10 +112,12 @@ class MainWindow(QMainWindow):
export_action.triggered.connect(self._on_export_clicked)
toolbar.addAction(export_action)
pack_action = QAction("Pack Ticket", self)
pack_action.setToolTip("Enter serial numbers and mark packed - select a ticket first")
pack_action.triggered.connect(self._on_pack_ticket_clicked)
toolbar.addAction(pack_action)
self._pack_ticket_action = QAction("Pack Ticket", self)
self._pack_ticket_action.setToolTip(
"Enter serial numbers and mark packed - select a ticket first"
)
self._pack_ticket_action.triggered.connect(self._on_pack_ticket_clicked)
toolbar.addAction(self._pack_ticket_action)
toolbar.addSeparator()
@@ -117,12 +126,12 @@ class MainWindow(QMainWindow):
emergency_action.triggered.connect(self._on_emergency_send_clicked)
toolbar.addAction(emergency_action)
return_label_action = QAction("Create Return Label", self)
return_label_action.setToolTip(
self._return_label_action = QAction("Create Return Label", self)
self._return_label_action.setToolTip(
"For emailed-return-label tickets (SH007/OK012) - select one in Active Orders first"
)
return_label_action.triggered.connect(self._on_create_return_label_clicked)
toolbar.addAction(return_label_action)
self._return_label_action.triggered.connect(self._on_create_return_label_clicked)
toolbar.addAction(self._return_label_action)
toolbar.addSeparator()
@@ -379,10 +388,28 @@ class MainWindow(QMainWindow):
if proceed != QMessageBox.StandardButton.Yes:
return
dialog = ReturnLabelDialog(order, self)
if dialog.exec() != QDialog.DialogCode.Accepted:
if self._return_label_dialog is None:
self._return_label_dialog = ReturnLabelDialog(order, self)
self._return_label_dialog.finished.connect(self._on_return_label_dialog_finished)
else:
self._return_label_dialog.set_order(order)
# Non-modal on purpose - see the module docstring in
# return_label_dialog.py. Disable the action while it's open so a
# second click can't call set_order() on it mid-edit and silently
# overwrite whatever the user is in the middle of entering.
self._return_label_action.setEnabled(False)
self._return_label_dialog.show()
self._return_label_dialog.raise_()
self._return_label_dialog.activateWindow()
def _on_return_label_dialog_finished(self, result: int) -> None:
self._return_label_action.setEnabled(True)
if result != QDialog.DialogCode.Accepted:
return
dialog = self._return_label_dialog
order = dialog.order
packages = dialog.get_packages()
charge_event = dialog.get_charge_event()
if not packages:
@@ -427,10 +454,28 @@ class MainWindow(QMainWindow):
)
return
dialog = PackTicketDialog(order, self)
if dialog.exec() != QDialog.DialogCode.Accepted:
if self._pack_ticket_dialog is None:
self._pack_ticket_dialog = PackTicketDialog(order, self)
self._pack_ticket_dialog.finished.connect(self._on_pack_ticket_dialog_finished)
else:
self._pack_ticket_dialog.set_order(order)
# Non-modal on purpose - see the module docstring in
# pack_ticket_dialog.py. Disable the action while it's open so a
# second click can't call set_order() on it mid-edit and silently
# overwrite whatever the user is in the middle of entering/scanning.
self._pack_ticket_action.setEnabled(False)
self._pack_ticket_dialog.show()
self._pack_ticket_dialog.raise_()
self._pack_ticket_dialog.activateWindow()
def _on_pack_ticket_dialog_finished(self, result: int) -> None:
self._pack_ticket_action.setEnabled(True)
if result != QDialog.DialogCode.Accepted:
return
dialog = self._pack_ticket_dialog
order = dialog.order
ticket_number = order.ticket_number or order.external_id
save_pack_data(ticket_number, dialog.get_serial_numbers(), dialog.get_packed())
self._refresh_everything()