From 989d8357afc8caa708bc19615bfc9b05409c7e1d Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Wed, 12 Nov 2014 17:29:24 +0100 Subject: [PATCH 01/72] base_calendar passed away Migrate ir_report.py to new API Migrate printing.py to new API Migrate res_users.py to new API Migrate report_xml_action.py to new API Migrate wizard/update_printers.py to new API Better view for wizard Recursion when calling a method with old-style api signature from browse Remove the Lock because it is useless on multiprocess Replace it by a database lock so the different processes are all aware of the lock and the last update timestamp. browse is called often enough to call the update routine (even too much) Implements the print on the new 'report' model Restore the print capability on deprecated reports Update copyrights Improve form view, add search view for printers Update translations, add a string to URI so it is uppercased missing api decorator We need the report in print_document and print options (needed in printer_tray) Move the 'skip_update' right in the browse, it prevents a loop See https://github.com/odoo/odoo/issues/3644 Also, it helps to have the value set/read in context close to each other. Avoid to hits the database too many times to check if the list of printers needs to be refreshed. Keep the last update datetime in cache and invalidate this datetime if is is older than POLL_INTERVAL. Thus, one process won't hit the DB more than 1 time every POLL_INTERVAL (10 seconds currently) to check if it needs to update the list. Refresh the list of printers every 15 seconds instead of 10 Extract a method so it will be easier to override in printer_tray Error on installation of the module Invalidate the cache when the table is created so the table_exists() method returns a fresh value after creation of the table Use a cron instead of threads to update printers status The implementation with threads was blocking the loading of the server in multiprocess. Using a cron will lower the frequency of the updates but at least it is simple and reliable. Fixes #14 Do not write the printer status if it has not changed Avoid unnecessary UPDATE every minute Clean the XML file (remove eval, reindent) Give access to models to all users for reading So they are able to print --- base_report_to_printer/README.rst | 50 ++++ base_report_to_printer/__init__.py | 30 ++ base_report_to_printer/__openerp__.py | 46 +++ .../i18n/base_report_to_printer.pot | 272 +++++++++++++++++ base_report_to_printer/i18n/fr.po | 276 ++++++++++++++++++ base_report_to_printer/i18n/it.po | 230 +++++++++++++++ base_report_to_printer/ir_report.py | 98 +++++++ base_report_to_printer/printing.py | 172 +++++++++++ base_report_to_printer/printing_data.xml | 34 +++ base_report_to_printer/printing_view.xml | 158 ++++++++++ base_report_to_printer/report.py | 39 +++ base_report_to_printer/report_service.py | 86 ++++++ base_report_to_printer/report_xml_action.py | 52 ++++ base_report_to_printer/security/security.xml | 62 ++++ base_report_to_printer/users.py | 43 +++ base_report_to_printer/wizard/__init__.py | 22 ++ .../wizard/update_printers.py | 66 +++++ .../wizard/update_printers.xml | 28 ++ 18 files changed, 1764 insertions(+) create mode 100644 base_report_to_printer/README.rst create mode 100644 base_report_to_printer/__init__.py create mode 100644 base_report_to_printer/__openerp__.py create mode 100644 base_report_to_printer/i18n/base_report_to_printer.pot create mode 100644 base_report_to_printer/i18n/fr.po create mode 100644 base_report_to_printer/i18n/it.po create mode 100644 base_report_to_printer/ir_report.py create mode 100644 base_report_to_printer/printing.py create mode 100644 base_report_to_printer/printing_data.xml create mode 100644 base_report_to_printer/printing_view.xml create mode 100644 base_report_to_printer/report.py create mode 100644 base_report_to_printer/report_service.py create mode 100644 base_report_to_printer/report_xml_action.py create mode 100644 base_report_to_printer/security/security.xml create mode 100644 base_report_to_printer/users.py create mode 100644 base_report_to_printer/wizard/__init__.py create mode 100644 base_report_to_printer/wizard/update_printers.py create mode 100644 base_report_to_printer/wizard/update_printers.xml diff --git a/base_report_to_printer/README.rst b/base_report_to_printer/README.rst new file mode 100644 index 00000000000..51c0e390e75 --- /dev/null +++ b/base_report_to_printer/README.rst @@ -0,0 +1,50 @@ +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 + + +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 +* Albert Cervera i Areny +* Davide Corio +* Lorenzo Battistini +* Yannick Vaucher +* Lionel Sausin +* Guewen Baconnier diff --git a/base_report_to_printer/__init__.py b/base_report_to_printer/__init__.py new file mode 100644 index 00000000000..ddd67e1a648 --- /dev/null +++ b/base_report_to_printer/__init__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2007 Ferran Pegueroles +# Copyright (c) 2009 Albert Cervera i Areny +# Copyright (C) 2011 Agile Business Group sagl () +# Copyright (C) 2011 Domsense srl () +# Copyright (C) 2013-2014 Camptocamp () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import printing +from . import report +from . import report_xml_action +from . import report_service +from . import users +from . import ir_report +from . import wizard diff --git a/base_report_to_printer/__openerp__.py b/base_report_to_printer/__openerp__.py new file mode 100644 index 00000000000..511c179086e --- /dev/null +++ b/base_report_to_printer/__openerp__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2007 Ferran Pegueroles +# Copyright (c) 2009 Albert Cervera i Areny +# Copyright (C) 2011 Agile Business Group sagl () +# Copyright (C) 2011 Domsense srl () +# Copyright (C) 2013-2014 Camptocamp () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + 'name': "Report to printer", + 'version': '0.1.1', + 'category': 'Generic Modules/Base', + 'author': 'Agile Business Group & Domsense, Pegueroles SCP, NaN', + 'website': 'http://www.agilebg.com', + 'license': 'AGPL-3', + "depends": ['base', + 'report', + ], + 'data': [ + 'security/security.xml', + 'printing_data.xml', + 'printing_view.xml', + 'wizard/update_printers.xml', + ], + 'installable': True, + 'auto_install': False, + 'application': True, + 'external_dependencies': { + 'python': ['cups'] + } +} diff --git a/base_report_to_printer/i18n/base_report_to_printer.pot b/base_report_to_printer/i18n/base_report_to_printer.pot new file mode 100644 index 00000000000..58c55d5f3ff --- /dev/null +++ b/base_report_to_printer/i18n/base_report_to_printer.pot @@ -0,0 +1,272 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * base_report_to_printer +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-11-05 14:48+0000\n" +"PO-Revision-Date: 2014-11-17 12:50+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,property_printing_action:0 +#: field:printing.report.xml.action,action:0 +msgid "Action" +msgstr "" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,printing_action_ids:0 +msgid "Actions" +msgstr "" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Available" +msgstr "" + +#. module: base_report_to_printer +#: view:printing.printer.update.wizard:base_report_to_printer.printer_update_wizard +msgid "Cancel" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,create_uid:0 field:printing.printer,create_uid:0 +#: field:printing.printer.polling,create_uid:0 +#: field:printing.printer.update.wizard,create_uid:0 +#: field:printing.report.xml.action,create_uid:0 +msgid "Created by" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,create_date:0 field:printing.printer,create_date:0 +#: field:printing.printer.polling,create_date:0 +#: field:printing.printer.update.wizard,create_date:0 +#: field:printing.report.xml.action,create_date:0 +msgid "Created on" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,default:0 +msgid "Default" +msgstr "" + +#. module: base_report_to_printer +#: field:res.users,printing_printer_id:0 +msgid "Default Printer" +msgstr "" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Error" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,id:0 field:printing.printer,id:0 +#: field:printing.printer.polling,id:0 +#: field:printing.printer.update.wizard,id:0 +#: field:printing.report.xml.action,id:0 +msgid "ID" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,write_uid:0 field:printing.printer,write_uid:0 +#: field:printing.printer.polling,write_uid:0 +#: field:printing.printer.update.wizard,write_uid:0 +#: field:printing.report.xml.action,write_uid:0 +msgid "Last Updated by" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,write_date:0 field:printing.printer,write_date:0 +#: field:printing.printer.polling,write_date:0 +#: field:printing.printer.update.wizard,write_date:0 +#: field:printing.report.xml.action,write_date:0 +msgid "Last Updated on" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer.polling,last_update:0 +msgid "Last update" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,location:0 +msgid "Location" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,model:0 +msgid "Model" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,name:0 field:printing.printer,name:0 +msgid "Name" +msgstr "" + +#. module: base_report_to_printer +#: view:res.users:base_report_to_printer.view_printing_users_form +msgid "Preferences" +msgstr "" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:base_report_to_printer.action_report_xml_form +msgid "Print" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_printing_action +msgid "Print Job Action" +msgstr "" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,printing_printer_id:0 +#: model:ir.model,name:base_report_to_printer.model_printing_printer +#: field:printing.report.xml.action,printer_id:0 +msgid "Printer" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.ui.menu,name:base_report_to_printer.menu_printing_printer_form +#: view:printing.printer:base_report_to_printer.view_printing_printer_form +#: view:printing.printer:base_report_to_printer.view_printing_printer_search +#: view:printing.printer:base_report_to_printer.view_printing_printer_tree +msgid "Printers" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_printing_printer_polling +msgid "Printers Polling" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.ui.menu,name:base_report_to_printer.menu_printing_main +#: selection:printing.printer,status:0 +#: view:res.users:base_report_to_printer.view_printing_users_prefs +msgid "Printing" +msgstr "" + +#. module: base_report_to_printer +#: model:res.groups,name:base_report_to_printer.res_groups_printingprintoperator0 +msgid "Printing / Print Operator" +msgstr "" + +#. module: base_report_to_printer +#: field:res.users,printing_action:0 +msgid "Printing action" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_report +#: field:printing.report.xml.action,report_id:0 +msgid "Report" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_printing_report_xml_action +#: view:printing.report.xml.action:base_report_to_printer.printing_report_xml_action_form +#: view:printing.report.xml.action:base_report_to_printer.printing_report_xml_action_tree +msgid "Report Printing Actions" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.ui.menu,name:base_report_to_printer.menu_printing_reports +msgid "Reports" +msgstr "" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:base_report_to_printer.action_report_xml_form +msgid "Security" +msgstr "" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Server Error" +msgstr "" + +#. module: base_report_to_printer +#: view:printing.printer:base_report_to_printer.view_printing_printer_form +msgid "Set Default" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.actions.act_window,name:base_report_to_printer.action_printing_printer_form +msgid "Show Printers" +msgstr "" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:base_report_to_printer.action_report_xml_form +msgid "Specific actions per user" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,status:0 +msgid "Status" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,status_message:0 +msgid "Status message" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,system_name:0 +msgid "System name" +msgstr "" + +#. module: base_report_to_printer +#: help:ir.actions.report.xml,printing_action_ids:0 +msgid "This field allows configuring action and printer on a per user basis" +msgstr "" + +#. module: base_report_to_printer +#: view:printing.printer.update.wizard:base_report_to_printer.printer_update_wizard +msgid "" +"This process will create all the missing printers from the current CUPS " +"server." +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,type:0 +msgid "Type" +msgstr "" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Unavailable" +msgstr "" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Unknown" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.actions.act_window,name:base_report_to_printer.action_printer_update_wizard +#: model:ir.ui.menu,name:base_report_to_printer.menu_printer_update_wizard +#: view:printing.printer.update.wizard:base_report_to_printer.printer_update_wizard +msgid "Update Printers from CUPS" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,uri:0 +msgid "URI" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.report.xml.action,user_id:0 +msgid "User" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_res_users +msgid "Users" +msgstr "" diff --git a/base_report_to_printer/i18n/fr.po b/base_report_to_printer/i18n/fr.po new file mode 100644 index 00000000000..1e06bfab045 --- /dev/null +++ b/base_report_to_printer/i18n/fr.po @@ -0,0 +1,276 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * base_report_to_printer +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-11-05 14:48+0000\n" +"PO-Revision-Date: 2014-02-25 15:06+0000\n" +"Last-Translator: Guewen Baconnier @ Camptocamp \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-06 07:28+0000\n" +"X-Generator: Launchpad (build 16996)\n" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,property_printing_action:0 +#: field:printing.report.xml.action,action:0 +msgid "Action" +msgstr "Action" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,printing_action_ids:0 +msgid "Actions" +msgstr "Actions" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Available" +msgstr "Disponible" + +#. module: base_report_to_printer +#: view:printing.printer.update.wizard:base_report_to_printer.printer_update_wizard +msgid "Cancel" +msgstr "Annuler" + +#. module: base_report_to_printer +#: field:printing.action,create_uid:0 field:printing.printer,create_uid:0 +#: field:printing.printer.polling,create_uid:0 +#: field:printing.printer.update.wizard,create_uid:0 +#: field:printing.report.xml.action,create_uid:0 +msgid "Created by" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,create_date:0 field:printing.printer,create_date:0 +#: field:printing.printer.polling,create_date:0 +#: field:printing.printer.update.wizard,create_date:0 +#: field:printing.report.xml.action,create_date:0 +msgid "Created on" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,default:0 +msgid "Default" +msgstr "Par défaut" + +#. module: base_report_to_printer +#: field:res.users,printing_printer_id:0 +msgid "Default Printer" +msgstr "Imprimante par défaut" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Error" +msgstr "Erreur" + +#. module: base_report_to_printer +#: field:printing.action,id:0 field:printing.printer,id:0 +#: field:printing.printer.polling,id:0 +#: field:printing.printer.update.wizard,id:0 +#: field:printing.report.xml.action,id:0 +msgid "ID" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,write_uid:0 field:printing.printer,write_uid:0 +#: field:printing.printer.polling,write_uid:0 +#: field:printing.printer.update.wizard,write_uid:0 +#: field:printing.report.xml.action,write_uid:0 +msgid "Last Updated by" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.action,write_date:0 field:printing.printer,write_date:0 +#: field:printing.printer.polling,write_date:0 +#: field:printing.printer.update.wizard,write_date:0 +#: field:printing.report.xml.action,write_date:0 +msgid "Last Updated on" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer.polling,last_update:0 +msgid "Last update" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,location:0 +msgid "Location" +msgstr "Emplacement" + +#. module: base_report_to_printer +#: field:printing.printer,model:0 +msgid "Model" +msgstr "Modèle" + +#. module: base_report_to_printer +#: field:printing.action,name:0 field:printing.printer,name:0 +msgid "Name" +msgstr "Nom" + +#. module: base_report_to_printer +#: view:res.users:base_report_to_printer.view_printing_users_form +msgid "Preferences" +msgstr "Préférences" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:base_report_to_printer.action_report_xml_form +msgid "Print" +msgstr "Imprimer" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_printing_action +msgid "Print Job Action" +msgstr "Action d'impression" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,printing_printer_id:0 +#: model:ir.model,name:base_report_to_printer.model_printing_printer +#: field:printing.report.xml.action,printer_id:0 +msgid "Printer" +msgstr "Imprimante" + +#. module: base_report_to_printer +#: model:ir.ui.menu,name:base_report_to_printer.menu_printing_printer_form +#: view:printing.printer:base_report_to_printer.view_printing_printer_form +#: view:printing.printer:base_report_to_printer.view_printing_printer_search +#: view:printing.printer:base_report_to_printer.view_printing_printer_tree +msgid "Printers" +msgstr "Imprimantes" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_printing_printer_polling +msgid "Printers Polling" +msgstr "Recherche d'imprimantes" + +#. module: base_report_to_printer +#: model:ir.ui.menu,name:base_report_to_printer.menu_printing_main +#: selection:printing.printer,status:0 +#: view:res.users:base_report_to_printer.view_printing_users_prefs +msgid "Printing" +msgstr "Impression en cours" + +#. module: base_report_to_printer +#: model:res.groups,name:base_report_to_printer.res_groups_printingprintoperator0 +msgid "Printing / Print Operator" +msgstr "Opérateur d'impression" + +#. module: base_report_to_printer +#: field:res.users,printing_action:0 +msgid "Printing action" +msgstr "Action d'impression" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_report +#: field:printing.report.xml.action,report_id:0 +msgid "Report" +msgstr "Rapport" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_printing_report_xml_action +#: view:printing.report.xml.action:base_report_to_printer.printing_report_xml_action_form +#: view:printing.report.xml.action:base_report_to_printer.printing_report_xml_action_tree +msgid "Report Printing Actions" +msgstr "Actions d'impression de rapports" + +#. module: base_report_to_printer +#: model:ir.ui.menu,name:base_report_to_printer.menu_printing_reports +msgid "Reports" +msgstr "Rapport" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:base_report_to_printer.action_report_xml_form +msgid "Security" +msgstr "Sécurité" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Server Error" +msgstr "Erreur serveur" + +#. module: base_report_to_printer +#: view:printing.printer:base_report_to_printer.view_printing_printer_form +msgid "Set Default" +msgstr "Définir par défaut" + +#. module: base_report_to_printer +#: model:ir.actions.act_window,name:base_report_to_printer.action_printing_printer_form +msgid "Show Printers" +msgstr "Afficher les imprimantes" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:base_report_to_printer.action_report_xml_form +msgid "Specific actions per user" +msgstr "Action spécifique par utilisateur" + +#. module: base_report_to_printer +#: field:printing.printer,status:0 +msgid "Status" +msgstr "État" + +#. module: base_report_to_printer +#: field:printing.printer,status_message:0 +msgid "Status message" +msgstr "Message d'état" + +#. module: base_report_to_printer +#: field:printing.printer,system_name:0 +msgid "System name" +msgstr "Nom système" + +#. module: base_report_to_printer +#: help:ir.actions.report.xml,printing_action_ids:0 +msgid "This field allows configuring action and printer on a per user basis" +msgstr "" +"Ce champs permet de configurer les actions et les imprimantes par utilisateur" + +#. module: base_report_to_printer +#: view:printing.printer.update.wizard:base_report_to_printer.printer_update_wizard +msgid "" +"This process will create all the missing printers from the current CUPS " +"server." +msgstr "" +"Cette opération va créer les imprimantes manquantes à partir du serveur CUPS " +"courant." + +#. module: base_report_to_printer +#: field:printing.action,type:0 +msgid "Type" +msgstr "Type" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Unavailable" +msgstr "Non disponible" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Unknown" +msgstr "Inconnu" + +#. module: base_report_to_printer +#: model:ir.actions.act_window,name:base_report_to_printer.action_printer_update_wizard +#: model:ir.ui.menu,name:base_report_to_printer.menu_printer_update_wizard +#: view:printing.printer.update.wizard:base_report_to_printer.printer_update_wizard +msgid "Update Printers from CUPS" +msgstr "Mettre à jour les imprimantes depuis CUPS" + +#. module: base_report_to_printer +#: field:printing.printer,uri:0 +msgid "URI" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.report.xml.action,user_id:0 +msgid "User" +msgstr "Utilisateur" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_res_users +msgid "Users" +msgstr "Utilisateurs" diff --git a/base_report_to_printer/i18n/it.po b/base_report_to_printer/i18n/it.po new file mode 100644 index 00000000000..e6f25c67acb --- /dev/null +++ b/base_report_to_printer/i18n/it.po @@ -0,0 +1,230 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * base_report_to_printer +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-11-05 14:48+0000\n" +"PO-Revision-Date: 2014-02-25 15:09+0000\n" +"Last-Translator: Yannick Vaucher @ Camptocamp \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2014-05-06 07:28+0000\n" +"X-Generator: Launchpad (build 16996)\n" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Unavailable" +msgstr "Non disponibile" + +#. module: base_report_to_printer +#: view:printing.printer.update.wizard:0 +msgid "" +"This process will create all missing printers from the current CUPS server." +msgstr "" +"Questo processo creerà tutte le stampante mancanti dal server CUPS corrente" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Unknown" +msgstr "Sconosciuto" + +#. module: base_report_to_printer +#: field:printing.printer,system_name:0 +msgid "System Name" +msgstr "Nome di sistema" + +#. module: base_report_to_printer +#: field:printing.printer,location:0 +msgid "Location" +msgstr "Locazione" + +#. module: base_report_to_printer +#: model:ir.actions.act_window,name:base_report_to_printer.action_printing_printer_form +#: model:ir.ui.menu,name:base_report_to_printer.menu_printing_printer_form +#: view:printing.printer:0 +msgid "Printers" +msgstr "Stampanti" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:0 +msgid "Print" +msgstr "" + +#. module: base_report_to_printer +#: field:res.users,printing_action:0 +msgid "Printing Action" +msgstr "Azione di stampa" + +#. module: base_report_to_printer +#: field:printing.action,type:0 +msgid "Type" +msgstr "Tipo" + +#. module: base_report_to_printer +#: field:printing.printer,model:0 +msgid "Model" +msgstr "Model" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Available" +msgstr "Disponibile" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,printing_printer_id:0 +#: model:ir.model,name:base_report_to_printer.model_printing_printer +#: field:printing.report.xml.action,printer_id:0 +msgid "Printer" +msgstr "Stampante" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_res_users +msgid "Users" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_printing_report_xml_action +#: view:printing.report.xml.action:0 +msgid "Report Printing Actions" +msgstr "Azioni di stampa report" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:0 +msgid "Specific actions per user" +msgstr "" + +#. module: base_report_to_printer +#: model:ir.model,name:base_report_to_printer.model_printing_action +msgid "Print Job Action" +msgstr "Azione di stampa" + +#. module: base_report_to_printer +#: field:printing.report.xml.action,user_id:0 +msgid "User" +msgstr "Utente" + +#. module: base_report_to_printer +#: field:printing.report.xml.action,report_id:0 +msgid "Report" +msgstr "Report" + +#. module: base_report_to_printer +#: field:printing.printer,status:0 +msgid "Status" +msgstr "Stato" + +#. module: base_report_to_printer +#: model:ir.actions.act_window,name:base_report_to_printer.action_printing_printer_form +msgid "Show Printers" +msgstr "" + +#. module: base_report_to_printer +#: view:printing.printer.update.wizard:0 +msgid "Ok" +msgstr "Ok" + +#. module: base_report_to_printer +#: field:printing.action,name:0 +#: field:printing.printer,name:0 +msgid "Name" +msgstr "Nome" + +#. module: base_report_to_printer +#: view:printing.printer:0 +msgid "Set Default" +msgstr "Imposta default" + +#. module: base_report_to_printer +#: field:printing.printer,default:0 +#: field:res.users,printing_printer_id:0 +msgid "Default Printer" +msgstr "Stampante di default" + +#. module: base_report_to_printer +#: code:addons/base_report_to_printer/printing.py:189 +#, python-format +msgid "Send to Client" +msgstr "Invia al client" + +#. module: base_report_to_printer +#: field:printing.printer,uri:0 +msgid "URI" +msgstr "URI" + +#. module: base_report_to_printer +#: model:ir.actions.act_window,name:base_report_to_printer.action_printer_update_wizard +#: model:ir.ui.menu,name:base_report_to_printer.menu_printer_update_wizard +#: view:printing.printer.update.wizard:0 +msgid "Update Printers from CUPS" +msgstr "Aggiorna stampanti da CUPS" + +#. module: base_report_to_printer +#: code:addons/base_report_to_printer/printing.py:188 +#, python-format +msgid "Send to Printer" +msgstr "Invia alla stampante" + +#. module: base_report_to_printer +#: model:ir.ui.menu,name:base_report_to_printer.menu_printing_main +#: selection:printing.printer,status:0 +msgid "Printing" +msgstr "Stampa" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Error" +msgstr "Errore" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,property_printing_action:0 +#: field:printing.report.xml.action,action:0 +msgid "Action" +msgstr "Azione" + +#. module: base_report_to_printer +#: view:ir.actions.report.xml:0 +msgid "Security" +msgstr "" + +#. module: base_report_to_printer +#: field:printing.printer,status_message:0 +msgid "Status Message" +msgstr "Messaggio di stato" + +#. module: base_report_to_printer +#: help:ir.actions.report.xml,printing_action_ids:0 +msgid "This field allows configuring action and printer on a per user basis" +msgstr "" +"Questo campo permette di configurare azioni e stampanti sulla base degli " +"utenti" + +#. module: base_report_to_printer +#: selection:printing.printer,status:0 +msgid "Server Error" +msgstr "Errore server" + +#. module: base_report_to_printer +#: field:ir.actions.report.xml,printing_action_ids:0 +msgid "Actions" +msgstr "Azioni" + +#. module: base_report_to_printer +#: view:printing.printer.update.wizard:0 +msgid "Cancel" +msgstr "Annulla" + +#. module: base_report_to_printer +#: model:res.groups,name:base_report_to_printer.res_groups_printingprintoperator0 +msgid "Printing / Print Operator" +msgstr "" + +#. module: base_report_to_printer +#: code:addons/base_report_to_printer/printing.py:190 +#, python-format +msgid "Use user's defaults" +msgstr "Utilizza i default dell'utente" diff --git a/base_report_to_printer/ir_report.py b/base_report_to_printer/ir_report.py new file mode 100644 index 00000000000..4b610547d5e --- /dev/null +++ b/base_report_to_printer/ir_report.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2007 Ferran Pegueroles +# Copyright (c) 2009 Albert Cervera i Areny +# Copyright (C) 2011 Agile Business Group sagl () +# Copyright (C) 2011 Domsense srl () +# Copyright (C) 2013-2014 Camptocamp () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import logging + +from openerp import models, fields, api + +_logger = logging.getLogger('base_report_to_printer') + + +class ReportXml(models.Model): + """ + Reports + """ + + _inherit = 'ir.actions.report.xml' + + property_printing_action = fields.Many2one( + comodel_name='printing.action', + string='Action', + company_dependent=True, + ) + printing_printer_id = fields.Many2one( + comodel_name='printing.printer', + string='Printer' + ) + printing_action_ids = fields.One2many( + comodel_name='printing.report.xml.action', + inverse_name='report_id', + string='Actions', + help='This field allows configuring action and printer on a per ' + 'user basis' + ) + + @api.multi + def behaviour(self): + result = {} + printer_obj = self.env['printing.printer'] + printing_act_obj = self.env['printing.report.xml.action'] + # Set hardcoded default action + default_action = 'client' + # Retrieve system wide printer + default_printer = printer_obj.get_default() + + # Retrieve user default values + user = self.env.user + if user.printing_action: + default_action = user.printing_action + if user.printing_printer_id: + default_printer = user.printing_printer_id + + for report in self: + action = default_action + printer = default_printer + + # Retrieve report default values + report_action = report.property_printing_action + if report_action and report_action.type != 'user_default': + action = report_action.type + if report.printing_printer_id: + printer = report.printing_printer_id + + # Retrieve report-user specific values + print_action = printing_act_obj.search( + [('report_id', '=', report.id), + ('user_id', '=', self.env.uid), + ('action', '!=', 'user_default')], + limit=1) + if print_action: + user_action = print_action.behaviour() + action = user_action['action'] + if user_action['printer']: + printer = user_action['printer'] + + result[report.id] = {'action': action, + 'printer': printer, + } + return result diff --git a/base_report_to_printer/printing.py b/base_report_to_printer/printing.py new file mode 100644 index 00000000000..0a8b89ff52e --- /dev/null +++ b/base_report_to_printer/printing.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2007 Ferran Pegueroles +# Copyright (c) 2009 Albert Cervera i Areny +# Copyright (C) 2011 Agile Business Group sagl () +# Copyright (C) 2011 Domsense srl () +# Copyright (C) 2013-2014 Camptocamp () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import logging +import os + +from tempfile import mkstemp + +import cups + +from openerp import models, fields, api + +_logger = logging.getLogger(__name__) + + +class PrintingPrinter(models.Model): + """ + Printers + """ + + _name = 'printing.printer' + _description = 'Printer' + _order = 'name' + + name = fields.Char(required=True, select=True) + system_name = fields.Char(required=True, select=True) + default = fields.Boolean(readonly=True) + status = fields.Selection([('unavailable', 'Unavailable'), + ('printing', 'Printing'), + ('unknown', 'Unknown'), + ('available', 'Available'), + ('error', 'Error'), + ('server-error', 'Server Error')], + required=True, + readonly=True, + default='unknown') + status_message = fields.Char(readonly=True) + model = fields.Char(readonly=True) + location = fields.Char(readonly=True) + uri = fields.Char(string='URI', readonly=True) + + @api.model + def update_printers_status(self): + printer_recs = self.search([]) + try: + connection = cups.Connection() + printers = connection.getPrinters() + except: + printer_recs.write({'status': 'server-error'}) + else: + for printer in printer_recs: + cups_printer = printers.get(printer.system_name) + if cups_printer: + printer.update_from_cups(connection, cups_printer) + else: + # not in cups list + printer.status = 'unavailable' + return True + + @api.multi + def _prepare_update_from_cups(self, cups_connection, cups_printer): + mapping = { + 3: 'available', + 4: 'printing', + 5: 'error' + } + vals = { + 'model': cups_printer.get('printer-make-and-model', False), + 'location': cups_printer.get('printer-location', False), + 'uri': cups_printer.get('device-uri', False), + 'status': mapping.get(cups_printer['printer-state'], 'unknown'), + } + return vals + + @api.multi + def update_from_cups(self, cups_connection, cups_printer): + """ 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 + """ + self.ensure_one() + vals = self._prepare_update_from_cups(cups_connection, cups_printer) + if any(self[name] != value for name, value in vals.iteritems()): + self.write(vals) + + @api.multi + def print_options(self, report, format): + """ Hook to set print options """ + options = {} + if format == 'raw': + options['raw'] = True + return options + + @api.multi + def print_document(self, report, content, format): + """ Print a file + + Format could be pdf, qweb-pdf, raw, ... + + """ + self.ensure_one() + fd, file_name = mkstemp() + try: + os.write(fd, content) + finally: + os.close(fd) + connection = cups.Connection() + + options = self.print_options(report, format) + + connection.printFile(self.system_name, + file_name, + file_name, + options=options) + _logger.info("Printing job: '%s'" % file_name) + return True + + @api.multi + def set_default(self): + if not self: + return + self.ensure_one() + default_printers = self.search([('default', '=', True)]) + default_printers.write({'default': False}) + self.write({'default': True}) + return True + + @api.multi + def get_default(self): + return self.search([('default', '=', True)], limit=1) + +# +# Actions +# + + +def _available_action_types(self): + return [('server', 'Send to Printer'), + ('client', 'Send to Client'), + ('user_default', "Use user's defaults"), + ] + + +class PrintingAction(models.Model): + _name = 'printing.action' + _description = 'Print Job Action' + + name = fields.Char(required=True) + type = fields.Selection(_available_action_types, required=True) diff --git a/base_report_to_printer/printing_data.xml b/base_report_to_printer/printing_data.xml new file mode 100644 index 00000000000..5998d14b827 --- /dev/null +++ b/base_report_to_printer/printing_data.xml @@ -0,0 +1,34 @@ + + + + + + Send to Printer + server + + + Send to Client + client + + + + property_printing_action + + + + + + Update Printers Status + + + 1 + minutes + -1 + + + + + + + + diff --git a/base_report_to_printer/printing_view.xml b/base_report_to_printer/printing_view.xml new file mode 100644 index 00000000000..42f4be4f4b3 --- /dev/null +++ b/base_report_to_printer/printing_view.xml @@ -0,0 +1,158 @@ + + + + + + + + printing.printer.form + printing.printer + +
+ +
+

+

+
+ + + + + +