mirror of
https://github.com/OCA/report-print-send.git
synced 2025-02-16 07:11:31 +02:00
108 lines
4.5 KiB
Python
108 lines
4.5 KiB
Python
# Copyright (C) 2016 SYLEAM (<http://www.syleam.fr>)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
import logging
|
|
from odoo import models, fields, api
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class PrintingJob(models.Model):
|
|
_name = 'printing.job'
|
|
_description = 'Printing Job'
|
|
_order = 'job_id_cups DESC'
|
|
|
|
name = fields.Char(help='Job name.')
|
|
active = fields.Boolean(
|
|
default=True, help='Unchecked if the job is purged from cups.')
|
|
job_id_cups = fields.Integer(
|
|
string='Job ID', required=True,
|
|
help='CUPS id for this job.')
|
|
server_id = fields.Many2one(
|
|
comodel_name='printing.server', string='Server',
|
|
related='printer_id.server_id', store=True,
|
|
help='Server which hosts this job.')
|
|
printer_id = fields.Many2one(
|
|
comodel_name='printing.printer', string='Printer', required=True,
|
|
ondelete='cascade', help='Printer used for this job.')
|
|
job_media_progress = fields.Integer(
|
|
string='Media Progress', required=True,
|
|
help='Percentage of progress for this job.')
|
|
time_at_creation = fields.Datetime(
|
|
required=True, help='Date and time of creation for this job.')
|
|
time_at_processing = fields.Datetime(
|
|
help='Date and time of process for this job.')
|
|
time_at_completed = fields.Datetime(
|
|
help='Date and time of completion for this job.')
|
|
job_state = fields.Selection(selection=[
|
|
('pending', 'Pending'),
|
|
('pending held', 'Pending Held'),
|
|
('processing', 'Processing'),
|
|
('processing stopped', 'Processing Stopped'),
|
|
('canceled', 'Canceled'),
|
|
('aborted', 'Aborted'),
|
|
('completed', 'Completed'),
|
|
('unknown', 'Unknown'),
|
|
], string='State', help='Current state of the job.')
|
|
job_state_reason = fields.Selection(selection=[
|
|
('none', 'No reason'),
|
|
('aborted-by-system', 'Aborted by the system'),
|
|
('compression-error', 'Error in the compressed data'),
|
|
('document-access-error', 'The URI cannot be accessed'),
|
|
('document-format-error', 'Error in the document'),
|
|
('cups-filter-crashed', 'CUPS filter crashed'),
|
|
('job-canceled-at-device', 'Cancelled at the device'),
|
|
('job-canceled-by-operator', 'Cancelled by the printer operator'),
|
|
('job-canceled-by-user', 'Cancelled by the user'),
|
|
('job-completed-successfully', 'Completed successfully'),
|
|
('job-completed-with-errors', 'Completed with some errors'),
|
|
('job-completed-with-warnings', 'Completed with some warnings'),
|
|
('job-data-insufficient', 'No data has been received'),
|
|
('job-hold-until-specified', 'Currently held'),
|
|
('job-incoming', 'Files are currently being received'),
|
|
('job-interpreting', 'Currently being interpreted'),
|
|
('job-outgoing', 'Currently being sent to the printer'),
|
|
('job-printing', 'Currently printing'),
|
|
('job-queued', 'Queued for printing'),
|
|
('job-queued-for-marker', 'Printer needs ink/marker/toner'),
|
|
('job-restartable', 'Can be restarted'),
|
|
('job-transforming', 'Being transformed into a different format'),
|
|
('printer-stopped', 'Printer is stopped'),
|
|
('printer-stopped-partly',
|
|
'Printer state reason set to \'stopped-partly\''),
|
|
('processing-to-stop-point',
|
|
'Cancelled, but printing already processed pages'),
|
|
('queued-in-device', 'Queued at the output device'),
|
|
('resources-are-not-ready',
|
|
'Resources not available to print the job'),
|
|
('service-off-line', 'Held because the printer is offline'),
|
|
('submission-interrupted', 'Files were not received in full'),
|
|
('unsupported-compression', 'Compressed using an unknown algorithm'),
|
|
('unsupported-document-format', 'Unsupported format'),
|
|
], string='State Reason', help='Reason for the current job state.')
|
|
|
|
_sql_constraints = [
|
|
('job_id_cups_unique', 'UNIQUE(job_id_cups, server_id)',
|
|
'The id of the job must be unique per server !'),
|
|
]
|
|
|
|
@api.multi
|
|
def action_cancel(self):
|
|
self.ensure_one()
|
|
return self.cancel()
|
|
|
|
@api.multi
|
|
def cancel(self, purge_job=False):
|
|
for job in self:
|
|
connection = job.server_id._open_connection()
|
|
if not connection:
|
|
continue
|
|
|
|
connection.cancelJob(job.job_id_cups, purge_job=purge_job)
|
|
|
|
# Update jobs' states info Odoo
|
|
self.mapped('server_id').update_jobs(
|
|
which='all', first_job_id=job.job_id_cups)
|
|
|
|
return True
|