diff options
| author | Christophe Simonis <chs@odoo.com> | 2019-03-04 15:49:35 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2019-03-04 15:49:35 +0100 |
| commit | 1c712986c437ff16a7d7d7392e4b52b319f55b70 (patch) | |
| tree | 950a097b11c1c20cd7145fdccd40cc279752c443 | |
| parent | d92eba3a1999ba08c83b6b60c16633ba813bd500 (diff) | |
| parent | 1f1fa35c07299dd3940c47ac13f966ddbb1c875b (diff) | |
[MERGE] forward port branch saas-15 up to 1f1fa35c072
| -rw-r--r-- | addons/account/models/account_invoice.py | 8 | ||||
| -rw-r--r-- | addons/hr_gamification/wizard/gamification_badge_user_wizard.py | 2 | ||||
| -rw-r--r-- | addons/hr_holidays/models/hr_holidays.py | 2 | ||||
| -rw-r--r-- | addons/point_of_sale/static/src/css/pos.css | 2 | ||||
| -rw-r--r-- | addons/sale/models/res_partner.py | 22 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/relational_fields.js | 2 | ||||
| -rw-r--r-- | doc/cla/corporate/savoirfairelinux.md | 1 | ||||
| -rw-r--r-- | odoo/addons/base/ir/ir_qweb/qweb.py | 4 | ||||
| -rw-r--r-- | odoo/addons/base/ir/ir_rule.py | 2 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_expression.py | 30 | ||||
| -rw-r--r-- | odoo/models.py | 1 | ||||
| -rw-r--r-- | odoo/osv/expression.py | 2 |
12 files changed, 61 insertions, 17 deletions
diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py index 576f9d9e551..05c358f354c 100644 --- a/addons/account/models/account_invoice.py +++ b/addons/account/models/account_invoice.py @@ -654,12 +654,12 @@ class AccountInvoice(models.Model): msg = _('Cannot find a chart of accounts for this company, You should configure it. \nPlease go to Account Configuration.') raise RedirectWarning(msg, action.id, _('Go to the configuration panel')) - if type in ('out_invoice', 'out_refund'): - account_id = rec_account.id - payment_term_id = p.property_payment_term_id.id - else: + if type in ('in_invoice', 'in_refund'): account_id = pay_account.id payment_term_id = p.property_supplier_payment_term_id.id + else: + account_id = rec_account.id + payment_term_id = p.property_payment_term_id.id delivery_partner_id = self.get_delivery_partner_id() fiscal_position = self.env['account.fiscal.position'].get_fiscal_position(self.partner_id.id, delivery_id=delivery_partner_id) diff --git a/addons/hr_gamification/wizard/gamification_badge_user_wizard.py b/addons/hr_gamification/wizard/gamification_badge_user_wizard.py index 5bbb6848bd3..4c66db60db9 100644 --- a/addons/hr_gamification/wizard/gamification_badge_user_wizard.py +++ b/addons/hr_gamification/wizard/gamification_badge_user_wizard.py @@ -10,7 +10,7 @@ class GamificationBadgeUserWizard(models.TransientModel): employee_id = fields.Many2one('hr.employee', string='Employee', required=True) user_id = fields.Many2one('res.users', string='User', - related='employee_id.user_id', store=True, readonly=True) + related='employee_id.user_id', store=True, readonly=True, compute_sudo=True) # TODO 12.0/master remove this hack by changing the model @api.model diff --git a/addons/hr_holidays/models/hr_holidays.py b/addons/hr_holidays/models/hr_holidays.py index ad2ea51d1f3..adb8c5fbbe0 100644 --- a/addons/hr_holidays/models/hr_holidays.py +++ b/addons/hr_holidays/models/hr_holidays.py @@ -174,7 +174,7 @@ class Holidays(models.Model): payslip_status = fields.Boolean('Reported in last payslips', help='Green this button when the leave has been taken into account in the payslip.') report_note = fields.Text('HR Comments') - user_id = fields.Many2one('res.users', string='User', related='employee_id.user_id', related_sudo=True, store=True, default=lambda self: self.env.uid, readonly=True) + user_id = fields.Many2one('res.users', string='User', related='employee_id.user_id', related_sudo=True, compute_sudo=True, store=True, default=lambda self: self.env.uid, readonly=True) date_from = fields.Datetime('Start Date', readonly=True, index=True, copy=False, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]}, track_visibility='onchange') date_to = fields.Datetime('End Date', readonly=True, copy=False, diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index ec28fb6fa15..ecbfedee859 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -1477,6 +1477,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/sale/models/res_partner.py b/addons/sale/models/res_partner.py index 0ac1409cd00..05d3f21f05f 100644 --- a/addons/sale/models/res_partner.py +++ b/addons/sale/models/res_partner.py @@ -14,11 +14,17 @@ class ResPartner(models.Model): sale_warn_msg = fields.Text('Message for Sales Order') def _compute_sale_order_count(self): - sale_data = self.env['sale.order'].read_group(domain=[('partner_id', 'child_of', self.ids)], - fields=['partner_id'], groupby=['partner_id']) - mapped_data = dict([(m['partner_id'][0], m['partner_id_count']) for m in sale_data]) - for partner in self: - # let's obtain the partner id and all its child ids - partner_ids = [partner.id] + partner.child_ids.ids - # then we can sum for all the partner's child - partner.sale_order_count = sum(mapped_data.get(child, 0) for child in partner_ids) + # retrieve all children partners and prefetch 'parent_id' on them + all_partners = self.search([('id', 'child_of', self.ids)]) + all_partners.read(['parent_id']) + + sale_order_groups = self.env['sale.order'].read_group( + domain=[('partner_id', 'in', all_partners.ids)], + fields=['partner_id'], groupby=['partner_id'] + ) + for group in sale_order_groups: + partner = self.browse(group['partner_id'][0]) + while partner: + if partner in self: + partner.sale_order_count += group['partner_id_count'] + partner = partner.parent_id diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index bb29d3d4ebe..581b5f2a62c 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -194,7 +194,7 @@ var FieldMany2One = AbstractField.extend({ _bindAutoComplete: function () { var self = this; // avoid ignoring autocomplete="off" by obfuscating placeholder, see #30439 - if (this.$input.attr('placeholder')) { + if ($.browser.chrome && this.$input.attr('placeholder')) { this.$input.attr('placeholder', function (index, val) { return val.split('').join('\ufeff'); }); diff --git a/doc/cla/corporate/savoirfairelinux.md b/doc/cla/corporate/savoirfairelinux.md index 7097cf3db6b..913e317cb07 100644 --- a/doc/cla/corporate/savoirfairelinux.md +++ b/doc/cla/corporate/savoirfairelinux.md @@ -22,6 +22,7 @@ Quentin Lavallée-Bourdeau quentin.lavallee@savoirfairelinux.com https://github. Rim Ben Dhaou rim.bendhaou@savoirfairelinux.com https://github.com/rimbendhaou Yasmine El Mrini yasmine.elmrini@savoirfairelinux.com https://github.com/yasmineelmrini Luis Garcia Ruiz luis.garcia@savoirfairelinux.com https://github.com/eilst +Dimitar Apostolov dimitar.apostolov@savoirfairelinux.com https://github.com/dapostolov-sfl Jérome Boisvert-Chouinard jerome.boisvertchouinard@savoirfairelinux.com https://github.com/jbchouinard (up to 2017-10-17) Julie Moussu julie.mousse@savoirfairelinux.com https://github.com/JulieSFL (up to 2017-10-17) Pierre Lamarche pierre.lamarche@savoirfairelinux.com https://github.com/plamarche (up to 2017-10-17) diff --git a/odoo/addons/base/ir/ir_qweb/qweb.py b/odoo/addons/base/ir/ir_qweb/qweb.py index 9f5518632d6..aa5c12e4c03 100644 --- a/odoo/addons/base/ir/ir_qweb/qweb.py +++ b/odoo/addons/base/ir/ir_qweb/qweb.py @@ -31,6 +31,8 @@ try: except ImportError: astor = None +from odoo.tools.parse_version import parse_version + unsafe_eval = eval _logger = logging.getLogger(__name__) @@ -176,7 +178,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 foreach_iterator(base_ctx, enum, name): ctx = base_ctx.copy() diff --git a/odoo/addons/base/ir/ir_rule.py b/odoo/addons/base/ir/ir_rule.py index 13068389cce..a319b74a1a2 100644 --- a/odoo/addons/base/ir/ir_rule.py +++ b/odoo/addons/base/ir/ir_rule.py @@ -96,6 +96,8 @@ class IrRule(models.Model): group_domains.append(dom) # combine global domains and group domains + if not group_domains: + return expression.AND(global_domains) return expression.AND(global_domains + [expression.OR(group_domains)]) @api.model diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index e18e0b1240e..56fdd0b8961 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -611,6 +611,36 @@ class TestExpression(TransactionCase): not_be = Partner.with_context(lang='fr_FR').search([('country_id', '!=', 'Belgique')]) self.assertNotIn(agrolait, not_be) + def test_proper_combine_unit_leaves(self): + # test that unit leaves (TRUE_LEAF, FALSE_LEAF) are properly handled in specific cases + false = expression.FALSE_DOMAIN + true = expression.TRUE_DOMAIN + normal = [('foo', '=', 'bar')] + # OR with single FALSE_LEAF + expr = expression.OR([false]) + self.assertEqual(expr, false) + # OR with multiple FALSE_LEAF + expr = expression.OR([false, false]) + self.assertEqual(expr, false) + # OR with FALSE_LEAF and a normal leaf + expr = expression.OR([false, normal]) + self.assertEqual(expr, normal) + # OR with AND of single TRUE_LEAF and normal leaf + expr = expression.OR([expression.AND([true]), normal]) + self.assertEqual(expr, true) + # AND with single TRUE_LEAF + expr = expression.AND([true]) + self.assertEqual(expr, true) + # AND with multiple TRUE_LEAF + expr = expression.AND([true, true]) + self.assertEqual(expr, true) + # AND with TRUE_LEAF and normal leaves + expr = expression.AND([true, normal]) + self.assertEqual(expr, normal) + # AND with OR with single FALSE_LEAF and normal leaf + expr = expression.AND([expression.OR([false]), normal]) + self.assertEqual(expr, false) + class TestAutoJoin(TransactionCase): diff --git a/odoo/models.py b/odoo/models.py index 130a561445f..15c1c525e6b 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -1038,6 +1038,7 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})): except ValidationError as e: raise except Exception as e: + _logger.exception('Exception while validating constraint') raise ValidationError("%s\n\n%s" % (_("Error while validating constraint"), tools.ustr(e))) @api.model diff --git a/odoo/osv/expression.py b/odoo/osv/expression.py index 26013885437..72fbc654577 100644 --- a/odoo/osv/expression.py +++ b/odoo/osv/expression.py @@ -258,7 +258,7 @@ def combine(operator, unit, zero, domains): result += domain count += 1 result = [operator] * (count - 1) + result - return result + return result or unit def AND(domains): |
