summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2016-06-14 19:22:21 +0200
committerChristophe Simonis <chs@odoo.com>2016-06-14 19:22:21 +0200
commitbfbe2d6e6d181da3877acebfee1a701cbd6493fc (patch)
treedabfd94f516d3a4796f0bb2440723d00e92d9654 /addons
parentc12c097655a4f770281dfdf5bb35657080abcd7b (diff)
parentdf95b1fc9d971137c1b73a5125c69f42c8531603 (diff)
[MERGE] forward port of branch saas-6 up to df95b1f
The changes in `l10n_es` [1] have been ignored. They will be ported to the new accouting later. [1] See 730890f3696e8117eec429bc302e5b67bee69fa0 and e3e5cfe82c43d9701858bd643e02df390f5f6f66
Diffstat (limited to 'addons')
-rw-r--r--addons/base_import/static/src/js/import.js6
-rw-r--r--addons/hr_payroll/hr_payroll.py10
-rw-r--r--addons/hw_scanner/controllers/main.py113
-rw-r--r--addons/l10n_fr_hr_payroll/report/fiche_paye.py2
-rw-r--r--addons/procurement/procurement.py2
-rw-r--r--addons/website_quote/models/order.py1
6 files changed, 78 insertions, 56 deletions
diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js
index d489bc49474..496a25bc9ab 100644
--- a/addons/base_import/static/src/js/import.js
+++ b/addons/base_import/static/src/js/import.js
@@ -396,9 +396,11 @@ var DataImport = Widget.extend(ControlPanelMixin, {
var fields = this.$('.oe_import_fields input.oe_import_match_field').map(function (index, el) {
return $(el).select2('val') || false;
}).get();
+ var tracking_disable = 'tracking_disable' in kwargs ? kwargs.tracking_disable : !this.$('#oe_import_tracking').prop('checked')
+ delete kwargs.tracking_disable
kwargs.context = _.extend(
{}, this.parent_context,
- {tracking_disable: !this.$('#oe_import_tracking').prop('checked')}
+ {tracking_disable: tracking_disable}
);
return this.Import.call('do', [this.id, fields, this.import_options()], kwargs)
.then(undefined, function (error, event) {
@@ -414,7 +416,7 @@ var DataImport = Widget.extend(ControlPanelMixin, {
}) ;
},
onvalidate: function () {
- return this.call_import({ dryrun: true })
+ return this.call_import({ dryrun: true, tracking_disable: true })
.done(this.proxy('validated'));
},
onimport: function () {
diff --git a/addons/hr_payroll/hr_payroll.py b/addons/hr_payroll/hr_payroll.py
index f7d6cefe4c8..0b612cac04c 100644
--- a/addons/hr_payroll/hr_payroll.py
+++ b/addons/hr_payroll/hr_payroll.py
@@ -609,21 +609,23 @@ class hr_payslip(osv.osv):
if context is None:
context = {}
#delete old worked days lines
+ worked_days_ids_to_remove=[]
old_worked_days_ids = ids and worked_days_obj.search(cr, uid, [('payslip_id', '=', ids[0])], context=context) or False
if old_worked_days_ids:
- worked_days_obj.unlink(cr, uid, old_worked_days_ids, context=context)
+ worked_days_ids_to_remove = map(lambda x: (2, x,),old_worked_days_ids)
#delete old input lines
+ input_line_ids_to_remove=[]
old_input_ids = ids and input_obj.search(cr, uid, [('payslip_id', '=', ids[0])], context=context) or False
if old_input_ids:
- input_obj.unlink(cr, uid, old_input_ids, context=context)
+ input_line_ids_to_remove = map(lambda x: (2,x,), old_input_ids)
#defaults
res = {'value':{
'line_ids':[],
- 'input_line_ids': [],
- 'worked_days_line_ids': [],
+ 'input_line_ids': input_line_ids_to_remove,
+ 'worked_days_line_ids': worked_days_ids_to_remove,
#'details_by_salary_head':[], TODO put me back
'name':'',
'contract_id': False,
diff --git a/addons/hw_scanner/controllers/main.py b/addons/hw_scanner/controllers/main.py
index 8e5e8f6af18..ad0f47a2cda 100644
--- a/addons/hw_scanner/controllers/main.py
+++ b/addons/hw_scanner/controllers/main.py
@@ -22,6 +22,13 @@ except ImportError:
_logger.error('Odoo module hw_scanner depends on the evdev python module')
evdev = None
+class ScannerDevice():
+ def __init__(self, path):
+ self.evdev = evdev.InputDevice(path)
+ self.evdev.grab()
+
+ self.barcode = []
+ self.shift = False
class Scanner(Thread):
def __init__(self):
@@ -29,6 +36,7 @@ class Scanner(Thread):
self.lock = Lock()
self.status = {'status':'connecting', 'messages':[]}
self.input_dir = '/dev/input/by-id/'
+ self.open_devices = []
self.barcodes = Queue()
self.keymap = {
2: ("1","!"),
@@ -109,25 +117,33 @@ class Scanner(Thread):
elif status == 'disconnected' and message:
_logger.info('Disconnected Barcode Scanner: %s', message)
- def get_device(self):
+ def get_devices(self):
try:
if not evdev:
return None
- devices = [ device for device in listdir(self.input_dir)]
- keyboards = [ device for device in devices if ('kbd' in device) and ('keyboard' not in device.lower())]
- scanners = [ device for device in devices if ('barcode' in device.lower()) or ('scanner' in device.lower())]
- if len(scanners) > 0:
- self.set_status('connected','Connected to '+scanners[0])
- return evdev.InputDevice(join(self.input_dir,scanners[0]))
- elif len(keyboards) > 0:
- self.set_status('connected','Connected to '+keyboards[0])
- return evdev.InputDevice(join(self.input_dir,keyboards[0]))
+
+ new_devices = [device for device in listdir(self.input_dir)
+ if join(self.input_dir, device) not in [dev.evdev.fn for dev in self.open_devices]]
+ scanners = [device for device in new_devices
+ if (('kbd' in device) and ('keyboard' not in device.lower()))
+ or ('barcode' in device.lower()) or ('scanner' in device.lower())]
+
+ for device in scanners:
+ _logger.debug('opening device %s', join(self.input_dir,device))
+ self.open_devices.append(ScannerDevice(join(self.input_dir,device)))
+
+ if self.open_devices:
+ self.set_status('connected','Connected to '+ str([dev.evdev.name for dev in self.open_devices]))
else:
self.set_status('disconnected','Barcode Scanner Not Found')
- return None
+
+ return self.open_devices
except Exception as e:
self.set_status('error',str(e))
- return None
+ return []
+
+ def release_device(self, dev):
+ self.open_devices.remove(dev)
def get_barcode(self):
""" Returns a scanned barcode. Will wait at most 5 seconds to get a barcode, and will
@@ -150,6 +166,11 @@ class Scanner(Thread):
self.lockedstart()
return self.status
+ def _get_open_device_by_fd(self, fd):
+ for dev in self.open_devices:
+ if dev.evdev.fd == fd:
+ return dev
+
def run(self):
""" This will start a loop that catches all keyboard events, parse barcode
sequences and put them on a timestamped queue that can be consumed by
@@ -160,49 +181,45 @@ class Scanner(Thread):
barcode = []
shift = False
- device = None
+ devices = None
while True: # barcodes loop
- if device: # ungrab device between barcodes and timeouts for plug & play
- try:
- device.ungrab()
- except Exception as e:
- device = None
- self.set_status('error',str(e))
- else:
- time.sleep(5) # wait until a suitable device is plugged
- device = self.get_device()
- if not device:
- continue
+ devices = self.get_devices()
try:
- device.grab()
- shift = False
- barcode = []
-
while True: # keycode loop
- r,w,x = select([device],[],[],5)
+ r,w,x = select({dev.fd: dev for dev in [d.evdev for d in devices]},[],[],5)
if len(r) == 0: # timeout
break
- events = device.read()
-
- for event in events:
- if event.type == evdev.ecodes.EV_KEY:
- #_logger.debug('Evdev Keyboard event %s',evdev.categorize(event))
- if event.value == 1: # keydown events
- if event.code in self.keymap:
- if shift:
- barcode.append(self.keymap[event.code][1])
- else:
- barcode.append(self.keymap[event.code][0])
- elif event.code == 42 or event.code == 54: # SHIFT
- shift = True
- elif event.code == 28: # ENTER, end of barcode
- self.barcodes.put( (time.time(),''.join(barcode)) )
- barcode = []
- elif event.value == 0: #keyup events
- if event.code == 42 or event.code == 54: # LEFT SHIFT
- shift = False
+
+ for fd in r:
+ device = self._get_open_device_by_fd(fd)
+
+ if not evdev.util.is_device(device.evdev.fn):
+ _logger.info('%s disconnected', str(device.evdev))
+ self.release_device(device)
+ break
+
+ events = device.evdev.read()
+
+ for event in events:
+ if event.type == evdev.ecodes.EV_KEY:
+ # _logger.debug('Evdev Keyboard event %s',evdev.categorize(event))
+ if event.value == 1: # keydown events
+ if event.code in self.keymap:
+ if device.shift:
+ device.barcode.append(self.keymap[event.code][1])
+ else:
+ device.barcode.append(self.keymap[event.code][0])
+ elif event.code == 42 or event.code == 54: # SHIFT
+ device.shift = True
+ elif event.code == 28: # ENTER, end of barcode
+ _logger.debug('pushing barcode %s from %s', ''.join(device.barcode), str(device.evdev))
+ self.barcodes.put( (time.time(),''.join(device.barcode)) )
+ device.barcode = []
+ elif event.value == 0: #keyup events
+ if event.code == 42 or event.code == 54: # LEFT SHIFT
+ device.shift = False
except Exception as e:
self.set_status('error',str(e))
diff --git a/addons/l10n_fr_hr_payroll/report/fiche_paye.py b/addons/l10n_fr_hr_payroll/report/fiche_paye.py
index 77402772ad7..4b39afb9544 100644
--- a/addons/l10n_fr_hr_payroll/report/fiche_paye.py
+++ b/addons/l10n_fr_hr_payroll/report/fiche_paye.py
@@ -37,7 +37,7 @@ class fiche_paye_parser(report_sxw.rml_parse):
category_total = 0
if cate_ids:
- line_ids = payslip_line.search(self.cr, self.uid, [('slip_id', '=', obj.id),('category_id.id', '=', cate_ids[0] )])
+ line_ids = payslip_line.search(self.cr, self.uid, [('slip_id', '=', obj.id), ('category_id', 'child_of', cate_ids)])
for line in payslip_line.browse(self.cr, self.uid, line_ids):
category_total += line.total
diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py
index 6c53bd5d545..f403565f3a0 100644
--- a/addons/procurement/procurement.py
+++ b/addons/procurement/procurement.py
@@ -136,7 +136,7 @@ class procurement_order(osv.osv):
unlink_ids.append(s['id'])
else:
raise UserError(_('Cannot delete Procurement Order(s) which are in %s state.') % s['state'])
- return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
+ return super(procurement_order, self).unlink(cr, uid, unlink_ids, context=context)
def create(self, cr, uid, vals, context=None):
context = context or {}
diff --git a/addons/website_quote/models/order.py b/addons/website_quote/models/order.py
index 8af74a76149..188045831f5 100644
--- a/addons/website_quote/models/order.py
+++ b/addons/website_quote/models/order.py
@@ -217,6 +217,7 @@ class sale_order(osv.osv):
'website_description': line.website_description,
'state': 'draft',
'customer_lead': self._get_customer_lead(cr, uid, line.product_id.product_tmpl_id),
+ 'delay': line.product_id.sale_delay
})
lines.append((0, 0, data))
options = []