Report to printer

base_report_to_printer
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/19.0/base_report_to_printer
VERSION
VERSION 1.2.1
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
COMMITTERS
COMMITTERSEmanuel Cino, Weblate, OCA-git-bot, oca-ci, Miquel Alzanillas, DavidJForgeFlow, eugenio
WEBSITE
WEBSITEhttps://github.com/OCA/report-print-send
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides the core framework to send Odoo reports directly to printers.
It defines the base models, configuration options and printing workflow, without depending on a specific printing protocol.

The actual connection with printers is delegated to extension modules (e.g. base_report_to_printer_cups), which implement support for a given printing backend.

Key features:

Flexible report output behavior:

Send to Client (default): generates a downloadable PDF.

Send to Printer: sends the report directly to a configured printer (via backend module).

Support for user-level, report-level, and combined user/report printing rules.

Extensible design: new modules can add support for additional printing systems or protocols.

This modular approach allows administrators to configure printing globally, per user, per report, or per user/report combination, while keeping the printing backend independent and replaceable.

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.form (in base_report_to_printer) ir.actions.report page Inherits base.act_report_xml_view
printing_job_view_form printing.job.form (in base_report_to_printer) printing.job form New
printing_job_view_tree printing.job.tree (in base_report_to_printer) printing.job list New
printing_printer_view_form printing.printer.form (in base_report_to_printer) printing.printer form New
printing_printer_view_search printing.printer.search (in base_report_to_printer) printing.printer search New
printing_printer_view_tree printing.printer.tree (in base_report_to_printer) printing.printer list New
printing_report_xml_action_view_form printing.report.xml.action.form (in base_report_to_printer) printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree (in base_report_to_printer) printing.report.xml.action list New
view_users_form res.users.form (in base_report_to_printer) res.users group Inherits base.view_users_form
view_users_form_simple_modif res.users.form.simple (in base_report_to_printer) res.users group Inherits base.view_users_form_simple_modif
wizard_print_attachment_form wizard.print.attachment wizard.print.attachment form New
wizard_print_attachment_line_form wizard.print.attachment.line.form wizard.print.attachment.line form New
Models touched (12)

New fields (5)
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printing_printer_id)]" string='Output Bin'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (7)
  • behaviour(self)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    Print a document, do not return the document file
  • print_document_client_action(self, record_ids, data=None)
  • print_document_threaded(self, report_id, record_ids, data)
  • report_action(self, docids, data=None, config=True)

New fields (2)
  • action_type Selection
    required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (6)
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • time_at_completed Datetime
    help='Date and time of completion for this job.' string='Completion Date'
  • time_at_creation Datetime
    help='Date and time of creation of this job.' required=True string='Creation Date'
  • time_at_processing Datetime
    help='Date and time of process for this job.' string='Processing Date'
Public methods (2)
  • action_cancel(self)
  • cancel(self)

New fields (11)
  • active Boolean
    default=True
  • backend Selection
    default='base' required=True selection=[('base', 'Base')]
  • default Boolean
    readonly=True
  • location Char
    readonly=True
  • model Char
    readonly=True
  • multi_thread Boolean
  • name Char
    required=True
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    required=True
  • uri Char
    readonly=True string='URI'
Public methods (11)
  • action_cancel_all_jobs(self)
  • cancel_all_jobs(self, purge_jobs=False)
  • disable(self)
  • enable(self)
  • get_default(self)
  • print_document(self, report, content, action=None, doc_format='qweb-pdf', **kwargs)
    Generic document print logic, backend-agnostic.
  • print_file(self, file_name, report=None, **print_opts)
  • print_options(self, report=None, **print_opts)
  • print_test_page(self)
  • set_default(self)
  • unset_default(self)

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)

New fields (7)
  • action Selection
    required=True selection=<expr>
  • active Boolean
    default=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printer_id)]" string='Output Bin'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Output Bin'
  • printing_action Selection
    selection=<expr>
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (3)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed

New fields (2)
  • attachment_line_ids One2many → wizard.print.attachment.line
    string='Attachments to print' args: 'wizard.print.attachment.line', 'wizard_id'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used to print the attachments.' required=True string='Printer'
Public methods (1)
  • print_attachments(self)
    Prints a label per selected record

New fields (4)
  • attachment_id Many2one → ir.attachment
    domain=['|', ('mimetype', '=', 'application/pdf'), ('mimetype', '=', 'application/octet-stream')] required=True args: 'ir.attachment'
  • copies Integer
    default=1
  • record_name Char
    readonly=True related='attachment_id.res_name'
  • wizard_id Many2one → wizard.print.attachment
    args: 'wizard.print.attachment'
Public methods (1)
  • get_format(self)
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/18.0/base_report_to_printer
VERSION
VERSION 1.4.0
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
COMMITTERS
COMMITTERSCarlos Lopez, Florent Xicluna, Sébastien Alix, Emanuel Cino, Weblate, OCA-git-bot, Tom, oca-ci, Vincent Van Rossem, Carlos Roca, Miquel Alzanillas, ferran-S73, david-s73, trisdoan, arantxa-s73
WEBSITE
WEBSITEhttps://github.com/OCA/report-print-send
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES pycups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows users to send reports to a printer attached to the
server.

It adds an optional behaviour on reports to send it directly to a
printer.

- Send to Client is the default behaviour providing you a downloadable
  PDF
- Send to Printer prints the report on selected printer

It detects trays on printers installation plus permits to select the
paper source on which you want to print directly.

Report behaviour is defined by settings.

You will find this option on default user config, on default report
config and on specific config per user per report.

This allows you to dedicate a specific paper source for example for
preprinted paper such as payment slip.

Settings can be configured:

- globally
- per user
- per report
- per user and report

Code Analysis

Views touched (17)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.form (in base_report_to_printer) ir.actions.report page Inherits base.act_report_xml_view
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form (in base_report_to_printer) printing.job form New
printing_job_view_tree printing.job.tree (in base_report_to_printer) printing.job list New
printing_printer_view_form printing.printer.form (in base_report_to_printer) printing.printer form New
printing_printer_view_search printing.printer.search (in base_report_to_printer) printing.printer search New
printing_printer_view_tree printing.printer.tree (in base_report_to_printer) printing.printer list New
printing_report_xml_action_view_form printing.report.xml.action.form (in base_report_to_printer) printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree (in base_report_to_printer) printing.report.xml.action list New
printing_server_view_form printing.server.form (in base_report_to_printer) printing.server form New
printing_server_view_search printing.server.search (in base_report_to_printer) printing.server search New
printing_server_view_tree printing.server.tree (in base_report_to_printer) printing.server list New
view_user_default_printer_selector_form wiz.user.default.printer.selector.form wiz.user.default.printer.selector form New
view_users_form res.users.form (in base_report_to_printer) res.users group Inherits base.view_users_form
view_users_form_simple_modif res.users.form.simple (in base_report_to_printer) res.users group Inherits base.view_users_form_simple_modif
wizard_print_attachment_form wizard.print.attachment wizard.print.attachment form New
wizard_print_attachment_line_form wizard.print.attachment.line.form wizard.print.attachment.line form New
Models touched (14)

New fields (5)
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printing_printer_id)]" string='Output Bin'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (7)
  • behaviour(self)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    Print a document, do not return the document file
  • print_document_client_action(self, record_ids, data=None)
  • print_document_threaded(self, report_id, record_ids, data)
  • report_action(self, docids, data=None, config=True)

New fields (2)
  • action_type Selection
    required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from CUPS.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' selection=[('none', 'No reason'), ('aborted-by-system', 'Aborted by the system'), ('compression-error', 'Error in the compressed data'), ('cups-filter-crashed', 'CUPS filter crashed'), ('document-access-error', 'The URI cannot be accessed'), ('document-format-error', 'Error in the document'), ('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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.' string='Completion Date'
  • time_at_creation Datetime
    help='Date and time of creation of this job.' required=True string='Creation Date'
  • time_at_processing Datetime
    help='Date and time of process for this job.' string='Processing Date'
Public methods (2)
  • action_cancel(self)
  • cancel(self, purge_job=False)

New fields (15)
  • active Boolean
    default=True
  • backend Selection
    default='cups' required=True selection=[('cups', 'Cups')]
  • default Boolean
    readonly=True
  • input_tray_ids One2many → printing.tray.input
    comodel_name='printing.tray.input' inverse_name='printer_id' string='Paper Sources'
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • multi_thread Boolean
    compute='_compute_multi_thread' readonly=False store=True
  • name Char
    index=True required=True
  • output_tray_ids One2many → printing.tray.output
    comodel_name='printing.tray.output' inverse_name='printer_id' string='Output trays'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • uri Char
    readonly=True string='URI'
Public methods (11)
  • action_cancel_all_jobs(self)
  • cancel_all_jobs(self, purge_jobs=False)
  • disable(self)
  • enable(self)
  • get_default(self)
  • print_document(self, report, content, **print_opts)
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, **print_opts)
    Print a file
  • print_options(self, report=None, **print_opts)
  • print_test_page(self)
  • set_default(self)
  • unset_default(self)

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)

New fields (7)
  • action Selection
    required=True selection=<expr>
  • active Boolean
    default=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printer_id)]" string='Output Bin'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (9)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • encryption_policy Selection
    help='Encryption Policy to connect to the server. Empty by default.' args: [('0', 'HTTP_ENCRYPT_IF_REQUESTED'), ('1', 'HTTP_ENCRYPT_NEVER'), ('2', 'HTTP_ENCRYPT_REQUIRED'), ('3', 'HTTP_ENCRYPT_ALWAYS')]
  • multi_thread Boolean
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • password Char
    help='Password to connect to the server. Empty by default.'
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
  • user Char
    help='User name to connect to the server. Empty by default.'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
  • update_jobs(self, which='all', first_job_id=-1)
  • update_printers(self, domain=None, raise_on_error=False)

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Output Bin'
  • printing_action Selection
    selection=<expr>
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (3)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed

New fields (1)
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' default=<expr> string='Default Printer'
Public methods (1)
  • action_confirm(self)

New fields (2)
  • attachment_line_ids One2many → wizard.print.attachment.line
    string='Attachments to print' args: 'wizard.print.attachment.line', 'wizard_id'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used to print the attachments.' required=True string='Printer'
Public methods (1)
  • print_attachments(self)
    Prints a label per selected record

New fields (4)
  • attachment_id Many2one → ir.attachment
    domain=['|', ('mimetype', '=', 'application/pdf'), ('mimetype', '=', 'application/octet-stream')] required=True args: 'ir.attachment'
  • copies Integer
    default=1
  • record_name Char
    readonly=True related='attachment_id.res_name'
  • wizard_id Many2one → wizard.print.attachment
    args: 'wizard.print.attachment'
Public methods (1)
  • get_format(self)
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/17.0/base_report_to_printer
VERSION
VERSION 1.2.2
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
COMMITTERS
COMMITTERSStéphane Bidoul, Emanuel Cino, Weblate, OCA-git-bot, David, oca-ci, arantxa-s73, John Herholz
WEBSITE
WEBSITEhttps://github.com/OCA/report-print-send
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES pycups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows users to send reports to a printer attached to the
server.

It adds an optional behaviour on reports to send it directly to a
printer.

- Send to Client is the default behaviour providing you a downloadable
  PDF
- Send to Printer prints the report on selected printer

It detects trays on printers installation plus permits to select the
paper source on which you want to print directly.

Report behaviour is defined by settings.

You will find this option on default user config, on default report
config and on specific config per user per report.

This allows you to dedicate a specific paper source for example for
preprinted paper such as payment slip.

Settings can be configured:

- globally
- per user
- per report
- per user and report

Code Analysis

Views touched (16)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.form (in base_report_to_printer) ir.actions.report page Inherits base.act_report_xml_view
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form (in base_report_to_printer) printing.job form New
printing_job_view_tree printing.job.tree (in base_report_to_printer) printing.job tree New
printing_printer_view_form printing.printer.form (in base_report_to_printer) printing.printer form New
printing_printer_view_search printing.printer.search (in base_report_to_printer) printing.printer search New
printing_printer_view_tree printing.printer.tree (in base_report_to_printer) printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form (in base_report_to_printer) printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree (in base_report_to_printer) printing.report.xml.action tree New
printing_server_view_form printing.server.form (in base_report_to_printer) printing.server form New
printing_server_view_search printing.server.search (in base_report_to_printer) printing.server search New
printing_server_view_tree printing.server.tree (in base_report_to_printer) printing.server tree New
view_users_form res.users.form (in base_report_to_printer) res.users group Inherits base.view_users_form
view_users_form_simple_modif res.users.form.simple (in base_report_to_printer) res.users group Inherits base.view_users_form_simple_modif
wizard_print_attachment_form wizard.print.attachment wizard.print.attachment form New
wizard_print_attachment_line_form wizard.print.attachment.line.form wizard.print.attachment.line form New
Models touched (13)

New fields (5)
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printing_printer_id)]" string='Output Bin'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (7)
  • behaviour(self)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    Print a document, do not return the document file
  • print_document_client_action(self, record_ids, data=None)
  • print_document_threaded(self, report_id, record_ids, data)
  • report_action(self, docids, data=None, config=True)

New fields (2)
  • action_type Selection
    required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from CUPS.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' selection=[('none', 'No reason'), ('aborted-by-system', 'Aborted by the system'), ('compression-error', 'Error in the compressed data'), ('cups-filter-crashed', 'CUPS filter crashed'), ('document-access-error', 'The URI cannot be accessed'), ('document-format-error', 'Error in the document'), ('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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.' string='Completion Date'
  • time_at_creation Datetime
    help='Date and time of creation of this job.' required=True string='Creation Date'
  • time_at_processing Datetime
    help='Date and time of process for this job.' string='Processing Date'
Public methods (2)
  • action_cancel(self)
  • cancel(self, purge_job=False)

New fields (14)
  • active Boolean
    default=True
  • default Boolean
    readonly=True
  • input_tray_ids One2many → printing.tray.input
    comodel_name='printing.tray.input' inverse_name='printer_id' string='Paper Sources'
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • multi_thread Boolean
    compute='_compute_multi_thread' readonly=False store=True
  • name Char
    index=True required=True
  • output_tray_ids One2many → printing.tray.output
    comodel_name='printing.tray.output' inverse_name='printer_id' string='Output trays'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • uri Char
    readonly=True string='URI'
Public methods (11)
  • action_cancel_all_jobs(self)
  • cancel_all_jobs(self, purge_jobs=False)
  • disable(self)
  • enable(self)
  • get_default(self)
  • print_document(self, report, content, **print_opts)
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, **print_opts)
    Print a file
  • print_options(self, report=None, **print_opts)
  • print_test_page(self)
  • set_default(self)
  • unset_default(self)

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)

New fields (6)
  • action Selection
    required=True selection=<expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printer_id)]" string='Output Bin'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (9)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • encryption_policy Selection
    help='Encryption Policy to connect to the server. Empty by default.' args: [('0', 'HTTP_ENCRYPT_IF_REQUESTED'), ('1', 'HTTP_ENCRYPT_NEVER'), ('2', 'HTTP_ENCRYPT_REQUIRED'), ('3', 'HTTP_ENCRYPT_ALWAYS')]
  • multi_thread Boolean
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • password Char
    help='Password to connect to the server. Empty by default.'
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
  • user Char
    help='User name to connect to the server. Empty by default.'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
  • update_jobs(self, which='all', first_job_id=-1)
  • update_printers(self, domain=None, raise_on_error=False)

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • printer_input_tray_id Many2one → printing.tray.input
    comodel_name='printing.tray.input' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printer_output_tray_id Many2one → printing.tray.output
    comodel_name='printing.tray.output' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Output Bin'
  • printing_action Selection
    selection=_user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (3)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed

New fields (2)
  • attachment_line_ids One2many → wizard.print.attachment.line
    string='Attachments to print' args: 'wizard.print.attachment.line', 'wizard_id'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used to print the attachments.' required=True string='Printer'
Public methods (1)
  • print_attachments(self)
    Prints a label per selected record

New fields (4)
  • attachment_id Many2one → ir.attachment
    domain=['|', ('mimetype', '=', 'application/pdf'), ('mimetype', '=', 'application/octet-stream')] required=True args: 'ir.attachment'
  • copies Integer
    default=1
  • record_name Char
    readonly=True related='attachment_id.res_name'
  • wizard_id Many2one → wizard.print.attachment
    args: 'wizard.print.attachment'
Public methods (1)
  • get_format(self)
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/16.0/base_report_to_printer
VERSION
VERSION 1.5.2
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
COMMITTERS
COMMITTERSAlexis de Lattre, GitHub, Jacques-Etienne Baudoux, Laurent Mignon (ACSONE), Denis Roussel, GabbasovDinar, Sébastien Alix, Weblate, OCA-git-bot, David, Michele, oca-ci, Guille, Kevin Luna, hda, dtec-landoo, Artur Machura
WEBSITE
WEBSITEhttps://github.com/OCA/report-print-send
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES pycups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (16)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.form (in base_report_to_printer) ir.actions.report page Inherits base.act_report_xml_view
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form (in base_report_to_printer) printing.job form New
printing_job_view_tree printing.job.tree (in base_report_to_printer) printing.job tree New
printing_printer_view_form printing.printer.form (in base_report_to_printer) printing.printer form New
printing_printer_view_search printing.printer.search (in base_report_to_printer) printing.printer search New
printing_printer_view_tree printing.printer.tree (in base_report_to_printer) printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form (in base_report_to_printer) printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree (in base_report_to_printer) printing.report.xml.action tree New
printing_server_view_form printing.server.form (in base_report_to_printer) printing.server form New
printing_server_view_search printing.server.search (in base_report_to_printer) printing.server search New
printing_server_view_tree printing.server.tree (in base_report_to_printer) printing.server tree New
view_users_form res.users.form (in base_report_to_printer) res.users group Inherits base.view_users_form
view_users_form_simple_modif res.users.form.simple (in base_report_to_printer) res.users group Inherits base.view_users_form_simple_modif
wizard_print_attachment_form wizard.print.attachment wizard.print.attachment form New
wizard_print_attachment_line_form wizard.print.attachment.line.form wizard.print.attachment.line form New
Models touched (11)

New fields (4)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (7)
  • behaviour(self)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    Print a document, do not return the document file
  • print_document_client_action(self, record_ids, data=None)
  • print_document_threaded(self, report_id, record_ids, data)
  • report_action(self, docids, data=None, config=True)

New fields (2)
  • action_type Selection
    required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from CUPS.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' selection=[('none', 'No reason'), ('aborted-by-system', 'Aborted by the system'), ('compression-error', 'Error in the compressed data'), ('cups-filter-crashed', 'CUPS filter crashed'), ('document-access-error', 'The URI cannot be accessed'), ('document-format-error', 'Error in the document'), ('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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.' string='Completion Date'
  • time_at_creation Datetime
    help='Date and time of creation of this job.' required=True string='Creation Date'
  • time_at_processing Datetime
    help='Date and time of process for this job.' string='Processing Date'
Public methods (2)
  • action_cancel(self)
  • cancel(self, purge_job=False)

New fields (13)
  • active Boolean
    default=True
  • default Boolean
    readonly=True
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • multi_thread Boolean
    compute='_compute_multi_thread' readonly=False store=True
  • name Char
    index=True required=True
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • tray_ids One2many → printing.tray
    comodel_name='printing.tray' inverse_name='printer_id' string='Paper Sources'
  • uri Char
    readonly=True string='URI'
Public methods (12)
  • action_cancel_all_jobs(self)
  • cancel_all_jobs(self, purge_jobs=False)
  • disable(self)
  • enable(self)
  • get_default(self)
  • print_document(self, report, content, **print_opts)
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, **print_opts)
    Print a file
  • print_file_and_clean(self, file_name, report=None, **print_opts)
    Print a file and clean up the given file after printing
  • print_options(self, report=None, **print_opts)
  • print_test_page(self)
  • set_default(self)
  • unset_default(self)

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)

New fields (5)
  • action Selection
    required=True selection=<expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (10)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • company_ids Many2many → res.company
    comodel_name='res.company'
  • encryption_policy Selection
    help='Encryption Policy to connect to the server. Empty by default.' args: [('0', 'HTTP_ENCRYPT_IF_REQUESTED'), ('1', 'HTTP_ENCRYPT_NEVER'), ('2', 'HTTP_ENCRYPT_REQUIRED'), ('3', 'HTTP_ENCRYPT_ALWAYS')]
  • multi_thread Boolean
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • password Char
    help='Password to connect to the server. Empty by default.'
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
  • user Char
    help='User name to connect to the server. Empty by default.'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
  • update_jobs(self, which='all', first_job_id=-1)
  • update_printers(self, domain=None, raise_on_error=False)

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (3)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printing_action Selection
    selection=_user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (3)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed

New fields (2)
  • attachment_line_ids One2many → wizard.print.attachment.line
    string='Attachments to print' args: 'wizard.print.attachment.line', 'wizard_id'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used to print the attachments.' required=True string='Printer'
Public methods (1)
  • print_attachments(self)
    Prints a label per selected record

New fields (4)
  • attachment_id Many2one → ir.attachment
    domain=['|', ('mimetype', '=', 'application/pdf'), ('mimetype', '=', 'application/octet-stream')] required=True args: 'ir.attachment'
  • copies Integer
    default=1
  • record_name Char
    readonly=True related='attachment_id.res_name'
  • wizard_id Many2one → wizard.print.attachment
    args: 'wizard.print.attachment'
Public methods (1)
  • get_format(self)
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/15.0/base_report_to_printer
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
COMMITTERS
COMMITTERSsergio-teruel, Sébastien Alix, Weblate, OCA-git-bot, David, oca-ci, Carlos Roca, matiasperalta1, David Montull
WEBSITE
WEBSITEhttps://github.com/OCA/report-print-send
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES pycups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (17)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.form (in base_report_to_printer) ir.actions.report page Inherits base.act_report_xml_view
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form (in base_report_to_printer) printing.job form New
printing_job_view_tree printing.job.tree (in base_report_to_printer) printing.job tree New
printing_printer_view_form printing.printer.form (in base_report_to_printer) printing.printer form New
printing_printer_view_search printing.printer.search (in base_report_to_printer) printing.printer search New
printing_printer_view_tree printing.printer.tree (in base_report_to_printer) printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form (in base_report_to_printer) printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree (in base_report_to_printer) printing.report.xml.action tree New
printing_server_view_form printing.server.form (in base_report_to_printer) printing.server form New
printing_server_view_search printing.server.search (in base_report_to_printer) printing.server search New
printing_server_view_tree printing.server.tree (in base_report_to_printer) printing.server tree New
view_user_default_printer_selector_form wiz.user.default.printer.selector.form wiz.user.default.printer.selector form New
view_users_form res.users.form (in base_report_to_printer) res.users group Inherits base.view_users_form
view_users_form_simple_modif res.users.form.simple (in base_report_to_printer) res.users group Inherits base.view_users_form_simple_modif
wizard_print_attachment_form wizard.print.attachment wizard.print.attachment form New
wizard_print_attachment_line_form wizard.print.attachment.line.form wizard.print.attachment.line form New
Models touched (12)

New fields (4)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (7)
  • behaviour(self)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    Print a document, do not return the document file
  • print_document_client_action(self, record_ids, data=None)
  • print_document_threaded(self, report_id, record_ids, data)
  • report_action(self, docids, data=None, config=True)

New fields (2)
  • action_type Selection
    required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from cups.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' selection=[('none', 'No reason'), ('aborted-by-system', 'Aborted by the system'), ('compression-error', 'Error in the compressed data'), ('cups-filter-crashed', 'CUPS filter crashed'), ('document-access-error', 'The URI cannot be accessed'), ('document-format-error', 'Error in the document'), ('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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.'
  • time_at_creation Datetime
    help='Date and time of creation for this job.' required=True
  • time_at_processing Datetime
    help='Date and time of process for this job.'
Public methods (2)
  • action_cancel(self)
  • cancel(self, purge_job=False)

New fields (13)
  • active Boolean
    default=True
  • default Boolean
    readonly=True
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • multi_thread Boolean
    compute='_compute_multi_thread' readonly=False store=True
  • name Char
    index=True required=True
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • tray_ids One2many → printing.tray
    comodel_name='printing.tray' inverse_name='printer_id' string='Paper Sources'
  • uri Char
    readonly=True string='URI'
Public methods (11)
  • action_cancel_all_jobs(self)
  • cancel_all_jobs(self, purge_jobs=False)
  • disable(self)
  • enable(self)
  • get_default(self)
  • print_document(self, report, content, **print_opts)
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, **print_opts)
    Print a file
  • print_options(self, report=None, **print_opts)
  • print_test_page(self)
  • set_default(self)
  • unset_default(self)

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)

New fields (5)
  • action Selection
    required=True selection=<expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (9)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • encryption_policy Selection
    help='Encryption Policy to connect to the server. Empty by default.' args: [('0', 'HTTP_ENCRYPT_IF_REQUESTED'), ('1', 'HTTP_ENCRYPT_NEVER'), ('2', 'HTTP_ENCRYPT_REQUIRED'), ('3', 'HTTP_ENCRYPT_ALWAYS')]
  • multi_thread Boolean
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • password Char
    help='Password to connect to the server. Empty by default.'
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
  • user Char
    help='User name to connect to the server. Empty by default.'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
  • update_jobs(self, which='all', first_job_id=-1)
  • update_printers(self, domain=None, raise_on_error=False)

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (3)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printing_action Selection
    selection=_user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (3)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITEABLE_FIELDS(self)
    @property
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed

New fields (1)
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' default=<expr> string='Default Printer'
Public methods (1)
  • action_confirm(self)

New fields (2)
  • attachment_line_ids One2many → wizard.print.attachment.line
    string='Attachments to print' args: 'wizard.print.attachment.line', 'wizard_id'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used to print the attachments.' required=True string='Printer'
Public methods (1)
  • print_attachments(self)
    Prints a label per selected record

New fields (4)
  • attachment_id Many2one → ir.attachment
    domain="['|', ('mimetype', '=', 'application/pdf'), ('mimetype', '=', 'application/octet-stream')]" required=True args: 'ir.attachment'
  • copies Integer
    default=1
  • record_name Char
    readonly=True related='attachment_id.res_name'
  • wizard_id Many2one → wizard.print.attachment
    args: 'wizard.print.attachment'
Public methods (1)
  • get_format(self)
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/14.0/base_report_to_printer
VERSION
VERSION 2.0.2
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
COMMITTERS
COMMITTERSAlexandre Fayolle, Pedro M. Baeza, Denis Roussel, Florent de Labarre, Lois Rilo, Pierre Verkest, OCA Transbot, Sébastien Alix, oca-travis, Weblate, OCA-git-bot, Stephane Mangin, oca-ci, Carlos Roca, oca-git-bot, sonhd
WEBSITE
WEBSITEhttps://github.com/OCA/report-print-send
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES pycups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (17)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.form (in base_report_to_printer) ir.actions.report page Inherits base.act_report_xml_view
assets_backend base_report_to_printer assets ir.ui.view qweb Inherits web.assets_backend
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form (in base_report_to_printer) printing.job form New
printing_job_view_tree printing.job.tree (in base_report_to_printer) printing.job tree New
printing_printer_view_form printing.printer.form (in base_report_to_printer) printing.printer form New
printing_printer_view_search printing.printer.search (in base_report_to_printer) printing.printer search New
printing_printer_view_tree printing.printer.tree (in base_report_to_printer) printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form (in base_report_to_printer) printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree (in base_report_to_printer) printing.report.xml.action tree New
printing_server_view_form printing.server.form (in base_report_to_printer) printing.server form New
printing_server_view_search printing.server.search (in base_report_to_printer) printing.server search New
printing_server_view_tree printing.server.tree (in base_report_to_printer) printing.server tree New
view_users_form res.users.form (in base_report_to_printer) res.users group Inherits base.view_users_form
view_users_form_simple_modif res.users.form.simple (in base_report_to_printer) res.users group Inherits base.view_users_form_simple_modif
wizard_print_attachment_form wizard.print.attachment wizard.print.attachment form New
wizard_print_attachment_line_form wizard.print.attachment.line.form wizard.print.attachment.line form New
Models touched (11)

New fields (4)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (5)
  • behaviour(self)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    Print a document, do not return the document file
  • report_action(self, docids, data=None, config=True)

New fields (2)
  • action_type Selection
    required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from cups.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' selection=[('none', 'No reason'), ('aborted-by-system', 'Aborted by the system'), ('compression-error', 'Error in the compressed data'), ('cups-filter-crashed', 'CUPS filter crashed'), ('document-access-error', 'The URI cannot be accessed'), ('document-format-error', 'Error in the document'), ('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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.'
  • time_at_creation Datetime
    help='Date and time of creation for this job.' required=True
  • time_at_processing Datetime
    help='Date and time of process for this job.'
Public methods (2)
  • action_cancel(self)
  • cancel(self, purge_job=False)

New fields (12)
  • active Boolean
    default=True
  • default Boolean
    readonly=True
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • name Char
    index=True required=True
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • tray_ids One2many → printing.tray
    comodel_name='printing.tray' inverse_name='printer_id' string='Paper Sources'
  • uri Char
    readonly=True string='URI'
Public methods (11)
  • action_cancel_all_jobs(self)
  • cancel_all_jobs(self, purge_jobs=False)
  • disable(self)
  • enable(self)
  • get_default(self)
  • print_document(self, report, content, **print_opts)
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, **print_opts)
    Print a file
  • print_options(self, report=None, **print_opts)
  • print_test_page(self)
  • set_default(self)
  • unset_default(self)

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)

New fields (5)
  • action Selection
    required=True selection=<expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (8)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • encryption_policy Selection
    help='Encryption Policy to connect to the server. Empty by default.' args: [('0', 'HTTP_ENCRYPT_IF_REQUESTED'), ('1', 'HTTP_ENCRYPT_NEVER'), ('2', 'HTTP_ENCRYPT_REQUIRED'), ('3', 'HTTP_ENCRYPT_ALWAYS')]
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • password Char
    help='Password to connect to the server. Empty by default.'
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
  • user Char
    help='User name to connect to the server. Empty by default.'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
  • update_jobs(self, which='all', first_job_id=-1)
  • update_printers(self, domain=None, raise_on_error=False)

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (3)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printing_action Selection
    selection=_user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (1)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed

New fields (2)
  • attachment_line_ids One2many → wizard.print.attachment.line
    string='Attachments to print' args: 'wizard.print.attachment.line', 'wizard_id'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used to print the attachments.' required=True string='Printer'
Public methods (1)
  • print_attachments(self)
    Prints a label per selected record

New fields (4)
  • attachment_id Many2one → ir.attachment
    domain="['|', ('mimetype', '=', 'application/pdf'), ('mimetype', '=', 'application/octet-stream')]" required=True args: 'ir.attachment'
  • copies Integer
    default=1
  • record_name Char
    readonly=True related='attachment_id.res_name'
  • wizard_id Many2one → wizard.print.attachment
    args: 'wizard.print.attachment'
Public methods (1)
  • get_format(self)
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/13.0/base_report_to_printer
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
COMMITTERS
COMMITTERSStéphane Bidoul, Guewen Baconnier, Alexandre Fayolle, GitHub, Enric Tobella, OCA Transbot, Thomas Binsfeld, Rod Schouteden, oca-travis, Weblate, OCA-git-bot, Jaime Arroyo, Florian Pose
WEBSITE
WEBSITEhttps://github.com/OCA/report-print-send
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:20
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES pycups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (15)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.form (in base_report_to_printer) ir.actions.report xpath Inherits base.act_report_xml_view
assets_backend base_report_to_printer assets ir.ui.view qweb Inherits web.assets_backend
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form (in base_report_to_printer) printing.job form New
printing_job_view_tree printing.job.tree (in base_report_to_printer) printing.job tree New
printing_printer_view_form printing.printer.form (in base_report_to_printer) printing.printer form New
printing_printer_view_search printing.printer.search (in base_report_to_printer) printing.printer search New
printing_printer_view_tree printing.printer.tree (in base_report_to_printer) printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form (in base_report_to_printer) printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree (in base_report_to_printer) printing.report.xml.action tree New
printing_server_view_form printing.server.form (in base_report_to_printer) printing.server form New
printing_server_view_search printing.server.search (in base_report_to_printer) printing.server search New
printing_server_view_tree printing.server.tree (in base_report_to_printer) printing.server tree New
view_users_form res.users.form (in base_report_to_printer) res.users xpath Inherits base.view_users_form
view_users_form_simple_modif res.users.form.simple (in base_report_to_printer) res.users footer Inherits base.view_users_form_simple_modif
Models touched (9)

New fields (4)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (6)
  • behaviour(self)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    Print a document, do not return the document file
  • render_qweb_pdf(self, res_ids=None, data=None)
    Generate a PDF and returns it. If the action configured on the report is server, it prints the generated document as well.
  • report_action(self, docids, data=None, config=True)

New fields (2)
  • action_type Selection
    required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from cups.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' selection=[('none', 'No reason'), ('aborted-by-system', 'Aborted by the system'), ('compression-error', 'Error in the compressed data'), ('cups-filter-crashed', 'CUPS filter crashed'), ('document-access-error', 'The URI cannot be accessed'), ('document-format-error', 'Error in the document'), ('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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.'
  • time_at_creation Datetime
    help='Date and time of creation for this job.' required=True
  • time_at_processing Datetime
    help='Date and time of process for this job.'
Public methods (2)
  • action_cancel(self)
  • cancel(self, purge_job=False)

New fields (12)
  • active Boolean
    default=True
  • default Boolean
    readonly=True
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • name Char
    index=True required=True
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • tray_ids One2many → printing.tray
    comodel_name='printing.tray' inverse_name='printer_id' string='Paper Sources'
  • uri Char
    readonly=True string='URI'
Public methods (10)
  • action_cancel_all_jobs(self)
  • cancel_all_jobs(self, purge_jobs=False)
  • disable(self)
  • enable(self)
  • get_default(self)
  • print_document(self, report, content, **print_opts)
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, **print_opts)
    Print a file
  • print_options(self, report=None, **print_opts)
  • set_default(self)
  • unset_default(self)

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)

New fields (5)
  • action Selection
    required=True selection=<expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (5)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
  • update_jobs(self, which='all', first_job_id=-1)
  • update_printers(self, domain=None, raise_on_error=False)

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (3)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printing_action Selection
    selection=_user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (1)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/12.0/base_report_to_printer
VERSION
VERSION 1.2.1
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN, Open for Small Business Ltd
COMMITTERS
COMMITTERSAlexandre Fayolle, sebalix, OCA Transbot, Graeme Gellatly, oca-travis, Weblate, OCA-git-bot, Jaime Arroyo
WEBSITE
WEBSITEhttp://www.agilebg.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:25
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (17)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.form (in base_report_to_printer) ir.actions.report xpath Inherits base.act_report_xml_view
assets_backend base_report_to_printer assets ir.ui.view qweb Inherits web.assets_backend
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form (in base_report_to_printer) printing.job form New
printing_job_view_tree printing.job.tree (in base_report_to_printer) printing.job tree New
printing_printer_view_form printing.printer.form (in base_report_to_printer) printing.printer form New
printing_printer_view_search printing.printer.search (in base_report_to_printer) printing.printer search New
printing_printer_view_tree printing.printer.tree (in base_report_to_printer) printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form (in base_report_to_printer) printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree (in base_report_to_printer) printing.report.xml.action tree New
printing_server_view_form printing.server.form (in base_report_to_printer) printing.server form New
printing_server_view_search printing.server.search (in base_report_to_printer) printing.server search New
printing_server_view_tree printing.server.tree (in base_report_to_printer) printing.server tree New
view_users_form res.users.form (in base_report_to_printer) res.users xpath Inherits base.view_users_form
view_users_form_simple_modif res.users.form.simple (in base_report_to_printer) res.users footer Inherits base.view_users_form_simple_modif
wizard_print_attachment_form wizard.print.attachment wizard.print.attachment form New
wizard_print_attachment_line_form wizard.print.attachment.line.form wizard.print.attachment.line form New
Models touched (11)

New fields (4)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (6)
  • behaviour(self)
    @api.multi
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    @api.multi
    Print a document, do not return the document file
  • render_qweb_pdf(self, res_ids=None, data=None)
    Generate a PDF and returns it. If the action configured on the report is server, it prints the generated document as well.
  • report_action(self, docids, data=None, config=True)
    @api.noguess

New fields (2)
  • action_type Selection
    oldname='type' required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from cups.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' 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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.'
  • time_at_creation Datetime
    help='Date and time of creation for this job.' required=True
  • time_at_processing Datetime
    help='Date and time of process for this job.'
Public methods (2)
  • action_cancel(self)
    @api.multi
  • cancel(self, purge_job=False)
    @api.multi

New fields (12)
  • active Boolean
    default=True
  • default Boolean
    readonly=True
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • name Char
    index=True required=True
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • tray_ids One2many → printing.tray
    comodel_name='printing.tray' inverse_name='printer_id' string='Paper Sources'
  • uri Char
    readonly=True string='URI'
Public methods (10)
  • action_cancel_all_jobs(self)
    @api.multi
  • cancel_all_jobs(self, purge_jobs=False)
    @api.multi
  • disable(self)
    @api.multi
  • enable(self)
    @api.multi
  • get_default(self)
    @api.multi
  • print_document(self, report, content, **print_opts)
    @api.multi
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, **print_opts)
    @api.multi
    Print a file
  • print_options(self, report=None, **print_opts)
    @api.multi
  • set_default(self)
    @api.multi
  • unset_default(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)
    @api.multi

New fields (5)
  • action Selection
    required=True selection=<expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
    @api.multi
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (5)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
    @api.multi
  • update_jobs(self, which='all', first_job_id=-1)
    @api.multi
  • update_printers(self, domain=None, raise_on_error=False)
    @api.multi

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (3)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printing_action Selection
    selection=_user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (1)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed

New fields (2)
  • attachment_line_ids One2many → wizard.print.attachment.line
    string='Attachments to print' args: 'wizard.print.attachment.line', 'wizard_id'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used to print the attachments.' required=True string='Printer'
Public methods (1)
  • print_attachments(self)
    @api.multi
    Prints a label per selected record

New fields (4)
  • attachment_id Many2one → ir.attachment
    domain="['|', ('mimetype', '=', 'application/pdf'), ('mimetype', '=', 'application/octet-stream')]" required=True args: 'ir.attachment'
  • copies Integer
    default=1
  • record_name Char
    readonly=True related='attachment_id.res_name'
  • wizard_id Many2one → wizard.print.attachment
    args: 'wizard.print.attachment'
Public methods (1)
  • get_format(self)
    @api.multi
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/11.0/base_report_to_printer
VERSION
VERSION 2.3.1
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp, LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN
COMMITTERS
COMMITTERSYannick Vaucher, Alexandre Fayolle, Maxime Chambreuil, Pedro M. Baeza, GitHub, Enric Tobella, Florent de Labarre, OCA Transbot, Graeme Gellatly, oca-travis, Weblate, OCA-git-bot, Sylvain GARANCHER, Oscar Ulises Garza Cordova
WEBSITE
WEBSITEhttp://www.agilebg.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:24:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (15)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.printing ir.actions.report xpath Inherits base.act_report_xml_view
assets_backend base_report_to_printer assets ir.ui.view qweb Inherits web.assets_backend
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form printing.job form New
printing_job_view_tree printing.job.tree printing.job tree New
printing_printer_view_form printing.printer.form printing.printer form New
printing_printer_view_search printing.printer.search printing.printer search New
printing_printer_view_tree printing.printer.tree printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree printing.report.xml.action tree New
printing_server_view_form printing.server.form printing.server form New
printing_server_view_search printing.server.search printing.server search New
printing_server_view_tree printing.server.tree printing.server tree New
view_users_form res.users.form.printing.preferences res.users xpath Inherits base.view_users_form
view_users_form_simple_modif res.users.form.printing res.users footer Inherits base.view_users_form_simple_modif
Models touched (9)

New fields (4)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Paper Source'
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Default Behaviour'
Public methods (6)
  • behaviour(self)
    @api.multi
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js
  • print_document(self, record_ids, data=None)
    @api.multi
    Print a document, do not return the document file
  • render_qweb_pdf(self, docids, data=None)
    Generate a PDF and returns it. If the action configured on the report is server, it prints the generated document as well.
  • report_action(self, docids, data=None, config=True)
    @api.noguess

New fields (2)
  • action_type Selection
    oldname='type' required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from cups.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' 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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.'
  • time_at_creation Datetime
    help='Date and time of creation for this job.' required=True
  • time_at_processing Datetime
    help='Date and time of process for this job.'
Public methods (2)
  • action_cancel(self)
    @api.multi
  • cancel(self, purge_job=False)
    @api.multi

New fields (11)
  • default Boolean
    readonly=True
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • name Char
    index=True required=True
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • tray_ids One2many → printing.tray
    comodel_name='printing.tray' inverse_name='printer_id' string='Paper Sources'
  • uri Char
    readonly=True string='URI'
Public methods (10)
  • action_cancel_all_jobs(self)
    @api.multi
  • cancel_all_jobs(self, purge_jobs=False)
    @api.multi
  • disable(self)
    @api.multi
  • enable(self)
    @api.multi
  • get_default(self)
    @api.multi
  • print_document(self, report, content, **print_opts)
    @api.multi
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, **print_opts)
    @api.multi
    Print a file
  • print_options(self, report=None, **print_opts)
    @api.multi
  • set_default(self)
    @api.multi
  • unset_default(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)
    @api.multi

New fields (5)
  • action Selection
    required=True selection=<expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printer_id)]" string='Paper Source'
  • report_id Many2one → ir.actions.report
    comodel_name='ir.actions.report' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (2)
  • behaviour(self)
    @api.multi
  • onchange_printer_id(self)
    @api.onchange('printer_id')
    Reset the tray when the printer is changed

New fields (5)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
    @api.multi
  • update_jobs(self, which='all', first_job_id=-1)
    @api.multi
  • update_printers(self, domain=None, raise_on_error=False)
    @api.multi

New fields (3)
  • name Char
    required=True
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' ondelete='cascade' readonly=True required=True string='Printer'
  • system_name Char
    readonly=True required=True
Public methods (0)

No public methods.

New fields (3)
  • printer_tray_id Many2one → printing.tray
    comodel_name='printing.tray' domain="[('printer_id', '=', printing_printer_id)]" string='Default Printer Paper Source'
  • printing_action Selection
    selection=_user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (1)
  • onchange_printing_printer_id(self)
    @api.onchange('printing_printer_id')
    Reset the tray when the printer is changed
REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/10.0/base_report_to_printer
VERSION
VERSION 2.0.2
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Jairo Llopis, Stéphane Bidoul (ACSONE), OCA Transbot, Graeme Gellatly, Dave Lasley, oca-travis, Weblate, OCA-git-bot, Sergio Teruel Albert, Sylvain GARANCHER
WEBSITE
WEBSITEhttps://github.com/OCA/report-print-send
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:20:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - report
    - base
    - web
    - base_setup
    - web_kanban
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (16)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.xml.printing ir.actions.report.xml xpath Inherits base.act_report_xml_view
assets_backend base_report_to_printer assets ir.ui.view qweb Inherits report.assets_backend
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form printing.job form New
printing_job_view_tree printing.job.tree printing.job tree New
printing_printer_view_form printing.printer.form printing.printer form New
printing_printer_view_search printing.printer.search printing.printer search New
printing_printer_view_tree printing.printer.tree printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree printing.report.xml.action tree New
printing_server_view_form printing.server.form printing.server form New
printing_server_view_search printing.server.search printing.server search New
printing_server_view_tree printing.server.tree printing.server tree New
report_1 report_1 ir.ui.view qweb New
view_users_form res.users.form.printing.preferences res.users xpath Inherits base.view_users_form
view_users_form_simple_modif res.users.form.printing res.users footer Inherits base.view_users_form_simple_modif
Models touched (9)

New fields (4)
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Action'
  • report_copies Integer
    default=1 string='# Copies'
Public methods (2)
  • behaviour(self)
    @api.multi
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js

New fields (2)
  • action_type Selection
    oldname='type' required=True selection=_available_action_types string='Type'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from cups.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' 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'), ('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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' readonly=True related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.'
  • time_at_creation Datetime
    help='Date and time of creation for this job.' required=True
  • time_at_processing Datetime
    help='Date and time of process for this job.'
Public methods (2)
  • action_cancel(self)
    @api.multi
  • cancel(self, purge_job=False)
    @api.multi

New fields (10)
  • default Boolean
    readonly=True
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • name Char
    index=True required=True
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True selection=[('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • uri Char
    readonly=True string='URI'
Public methods (9)
  • action_cancel_all_jobs(self)
    @api.multi
  • cancel_all_jobs(self, purge_jobs=False)
    @api.multi
  • disable(self)
    @api.multi
  • enable(self)
    @api.multi
  • get_default(self)
    @api.multi
  • print_document(self, report, content, format, copies=None)
    @api.multi
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, copies=1, format=None)
    @api.multi
    Print a file
  • print_options(self, report=None, format=None, copies=1)
    @api.multi
    Hook to set print options
  • set_default(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)
    @api.multi

New fields (4)
  • action Selection
    required=True selection=<expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • report_id Many2one → ir.actions.report.xml
    comodel_name='ir.actions.report.xml' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (1)
  • behaviour(self)
    @api.multi

New fields (5)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
Public methods (4)
  • action_update_jobs(self)
  • action_update_printers(self)
    @api.multi
  • update_jobs(self, which='all', first_job_id=-1)
    @api.multi
  • update_printers(self, domain=None, raise_on_error=False)
    @api.multi

New fields (0)

No new fields.

Public methods (2)
  • get_pdf(self, docids, report_name, html=None, data=None)
    @api.model
    Generate a PDF and returns it. If the action configured on the report is server, it prints the generated document as well.
  • print_document(self, record_ids, report_name, html=None, data=None)
    @api.model
    Print a document, do not return the document file

New fields (2)
  • printing_action Selection
    selection=_user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/9.0/base_report_to_printer
VERSION
VERSION 2.1.1
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), LasLabs, Agile Business Group & Domsense, Pegueroles SCP, NaN
COMMITTERS
COMMITTERSYannick Vaucher, Pedro M. Baeza, GitHub, Stéphane Bidoul (ACSONE), OCA Transbot, Juan Jose Scarafia, Dave Lasley, Moises Lopez - https://www.vauxoo.com/, oca-travis, Weblate, OCA-git-bot, Sylvain GARANCHER, David, yvaucher
WEBSITE
WEBSITEhttp://www.agilebg.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:15:24
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - report
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (15)
XML IDNameModelTypeStatus
act_report_xml_view ir.actions.report.xml.printing ir.actions.report.xml xpath Inherits base.act_report_xml_view
assets_backend base_report_to_printer assets ir.ui.view qweb Inherits report.assets_backend
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_job_view_form printing.job.form printing.job form New
printing_job_view_tree printing.job.tree printing.job tree New
printing_printer_view_form printing.printer.form printing.printer form New
printing_printer_view_search printing.printer.search printing.printer search New
printing_printer_view_tree printing.printer.tree printing.printer tree New
printing_report_xml_action_view_form printing.report.xml.action.form printing.report.xml.action form New
printing_report_xml_action_view_tree printing.report.xml.action.tree printing.report.xml.action tree New
printing_server_view_form printing.server.form printing.server form New
printing_server_view_search printing.server.search printing.server search New
printing_server_view_tree printing.server.tree printing.server tree New
view_users_form res.users.form.printing.preferences res.users xpath Inherits base.view_users_form
view_users_form_simple_modif res.users.form.printing res.users footer Inherits base.view_users_form_simple_modif
Models touched (9)

New fields (3)
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • property_printing_action_id Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Action'
Public methods (2)
  • behaviour(self)
    @api.multi
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js

New fields (2)
  • name Char
    required=True
  • type Selection
    required=True args: <expr>
Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True help='Unchecked if the job is purged from cups.'
  • job_id_cups Integer
    help='CUPS id for this job.' required=True string='Job ID'
  • job_media_progress Integer
    help='Percentage of progress for this job.' required=True string='Media Progress'
  • job_state Selection
    help='Current state of the job.' selection=[('pending', 'Pending'), ('pending held', 'Pending Held'), ('processing', 'Processing'), ('processing stopped', 'Processing Stopped'), ('canceled', 'Canceled'), ('aborted', 'Aborted'), ('completed', 'Completed'), ('unknown', 'Unknown')] string='State'
  • job_state_reason Selection
    help='Reason for the current job state.' 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'), ('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'
  • name Char
    help='Job name.'
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' help='Printer used for this job.' ondelete='cascade' required=True string='Printer'
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server which hosts this job.' related='printer_id.server_id' store=True string='Server'
  • time_at_completed Datetime
    help='Date and time of completion for this job.'
  • time_at_creation Datetime
    help='Date and time of creation for this job.' required=True
  • time_at_processing Datetime
    help='Date and time of process for this job.'
Public methods (2)
  • action_cancel(self)
    @api.multi
  • cancel(self, purge_job=False)
    @api.multi

New fields (10)
  • default Boolean
    readonly=True
  • job_ids One2many → printing.job
    comodel_name='printing.job' help='Jobs printed on this printer.' inverse_name='printer_id' string='Jobs'
  • location Char
    readonly=True
  • model Char
    readonly=True
  • name Char
    index=True required=True
  • server_id Many2one → printing.server
    comodel_name='printing.server' help='Server used to access this printer.' required=True string='Server'
  • status Selection
    default='unknown' readonly=True required=True args: [('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    index=True required=True
  • uri Char
    readonly=True string='URI'
Public methods (11)
  • action_cancel_all_jobs(self)
    @api.multi
  • cancel_all_jobs(self, purge_jobs=False)
    @api.multi
  • disable(self)
    @api.multi
  • enable(self)
    @api.multi
  • get_default(self)
    @api.multi
  • print_document(self, report, content, format, copies=1)
    @api.multi
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_file(self, file_name, report=None, copies=1, format=None)
    @api.multi
    Print a file
  • print_options(self, report=None, format=None, copies=1)
    @api.multi
    Hook to set print options
  • set_default(self)
    @api.multi
  • update_from_cups(self, cups_connection, cups_printer)
    @api.multi
    Update a printer from the information returned by cups. :param cups_connection: connection to CUPS, may be used when the method is overriden (e.g. in printer_tray) :param cups_printer: dict of information returned by CUPS for the current printer
  • update_printers_status(self, domain=None)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)
    @api.multi

New fields (4)
  • action Selection
    required=True args: <expr>
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • report_id Many2one → ir.actions.report.xml
    comodel_name='ir.actions.report.xml' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (1)
  • behaviour(self)
    @api.multi

New fields (5)
  • active Boolean
    default=True help='If checked, this server is useable.'
  • address Char
    default='localhost' help='IP address or hostname of the server' required=True
  • name Char
    default='Localhost' help='Name of the server.' required=True
  • port Integer
    default=631 help='Port of the server.' required=True
  • printer_ids One2many → printing.printer
    comodel_name='printing.printer' help='List of printers available on this server.' inverse_name='server_id' string='Printers List'
Public methods (4)
  • action_update_jobs(self)
    @api.model
  • action_update_printers(self)
    @api.multi
  • update_jobs(self, which='all', first_job_id=-1)
    @api.multi
  • update_printers(self, domain=None, raise_on_error=False)
    @api.multi

New fields (0)

No new fields.

Public methods (3)
  • get_pdf(self, cr, uid, ids, report_name, html=None, data=None, context=None)
    @api.v7
    Generate a PDF and returns it. If the action configured on the report is server, it prints the generated document as well.
  • get_pdf(self, docids, report_name, html=None, data=None)
    @api.v8
  • print_document(self, record_ids, report_name, html=None, data=None)
    @api.model
    Print a document, do not return the document file

New fields (2)
  • printing_action Selection
    args: <expr>
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/8.0/base_report_to_printer
VERSION
VERSION 0.2.0
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Agile Business Group & Domsense, Pegueroles SCP, NaN
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Agile Business Group & Domsense, Pegueroles SCP, NaN
COMMITTERS
COMMITTERSStéphane Bidoul, Alexis de Lattre, Yannick Vaucher, Guewen Baconnier, Alexandre Fayolle, Anthony Muschang, Stéphane Bidoul (ACSONE), OCA Transbot, vrenaville, czoellner, Roel Adriaans, oca-travis, Weblate, OCA-git-bot, oihane
WEBSITE
WEBSITEhttp://www.agilebg.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:27
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - report
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
action_report_xml_form ir.actions.report.xml.printing ir.actions.report.xml page Inherits base.act_report_xml_view
assets_backend base_report_to_printer assets ir.ui.view qweb Inherits report.assets_backend
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_report_xml_action_form printing.report.xml.action.form printing.report.xml.action form New
printing_report_xml_action_tree printing.report.xml.action.tree printing.report.xml.action tree New
view_printing_printer_form printing.printer.form printing.printer form New
view_printing_printer_search printing.printer.search printing.printer search New
view_printing_printer_tree printing.printer.tree printing.printer tree New
view_printing_users_form res.users.form.printing res.users page Inherits base.view_users_form
view_printing_users_prefs res.users.form.printing res.users footer Inherits base.view_users_form_simple_modif
Models touched (7)

New fields (3)
  • printing_action_ids One2many → printing.report.xml.action
    comodel_name='printing.report.xml.action' help='This field allows configuring action and printer on a per user basis' inverse_name='report_id' string='Actions'
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • property_printing_action Many2one → printing.action
    comodel_name='printing.action' company_dependent=True string='Action'
Public methods (2)
  • behaviour(self)
    @api.multi
  • print_action_for_report_name(self, report_name)
    @api.model
    Returns if the action is a direct print or pdf Called from js

New fields (2)
  • name Char
    required=True
  • type Selection
    required=True args: _available_action_types
Public methods (0)

No public methods.

New fields (8)
  • default Boolean
    readonly=True
  • location Char
    readonly=True
  • model Char
    readonly=True
  • name Char
    required=True select=True
  • status Selection
    default='unknown' readonly=True required=True args: [('unavailable', 'Unavailable'), ('printing', 'Printing'), ('unknown', 'Unknown'), ('available', 'Available'), ('error', 'Error'), ('server-error', 'Server Error')]
  • status_message Char
    readonly=True
  • system_name Char
    required=True select=True
  • uri Char
    readonly=True string='URI'
Public methods (6)
  • get_default(self)
    @api.multi
  • print_document(self, report, content, format, copies=1)
    @api.multi
    Print a file Format could be pdf, qweb-pdf, raw, ...
  • print_options(self, report, format, copies=1)
    @api.multi
    Hook to set print options
  • set_default(self)
    @api.multi
  • update_from_cups(self, cups_connection, cups_printer)
    @api.multi
    Update a printer from the information returned by cups. :param cups_connection: connection to CUPS, may be used when the method is overriden (e.g. in printer_tray) :param cups_printer: dict of information returned by CUPS for the current printer
  • update_printers_status(self)
    @api.model

New fields (0)

No new fields.

Public methods (1)
  • action_ok(self)
    @api.multi

New fields (4)
  • action Selection
    required=True args: _available_action_types
  • printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Printer'
  • report_id Many2one → ir.actions.report.xml
    comodel_name='ir.actions.report.xml' ondelete='cascade' required=True string='Report'
  • user_id Many2one → res.users
    comodel_name='res.users' ondelete='cascade' required=True string='User'
Public methods (1)
  • behaviour(self)
    @api.multi

New fields (0)

No new fields.

Public methods (4)
  • get_pdf(self, cr, uid, ids, report_name, html=None, data=None, context=None)
    @api.v7
    Generate a PDF and returns it. If the action configured on the report is server, it prints the generated document as well.
  • get_pdf(self, records, report_name, html=None, data=None)
    @api.v8
  • print_document(self, cr, uid, ids, report_name, html=None, data=None, context=None)
    @api.v7
    Print a document, do not return the document file
  • print_document(self, records, report_name, html=None, data=None)
    @api.v8

New fields (2)
  • printing_action Selection
    args: _user_available_action_types
  • printing_printer_id Many2one → printing.printer
    comodel_name='printing.printer' string='Default Printer'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/7.0/base_report_to_printer
VERSION
VERSION 0.2
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Agile Business Group & Domsense, Pegueroles SCP, NaN
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Agile Business Group & Domsense, Pegueroles SCP, NaN
COMMITTERS
COMMITTERSYannick Vaucher, Guewen Baconnier, Alexandre Fayolle, Lionel Sausin, Laetitia Gangloff, Joel Grand-Guillaume, Maxime Chambreuil, Stéphane Bidoul (ACSONE), Launchpad Translations on behalf of report-print-send-core-editors, OCA Transbot, Lionel Sausin (Numérigraphe), Andrew Schrafel
WEBSITE
WEBSITEhttp://www.agilebg.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:07:16
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - base_calendar
    - base_status
    - mail
    - base_setup
    - web_kanban
    - web
    - base_action_rule
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES cups
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Report to printer
-----------------
This module allows users to send reports to a printer attached to the server.


It adds an optional behaviour on reports to send it directly to a printer.

* `Send to Client` is the default behavious providing you a downloadable PDF
* `Send to Printer` prints the report on selected printer

Report behaviour is defined by settings.


Settings can be configured:

* globaly
* per user
* per report
* per user and report
* per company and report
* per user/company and report


After installing enable the "Printing / Print Operator" option under access
rights to give users the ability to view the print menu.


To show all available printers for your server, uses
`Settings/Configuration/Printing/Update Printers from CUPS` wizard.


Then goto the user profile and set the users printing action and default
printer.


Dependencies
------------

This module requires pycups
https://pypi.python.org/pypi/pycups


Contributors
------------

* Ferran Pegueroles <ferran@pegueroles.com>
* Albert Cervera i Areny <albert@nan-tic.com>
* Davide Corio <davide.corio@agilebg.com>
* Lorenzo Battistini <lorenzo.battistini@agilebg.com>
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
* Lionel Sausin <ls@numerigraphe.com>

    

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
action_report_xml_form ir.actions.report.xml.printing ir.actions.report.xml page Inherits base.act_report_xml_view
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_report_xml_action_form printing.report.xml.action.form printing.report.xml.action form New
printing_report_xml_action_tree printing.report.xml.action.tree printing.report.xml.action tree New
view_printing_printer_form printing.printer.form printing.printer form New
view_printing_printer_tree printing.printer.tree printing.printer tree New
view_printing_users_form res.users.form.printing res.users page Inherits base.view_users_form
view_printing_users_prefs res.users.form.printing res.users footer Inherits base.view_users_form_simple_modif
Models touched (6)

New fields (0)

No new fields.

Public methods (3)
  • behaviour(self, cr, uid, ids, context=None)
  • print_direct(self, cr, uid, report_id, result, format, printer, context=None)
  • set_print_options(self, cr, uid, report_id, format, context=None)
    Hook to set print options

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (8)
  • browse(self, cr, uid, ids, context=None)
  • get_default(self, cr, uid, context)
  • read(self, cr, uid, ids, fields=None, context=None, load='_classic_read')
  • search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False)
  • set_default(self, cr, uid, ids, context)
  • start_printer_update(self, cr, uid, context)
  • update(self, cr, uid, context=None)
    Update printer status if current status is more than 10s old.
  • update_printers_status(self, db_name, uid, context=None)

New fields (0)

No new fields.

Public methods (2)
  • action_cancel(self, cr, uid, ids, context=None)
  • action_ok(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (1)
  • behaviour(self, cr, uid, act_id, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/report-print-send
GIT
GIThttps://github.com/OCA/report-print-send.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/report-print-send/tree/6.1/base_report_to_printer
VERSION
VERSION 0.1
CATEGORY
CATEGORYGeneric Modules/Base
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSAgile Business Group, Pegueroles SCP, NaN
MAINTAINERS
MAINTAINERSAgile Business Group, Pegueroles SCP, NaN
COMMITTERS
COMMITTERSLorenzo Battistini, Launchpad Translations on behalf of report-print-send-core-editors
WEBSITE
WEBSITEhttp://www.agilebg.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:04:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - base_calendar
    - mail
    - base_tools
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Extracted from printjob ( http://apps.openerp.com/addon/1727 ), this module allows to send reports to a printer attached to the server. Settings can be configured globaly, per user, per report and per user and report.

Configuration
=============

.. image:: http://planet.domsense.com/wp-content/uploads/2011/09/printing-menu.png
   :width: 400 px

First of all, you have to load CUPS printers in OpenERP. You can use a wizard that retrieves them automatically. You just have to click on Update Printers from CUPS and printers will appear within the available printers list.

In the next step you will configure the reports to send to the printers.

.. image:: http://planet.domsense.com/wp-content/uploads/2011/09/reports.png
   :width: 400 px

Through the report form you can define the system’s behaviour while producing the report.

.. image:: http://planet.domsense.com/wp-content/uploads/2011/09/report-configuration.png
   :width: 400 px

You can set a global behaviour, or differentiate it according to the user who’s printing. In the example, the global behaviour defines to send the report to client directly (Send to Client), therefore without sending it to the printer. But if user elbati is printing, the report will be sent to the selected printer (Send to Printer).

You can also define a default behaviour associated to the user, in order to establish whether a certain user, when not differently set, wants to send the reports always to a specific printer or not.

After finishing the configuration, you will just have to click on printing button associated to the report (or launch the report by a wizard or whatever) and the system will automatically send the report to the previously set printer

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
action_report_xml_form ir.actions.report.xml.printing ir.actions.report.xml field Inherits base.act_report_xml_view
printer_update_wizard printing.printer.update.wizard printing.printer.update.wizard form New
printing_report_xml_action_form printing.report.xml.action.form printing.report.xml.action form New
printing_report_xml_action_tree printing.report.xml.action.tree printing.report.xml.action tree New
view_printing_printer_form printing.printer.form printing.printer form New
view_printing_printer_tree printing.printer.tree printing.printer tree New
view_printing_users_form res.users.form.printing res.users field Inherits base.view_users_form
Models touched (0)

No models found for this module.