Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions db/migrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ def table_columns(name: str) -> set[str]:
printer_name TEXT,
printer_backend TEXT,
printer_transport TEXT,
printer_host TEXT,
printer_port INTEGER,
media_settings TEXT,
status TEXT NOT NULL DEFAULT 'pending',
pending_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
Expand All @@ -194,6 +196,8 @@ def table_columns(name: str) -> set[str]:
"printer_name",
"printer_backend",
"printer_transport",
"printer_host",
"printer_port",
"media_settings",
"pending_at",
Comment on lines 198 to 202

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] Migrating print_jobs drops existing printer metadata

Adding printer_host/printer_port to expected_print_job_columns causes _migration_1 to rebuild the print_jobs table for every existing database. The subsequent copy loop still only reinserts id, created_at, template_name, payload and status, so any pre‑existing jobs lose their printer_backend, printer_transport, media_settings and other fields. After upgrading, previously queued jobs can no longer be replayed with the correct printer configuration. Consider adding the new columns via ALTER TABLE or copying all columns when recreating the table to preserve existing data.

Useful? React with 👍 / 👎.

"running_at",
Expand Down
12 changes: 11 additions & 1 deletion db/store.py
Original file line number Diff line number Diff line change
Expand Up @@ -850,6 +850,8 @@ def insert_print_job(
printer_name: str | None = None,
printer_backend: str | None = None,
printer_transport: str | None = None,
printer_host: str | None = None,
printer_port: int | None = None,
media_settings: Mapping[str, object] | None = None,
db_path: str | Path | None = None,
) -> int:
Expand Down Expand Up @@ -879,11 +881,13 @@ def insert_print_job(
printer_name,
printer_backend,
printer_transport,
printer_host,
printer_port,
media_settings,
status,
pending_at
)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?)
""",
(
payload_hash,
Expand All @@ -893,6 +897,8 @@ def insert_print_job(
printer_name,
printer_backend,
printer_transport,
printer_host,
printer_port,
media_blob,
pending_at,
),
Expand Down Expand Up @@ -1030,6 +1036,8 @@ def get_print_job(
printer_name,
printer_backend,
printer_transport,
printer_host,
printer_port,
media_settings,
status,
pending_at,
Expand Down Expand Up @@ -1082,6 +1090,8 @@ def list_print_jobs(
printer_name,
printer_backend,
printer_transport,
printer_host,
printer_port,
media_settings,
status,
pending_at,
Expand Down
8 changes: 8 additions & 0 deletions printing/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1180,6 +1180,8 @@ def _record_and_send(
printer_name: str | None,
printer_backend: str | None,
printer_transport: str | None,
printer_host: str | None = None,
printer_port: int | None = None,
media_settings: Mapping[str, Any] | None,
send_callable: Callable[[bytes], None],
logger: logging.Logger | None,
Expand All @@ -1198,6 +1200,10 @@ def _record_and_send(
"printer_transport": printer_transport,
"media_settings": media_settings,
}
if printer_host:
params["printer_host"] = printer_host
if printer_port is not None:
params["printer_port"] = printer_port
job_id, status = enqueue_job(
template_name,
payload,
Expand Down Expand Up @@ -1411,6 +1417,8 @@ def send_commands(
printer_name=self.config.printer_name,
printer_backend=self.config.backend,
printer_transport=self.config.transport,
printer_host=self.config.host,
printer_port=self.config.port if self.config.host else None,
media_settings=media_settings,
send_callable=self.transport.send,
logger=self.logger,
Expand Down
2 changes: 2 additions & 0 deletions printing/queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,8 @@ def enqueue_job(
printer_name=printer.name,
printer_backend=params.get("printer_backend", printer.backend),
printer_transport=params.get("printer_transport", printer.transport),
printer_host=params.get("printer_host"),
printer_port=params.get("printer_port"),
media_settings=params.get("media_settings"),
)

Expand Down
2 changes: 2 additions & 0 deletions quick_print.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,8 @@ def _on_print(self) -> None:
"printer_backend": backend_name,
"printer_transport": "win32",
"media_settings": media_settings,
"printer_host": None,
"printer_port": None,
},
)
except Exception as exc: # pragma: no cover - defensive
Expand Down
2 changes: 2 additions & 0 deletions tests/db/test_init_and_migrate.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@
"printer_name",
"printer_backend",
"printer_transport",
"printer_host",
"printer_port",
"media_settings",
"status",
"pending_at",
Expand Down
7 changes: 7 additions & 0 deletions tests/test_db_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,13 @@ def test_print_job_lifecycle(tmp_path):
assert row["status"] == "pending"
assert row["pending_at"] is not None
assert row["running_at"] is None
host_row = conn.execute(
"SELECT printer_host, printer_port FROM print_jobs WHERE id = ?",
(job_id,),
).fetchone()
assert host_row is not None
assert host_row["printer_host"] is None
assert host_row["printer_port"] is None

assert store.update_print_job_status(
job_id=job_id, status="running", db_path=db_path
Expand Down
60 changes: 60 additions & 0 deletions tests/test_printing_new.py
Original file line number Diff line number Diff line change
Expand Up @@ -461,3 +461,63 @@ def test_reprint_uses_saved_payload():
assert wait_for_all_jobs(2.0)
assert reprint_stub.payloads == [original_payload]
assert new_job_id != original_job_id


def test_tcp_job_replay_preserves_host_port():
config = PrinterConfig(backend="tspl", transport="tcp", host="192.0.2.10", port=9200)
printer = Printer(config)
stub = StubTransport()
printer.transport = stub

ok, status, job_id = printer.send_commands(
b"tcp-payload",
backend="tspl",
template_name="tcp-job",
template_backend="tspl",
)

assert ok and status is not None and status.get("status") == "pending"
assert job_id is not None
assert wait_for_all_jobs(2.0)
assert stub.payloads == [b"tcp-payload"]

record = db_store.get_print_job(job_id=job_id)
assert record is not None
assert record.get("printer_host") == "192.0.2.10"
assert record.get("printer_port") == 9200

payload = db_store.get_job_payload(job_id=job_id)
assert payload == b"tcp-payload"

reprint_config = PrinterConfig(
backend=str(record.get("printer_backend") or "tspl"),
transport=str(record.get("printer_transport") or "tcp"),
printer_name=str(record.get("printer_name") or "") or None,
)
host_value = record.get("printer_host")
if host_value:
reprint_config.host = str(host_value)
port_value = record.get("printer_port")
if port_value is not None:
reprint_config.port = int(port_value)

reprint_printer = Printer(reprint_config)
reprint_stub = StubTransport()
reprint_printer.transport = reprint_stub

ok2, status2, replay_job_id = reprint_printer.send_commands(
payload,
backend=str(record.get("template_backend") or "tspl"),
template_name=str(record.get("template_name") or "") or None,
template_backend=str(record.get("template_backend") or "") or None,
)

assert ok2 and status2 is not None and status2.get("status") == "pending"
assert replay_job_id is not None
assert wait_for_all_jobs(2.0)
assert reprint_stub.payloads == [b"tcp-payload"]

replay_record = db_store.get_print_job(job_id=replay_job_id)
assert replay_record is not None
assert replay_record.get("printer_host") == "192.0.2.10"
assert replay_record.get("printer_port") == 9200
6 changes: 6 additions & 0 deletions ui/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1346,6 +1346,9 @@ def _resend_job(
"printer_transport": config.transport,
"media_settings": media_settings,
}
if config.host:
params["printer_host"] = config.host
params["printer_port"] = config.port

template_name = str(record.get("template_name") or "") or None

Expand Down Expand Up @@ -1813,6 +1816,9 @@ def _imprimir_etiqueta(self) -> None:
"printer_transport": config.transport,
"media_settings": media_settings,
}
if config.host:
params["printer_host"] = config.host
params["printer_port"] = config.port

try:
job_id, status = enqueue_job(tpl, payload, target, copies=1, params=params)
Expand Down
Loading