diff --git a/base_report_to_printer/__manifest__.py b/base_report_to_printer/__manifest__.py index 5f521f5164b..4e969e9dd0e 100644 --- a/base_report_to_printer/__manifest__.py +++ b/base_report_to_printer/__manifest__.py @@ -7,7 +7,7 @@ { "name": "Report to printer", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "category": "Generic Modules/Base", "author": "Agile Business Group & Domsense, Pegueroles SCP, NaN," " LasLabs, Camptocamp, Odoo Community Association (OCA)," diff --git a/base_report_to_printer/models/printing_printer.py b/base_report_to_printer/models/printing_printer.py index e16bbc31212..d29813c83ca 100644 --- a/base_report_to_printer/models/printing_printer.py +++ b/base_report_to_printer/models/printing_printer.py @@ -69,7 +69,7 @@ class PrintingPrinter(models.Model): def _prepare_update_from_cups(self, cups_connection, cups_printer): mapping = {3: "available", 4: "printing", 5: "error"} - vals = { + cups_vals = { "name": cups_printer["printer-info"], "model": cups_printer.get("printer-make-and-model", False), "location": cups_printer.get("printer-location", False), @@ -77,6 +77,14 @@ def _prepare_update_from_cups(self, cups_connection, cups_printer): "status": mapping.get(cups_printer.get("printer-state"), "unknown"), "status_message": cups_printer.get("printer-state-message", ""), } + + # prevent write if the field didn't change + vals = { + fieldname: value + for fieldname, value in cups_vals.items() + if not self or value != self[fieldname] + } + printer_uri = cups_printer["printer-uri-supported"] printer_system_name = printer_uri[printer_uri.rfind("/") + 1 :] ppd_info = cups_connection.getPPD3(printer_system_name) @@ -96,13 +104,13 @@ def _prepare_update_from_cups(self, cups_connection, cups_printer): if not option: return vals - vals["tray_ids"] = [] + tray_commands = [] cups_trays = { tray_option["choice"]: tray_option["text"] for tray_option in option.choices } # Add new trays - vals["tray_ids"].extend( + tray_commands.extend( [ (0, 0, {"name": text, "system_name": choice}) for choice, text in cups_trays.items() @@ -111,7 +119,7 @@ def _prepare_update_from_cups(self, cups_connection, cups_printer): ) # Remove deleted trays - vals["tray_ids"].extend( + tray_commands.extend( [ (2, tray.id) for tray in self.tray_ids.filtered( @@ -119,6 +127,8 @@ def _prepare_update_from_cups(self, cups_connection, cups_printer): ) ] ) + if tray_commands: + vals["tray_ids"] = tray_commands return vals def print_document(self, report, content, **print_opts): diff --git a/base_report_to_printer/models/printing_server.py b/base_report_to_printer/models/printing_server.py index ad840295cab..6ae2c6c14f3 100644 --- a/base_report_to_printer/models/printing_server.py +++ b/base_report_to_printer/models/printing_server.py @@ -82,11 +82,14 @@ def update_printers(self, domain=None, raise_on_error=False): printer_values = printer._prepare_update_from_cups( connection, printer_info ) - printer_values.update(system_name=name, server_id=server.id) + if server != printer.server_id: + printer_values["server_id"] = server.id + updated_printers.append(name) if not printer: + printer_values["system_name"] = name printer.create(printer_values) - else: + elif printer_values: printer.write(printer_values) # Set printers not found as unavailable @@ -172,27 +175,30 @@ def update_jobs(self, which="all", first_job_id=-1): jobs = job_obj.with_context(active_test=False).search( [("job_id_cups", "=", cups_job_id), ("server_id", "=", server.id)] ) - job_values = { + cups_job_values = { "name": job_data.get("job-name", ""), "active": True, - "job_id_cups": cups_job_id, - "job_media_progress": job_data.get("job-media-progress", False), + "job_media_progress": job_data.get("job-media-progress", 0), "job_state": mapping.get(job_data.get("job-state"), "unknown"), "job_state_reason": job_data.get("job-state-reasons", ""), - "time_at_creation": fields.Datetime.to_string( - datetime.fromtimestamp(job_data.get("time-at-creation", False)) - ), - "time_at_processing": job_data.get("time-at-processing", False) - and fields.Datetime.to_string( - datetime.fromtimestamp( - job_data.get("time-at-processing", False) - ) - ), - "time_at_completed": job_data.get("time-at-completed", False) - and fields.Datetime.to_string( - datetime.fromtimestamp(job_data.get("time-at-completed", False)) + "time_at_creation": datetime.fromtimestamp( + job_data.get("time-at-creation", 0) ), } + if job_data.get("time-at-processing"): + cups_job_values["time_at_processing"] = datetime.fromtimestamp( + job_data["time-at-processing"] + ) + if job_data.get("time-at-completed"): + cups_job_values["time_at_completed"] = datetime.fromtimestamp( + job_data["time-at-completed"] + ) + + job_values = { + fieldname: value + for fieldname, value in cups_job_values.items() + if not jobs or value != jobs[fieldname] + } # Search for the printer in Odoo printer_uri = job_data["printer-uri"] @@ -209,12 +215,14 @@ def update_jobs(self, which="all", first_job_id=-1): # discard here if not printer found if not printer: continue - job_values["printer_id"] = printer.id + if jobs.printer_id != printer: + job_values["printer_id"] = printer.id - if jobs: - jobs.write(job_values) - else: + if not jobs: + job_values["job_id_cups"] = cups_job_id job_obj.create(job_values) + elif job_values: + jobs.write(job_values) # Deactive purged jobs if which == "all" and first_job_id == -1: