diff --git a/printer_tray/__init__.py b/printer_tray/__init__.py new file mode 100644 index 0000000..db2e915 --- /dev/null +++ b/printer_tray/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 Affero 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 ir_report +from . import printer_tray +from . import printer +from . import users diff --git a/printer_tray/__openerp__.py b/printer_tray/__openerp__.py new file mode 100644 index 0000000..1f180c5 --- /dev/null +++ b/printer_tray/__openerp__.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 Affero 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 - Paper tray selection', + 'version' : '1.0', + 'category': 'Printer', + 'description': """ +Report to printer - Paper tray selection +======================================== + + **Author:** Camptocamp SA + + *This module extends `Report to printer` module.* + + It detects trays on printer installation plus permits to select + the paper source on which you want to print directly. + + 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 exemple for prepinted + paper such as payment slip. + """, + 'author' : 'Camptocamp', + 'maintainer': 'Camptocamp', + 'website': 'http://www.camptocamp.com/', + 'depends' : ['base_report_assembler', + 'base_report_to_printer', + ], + 'data': [ + 'users_view.xml', + 'ir_report_view.xml', + ], + 'test': [], + 'installable': True, + 'auto_install': False, + 'application': True, + } diff --git a/printer_tray/ir_report.py b/printer_tray/ir_report.py new file mode 100644 index 0000000..4429f46 --- /dev/null +++ b/printer_tray/ir_report.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 Affero 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 openerp.osv import orm, fields + +class ReportXML(orm.Model): + + _inherit = 'ir.actions.report.xml' + + _columns = { + 'printer_tray_id': fields.many2one('printing.tray', 'Paper Source', + domain="[('printer_id', '=', printing_printer_id)]"), + } + + def set_print_options(self, cr, uid, report_id, format, context=None): + """ + Hook to define Tray + """ + printing_act_obj = self.pool.get('printing.report.xml.action') + options = super(ReportXML, self).set_print_options(cr, uid, report_id, format, context=context) + + # Retrieve user default values + user = self.pool.get('res.users').browse(cr, uid, context) + tray = user.printer_tray_id + report = self.browse(cr, uid, report_id, context=context) + + # Retrieve report default values + if report.printer_tray_id: + tray = report.printer_tray_id + + # Retrieve report-user specific values + act_ids = printing_act_obj.search(cr, uid, + [('report_id', '=', report.id), + ('user_id', '=', uid), + ('action', '!=', 'user_default')], context=context) + if act_ids: + user_action = printing_act_obj.browse(cr, uid, act_ids[0], context=context) + if user_action.tray_id: + tray = user_action.tray_id + + if tray: + options['InputSlot'] = str(tray.system_name) + return options + diff --git a/printer_tray/ir_report_view.xml b/printer_tray/ir_report_view.xml new file mode 100644 index 0000000..4a912e2 --- /dev/null +++ b/printer_tray/ir_report_view.xml @@ -0,0 +1,18 @@ + + + + + + + ir.actions.report.xml.add.printer.tray + ir.actions.report.xml + + + + + + + + + + diff --git a/printer_tray/printer.py b/printer_tray/printer.py new file mode 100644 index 0000000..830c844 --- /dev/null +++ b/printer_tray/printer.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 Affero 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 cups +from cups import PPD + +from openerp import pooler +from openerp.osv import orm, fields + +class Printer(orm.Model): + + _inherit = 'printing.printer' + + _columns = { + 'tray_ids': fields.one2many('printing.tray', 'printer_id', 'Paper Sources'), + } + + def _update_tray_option(self, db_name, uid, printer, context=None): + """ + Create missing tray for a printer + """ + db, pool = pooler.get_db_and_pool(db_name) + cr = db.cursor() + tray_obj = pool.get('printing.tray') + # get printers options from a PPD file + try: + connection = cups.Connection() + ppd_file_path = connection.getPPD3(printer.system_name) + except: + return + + if not ppd_file_path[2]: + return + ppd = PPD(ppd_file_path[2]) + option = ppd.findOption('InputSlot') + if not option: + return + + try: + for tray_opt in option.choices: + if tray_opt['choice'] not in [t.system_name for t in printer.tray_ids]: + tray_vals = { + 'name': tray_opt['text'], + 'system_name': tray_opt['choice'], + 'printer_id': printer.id, + } + + tray_obj.create(cr, uid, tray_vals, context=context) + + cr.commit() + except: + cr.rollback() + raise + finally: + cr.close() + return True + + + def update_printers_status(self, db_name, uid, context=None): + """ + Add creation of tray if no tray are defined + """ + db, pool = pooler.get_db_and_pool(db_name) + cr = db.cursor() + res = super(Printer, self).update_printers_status(db_name, uid, context=context) + + try: + connection = cups.Connection() + printers = connection.getPrinters() + server_error = False + except: + server_error = True + + printer_ids = self.search(cr, uid, [('system_name', 'in', printers.keys())], context=context) + printer_list = self.browse(cr, uid, printer_ids, context=context) + + for printer in printer_list: + # XXX we consider config of printer won't change + if not printer.tray_ids: + self._update_tray_option(db_name, uid, printer, context=context) + + return res + diff --git a/printer_tray/printer_tray.py b/printer_tray/printer_tray.py new file mode 100644 index 0000000..15506a0 --- /dev/null +++ b/printer_tray/printer_tray.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 Affero 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 openerp.osv import orm, fields + +class PrinterTray(orm.Model): + + _name = 'printing.tray' + _description = 'Printer Tray' + + _columns = { + 'name': fields.char('Name', size=64, required=True), + 'system_name': fields.char('System Name', size=64, required=True), + 'printer_id': fields.many2one('printing.printer', 'Printer', required=True), + } diff --git a/printer_tray/report_xml_action.py b/printer_tray/report_xml_action.py new file mode 100644 index 0000000..85f0176 --- /dev/null +++ b/printer_tray/report_xml_action.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 Affero 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 openerp.osv import orm, fields + +class ReportXMLAction(orm.Model): + _inherit = 'printing.report.xml.action' + + _columns = { + 'printer_tray_id': fields.many2one('printing.tray', 'Paper Source', + domain="[('printer_id', '=', printer_id)]"), + } + + def behaviour(self, cr, uid, act_id, context=None): + res = super(ReportXMLAction, self).behaviour(cr, uid, act_id, context=context) + action = self.browse(cr, uid, act_id, context=context) + res['tray'] = action.printer_tray_id.system_name + return res + + + diff --git a/printer_tray/users.py b/printer_tray/users.py new file mode 100644 index 0000000..dc38379 --- /dev/null +++ b/printer_tray/users.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 Affero 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 openerp.osv import orm, fields + +class ResUsers(orm.Model): + + _inherit = "res.users" + + _columns = { + 'printer_tray_id': fields.many2one('printing.tray', 'Default Printer Paper Source', + domain="[('printer_id', '=', printing_printer_id)]"), + } diff --git a/printer_tray/users_view.xml b/printer_tray/users_view.xml new file mode 100644 index 0000000..ba3bbbb --- /dev/null +++ b/printer_tray/users_view.xml @@ -0,0 +1,18 @@ + + + + + + + res.users.form.add.printer.tray + res.users + + + + + + + + + +