diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index d4d48d1578a..dbe43fe5011 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -1472,6 +1472,8 @@ td { body { margin: 0; color: white !important; + /* avoid black background if backgrounds are printed */ + background: initial; } .oe_leftbar, .oe_loading, diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py index 8192b4eec4c..a04ad250d9b 100644 --- a/addons/stock/models/product.py +++ b/addons/stock/models/product.py @@ -4,6 +4,7 @@ from odoo import api, fields, models, _ from odoo.addons import decimal_precision as dp from odoo.exceptions import UserError +from odoo.osv import expression from odoo.tools.float_utils import float_round from datetime import datetime import operator as py_operator @@ -370,6 +371,15 @@ class Product(models.Model): def action_view_routes(self): return self.mapped('product_tmpl_id').action_view_routes() + @api.model + def search(self, domain=None, *args, **kwargs): + # ONLY FOR 10.0 UP TO SAAS-15 + # ignore dummy fields used for search context² + for index in range(len(domain or [])): + if domain[index][0] in ('location_id', 'warehouse_id'): + domain[index] = expression.TRUE_LEAF + return super(Product, self).search(domain, *args, **kwargs) + @api.multi def write(self, values): res = super(Product, self).write(values) @@ -507,6 +517,15 @@ class ProductTemplate(models.Model): def onchange_tracking(self): return self.mapped('product_variant_ids').onchange_tracking() + @api.model + def search(self, domain=None, *args, **kwargs): + # ONLY FOR 10.0 UP TO SAAS-15 + # ignore dummy fields used for search context + for index in range(len(domain or [])): + if domain[index][0] in ('location_id', 'warehouse_id'): + domain[index] = expression.TRUE_LEAF + return super(ProductTemplate, self).search(domain, *args, **kwargs) + @api.multi def write(self, vals): if 'uom_id' in vals: diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py index 43a51a03831..9ffc2d0df88 100644 --- a/addons/stock/models/stock_move.py +++ b/addons/stock/models/stock_move.py @@ -193,8 +193,8 @@ class StockMove(models.Model): if self.state == 'done': self.availability = self.product_qty else: - quants = self.env['stock.quant'].search([('location_id', 'child_of', self.location_id.id), ('product_id', '=', self.product_id.id), ('reservation_id', '=', False)]) - self.availability = min(self.product_qty, sum(quants.mapped('qty'))) + qty_tot = self.env['stock.quant'].read_group([('location_id', 'child_of', self.location_id.id), ('product_id', '=', self.product_id.id), ('reservation_id', '=', False)], ['qty'], [])[0] + self.availability = min(self.product_qty, qty_tot['qty'] or 0) @api.multi def _compute_string_qty_information(self): diff --git a/odoo/addons/base/ir/ir_qweb/qweb.py b/odoo/addons/base/ir/ir_qweb/qweb.py index 1670dfa1e51..a3db7664a0a 100644 --- a/odoo/addons/base/ir/ir_qweb/qweb.py +++ b/odoo/addons/base/ir/ir_qweb/qweb.py @@ -20,6 +20,8 @@ except ImportError: import logging +from odoo.tools.parse_version import parse_version + unsafe_eval = eval _logger = logging.getLogger(__name__) @@ -146,7 +148,7 @@ class QWebException(Exception): return str(self) # Avoid DeprecationWarning while still remaining compatible with werkzeug pre-0.9 -escape = (lambda text: _escape(text, quote=True)) if getattr(werkzeug, '__version__', '0.0') < '0.9.0' else _escape +escape = (lambda text: _escape(text, quote=True)) if parse_version(getattr(werkzeug, '__version__', '0.0')) < parse_version('0.9.0') else _escape def unicodifier(val): if val is None or val is False: