[FIX] Bug #19 avoid crash when using 'raw' option

[Usability] Auto-add Administrator user to the Print group
Make XML code more readable

base_report_to_printer: add support for remote CUPS server (not just localhost)
More logging and better error handling

Add CUPS_HOST in more debug logs
This commit is contained in:
Alexis de Lattre
2014-12-28 01:36:12 +01:00
committed by Carlos Roca
parent 84d395cf7c
commit 74ce12bf3f
3 changed files with 43 additions and 11 deletions

View File

@@ -23,14 +23,15 @@
############################################################################## ##############################################################################
import logging import logging
import os import os
from tempfile import mkstemp from tempfile import mkstemp
import cups import cups
from openerp import models, fields, api, _
from openerp import models, fields, api from openerp.exceptions import Warning
from openerp.tools.config import config
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
CUPS_HOST = config.get('cups_host', 'localhost')
CUPS_PORT = int(config.get('cups_port', 631)) # config.get returns a string
class PrintingPrinter(models.Model): class PrintingPrinter(models.Model):
@@ -63,7 +64,7 @@ class PrintingPrinter(models.Model):
def update_printers_status(self): def update_printers_status(self):
printer_recs = self.search([]) printer_recs = self.search([])
try: try:
connection = cups.Connection() connection = cups.Connection(CUPS_HOST, CUPS_PORT)
printers = connection.getPrinters() printers = connection.getPrinters()
except: except:
printer_recs.write({'status': 'server-error'}) printer_recs.write({'status': 'server-error'})
@@ -111,7 +112,7 @@ class PrintingPrinter(models.Model):
""" Hook to set print options """ """ Hook to set print options """
options = {} options = {}
if format == 'raw': if format == 'raw':
options['raw'] = True options['raw'] = 'True'
return options return options
@api.multi @api.multi
@@ -127,15 +128,30 @@ class PrintingPrinter(models.Model):
os.write(fd, content) os.write(fd, content)
finally: finally:
os.close(fd) os.close(fd)
connection = cups.Connection()
try:
_logger.debug(
'Starting to connect to CUPS on %s:%s'
% (CUPS_HOST, CUPS_PORT))
connection = cups.Connection(CUPS_HOST, CUPS_PORT)
_logger.debug('Connection to CUPS successfull')
except:
raise Warning(
_("Failed to connect to the CUPS server on %s:%s. "
"Check that the CUPS server is running and that "
"you can reach it from the Odoo server.")
% (CUPS_HOST, CUPS_PORT))
options = self.print_options(report, format) options = self.print_options(report, format)
_logger.debug(
'Sending job to CUPS printer %s on %s'
% (self.system_name, CUPS_HOST))
connection.printFile(self.system_name, connection.printFile(self.system_name,
file_name, file_name,
file_name, file_name,
options=options) options=options)
_logger.info("Printing job: '%s'" % file_name) _logger.info("Printing job: '%s' on %s" % (file_name, CUPS_HOST))
return True return True
@api.multi @api.multi

View File

@@ -3,6 +3,7 @@
<data noupdate="1"> <data noupdate="1">
<record id="res_groups_printingprintoperator0" model="res.groups"> <record id="res_groups_printingprintoperator0" model="res.groups">
<field name="name">Printing / Print Operator</field> <field name="name">Printing / Print Operator</field>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record> </record>
<record id="ir_model_access_printingprintergroup1" model="ir.model.access"> <record id="ir_model_access_printingprintergroup1" model="ir.model.access">
<field name="name">printing_printer group</field> <field name="name">printing_printer group</field>

View File

@@ -22,8 +22,14 @@
############################################################################## ##############################################################################
import cups import cups
from openerp.exceptions import Warning
from openerp import models, api, _
from openerp.tools.config import config
import logging
from openerp import models, api _logger = logging.getLogger(__name__)
CUPS_HOST = config.get('cups_host', 'localhost')
CUPS_PORT = int(config.get('cups_port', 631))
class PrintingPrinterUpdateWizard(models.TransientModel): class PrintingPrinterUpdateWizard(models.TransientModel):
@@ -35,16 +41,22 @@ class PrintingPrinterUpdateWizard(models.TransientModel):
# Update Printers # Update Printers
printer_obj = self.env['printing.printer'] printer_obj = self.env['printing.printer']
try: try:
connection = cups.Connection() _logger.info('Trying to get list of printers')
connection = cups.Connection(CUPS_HOST, CUPS_PORT)
printers = connection.getPrinters() printers = connection.getPrinters()
_logger.info('Printers found: %s' % ','.join(printers.keys()))
except: except:
return {} raise Warning(
_('Could not get the list of printers from the CUPS server '
'(%s:%s)') % (CUPS_HOST, CUPS_PORT))
printer_recs = printer_obj.search( printer_recs = printer_obj.search(
[('system_name', 'in', printers.keys())] [('system_name', 'in', printers.keys())]
) )
for printer in printer_recs: for printer in printer_recs:
del printers[printer.system_name] del printers[printer.system_name]
_logger.info(
'Printer %s was already created' % printer.system_name)
for name, printer in printers.iteritems(): for name, printer in printers.iteritems():
values = { values = {
@@ -55,6 +67,9 @@ class PrintingPrinterUpdateWizard(models.TransientModel):
'uri': printer.get('device-uri', False), 'uri': printer.get('device-uri', False),
} }
self.env['printing.printer'].create(values) self.env['printing.printer'].create(values)
_logger.info(
'Created new printer %s with URI %s'
% (values['name'], values['uri']))
return { return {
'name': 'Printers', 'name': 'Printers',