[MERGE] forward port of branch 8.0 up to 40fdb84
This commit is contained in:
@@ -777,6 +777,7 @@ class account_invoice(models.Model):
|
||||
line2[tmp]['debit'] = (am > 0) and am or 0.0
|
||||
line2[tmp]['credit'] = (am < 0) and -am or 0.0
|
||||
line2[tmp]['tax_amount'] += l['tax_amount']
|
||||
line2[tmp]['amount_currency'] += l['amount_currency']
|
||||
line2[tmp]['analytic_lines'] += l['analytic_lines']
|
||||
else:
|
||||
line2[tmp] = l
|
||||
|
||||
@@ -166,7 +166,7 @@ class res_partner(osv.Model):
|
||||
if partner.user_ids:
|
||||
res['login'] = partner.user_ids[0].login
|
||||
else:
|
||||
res['email'] = partner.email or ''
|
||||
res['login'] = res['email'] = partner.email or ''
|
||||
return res
|
||||
|
||||
class res_users(osv.Model):
|
||||
|
||||
@@ -37,7 +37,7 @@ class Blackbox(Thread):
|
||||
# request. The first device to give an answer that makes sense
|
||||
# wins.
|
||||
def _find_device_path_by_probing(self):
|
||||
path = "/dev/serial/by-id/"
|
||||
path = "/dev/serial/by-path/"
|
||||
probe_message = self._wrap_low_level_message_around("S000")
|
||||
|
||||
try:
|
||||
|
||||
@@ -29,10 +29,12 @@ class Scale(Thread):
|
||||
self.lock = Lock()
|
||||
self.scalelock = Lock()
|
||||
self.status = {'status':'connecting', 'messages':[]}
|
||||
self.input_dir = '/dev/serial/by-id/'
|
||||
self.input_dir = '/dev/serial/by-path/'
|
||||
self.weight = 0
|
||||
self.weight_info = 'ok'
|
||||
self.device = None
|
||||
self.probed_device_paths = []
|
||||
self.path_to_scale = ''
|
||||
|
||||
def lockedstart(self):
|
||||
with self.lock:
|
||||
@@ -61,27 +63,55 @@ class Scale(Thread):
|
||||
elif status == 'disconnected' and message:
|
||||
_logger.info('Disconnected Scale: %s', message)
|
||||
|
||||
def _get_raw_response(self, connection):
|
||||
response = ""
|
||||
while True:
|
||||
byte = connection.read(1)
|
||||
|
||||
if byte:
|
||||
response += byte
|
||||
else:
|
||||
return response
|
||||
|
||||
def get_device(self):
|
||||
try:
|
||||
if not os.path.exists(self.input_dir):
|
||||
self.set_status('disconnected','Scale Not Found')
|
||||
return None
|
||||
devices = [ device for device in listdir(self.input_dir)]
|
||||
scales = [ device for device in devices if ('mettler' in device.lower()) or ('toledo' in device.lower()) ]
|
||||
if len(scales) > 0:
|
||||
print join(self.input_dir,scales[0])
|
||||
self.set_status('connected','Connected to '+scales[0])
|
||||
return serial.Serial(join(self.input_dir,scales[0]),
|
||||
baudrate = 9600,
|
||||
bytesize = serial.SEVENBITS,
|
||||
stopbits = serial.STOPBITS_ONE,
|
||||
parity = serial.PARITY_EVEN,
|
||||
#xonxoff = serial.XON,
|
||||
timeout = 0.02,
|
||||
writeTimeout= 0.02)
|
||||
else:
|
||||
self.set_status('disconnected','Scale Not Found')
|
||||
return None
|
||||
|
||||
if len(devices) > 0:
|
||||
for device in devices:
|
||||
path = self.input_dir + device
|
||||
|
||||
# don't keep probing devices that are not a scale,
|
||||
# only keep probing if in the past the device was
|
||||
# confirmed to be a scale
|
||||
if path not in self.probed_device_paths or path == self.path_to_scale:
|
||||
_logger.debug('Probing: ' + path)
|
||||
connection = serial.Serial(path,
|
||||
baudrate = 9600,
|
||||
bytesize = serial.SEVENBITS,
|
||||
stopbits = serial.STOPBITS_ONE,
|
||||
parity = serial.PARITY_EVEN,
|
||||
timeout = 1,
|
||||
writeTimeout = 1)
|
||||
|
||||
connection.write("W")
|
||||
self.probed_device_paths.append(path)
|
||||
|
||||
if self._get_raw_response(connection):
|
||||
_logger.debug(path + ' is scale')
|
||||
self.path_to_scale = path
|
||||
self.set_status('connected','Connected to '+device)
|
||||
connection.timeout = 0.02
|
||||
connection.writeTimeout = 0.02
|
||||
return connection
|
||||
else:
|
||||
_logger.debug('Already probed: ' + path)
|
||||
|
||||
self.set_status('disconnected','Scale Not Found')
|
||||
return None
|
||||
except Exception as e:
|
||||
self.set_status('error',str(e))
|
||||
return None
|
||||
|
||||
@@ -85,12 +85,7 @@ class ReportController(Controller):
|
||||
at the bottom of the output image
|
||||
"""
|
||||
try:
|
||||
width, height, humanreadable = int(width), int(height), bool(humanreadable)
|
||||
barcode = createBarcodeDrawing(
|
||||
type, value=value, format='png', width=width, height=height,
|
||||
humanReadable = humanreadable
|
||||
)
|
||||
barcode = barcode.asString('png')
|
||||
barcode = request.registry['report'].barcode(type, value, width=width, height=height, humanreadable=humanreadable)
|
||||
except (ValueError, AttributeError):
|
||||
raise exceptions.HTTPException(description='Cannot convert into barcode.')
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import report
|
||||
import report_paperformat
|
||||
import abstract_report
|
||||
import ir_qweb
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
from reportlab.graphics.barcode import createBarcodeDrawing
|
||||
|
||||
from openerp.osv import osv
|
||||
from openerp.addons.base.ir.ir_qweb import HTMLSafe
|
||||
|
||||
|
||||
class BarcodeConverter(osv.AbstractModel):
|
||||
""" ``barcode`` widget rendering, inserts a data:uri-using image tag in the
|
||||
document. May be overridden by e.g. the website module to generate links
|
||||
instead.
|
||||
"""
|
||||
_name = 'ir.qweb.field.barcode'
|
||||
_inherit = 'ir.qweb.field'
|
||||
|
||||
def value_to_html(self, cr, uid, value, field, options=None, context=None):
|
||||
barcode_type = options.get('type', 'Code128')
|
||||
barcode = self.pool['report'].barcode(
|
||||
barcode_type,
|
||||
value,
|
||||
**dict((key, value) for key, value in options.items() if key in ['width', 'height', 'humanreadable']))
|
||||
return HTMLSafe('<img src="data:%s;base64,%s">' % ('png', barcode.encode('base64')))
|
||||
@@ -42,6 +42,7 @@ from contextlib import closing
|
||||
from distutils.version import LooseVersion
|
||||
from functools import partial
|
||||
from pyPdf import PdfFileWriter, PdfFileReader
|
||||
from reportlab.graphics.barcode import createBarcodeDrawing
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
@@ -570,3 +571,18 @@ class Report(osv.Model):
|
||||
stream.close()
|
||||
|
||||
return merged_file_path
|
||||
|
||||
def barcode(self, barcode_type, value, width=600, height=100, humanreadable=0):
|
||||
if barcode_type == 'UPCA' and len(value) in (11, 12, 13):
|
||||
barcode_type = 'EAN13'
|
||||
if len(value) in (11, 12):
|
||||
value = '0%s' % value
|
||||
try:
|
||||
width, height, humanreadable = int(width), int(height), bool(humanreadable)
|
||||
barcode = createBarcodeDrawing(
|
||||
barcode_type, value=value, format='png', width=width, height=height,
|
||||
humanReadable=humanreadable
|
||||
)
|
||||
return barcode.asString('png')
|
||||
except (ValueError, AttributeError):
|
||||
raise ValueError("Cannot convert into barcode.")
|
||||
|
||||
@@ -51,12 +51,6 @@ msgstr ""
|
||||
msgid " (reserved)"
|
||||
msgstr ""
|
||||
|
||||
#. module: stock
|
||||
#: code:addons/stock/stock.py:2954
|
||||
#, python-format
|
||||
msgid "You cannot have two inventory adjustements in state 'in Progess' with the same product(%s), same location(%s), same package, same owner and same lot. Please first validate the first inventory adjustement with this product before creating another one."
|
||||
msgstr ""
|
||||
|
||||
#. module: stock
|
||||
#: code:addons/stock/stock.py:3090
|
||||
#, python-format
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
import controllers
|
||||
import report
|
||||
import ir_qweb
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
from openerp.osv import orm
|
||||
|
||||
|
||||
class Barcode(orm.AbstractModel):
|
||||
_name = 'website.qweb.field.barcode'
|
||||
_inherit = ['website.qweb.field', 'ir.qweb.field.barcode']
|
||||
|
||||
def from_html(self, cr, uid, model, field, element, context=None):
|
||||
return None
|
||||
Reference in New Issue
Block a user