From 25548eb7e963632668438f939401403431201904 Mon Sep 17 00:00:00 2001 From: len-odoo Date: Fri, 11 May 2018 16:59:10 +0200 Subject: [PATCH 01/18] [FIX] web: sort relational fields by their names When sorting records according to a many2one field in a list view embedded in a form view, the js would sort according to their ids, in a seemingly arbitrary order. Thus sorting records according to a field with values in ("a", "b", "c") could be sorted as "a", "a", "c", "b" instead of "a", "a", "b", "c". We make the comparison on the name of the field instead. opw 1838860 --- .../static/src/js/views/basic/basic_model.js | 14 ++++++- .../tests/fields/relational_fields_tests.js | 37 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 9e8afe1629f..d0eed4dc524 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -4100,10 +4100,20 @@ var BasicModel = AbstractModel.extend({ var r2 = self.localData[record2ID]; var data1 = _.extend({}, r1.data, r1._changes); var data2 = _.extend({}, r2.data, r2._changes); - if (data1[order.name] < data2[order.name]) { + + // Default value to sort against: the value of the field + var orderData1 = data1[order.name]; + var orderData2 = data2[order.name]; + + // If the field is a relation, sort on the display_name of those records + if (list.fields[order.name].type === 'many2one') { + orderData1 = orderData1 ? self.localData[orderData1].data.display_name : ""; + orderData2 = orderData2 ? self.localData[orderData2].data.display_name : ""; + } + if (orderData1 < orderData2) { return order.asc ? -1 : 1; } - if (data1[order.name] > data2[order.name]) { + if (orderData1 > orderData2) { return order.asc ? 1 : -1; } return compareRecords(record1ID, record2ID, level + 1); diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index db91d9d3ae5..9d7362972de 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -2271,6 +2271,43 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('x2many list sorted by many2one', function (assert) { + assert.expect(3); + + this.data.partner.records[0].p = [1, 2, 4]; + this.data.partner.fields.trululu.sortable = true; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + res_id: 1, + }); + + assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '124', + "should have correct order initially"); + + form.$('.o_list_view thead th:nth(1)').click(); + + assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '412', + "should have correct order (ASC)"); + + form.$('.o_list_view thead th:nth(1)').click(); + + assert.strictEqual(form.$('.o_data_row .o_list_number').text(), '214', + "should have correct order (DESC)"); + + form.destroy(); + }); + QUnit.test('many2many list add *many* records, remove, re-add', function (assert) { assert.expect(5); From 47cc4fbbab6e532b056fee26542283bd65978ac7 Mon Sep 17 00:00:00 2001 From: len-odoo Date: Tue, 15 May 2018 10:58:59 +0200 Subject: [PATCH 02/18] [FIX] auth_signup: add missing dependency on the computation of the signup validity The field signup_valid is a non stored computed field based on signup_token. The cache is filled with prefetched values, so in a loop the field is read from the cache and not recomputed due to the missing dependency. opw 1843442 --- addons/auth_signup/models/res_partner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/auth_signup/models/res_partner.py b/addons/auth_signup/models/res_partner.py index d2bad560398..cb253555a45 100644 --- a/addons/auth_signup/models/res_partner.py +++ b/addons/auth_signup/models/res_partner.py @@ -33,6 +33,7 @@ class ResPartner(models.Model): signup_url = fields.Char(compute='_compute_signup_url', string='Signup URL') @api.multi + @api.depends('signup_token', 'signup_expiration') def _compute_signup_valid(self): dt = now() for partner in self: From 9db6dfa25df26b340176b43d4c7df9d004b27afb Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 15 May 2018 19:19:51 +0200 Subject: [PATCH 03/18] [FIX] event_sale: update registrations as sudo. Consequence of 19878d011f8abdc737b7b702c4c79632670d4b78 Backport of fb17edd0b0d5c956f6991feabfa704566fa0a11b --- addons/event_sale/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py index 8c2b8bc0c3f..30c5e40d122 100644 --- a/addons/event_sale/models/sale_order.py +++ b/addons/event_sale/models/sale_order.py @@ -56,7 +56,7 @@ class sale_order_line(osv.osv): order line has a product_uom_qty attribute that will be the number of registrations linked to this line. This method update existing registrations and create new one for missing one. """ - Registration = self.env['event.registration'] + Registration = self.env['event.registration'].sudo() registrations = Registration.search([('sale_order_line_id', 'in', self.ids)]) for so_line in [l for l in self if l.event_id]: existing_registrations = registrations.filtered(lambda self: self.sale_order_line_id.id == so_line.id) From 6fce298d7013379c4383e8368c40ee06d6146423 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Tue, 15 May 2018 12:14:02 +0200 Subject: [PATCH 04/18] [FIX] account: tax computation at reconciliation - Create a tax included of 7.7% - Set the company rounding to 'Round Globally' - Create a bank statement of 10.70, reconcile - Add a manual line with the 7.7% tax An extra line of 0.01 remains. The remaining amount after subtracting the tax is `0.00499...`, which is rounded to `0.005` by `Math.round(total*1000)/1000`, and finally displayed as `0.01`. The 'Round Globally' setting makes sense for objects containing multiple lines, such as SO, PO or invoice. In the case of a reconciliation, we can switch to the 'Round per line' config. opw-1837986 --- .../account/static/src/js/reconciliation/reconciliation_model.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js index 796531e9a62..ab10c740b63 100644 --- a/addons/account/static/src/js/reconciliation/reconciliation_model.js +++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js @@ -785,6 +785,7 @@ var StatementModel = BasicModel.extend({ model: 'account.tax', method: 'json_friendly_compute_all', args: args, + context: $.extend(self.context || {}, {'round': true}), }) .then(function (result) { _.each(result.taxes, function(tax){ From b8f5f17aed48876bfeab2b321e15f719983ea3b5 Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Tue, 15 May 2018 17:14:51 +0200 Subject: [PATCH 05/18] [FIX] event: don't block scheduler at first exception Before this commit, when a scheduler fail for one event (eg: error in send_mail), the cron stop and don't continue to process all others event's scheduler. Now we try to warn (~ randomly once by hour) the responsible/organizer/write_uid that an error occurs with this scheduler, and we continue to process the others. opw-1840497 closes #24741 --- addons/event/models/event_mail.py | 50 +++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/addons/event/models/event_mail.py b/addons/event/models/event_mail.py index 1013f5a083b..680e1d4ba8a 100644 --- a/addons/event/models/event_mail.py +++ b/addons/event/models/event_mail.py @@ -4,7 +4,12 @@ from datetime import datetime from dateutil.relativedelta import relativedelta from odoo import api, fields, models, tools +from odoo.tools import exception_to_unicode +from odoo.tools.translate import _ +import random +import logging +_logger = logging.getLogger(__name__) _INTERVALS = { 'hours': lambda interval: relativedelta(hours=interval), @@ -114,13 +119,52 @@ class EventMailScheduler(models.Model): self.write({'mail_sent': True}) return True + @api.model + def _warn_template_error(self, scheduler, exception): + # We warn ~ once by hour ~ instead of every 10 min if the interval unit is more than 'hours'. + if random.random() < 0.1666 or scheduler.interval_unit in ('now', 'hours'): + ex_s = exception_to_unicode(exception) + try: + event, template = scheduler.event_id, scheduler.template_id + emails = list(set([event.organizer_id.email, event.user_id.email, template.write_uid.email])) + subject = _("WARNING: Event Scheduler Error for event: %s" % event.name) + body = _("""Event Scheduler for: + - Event: %s (%s) + - Scheduled: %s + - Template: %s (%s) + + Failed with error: + - %s + + You receive this email because you are: + - the organizer of the event, + - or the responsible of the event, + - or the last writer of the template.""" + % (event.name, event.id, scheduler.scheduled_date, template.name, template.id, ex_s)) + email = self.env['ir.mail_server'].build_email( + email_from=self.env.user.email, + email_to=emails, + subject=subject, body=body, + ) + self.env['ir.mail_server'].send_email(email) + except Exception as e: + _logger.error("Exception while sending traceback by email: %s.\n Original Traceback:\n%s", e, exception) + pass + @api.model def run(self, autocommit=False): schedulers = self.search([('done', '=', False), ('scheduled_date', '<=', datetime.strftime(fields.datetime.now(), tools.DEFAULT_SERVER_DATETIME_FORMAT))]) for scheduler in schedulers: - scheduler.execute() - if autocommit: - self.env.cr.commit() + try: + with self.env.cr.savepoint(): + scheduler.execute() + except Exception as e: + _logger.exception(e) + self.invalidate_cache() + self._warn_template_error(scheduler, e) + else: + if autocommit: + self.env.cr.commit() return True From cdabb9d74c93bca30a6a129bb9c6774e4c0212e8 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 16 May 2018 12:17:14 +0200 Subject: [PATCH 06/18] [FIX] auth_signup: remove password from welcome message Revision 054c68689b58f554e9433938644f2960720e08ef added by mistake the password of the new user in the welcome message that is sent to users who signed up with an invitation token. There is no need for this, the user has just chosen their password, and we should not send them a copy which could be compromised on the way to their inbox or later in their inbox. It may also give users the impression that their passwords is stored in cleartext in the database, even when that is not the case. This patch minimalizes changes to the template and its translations. For existing databases where the code is updated without re-syncing the template, the password will simply be missing in the message (until a resync of auth_signup module is done) --- addons/auth_signup/controllers/main.py | 1 - addons/auth_signup/data/auth_signup_data.xml | 1 - addons/auth_signup/i18n/af.po | 1 - addons/auth_signup/i18n/am.po | 1 - addons/auth_signup/i18n/ar.po | 1 - addons/auth_signup/i18n/auth_signup.pot | 1 - addons/auth_signup/i18n/bg.po | 1 - addons/auth_signup/i18n/bs.po | 1 - addons/auth_signup/i18n/ca.po | 1 - addons/auth_signup/i18n/cs.po | 1 - addons/auth_signup/i18n/da.po | 1 - addons/auth_signup/i18n/de.po | 2 -- addons/auth_signup/i18n/el.po | 2 -- addons/auth_signup/i18n/en_GB.po | 1 - addons/auth_signup/i18n/es.po | 2 -- addons/auth_signup/i18n/es_AR.po | 1 - addons/auth_signup/i18n/es_BO.po | 1 - addons/auth_signup/i18n/es_CL.po | 1 - addons/auth_signup/i18n/es_CO.po | 1 - addons/auth_signup/i18n/es_CR.po | 1 - addons/auth_signup/i18n/es_DO.po | 1 - addons/auth_signup/i18n/es_EC.po | 1 - addons/auth_signup/i18n/es_PA.po | 1 - addons/auth_signup/i18n/es_PE.po | 1 - addons/auth_signup/i18n/es_PY.po | 1 - addons/auth_signup/i18n/es_VE.po | 1 - addons/auth_signup/i18n/et.po | 1 - addons/auth_signup/i18n/eu.po | 1 - addons/auth_signup/i18n/fa.po | 1 - addons/auth_signup/i18n/fi.po | 1 - addons/auth_signup/i18n/fo.po | 1 - addons/auth_signup/i18n/fr.po | 2 -- addons/auth_signup/i18n/fr_CA.po | 1 - addons/auth_signup/i18n/gl.po | 1 - addons/auth_signup/i18n/gu.po | 1 - addons/auth_signup/i18n/he.po | 1 - addons/auth_signup/i18n/hr.po | 1 - addons/auth_signup/i18n/hu.po | 1 - addons/auth_signup/i18n/id.po | 1 - addons/auth_signup/i18n/it.po | 1 - addons/auth_signup/i18n/ja.po | 1 - addons/auth_signup/i18n/ka.po | 1 - addons/auth_signup/i18n/kab.po | 1 - addons/auth_signup/i18n/ko.po | 1 - addons/auth_signup/i18n/lo.po | 1 - addons/auth_signup/i18n/lt.po | 2 -- addons/auth_signup/i18n/lv.po | 1 - addons/auth_signup/i18n/mk.po | 1 - addons/auth_signup/i18n/mn.po | 1 - addons/auth_signup/i18n/nb.po | 1 - addons/auth_signup/i18n/ne.po | 1 - addons/auth_signup/i18n/nl.po | 2 -- addons/auth_signup/i18n/nl_BE.po | 1 - addons/auth_signup/i18n/pl.po | 1 - addons/auth_signup/i18n/pt.po | 1 - addons/auth_signup/i18n/pt_BR.po | 2 -- addons/auth_signup/i18n/ro.po | 1 - addons/auth_signup/i18n/ru.po | 1 - addons/auth_signup/i18n/sk.po | 1 - addons/auth_signup/i18n/sl.po | 1 - addons/auth_signup/i18n/sq.po | 1 - addons/auth_signup/i18n/sr.po | 1 - addons/auth_signup/i18n/sr@latin.po | 1 - addons/auth_signup/i18n/sv.po | 1 - addons/auth_signup/i18n/th.po | 1 - addons/auth_signup/i18n/tr.po | 1 - addons/auth_signup/i18n/uk.po | 1 - addons/auth_signup/i18n/vi.po | 1 - addons/auth_signup/i18n/zh_CN.po | 2 -- addons/auth_signup/i18n/zh_TW.po | 1 - 70 files changed, 78 deletions(-) diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py index 1d1b0476337..bce24f07885 100644 --- a/addons/auth_signup/controllers/main.py +++ b/addons/auth_signup/controllers/main.py @@ -42,7 +42,6 @@ class AuthSignupHome(Home): template.sudo().with_context( lang=user_sudo.lang, auth_login=werkzeug.url_encode({'auth_login': user_sudo.email}), - password=request.params.get('password') ).send_mail(user_sudo.id, force_send=True) return super(AuthSignupHome, self).web_login(*args, **kw) except UserError as e: diff --git a/addons/auth_signup/data/auth_signup_data.xml b/addons/auth_signup/data/auth_signup_data.xml index b9f88893d2a..b3364a51658 100644 --- a/addons/auth_signup/data/auth_signup_data.xml +++ b/addons/auth_signup/data/auth_signup_data.xml @@ -116,7 +116,6 @@

Your login: ${object.email}
- Your password: ${ctx['password']}

To gain access to your account, you can use the following link: diff --git a/addons/auth_signup/i18n/af.po b/addons/auth_signup/i18n/af.po index e95f0c01e3a..8fe284f2eb6 100644 --- a/addons/auth_signup/i18n/af.po +++ b/addons/auth_signup/i18n/af.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/am.po b/addons/auth_signup/i18n/am.po index 884e96a66f0..7ed08db42cb 100644 --- a/addons/auth_signup/i18n/am.po +++ b/addons/auth_signup/i18n/am.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/ar.po b/addons/auth_signup/i18n/ar.po index aec6d4ea4b9..b379535575d 100644 --- a/addons/auth_signup/i18n/ar.po +++ b/addons/auth_signup/i18n/ar.po @@ -115,7 +115,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/auth_signup.pot b/addons/auth_signup/i18n/auth_signup.pot index d14676bed0b..2a55058943a 100644 --- a/addons/auth_signup/i18n/auth_signup.pot +++ b/addons/auth_signup/i18n/auth_signup.pot @@ -102,7 +102,6 @@ msgid "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/bg.po b/addons/auth_signup/i18n/bg.po index 42b73456d16..7ea2482acda 100644 --- a/addons/auth_signup/i18n/bg.po +++ b/addons/auth_signup/i18n/bg.po @@ -112,7 +112,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/bs.po b/addons/auth_signup/i18n/bs.po index e30567817fb..72953b3e2fb 100644 --- a/addons/auth_signup/i18n/bs.po +++ b/addons/auth_signup/i18n/bs.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/ca.po b/addons/auth_signup/i18n/ca.po index 4154a0f8705..0d58beeaac2 100644 --- a/addons/auth_signup/i18n/ca.po +++ b/addons/auth_signup/i18n/ca.po @@ -134,7 +134,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/cs.po b/addons/auth_signup/i18n/cs.po index ee70411fb3a..af80655808a 100644 --- a/addons/auth_signup/i18n/cs.po +++ b/addons/auth_signup/i18n/cs.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/da.po b/addons/auth_signup/i18n/da.po index 2a50f034c72..f64def7236e 100644 --- a/addons/auth_signup/i18n/da.po +++ b/addons/auth_signup/i18n/da.po @@ -167,7 +167,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/de.po b/addons/auth_signup/i18n/de.po index 39935643c34..84fe3bdd16c 100644 --- a/addons/auth_signup/i18n/de.po +++ b/addons/auth_signup/i18n/de.po @@ -176,7 +176,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" @@ -210,7 +209,6 @@ msgstr "" "

\n" " Ihre Anmeldedaten: ${object.email}\n" "
\n" -" Ihr Passwort: ${ctx['password']}\n" "

\n" "

\n" " Um Zugriff auf Ihr Konto zu erlangen, können Sie den folgenden Link verwenden:\n" diff --git a/addons/auth_signup/i18n/el.po b/addons/auth_signup/i18n/el.po index 527e38d061c..bdd6ddbfdeb 100644 --- a/addons/auth_signup/i18n/el.po +++ b/addons/auth_signup/i18n/el.po @@ -165,7 +165,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" @@ -199,7 +198,6 @@ msgstr "" "

\n" " Email/Όνομα χρήστη: ${object.email}\n" "
\n" -" Κωδικός Πρόσβασης: ${ctx['password']}\n" "

\n" "

\n" " Για να αποκτήσετε πρόσβαση στο λογαριασμό σας, ακολουθήστε τον παρακάτω σύνδεσμο:\n" diff --git a/addons/auth_signup/i18n/en_GB.po b/addons/auth_signup/i18n/en_GB.po index c533eb0e2c3..e9d962451fc 100644 --- a/addons/auth_signup/i18n/en_GB.po +++ b/addons/auth_signup/i18n/en_GB.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es.po b/addons/auth_signup/i18n/es.po index 32c650d770f..4349fcd5ca4 100644 --- a/addons/auth_signup/i18n/es.po +++ b/addons/auth_signup/i18n/es.po @@ -174,7 +174,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" @@ -208,7 +207,6 @@ msgstr "" "

\n" " Usuario: ${object.email}\n" "
\n" -" Contraseña: ${ctx['password']}\n" "

\n" "

\n" " Puede acceder a su cuenta desde el siguiente enlace:\n" diff --git a/addons/auth_signup/i18n/es_AR.po b/addons/auth_signup/i18n/es_AR.po index 8d8866cef06..64e393f129a 100644 --- a/addons/auth_signup/i18n/es_AR.po +++ b/addons/auth_signup/i18n/es_AR.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_BO.po b/addons/auth_signup/i18n/es_BO.po index bfd8e1e489e..47b5859f164 100644 --- a/addons/auth_signup/i18n/es_BO.po +++ b/addons/auth_signup/i18n/es_BO.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_CL.po b/addons/auth_signup/i18n/es_CL.po index a67181ae4d1..ea610d886fe 100644 --- a/addons/auth_signup/i18n/es_CL.po +++ b/addons/auth_signup/i18n/es_CL.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_CO.po b/addons/auth_signup/i18n/es_CO.po index c663d241bab..e8d1451aff7 100644 --- a/addons/auth_signup/i18n/es_CO.po +++ b/addons/auth_signup/i18n/es_CO.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_CR.po b/addons/auth_signup/i18n/es_CR.po index e62e0727939..8f7b7380f02 100644 --- a/addons/auth_signup/i18n/es_CR.po +++ b/addons/auth_signup/i18n/es_CR.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_DO.po b/addons/auth_signup/i18n/es_DO.po index ae7f686a112..eb6d9532822 100644 --- a/addons/auth_signup/i18n/es_DO.po +++ b/addons/auth_signup/i18n/es_DO.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_EC.po b/addons/auth_signup/i18n/es_EC.po index 49115bebd99..9c46530c695 100644 --- a/addons/auth_signup/i18n/es_EC.po +++ b/addons/auth_signup/i18n/es_EC.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_PA.po b/addons/auth_signup/i18n/es_PA.po index b7e4b4a2b79..7300ae412a2 100644 --- a/addons/auth_signup/i18n/es_PA.po +++ b/addons/auth_signup/i18n/es_PA.po @@ -141,7 +141,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_PE.po b/addons/auth_signup/i18n/es_PE.po index 7831cdc8391..8f56db0a42c 100644 --- a/addons/auth_signup/i18n/es_PE.po +++ b/addons/auth_signup/i18n/es_PE.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_PY.po b/addons/auth_signup/i18n/es_PY.po index 32973798220..ee3607f40ee 100644 --- a/addons/auth_signup/i18n/es_PY.po +++ b/addons/auth_signup/i18n/es_PY.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/es_VE.po b/addons/auth_signup/i18n/es_VE.po index f952ba5f792..d36f3817ded 100644 --- a/addons/auth_signup/i18n/es_VE.po +++ b/addons/auth_signup/i18n/es_VE.po @@ -142,7 +142,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/et.po b/addons/auth_signup/i18n/et.po index fb99e25ebda..39c7ab2ae08 100644 --- a/addons/auth_signup/i18n/et.po +++ b/addons/auth_signup/i18n/et.po @@ -113,7 +113,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/eu.po b/addons/auth_signup/i18n/eu.po index 1a0ce5bd509..5d2a38415f7 100644 --- a/addons/auth_signup/i18n/eu.po +++ b/addons/auth_signup/i18n/eu.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/fa.po b/addons/auth_signup/i18n/fa.po index 725e37a6f1c..3aee3d5b30d 100644 --- a/addons/auth_signup/i18n/fa.po +++ b/addons/auth_signup/i18n/fa.po @@ -112,7 +112,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/fi.po b/addons/auth_signup/i18n/fi.po index 45126bd0c40..50afb11038f 100644 --- a/addons/auth_signup/i18n/fi.po +++ b/addons/auth_signup/i18n/fi.po @@ -115,7 +115,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/fo.po b/addons/auth_signup/i18n/fo.po index c2b513c1339..47a4304b83d 100644 --- a/addons/auth_signup/i18n/fo.po +++ b/addons/auth_signup/i18n/fo.po @@ -105,7 +105,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/fr.po b/addons/auth_signup/i18n/fr.po index 1ce976aeb06..9a06c282f7d 100644 --- a/addons/auth_signup/i18n/fr.po +++ b/addons/auth_signup/i18n/fr.po @@ -165,7 +165,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" @@ -195,7 +194,6 @@ msgstr "" "

\n" " Votre identifiant : ${object.email}\n" "
\n" -" Votre mot de passe : ${ctx['password']}\n" "

\n" " \n" " Pour accéder à votre compte, vous pouvez utiliser le lien suivant :\n" diff --git a/addons/auth_signup/i18n/fr_CA.po b/addons/auth_signup/i18n/fr_CA.po index 469fd480492..516ffa5ceaa 100644 --- a/addons/auth_signup/i18n/fr_CA.po +++ b/addons/auth_signup/i18n/fr_CA.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/gl.po b/addons/auth_signup/i18n/gl.po index d3ba0b2ac14..7e3f96ee07e 100644 --- a/addons/auth_signup/i18n/gl.po +++ b/addons/auth_signup/i18n/gl.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/gu.po b/addons/auth_signup/i18n/gu.po index e36ed3369b5..9899535ddd7 100644 --- a/addons/auth_signup/i18n/gu.po +++ b/addons/auth_signup/i18n/gu.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/he.po b/addons/auth_signup/i18n/he.po index d4adca058c8..5010a56142a 100644 --- a/addons/auth_signup/i18n/he.po +++ b/addons/auth_signup/i18n/he.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/hr.po b/addons/auth_signup/i18n/hr.po index a51417494c2..e28691d2ab8 100644 --- a/addons/auth_signup/i18n/hr.po +++ b/addons/auth_signup/i18n/hr.po @@ -143,7 +143,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/hu.po b/addons/auth_signup/i18n/hu.po index 24c13f4e57a..cfd59a75b52 100644 --- a/addons/auth_signup/i18n/hu.po +++ b/addons/auth_signup/i18n/hu.po @@ -165,7 +165,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/id.po b/addons/auth_signup/i18n/id.po index 6a1a3ff1898..3105d982405 100644 --- a/addons/auth_signup/i18n/id.po +++ b/addons/auth_signup/i18n/id.po @@ -112,7 +112,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/it.po b/addons/auth_signup/i18n/it.po index 7062f4d1605..5f0dfd9c0c5 100644 --- a/addons/auth_signup/i18n/it.po +++ b/addons/auth_signup/i18n/it.po @@ -110,7 +110,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/ja.po b/addons/auth_signup/i18n/ja.po index 14f82c46eda..042c36e57b5 100644 --- a/addons/auth_signup/i18n/ja.po +++ b/addons/auth_signup/i18n/ja.po @@ -165,7 +165,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/ka.po b/addons/auth_signup/i18n/ka.po index 42efcdb58f4..25971dd117e 100644 --- a/addons/auth_signup/i18n/ka.po +++ b/addons/auth_signup/i18n/ka.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/kab.po b/addons/auth_signup/i18n/kab.po index 0dec5bea4da..0e670472029 100644 --- a/addons/auth_signup/i18n/kab.po +++ b/addons/auth_signup/i18n/kab.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/ko.po b/addons/auth_signup/i18n/ko.po index 809d65abba3..a23730a871c 100644 --- a/addons/auth_signup/i18n/ko.po +++ b/addons/auth_signup/i18n/ko.po @@ -111,7 +111,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/lo.po b/addons/auth_signup/i18n/lo.po index e7bb5b2769a..8ae06fffbc2 100644 --- a/addons/auth_signup/i18n/lo.po +++ b/addons/auth_signup/i18n/lo.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/lt.po b/addons/auth_signup/i18n/lt.po index cb6a84b9b04..77181498483 100644 --- a/addons/auth_signup/i18n/lt.po +++ b/addons/auth_signup/i18n/lt.po @@ -169,7 +169,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" @@ -203,7 +202,6 @@ msgstr "" "

\n" " Jūsų prisijungimo vardas: ${object.email}\n" "
\n" -" Jūsų slaptažodis: ${ctx['password']}\n" "

\n" "

\n" " Prisijungimui prie savo paskyros, galite naudoti šią nuorodą:\n" diff --git a/addons/auth_signup/i18n/lv.po b/addons/auth_signup/i18n/lv.po index 837ea92a732..c1ac14aab67 100644 --- a/addons/auth_signup/i18n/lv.po +++ b/addons/auth_signup/i18n/lv.po @@ -110,7 +110,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/mk.po b/addons/auth_signup/i18n/mk.po index 723427f51d1..2bb3dadd211 100644 --- a/addons/auth_signup/i18n/mk.po +++ b/addons/auth_signup/i18n/mk.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/mn.po b/addons/auth_signup/i18n/mn.po index 59d0abc0d33..f4338bae13f 100644 --- a/addons/auth_signup/i18n/mn.po +++ b/addons/auth_signup/i18n/mn.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/nb.po b/addons/auth_signup/i18n/nb.po index 0397adfdfa5..b70c115663f 100644 --- a/addons/auth_signup/i18n/nb.po +++ b/addons/auth_signup/i18n/nb.po @@ -136,7 +136,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/ne.po b/addons/auth_signup/i18n/ne.po index bd9db832c01..d94a5813dea 100644 --- a/addons/auth_signup/i18n/ne.po +++ b/addons/auth_signup/i18n/ne.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/nl.po b/addons/auth_signup/i18n/nl.po index 9bc84576d42..9ceea1d4942 100644 --- a/addons/auth_signup/i18n/nl.po +++ b/addons/auth_signup/i18n/nl.po @@ -167,7 +167,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" @@ -201,7 +200,6 @@ msgstr "" "

\n" " Uw login: ${object.email}\n" "
\n" -" Uw wachtwoord: ${ctx['password']}\n" "

\n" "

\n" " Om toegang te krijgen tot uw account, kan u de volgende link gebruiken::\n" diff --git a/addons/auth_signup/i18n/nl_BE.po b/addons/auth_signup/i18n/nl_BE.po index 405e872d815..85eb30d00cd 100644 --- a/addons/auth_signup/i18n/nl_BE.po +++ b/addons/auth_signup/i18n/nl_BE.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/pl.po b/addons/auth_signup/i18n/pl.po index 75a82cfdb0b..b10f6f5831a 100644 --- a/addons/auth_signup/i18n/pl.po +++ b/addons/auth_signup/i18n/pl.po @@ -115,7 +115,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/pt.po b/addons/auth_signup/i18n/pt.po index 670cb2cb90a..c6e7d0228b9 100644 --- a/addons/auth_signup/i18n/pt.po +++ b/addons/auth_signup/i18n/pt.po @@ -110,7 +110,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/pt_BR.po b/addons/auth_signup/i18n/pt_BR.po index 2a700ca35a1..6c15d465714 100644 --- a/addons/auth_signup/i18n/pt_BR.po +++ b/addons/auth_signup/i18n/pt_BR.po @@ -167,7 +167,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" @@ -201,7 +200,6 @@ msgstr "" "

\n" " Seu login: ${object.email}\n" "
\n" -" Sua senha: ${ctx['password']}\n" "

\n" "

\n" " Para acessar sua conta, você pode acessar o seguinte link:\n" diff --git a/addons/auth_signup/i18n/ro.po b/addons/auth_signup/i18n/ro.po index e9c27054c27..668b86514bc 100644 --- a/addons/auth_signup/i18n/ro.po +++ b/addons/auth_signup/i18n/ro.po @@ -165,7 +165,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/ru.po b/addons/auth_signup/i18n/ru.po index ff71bf2746a..35f6bb4a5e6 100644 --- a/addons/auth_signup/i18n/ru.po +++ b/addons/auth_signup/i18n/ru.po @@ -172,7 +172,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/sk.po b/addons/auth_signup/i18n/sk.po index a4d1b88045a..19ffb9c03ff 100644 --- a/addons/auth_signup/i18n/sk.po +++ b/addons/auth_signup/i18n/sk.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/sl.po b/addons/auth_signup/i18n/sl.po index 9d55f11f98d..d2011ee612c 100644 --- a/addons/auth_signup/i18n/sl.po +++ b/addons/auth_signup/i18n/sl.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/sq.po b/addons/auth_signup/i18n/sq.po index 164fdf95948..0bcff3b0ad8 100644 --- a/addons/auth_signup/i18n/sq.po +++ b/addons/auth_signup/i18n/sq.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/sr.po b/addons/auth_signup/i18n/sr.po index 39bcf501d75..6a1f8a51afb 100644 --- a/addons/auth_signup/i18n/sr.po +++ b/addons/auth_signup/i18n/sr.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/sr@latin.po b/addons/auth_signup/i18n/sr@latin.po index 08a385e2a3b..bd4ac9ee65e 100644 --- a/addons/auth_signup/i18n/sr@latin.po +++ b/addons/auth_signup/i18n/sr@latin.po @@ -110,7 +110,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/sv.po b/addons/auth_signup/i18n/sv.po index d3b6c33642c..aa14a9b4a39 100644 --- a/addons/auth_signup/i18n/sv.po +++ b/addons/auth_signup/i18n/sv.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/th.po b/addons/auth_signup/i18n/th.po index 16eaf1167ef..46fe1210082 100644 --- a/addons/auth_signup/i18n/th.po +++ b/addons/auth_signup/i18n/th.po @@ -108,7 +108,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/tr.po b/addons/auth_signup/i18n/tr.po index 7516441be69..8e0333e0cb6 100644 --- a/addons/auth_signup/i18n/tr.po +++ b/addons/auth_signup/i18n/tr.po @@ -170,7 +170,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/uk.po b/addons/auth_signup/i18n/uk.po index d2223996c04..0666c2a5bb4 100644 --- a/addons/auth_signup/i18n/uk.po +++ b/addons/auth_signup/i18n/uk.po @@ -169,7 +169,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/vi.po b/addons/auth_signup/i18n/vi.po index 4fd58b26cfa..84d5bab21b7 100644 --- a/addons/auth_signup/i18n/vi.po +++ b/addons/auth_signup/i18n/vi.po @@ -109,7 +109,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" diff --git a/addons/auth_signup/i18n/zh_CN.po b/addons/auth_signup/i18n/zh_CN.po index 8accd5a1bed..6c02191a5b6 100644 --- a/addons/auth_signup/i18n/zh_CN.po +++ b/addons/auth_signup/i18n/zh_CN.po @@ -170,7 +170,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" @@ -204,7 +203,6 @@ msgstr "" "

\n" " 您的登录账号:${object.email}\n" "
\n" -" 您的密码:${ctx['password']}\n" "

\n" "

\n" " 要获取访问您账户的权限,可使用以下链接:\n" diff --git a/addons/auth_signup/i18n/zh_TW.po b/addons/auth_signup/i18n/zh_TW.po index fd843e2e2f2..9c710056350 100644 --- a/addons/auth_signup/i18n/zh_TW.po +++ b/addons/auth_signup/i18n/zh_TW.po @@ -166,7 +166,6 @@ msgid "" "

\n" " Your login: ${object.email}\n" "
\n" -" Your password: ${ctx['password']}\n" "

\n" "

\n" " To gain access to your account, you can use the following link:\n" From c22d3f67320f3c3edfdd3d00732021e896f2cda6 Mon Sep 17 00:00:00 2001 From: Xavier ALT Date: Thu, 3 May 2018 10:07:22 +0200 Subject: [PATCH 07/18] [FIX] web: widget char_domain should pass context to selection dialog In case we define a field like, when selecting records the dialog should display all records (as asked by the context), but it's not the case. This commit ensure the field context is passed to the selection dialog. opw-1831902 --- addons/web/static/src/js/views/form_widgets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/js/views/form_widgets.js b/addons/web/static/src/js/views/form_widgets.js index b99732774f2..25b4fbed8ba 100644 --- a/addons/web/static/src/js/views/form_widgets.js +++ b/addons/web/static/src/js/views/form_widgets.js @@ -454,6 +454,7 @@ var FieldCharDomain = common.AbstractField.extend(common.ReinitializeFieldMixin, var self = this; var dialog = new common.DomainEditorDialog(this, { res_model: this.options.model || this.field_manager.get_field_value(this.options.model_field), + context: self.build_context(), default_domain: this.get('value'), title: this.get('effective_readonly') ? _t('Selected records') : _t('Select records...'), readonly: this.get('effective_readonly'), From 491243d1caa46b75a08a656a0049e79fd7597258 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Wed, 16 May 2018 13:23:00 +0200 Subject: [PATCH 08/18] [FIX] stock_account: partial reception with avg cost MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Create a product where the associated product category has Costing Method "Average Cost (AVCO)" - Create a PO. Order 1 unit at $1000. - Receive that unit. (System now has 1 unit at $1000). - Create another PO. Order 3 units at $500 each. - Receive only 1 unit and don’t create any back order. System has 2 units @ $625, instead of $750. The quantity computed should take into account the quantity actually done. opw-1843998 --- addons/stock_account/models/stock.py | 8 +++-- .../tests/test_stockvaluation.py | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/addons/stock_account/models/stock.py b/addons/stock_account/models/stock.py index 113ff99b87a..2a7cb101c4e 100644 --- a/addons/stock_account/models/stock.py +++ b/addons/stock_account/models/stock.py @@ -372,6 +372,7 @@ class StockMove(models.Model): product_tot_qty_available = move.product_id.qty_available + tmpl_dict[move.product_id.id] rounding = move.product_id.uom_id.rounding + qty_done = 0.0 if float_is_zero(product_tot_qty_available, precision_rounding=rounding): new_std_price = move._get_price_unit() elif float_is_zero(product_tot_qty_available + move.product_qty, precision_rounding=rounding): @@ -379,10 +380,11 @@ class StockMove(models.Model): else: # Get the standard price amount_unit = std_price_update.get((move.company_id.id, move.product_id.id)) or move.product_id.standard_price - qty = forced_qty or move.product_qty - new_std_price = ((amount_unit * product_tot_qty_available) + (move._get_price_unit() * qty)) / (product_tot_qty_available + move.product_qty) + qty_done = move.product_uom._compute_quantity(move.quantity_done, move.product_id.uom_id) + qty = forced_qty or qty_done + new_std_price = ((amount_unit * product_tot_qty_available) + (move._get_price_unit() * qty)) / (product_tot_qty_available + qty_done) - tmpl_dict[move.product_id.id] += move.product_qty + tmpl_dict[move.product_id.id] += qty_done # Write the standard price, as SUPERUSER_ID because a warehouse manager may not have the right to write on products move.product_id.with_context(force_company=move.company_id.id).sudo().write({'standard_price': new_std_price}) std_price_update[move.company_id.id, move.product_id.id] = new_std_price diff --git a/addons/stock_account/tests/test_stockvaluation.py b/addons/stock_account/tests/test_stockvaluation.py index 50cc57885bb..0450d66e9a1 100644 --- a/addons/stock_account/tests/test_stockvaluation.py +++ b/addons/stock_account/tests/test_stockvaluation.py @@ -2489,6 +2489,39 @@ class TestStockValuation(TransactionCase): move2.move_line_ids.qty_done = 0 self.assertEqual(self.product1.stock_value, -187.5) + def test_average_perpetual_4(self): + self.product1.product_tmpl_id.cost_method = 'average' + + move1 = self.env['stock.move'].create({ + 'name': 'Receive 1 unit at 10', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 1.0, + 'price_unit': 10, + }) + move1._action_confirm() + move1._action_assign() + move1.move_line_ids.qty_done = 1.0 + move1._action_done() + + move2 = self.env['stock.move'].create({ + 'name': 'Receive 3 units at 5', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 3.0, + 'price_unit': 5, + }) + move2._action_confirm() + move2._action_assign() + move2.move_line_ids.qty_done = 1.0 + move2._action_done() + + self.assertAlmostEqual(self.product1.standard_price, 7.5) + def test_average_negative_1(self): """ Test edit in the past. Receive 10, send 20, edit the second move to only send 10. """ From 19fb650863f11172c8a6839fcc10919e9ca9977b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Doll=C3=A9?= Date: Wed, 16 May 2018 12:53:32 +0200 Subject: [PATCH 09/18] [FIX] mail: correctly filter needaction on unread notifications in message_format Previously to this commit needaction used by JS was not taking into account read notifications. It means notably Inbox counter could be higher than expected as taking into account read messages while Inbox displays only unread messages. This commit fixes that by checking notification state when giving needaction_partner_ids to message_format result. This fix has a small impact on performances as message_format is used in notification process for chat or push. A better implementation of message format and its postprocess could probably lessen this fix impact. As we target stable version we avoid rewriting other part of the code. Optimization will be done in development version. Related to task ID 1841243. This is a manual backport of commit 69714fbeee479cd3e0f89de39b3687c183791fc0 done in saas-11.2. --- addons/mail/models/mail_message.py | 2 +- odoo/addons/test_performance/tests/test_performance.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/mail/models/mail_message.py b/addons/mail/models/mail_message.py index 62f0f524ebf..01bc5e71a5a 100644 --- a/addons/mail/models/mail_message.py +++ b/addons/mail/models/mail_message.py @@ -411,7 +411,6 @@ class Message(models.Model): 'message_type', 'subtype_id', 'subject', # message specific 'model', 'res_id', 'record_name', # document related 'channel_ids', 'partner_ids', # recipients - 'needaction_partner_ids', # list of partner ids for whom the message is a needaction 'starred_partner_ids', # list of partner ids for whom the message is starred ]) message_tree = dict((m.id, m) for m in self.sudo()) @@ -423,6 +422,7 @@ class Message(models.Model): subtypes = self.env['mail.message.subtype'].sudo().browse(subtype_ids).read(['internal', 'description']) subtypes_dict = dict((subtype['id'], subtype) for subtype in subtypes) for message in message_values: + message['needaction_partner_ids'] = self.env['mail.notification'].sudo().search([('mail_message_id', '=', message['id']), ('is_read', '=', False)]).mapped('res_partner_id').ids message['is_note'] = message['subtype_id'] and subtypes_dict[message['subtype_id'][0]]['internal'] message['subtype_description'] = message['subtype_id'] and subtypes_dict[message['subtype_id'][0]]['description'] if message['model'] and self.env[message['model']]._original_module: diff --git a/odoo/addons/test_performance/tests/test_performance.py b/odoo/addons/test_performance/tests/test_performance.py index ef4089a8fdc..d05c006d451 100644 --- a/odoo/addons/test_performance/tests/test_performance.py +++ b/odoo/addons/test_performance/tests/test_performance.py @@ -141,7 +141,7 @@ class TestPerformance(TransactionCase): records.write({'value': self.int(20)}) - @queryCount(admin=33, demo=47) + @queryCount(admin=35, demo=47) def test_write_mail_with_tracking(self): """ Write records inheriting from 'mail.thread' (with field tracking). """ record = self.env['test_performance.mail'].search([], limit=1) @@ -180,7 +180,7 @@ class TestPerformance(TransactionCase): model = self.env['test_performance.mail'] model.with_context(tracking_disable=True).create({'name': self.str('X')}) - @queryCount(admin=63, demo=85) + @queryCount(admin=67, demo=85) def test_create_mail_with_tracking(self): """ Create records inheriting from 'mail.thread' (with field tracking). """ model = self.env['test_performance.mail'] From bcf20cfbecf6850256ad2d542bc3cac75a42dad8 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 14 May 2018 16:58:21 +0200 Subject: [PATCH 10/18] [FIX] stock: use timedelta instead of relativedelta Suppose we have a delta between two datetimes: delta = dt1 - dt0 If delta is negative but less than a day, ``delta.days`` returns -1 (which is compensated by positive seconds). In order to avoid this surprising effect, use ``delta.total_seconds()`` to compute the number of days. --- addons/stock/models/stock_move.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py index c5f8e54d984..a0f774109e1 100644 --- a/addons/stock/models/stock_move.py +++ b/addons/stock/models/stock_move.py @@ -288,10 +288,10 @@ class StockMove(models.Model): if propagated_date_field: current_date = datetime.strptime(move.date_expected, DEFAULT_SERVER_DATETIME_FORMAT) new_date = datetime.strptime(vals.get(propagated_date_field), DEFAULT_SERVER_DATETIME_FORMAT) - delta = relativedelta.relativedelta(new_date, current_date) - if abs(delta.days) >= move.company_id.propagation_minimum_delta: + delta_days = (new_date - current_date).total_seconds() / 86400 + if abs(delta_days) >= move.company_id.propagation_minimum_delta: old_move_date = datetime.strptime(move.move_dest_id.date_expected, DEFAULT_SERVER_DATETIME_FORMAT) - new_move_date = (old_move_date + relativedelta.relativedelta(days=delta.days or 0)).strftime(DEFAULT_SERVER_DATETIME_FORMAT) + new_move_date = (old_move_date + relativedelta.relativedelta(days=delta_days or 0)).strftime(DEFAULT_SERVER_DATETIME_FORMAT) propagated_changes_dict['date_expected'] = new_move_date #For pushed moves as well as for pulled moves, propagate by recursive call of write(). #Note that, for pulled moves we intentionally don't propagate on the procurement. From 86ffb549bf80b054f8bb5131c52d3e7757accb29 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 16 May 2018 16:12:53 +0200 Subject: [PATCH 11/18] [FIX] base: log failed/successful logins with ip We used to only log failed logins, and did not include the IP, which makes it much less useful for intrusion detections systems (e.g. fail2ban) For example, the following fail2ban filter definition should match a failed login (in /etc/fail2ban/filter.d/odoo-login.local): [Definition] failregex = ^ \d+ INFO \S+ \S+ Login failed for db:\S+ login:\S+ from ignoreregex = This could be used with a jail definition to block the IP on HTTP(S). Here is what it could look like for blocking the IP for 15 minutes when 10 failed login attempts are detected from the same IP within 1 minute: [odoo-login] enabled = true port = http,https bantime = 900 ; 15 min ban maxretry = 10 ; if 10 attempts findtime = 60 ; within 1 min logpath = /var/log/odoo.log ; set the actual odoo log path here --- odoo/addons/base/res/res_users.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/odoo/addons/base/res/res_users.py b/odoo/addons/base/res/res_users.py index c7dd17ba4c1..8db66e282ec 100644 --- a/odoo/addons/base/res/res_users.py +++ b/odoo/addons/base/res/res_users.py @@ -14,6 +14,7 @@ from hashlib import sha256 from odoo import api, fields, models, tools, SUPERUSER_ID, _ from odoo.exceptions import AccessDenied, AccessError, UserError, ValidationError +from odoo.http import request from odoo.osv import expression from odoo.service.db import check_super from odoo.tools import partition, pycompat @@ -467,8 +468,12 @@ class Users(models.Model): user.sudo(user_id).check_credentials(password) user.sudo(user_id)._update_last_login() except AccessDenied: - _logger.info("Login failed for db:%s login:%s", db, login) user_id = False + + status = "successful" if user_id else "failed" + ip = request.httprequest.environ['REMOTE_ADDR'] if request else 'n/a' + _logger.info("Login %s for db:%s login:%s from %s", status, db, login, ip) + return user_id @classmethod From 65a589eb54a1421baa71074701bea2873a83c75f Mon Sep 17 00:00:00 2001 From: Joren Van Onder Date: Fri, 11 May 2018 14:01:07 -0700 Subject: [PATCH 12/18] [FIX] website_quote: make 'Pay & Confirm' work without website_sale When creating a db with only website_quote and payment_paypal you end up with: AttributeError: 'payment.transaction' object has no attribute '_check_or_create_sale_tx' when clicking on 'Pay & Confirm' in an online quote. This is because various controller methods in website_quote use this method and it is defined by the sale_payment module. opw-1847977 --- addons/website_quote/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/website_quote/__manifest__.py b/addons/website_quote/__manifest__.py index e6a0a1c274f..115f8f6821d 100644 --- a/addons/website_quote/__manifest__.py +++ b/addons/website_quote/__manifest__.py @@ -7,7 +7,7 @@ 'website': 'https://www.odoo.com/page/quote-builder', 'version': '1.0', 'description': "", - 'depends': ['website', 'sale_management', 'mail', 'payment', 'website_mail'], + 'depends': ['website', 'sale_management', 'mail', 'payment', 'website_mail', 'sale_payment'], 'data': [ 'data/website_quote_data.xml', 'report/sale_order_reports.xml', From 507b5cce3ae848d4b22b401f45d346f66e8fc45d Mon Sep 17 00:00:00 2001 From: "Lucas Perais (lpe)" Date: Wed, 16 May 2018 14:28:49 +0200 Subject: [PATCH 13/18] [FIX] point_of_sale: repair cashier from localStorage on refresh page open a pos, change cashier hit F5 Before this commit, the previous user was set as cashier, forgetting about the change we made This was because of two things: - The original fix to do just this use case was pushed in v9.0 as e14ab697727d87773dbefba11453b9edca79fc68 - In v11.0 the commit f5f60599bfd49df5904f971b0f1bbb37a96ccdbe introduced full usage of Backbone's set and get which meant that self.cashier was no longer relevant - In v10.0 the commit 475027b9889c0701f8fe5e0373a40663f6a831e1 (For v11.0: a9caef0ebbc7f3288e06f352f5bb817861e9689c) Was intended to update the res.users objects at their loading to ensure that their access rights were loaded too But it did this using the wrong condition After this commit, it reworks fine OPW 1844006 closes #24762 --- addons/point_of_sale/static/src/js/models.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 24443942ba5..1e5fa2e937b 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -259,6 +259,7 @@ exports.PosModel = Backbone.Model.extend({ // we attribute a role to the user, 'cashier' or 'manager', depending // on the group the user belongs. var pos_users = []; + var current_cashier = self.get_cashier(); for (var i = 0; i < users.length; i++) { var user = users[i]; for (var j = 0; j < user.groups_id.length; j++) { @@ -276,6 +277,8 @@ exports.PosModel = Backbone.Model.extend({ // replace the current user with its updated version if (user.id === self.user.id) { self.user = user; + } + if (user.id === current_cashier.id) { self.set_cashier(user); } } @@ -629,7 +632,7 @@ exports.PosModel = Backbone.Model.extend({ // changes the current cashier set_cashier: function(user){ this.set('cashier', user); - this.db.set_cashier(this.cashier); + this.db.set_cashier(this.get('cashier')); }, //creates a new empty order and sets it as the current order add_new_order: function(){ From 77aa313b141b9b4c79fa8e24ed0984a9d5c955fe Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Wed, 16 May 2018 15:20:33 +0200 Subject: [PATCH 14/18] [FIX] mail: XHTML In case an email received contains XHTML, `fromstring` fails because of the following error: > Unicode strings with encoding declaration are not supported. Please > use bytes input or XML fragments without declaration. opw-1832683 --- addons/mail/models/mail_thread.py | 8 +- addons/mail/tests/test_mail_gateway.py | 248 +++++++++++++++++++++++++ 2 files changed, 255 insertions(+), 1 deletion(-) diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index 6b41b8769d9..7050f2bfc89 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -1373,7 +1373,13 @@ class MailThread(models.AbstractModel): located in tools. """ if not body: return body, attachments - root = lxml.html.fromstring(body) + try: + root = lxml.html.fromstring(body) + except ValueError: + # In case the email client sent XHTML, fromstring will fail because 'Unicode strings + # with encoding declaration are not supported'. + root = lxml.html.fromstring(body.encode('utf-8')) + postprocessed = False to_remove = [] for node in root.iter(): diff --git a/addons/mail/tests/test_mail_gateway.py b/addons/mail/tests/test_mail_gateway.py index 12eac4437ac..93d873ce0cc 100644 --- a/addons/mail/tests/test_mail_gateway.py +++ b/addons/mail/tests/test_mail_gateway.py @@ -439,6 +439,248 @@ Web: http://www.odoo --------------A6B5FD5F68F4D73ECD739009--""" + +MAIL_XHTML = """Return-Path: +Received: from xxxx.internal (xxxx.xxxx.internal [1.1.1.1]) + by xxxx (xxxx 1.1.1-111-g972eecc-slipenbois) with LMTPA; + Fri, 13 Apr 2018 22:11:52 -0400 +X-Cyrus-Session-Id: sloti35d1t38-1111111-11111111111-5-11111111111111111111 +X-Sieve: CMU Sieve 1.0 +X-Spam-known-sender: no ("Email failed DMARC policy for domain"); in-addressbook +X-Spam-score: 0.0 +X-Spam-hits: ALL_TRUSTED -1, BAYES_00 -1.9, FREEMAIL_FROM 0.001, + HTML_FONT_LOW_CONTRAST 0.001, HTML_MESSAGE 0.001, SPF_SOFTFAIL 0.665, + LANGUAGES en, BAYES_USED global, SA_VERSION 1.1.0 +X-Spam-source: IP='1.1.1.1', Host='unk', Country='unk', FromHeader='com', + MailFrom='com' +X-Spam-charsets: plain='utf-8', html='utf-8' +X-IgnoreVacation: yes ("Email failed DMARC policy for domain") +X-Resolved-to: catchall@xxxx.xxxx +X-Delivered-to: catchall@xxxx.xxxx +X-Mail-from: xxxx@xxxx.com +Received: from mx4 ([1.1.1.1]) + by xxxx.internal (LMTPProxy); Fri, 13 Apr 2018 22:11:52 -0400 +Received: from xxxx.xxxx.com (localhost [127.0.0.1]) + by xxxx.xxxx.internal (Postfix) with ESMTP id E1111C1111; + Fri, 13 Apr 2018 22:11:51 -0400 (EDT) +Received: from xxxx.xxxx.internal (localhost [127.0.0.1]) + by xxxx.xxxx.com (Authentication Milter) with ESMTP + id BBDD1111D1A; + Fri, 13 Apr 2018 22:11:51 -0400 +ARC-Authentication-Results: i=1; xxxx.xxxx.com; arc=none (no signatures found); + dkim=pass (2048-bit rsa key sha256) header.d=xxxx.com header.i=@xxxx.com header.b=P1aaAAaa x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=fm2; + dmarc=fail (p=none,d=none) header.from=xxxx.com; + iprev=pass policy.iprev=1.1.1.1 (out1-smtp.xxxx.com); + spf=softfail smtp.mailfrom=xxxx@xxxx.com smtp.helo=out1-smtp.xxxx.com; + x-aligned-from=pass (Address match); + x-cm=none score=0; + x-ptr=pass x-ptr-helo=out1-smtp.xxxx.com x-ptr-lookup=out1-smtp.xxxx.com; + x-return-mx=pass smtp.domain=xxxx.com smtp.result=pass smtp_is_org_domain=yes header.domain=xxxx.com header.result=pass header_is_org_domain=yes; + x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128; + x-vs=clean score=0 state=0 +Authentication-Results: xxxx.xxxx.com; + arc=none (no signatures found); + dkim=pass (2048-bit rsa key sha256) header.d=xxxx.com header.i=@xxxx.com header.b=P1awJPiy x-bits=2048 x-keytype=rsa x-algorithm=sha256 x-selector=fm2; + dmarc=fail (p=none,d=none) header.from=xxxx.com; + iprev=pass policy.iprev=66.111.4.25 (out1-smtp.xxxx.com); + spf=softfail smtp.mailfrom=xxxx@xxxx.com smtp.helo=out1-smtp.xxxx.com; + x-aligned-from=pass (Address match); + x-cm=none score=0; + x-ptr=pass x-ptr-helo=out1-smtp.xxxx.com x-ptr-lookup=out1-smtp.xxxx.com; + x-return-mx=pass smtp.domain=xxxx.com smtp.result=pass smtp_is_org_domain=yes header.domain=xxxx.com header.result=pass header_is_org_domain=yes; + x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128; + x-vs=clean score=0 state=0 +X-ME-VSCategory: clean +X-ME-CMScore: 0 +X-ME-CMCategory: none +Received-SPF: softfail + (gmail.com ... _spf.xxxx.com: Sender is not authorized by default to use 'xxxx@xxxx.com' in 'mfrom' identity, however domain is not currently prepared for false failures (mechanism '~all' matched)) + receiver=xxxx.xxxx.com; + identity=mailfrom; + envelope-from="xxxx@xxxx.com"; + helo=out1-smtp.xxxx.com; + client-ip=1.1.1.1 +Received: from xxxx.xxxx.internal (gateway1.xxxx.internal [1.1.1.1]) + (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) + (No client certificate requested) + by xxxx.xxxx.internal (Postfix) with ESMTPS; + Fri, 13 Apr 2018 22:11:51 -0400 (EDT) +Received: from compute3.internal (xxxx.xxxx.internal [10.202.2.43]) + by xxxx.xxxx.internal (Postfix) with ESMTP id 8BD5B21BBD; + Fri, 13 Apr 2018 22:11:51 -0400 (EDT) +Received: from xxxx ([10.202.2.163]) + by xxxx.internal (MEProxy); Fri, 13 Apr 2018 22:11:51 -0400 +X-ME-Sender: +Received: from [1.1.1.1] (unknown [1.1.1.1]) + by mail.xxxx.com (Postfix) with ESMTPA id BF5E1111D + for ; Fri, 13 Apr 2018 22:11:50 -0400 (EDT) +From: "xxxx xxxx" +To: "xxxx" +Subject: Re: xxxx (Ref PO1) +Date: Sat, 14 Apr 2018 02:11:42 +0000 +Message-Id: +In-Reply-To: <829228111124527.1111111602.256611118262939-openerp-129-xxxx.xxxx@ip-1-1-1-1> +References: <867911111953277.1523671337.187951111160400-openerp-129-xxxx.xxxx@ip-1-1-1-1> + <867911111953277.1523671337.256611118262939-openerp-129-xxxx.xxxx@ip-1-1-1-1> +Reply-To: "xxxx xxxx" +User-Agent: eM_Client/7.0.26687.0 +Mime-Version: 1.0 +Content-Type: multipart/alternative; + boundary="------=_MB48E455BD-1111-42EC-1111-886CDF48905E" + +--------=_MB48E455BD-1111-42EC-1111-886CDF48905E +Content-Type: text/plain; format=flowed; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +xxxx + + +------ Original Message ------ +From: "xxxx" +To: "xxxx" +Sent: 4/13/2018 7:06:43 PM +Subject: xxxx + +>xxxx + +--------=_MB48E455BD-1111-42EC-1111-886CDF48905E +Content-Type: text/html; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +

this is a reply to PO200109 from emClient
--
xxxx
xxxx
xxxx



+
------ Original Message ------
+
+
To: "xxxx" <a= +xxxx@xxxx.com>
+
Sent: 4/13/2018 7:06:43 PM
+
Subject: xxxx

+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + mangez des saucisses + + + 3D= +
+
+ + + + +
+

xxxx.=20 +,

+

+xxxx. +

+ +

You can reply = +to this email if you have any questions.

+

Thank you,

+
+
+ + + + + +
+ xxxx
+ +1-801-980-4240 +
+ info@aust-mfg.com= +
+ + http://www.xxxx.com + +
+
+ Powered by Odo= +o. +
+ =20 +
xxxx.
+
+
+ +--------=_MB48E455BD-2850-42EC-B1CA-886CDF48905E--""" + + class TestMailgateway(TestMail): def setUp(self): @@ -512,6 +754,12 @@ class TestMailgateway(TestMail): """ self.env['mail.thread'].message_process('mail.channel', MAIL_EML_ATTACHMENT) + @mute_logger('odoo.addons.mail.models.mail_thread') + def test_message_parse_xhtml(self): + """ Test that the parsing of mail with embedded emails as eml(msg) which generates empty attachments, can be processed. + """ + self.env['mail.thread'].message_process('mail.channel', MAIL_XHTML) + @mute_logger('odoo.addons.mail.models.mail_thread') def test_message_process_cid(self): new_groups = self.format_and_process(MAIL_MULTIPART_IMAGE, subject='My Frogs', to='groups@example.com') From 935043dda123a030130571a2a4bb45b2b13f145c Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 17 May 2018 11:37:01 +0200 Subject: [PATCH 15/18] Revert "[FIX] website_quote: make 'Pay & Confirm' work without website_sale" No dependency change in stable version This reverts commit 65a589eb54a1421baa71074701bea2873a83c75f. --- addons/website_quote/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/website_quote/__manifest__.py b/addons/website_quote/__manifest__.py index 115f8f6821d..e6a0a1c274f 100644 --- a/addons/website_quote/__manifest__.py +++ b/addons/website_quote/__manifest__.py @@ -7,7 +7,7 @@ 'website': 'https://www.odoo.com/page/quote-builder', 'version': '1.0', 'description': "", - 'depends': ['website', 'sale_management', 'mail', 'payment', 'website_mail', 'sale_payment'], + 'depends': ['website', 'sale_management', 'mail', 'payment', 'website_mail'], 'data': [ 'data/website_quote_data.xml', 'report/sale_order_reports.xml', From 0897195f919b67538257e38647c6c9c72258aec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 17 May 2018 10:23:49 +0200 Subject: [PATCH 16/18] [FIX] mail: improve implementation of message format fix This is a better implementation of 19fb650863f11172c8a6839fcc10919e9ca9977b. It seems we did not see the fix was inside a loop meaning not really optimized when thinking about Inbox fetching a lot of messages. --- addons/mail/models/mail_message.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/mail/models/mail_message.py b/addons/mail/models/mail_message.py index 01bc5e71a5a..69ef327e9ff 100644 --- a/addons/mail/models/mail_message.py +++ b/addons/mail/models/mail_message.py @@ -421,8 +421,18 @@ class Message(models.Model): subtype_ids = [msg['subtype_id'][0] for msg in message_values if msg['subtype_id']] subtypes = self.env['mail.message.subtype'].sudo().browse(subtype_ids).read(['internal', 'description']) subtypes_dict = dict((subtype['id'], subtype) for subtype in subtypes) + + # fetch notification status + notif_dict = {} + notifs = self.env['mail.notification'].sudo().search([('mail_message_id', 'in', list(mid for mid in message_tree)), ('is_read', '=', False)]) + for notif in notifs: + mid = notif.mail_message_id + if not notif_dict.get(mid): + notif_dict[mid] = {'partner_id': list()} + notif_dict[mid]['partner_id'].append(notif.res_partner_id.id) + for message in message_values: - message['needaction_partner_ids'] = self.env['mail.notification'].sudo().search([('mail_message_id', '=', message['id']), ('is_read', '=', False)]).mapped('res_partner_id').ids + message['needaction_partner_ids'] = notif_dict.get(message['id']) message['is_note'] = message['subtype_id'] and subtypes_dict[message['subtype_id'][0]]['internal'] message['subtype_description'] = message['subtype_id'] and subtypes_dict[message['subtype_id'][0]]['description'] if message['model'] and self.env[message['model']]._original_module: From 7313ce7d3c3700bc4184c27c397887824e7fecc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 17 May 2018 12:34:46 +0200 Subject: [PATCH 17/18] [FIX] mail: correctly fetch needaction partner ids in chatter Why y push too fast. --- addons/mail/models/mail_message.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/mail/models/mail_message.py b/addons/mail/models/mail_message.py index 69ef327e9ff..78959f157fe 100644 --- a/addons/mail/models/mail_message.py +++ b/addons/mail/models/mail_message.py @@ -426,13 +426,13 @@ class Message(models.Model): notif_dict = {} notifs = self.env['mail.notification'].sudo().search([('mail_message_id', 'in', list(mid for mid in message_tree)), ('is_read', '=', False)]) for notif in notifs: - mid = notif.mail_message_id + mid = notif.mail_message_id.id if not notif_dict.get(mid): notif_dict[mid] = {'partner_id': list()} notif_dict[mid]['partner_id'].append(notif.res_partner_id.id) for message in message_values: - message['needaction_partner_ids'] = notif_dict.get(message['id']) + message['needaction_partner_ids'] = notif_dict.get(message['id'], dict()).get('partner_id', []) message['is_note'] = message['subtype_id'] and subtypes_dict[message['subtype_id'][0]]['internal'] message['subtype_description'] = message['subtype_id'] and subtypes_dict[message['subtype_id'][0]]['description'] if message['model'] and self.env[message['model']]._original_module: From 59a8a1cd8eec1af59df2d62d7c3b10b7cff3dfc9 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 17 May 2018 12:50:18 +0200 Subject: [PATCH 18/18] [FIX] account: accounting advisers can create taxes Since revision 4acec418ce1548b404333f0de4a7f57bd803ce9e it was no longer possible for an accounting adviser to create taxes. This is because when creating a taxes, as the related field `hide_tax_exigibility` wasn't readonly, it attempted to write on the field `tax_exigibility` of the model `res.company`, and the adviser do not has that access right. There is no reason for this field not to be readonly, as it is used only to compute an invisible attrs for the tax form view. opw-1846265 --- addons/account/models/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/models/account.py b/addons/account/models/account.py index a39497d7216..4642cacd9b5 100644 --- a/addons/account/models/account.py +++ b/addons/account/models/account.py @@ -767,7 +767,7 @@ class AccountTax(models.Model): tag_ids = fields.Many2many('account.account.tag', 'account_tax_account_tag', string='Tags', help="Optional tags you may want to assign for custom reporting") tax_group_id = fields.Many2one('account.tax.group', string="Tax Group", default=_default_tax_group, required=True) # Technical field to make the 'tax_exigibility' field invisible if the same named field is set to false in 'res.company' model - hide_tax_exigibility = fields.Boolean(string='Hide Use Cash Basis Option', related='company_id.tax_exigibility') + hide_tax_exigibility = fields.Boolean(string='Hide Use Cash Basis Option', related='company_id.tax_exigibility', readonly=True) tax_exigibility = fields.Selection( [('on_invoice', 'Based on Invoice'), ('on_payment', 'Based on Payment'),