diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py index 88be301eea4..7aa8ddeec56 100644 --- a/addons/mass_mailing/models/mass_mailing.py +++ b/addons/mass_mailing/models/mass_mailing.py @@ -292,7 +292,7 @@ class MassMailing(models.Model): create_date = fields.Datetime(string='Creation Date') sent_date = fields.Datetime(string='Sent Date', oldname='date', copy=False) schedule_date = fields.Datetime(string='Schedule in the Future') - body_html = fields.Html(string='Body', translate=html_translate, sanitize_attributes=False) + body_html = fields.Html(string='Body', sanitize_attributes=False) attachment_ids = fields.Many2many('ir.attachment', 'mass_mailing_ir_attachments_rel', 'mass_mailing_id', 'attachment_id', string='Attachments') keep_archives = fields.Boolean(string='Keep Archives') diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index 2742e708790..2f27048c983 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -851,7 +851,8 @@ class PosOrderLine(models.Model): fiscal_position_id = line.order_id.fiscal_position_id if fiscal_position_id: taxes = fiscal_position_id.map_tax(taxes, line.product_id, line.order_id.partner_id) - price = line.price_unit * (1 - (line.discount or 0.0) / 100.0) + price = self.env['account.tax']._fix_tax_included_price( + line.price_unit * (1 - (line.discount or 0.0) / 100.0), line.product_id.taxes_id, taxes) line.price_subtotal = line.price_subtotal_incl = price * line.qty if taxes: taxes = taxes.compute_all(price, currency, line.qty, product=line.product_id, partner=line.order_id.partner_id or False) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index bf75c52bbd9..e76f3854340 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -2340,7 +2340,6 @@ td { } .pos .popup-password .popup-input { width: 70%; - -webkit-text-security: disc; } .pos .popup .body ul, diff --git a/addons/point_of_sale/static/src/js/popups.js b/addons/point_of_sale/static/src/js/popups.js index eaeae4d6f83..f38cf18999c 100644 --- a/addons/point_of_sale/static/src/js/popups.js +++ b/addons/point_of_sale/static/src/js/popups.js @@ -307,6 +307,11 @@ var PasswordPopupWidget = NumberPopupWidget.extend({ this._super(); this.$('.popup').addClass('popup-password'); }, + click_numpad: function(event){ + this._super.apply(this, arguments); + var $value = this.$('.value'); + $value.text($value.text().replace(/./g, '•')); + }, }); gui.define_popup({name:'password', widget: PasswordPopupWidget}); diff --git a/addons/purchase_requisition/models/purchase_requisition.py b/addons/purchase_requisition/models/purchase_requisition.py index 6ac629e17da..fcf0cd47ca6 100644 --- a/addons/purchase_requisition/models/purchase_requisition.py +++ b/addons/purchase_requisition/models/purchase_requisition.py @@ -33,7 +33,14 @@ class PurchaseRequisition(models.Model): _order = "id desc" def _get_picking_in(self): - return self.env.ref('stock.picking_type_in') + pick_in = self.env.ref('stock.picking_type_in') + if not pick_in: + company = self.env['res.company']._company_default_get('purchase.requisition') + pick_in = self.env['stock.picking.type'].search( + [('warehouse_id.company_id', '=', company.id), ('code', '=', 'incoming')], + limit=1, + ) + return pick_in def _get_type_id(self): return self.env['purchase.requisition.type'].search([], limit=1) diff --git a/addons/web_editor/static/src/js/backend.js b/addons/web_editor/static/src/js/backend.js index 1c6f069ae3c..7d22186c0a8 100644 --- a/addons/web_editor/static/src/js/backend.js +++ b/addons/web_editor/static/src/js/backend.js @@ -183,6 +183,11 @@ var FieldTextHtml = widget.extend({ template: 'web_editor.FieldTextHtml', willStart: function () { var self = this; + + if (this.field.translate === false) { + this.languages = []; + return $.when(); + } return new Model('res.lang').call("search_read", [[['code', '!=', 'en_US']], ["name", "code"]]).then(function (res) { self.languages = res; }); diff --git a/odoo/addons/base/ir/ir_translation.py b/odoo/addons/base/ir/ir_translation.py index ca21040e6b9..80e04be3cfc 100644 --- a/odoo/addons/base/ir/ir_translation.py +++ b/odoo/addons/base/ir/ir_translation.py @@ -47,7 +47,8 @@ class IrTranslationImport(object): # of ir_translation, so this copy will be much faster. query = """ CREATE TEMP TABLE %s ( imd_model VARCHAR(64), - imd_name VARCHAR(128) + imd_name VARCHAR(128), + noupdate BOOLEAN ) INHERITS (%s) """ % (self._table, self._model_table) self._cr.execute(query) @@ -104,7 +105,8 @@ class IrTranslationImport(object): # Step 1: resolve ir.model.data references to res_ids cr.execute(""" UPDATE %s AS ti - SET res_id = imd.res_id + SET res_id = imd.res_id, + noupdate = imd.noupdate FROM ir_model_data AS imd WHERE ti.res_id IS NULL AND ti.module IS NOT NULL AND ti.imd_name IS NOT NULL @@ -150,7 +152,10 @@ class IrTranslationImport(object): src = ti.src, state = 'translated' FROM %s AS ti - WHERE %s AND ti.value IS NOT NULL AND ti.value != '' + WHERE %s + AND ti.value IS NOT NULL + AND ti.value != '' + AND noupdate IS NOT TRUE """ % (self._model_table, self._table, find_expr), (tuple(src_relevant_fields), tuple(src_relevant_fields))) diff --git a/odoo/tests/addons/test_translation_import/tests/test_term_count.py b/odoo/tests/addons/test_translation_import/tests/test_term_count.py index d63f2b01baa..864c4222962 100644 --- a/odoo/tests/addons/test_translation_import/tests/test_term_count.py +++ b/odoo/tests/addons/test_translation_import/tests/test_term_count.py @@ -13,3 +13,20 @@ class TestTermCount(common.TransactionCase): ids = self.env['ir.translation'].search( [('src', '=', '1XBUO5PUYH2RYZSA1FTLRYS8SPCNU1UYXMEYMM25ASV7JC2KTJZQESZYRV9L8CGB')]) self.assertEqual(len(ids), 2) + + def test_noupdate(self): + """ + Make sure no update do not overwrite translations + """ + menu = self.env.ref('test_translation_import.menu_test_translation_import') + menu.name = "New Name" + # install french and change translation content + odoo.tools.trans_load(self.cr, 'test_translation_import/i18n/fr.po', 'fr_FR', verbose=False) + menu.with_context(lang='fr_FR').name = "Nouveau nom" + # reload with overwrite + odoo.tools.trans_load(self.cr, 'test_translation_import/i18n/fr.po', 'fr_FR', verbose=False, context={'overwrite': True}) + + # trans_load invalidates ormcache but not record cache + menu.refresh() + self.assertEqual(menu.name, "New Name") + self.assertEqual(menu.with_context(lang='fr_FR').name, "Nouveau nom") diff --git a/odoo/tests/addons/test_translation_import/view.xml b/odoo/tests/addons/test_translation_import/view.xml index 7dd417707e3..c4e31d6cebd 100644 --- a/odoo/tests/addons/test_translation_import/view.xml +++ b/odoo/tests/addons/test_translation_import/view.xml @@ -1,6 +1,6 @@ - + Test translation import