From 1ec887b773581b6316902997fec94176bbae1ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Debauche=20St=C3=A9phane?= Date: Wed, 15 Jan 2020 14:22:37 +0000 Subject: [PATCH 1/5] [FIX] mass_mailing: correctly support mailing domain from default context value MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently mailing_domain is a computed editable stored field. Its mailing domain is either computed based on current model (taking into account blacklist, opt-out, ...), either manually crafted. However current implementation does not support default values coming from context as they are reset by the triggers of the computed field. This commit fixes that behavior. Tests are added because somehow we should find a way to stabilize mailing domain computation. Co-Authored-By: Stéphane Debauche Co-Authored-By: Thibault Delavallée Task ID 2119333 PR #40949 --- addons/mass_mailing/models/mailing.py | 12 +++++++++++- .../mass_mailing/tests/test_mailing_internals.py | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py index ee16a00b1d9..2e36779ce11 100644 --- a/addons/mass_mailing/models/mailing.py +++ b/addons/mass_mailing/models/mailing.py @@ -581,9 +581,19 @@ class MassMailing(models.Model): # ------------------------------------------------------ def _get_default_mailing_domain(self): - mailing_domain = [] + default_mailing_domain = self.default_get(['mailing_domain']).get('mailing_domain') if self.mailing_model_name == 'mailing.list' and self.contact_list_ids: mailing_domain = [('list_ids', 'in', self.contact_list_ids.ids)] + elif default_mailing_domain: + default_mailing_domain = literal_eval(default_mailing_domain) if isinstance(default_mailing_domain, str) else default_mailing_domain + try: + self.env[self.mailing_model_real].search(default_mailing_domain, limit=1) + except: + mailing_domain = [] + else: + mailing_domain = default_mailing_domain + else: + mailing_domain = [] if self.mailing_type == 'mail' and 'is_blacklisted' in self.env[self.mailing_model_name]._fields: mailing_domain = expression.AND([[('is_blacklisted', '=', False)], mailing_domain]) diff --git a/addons/mass_mailing/tests/test_mailing_internals.py b/addons/mass_mailing/tests/test_mailing_internals.py index 8f25119063d..dd0af8584ab 100644 --- a/addons/mass_mailing/tests/test_mailing_internals.py +++ b/addons/mass_mailing/tests/test_mailing_internals.py @@ -4,8 +4,7 @@ from ast import literal_eval from odoo.addons.mass_mailing.tests.common import TestMassMailCommon -from odoo.tests.common import users -from odoo.tools import mute_logger +from odoo.tests.common import users, Form class TestMassMailValues(TestMassMailCommon): @@ -71,3 +70,15 @@ class TestMassMailValues(TestMassMailCommon): 'mailing_model_id': self.env['ir.model']._get('res.partner').id, }) self.assertEqual(literal_eval(mailing.mailing_domain), [('email', 'ilike', 'test.example.com')]) + + @users('user_marketing') + def test_mailing_computed_fields_form(self): + mailing_form = Form(self.env['mailing.mailing'].with_context( + default_mailing_domain="[('email', 'ilike', 'test.example.com')]", + default_mailing_model_id=self.env['ir.model']._get('res.partner').id, + )) + self.assertEqual( + literal_eval(mailing_form.mailing_domain), + ['&', ('is_blacklisted', '=', False), ('email', 'ilike', 'test.example.com')] + ) + self.assertEqual(mailing_form.mailing_model_real, 'res.partner') From 75f7ab0608bfb9770e99fe2ce1ad55e76c70ac72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Debauche=20St=C3=A9phane?= Date: Mon, 20 Jan 2020 14:28:35 +0000 Subject: [PATCH 2/5] [FIX] web: fix email and phone widgets with empty value When the value is empty in a related field, string of the element was displaying "false" instead of an empty string which is not what we expect. This commit fixes that issue. Task ID 2119333 PR #40949 --- .../sms/static/src/js/fields_phone_widget.js | 2 +- addons/sms/static/tests/sms_widget_test.js | 44 +++++++++++++++++++ .../web/static/src/js/fields/basic_fields.js | 10 +++-- .../static/tests/fields/basic_fields_tests.js | 25 +++++++++++ 4 files changed, 77 insertions(+), 4 deletions(-) diff --git a/addons/sms/static/src/js/fields_phone_widget.js b/addons/sms/static/src/js/fields_phone_widget.js index 4dd9a033e23..84809f2b044 100644 --- a/addons/sms/static/src/js/fields_phone_widget.js +++ b/addons/sms/static/src/js/fields_phone_widget.js @@ -79,7 +79,7 @@ Phone.include({ */ _renderReadonly: function () { var def = this._super.apply(this, arguments); - if (this.enableSMS) { + if (this.enableSMS && this.value) { var $composerButton = $('', { title: _t('Send SMS Text Message'), href: '', diff --git a/addons/sms/static/tests/sms_widget_test.js b/addons/sms/static/tests/sms_widget_test.js index 36ae6de5c1b..9a0f31e42c1 100644 --- a/addons/sms/static/tests/sms_widget_test.js +++ b/addons/sms/static/tests/sms_widget_test.js @@ -18,6 +18,15 @@ QUnit.module('fields', { message: "", }] }, + visitor: { + fields: { + mobile: {string: "mobile", type: "text"}, + }, + records: [{ + id: 1, + mobile: "+32494444444", + }] + }, }; } }, function () { @@ -32,6 +41,7 @@ QUnit.module('fields', { data: this.data, arch: '
', }); + assert.containsOnce(form, '.o_sms_count', "Should have a sms counter"); assert.strictEqual(form.$('.o_sms_count').text(), '0 characters, fits in 0 SMS (GSM7) ', 'Should be "0 characters, fits in 0 SMS (GSM7) " by default'); @@ -70,5 +80,39 @@ QUnit.module('fields', { form.destroy(); }); + + QUnit.test('Sms widgets with non-empty initial value', async function (assert) { + assert.expect(1); + var form = await createView({ + View: FormView, + model: 'visitor', + data: this.data, + arch: `
`, + res_id: 1, + res_ids: [1], + }); + + assert.strictEqual(form.$('.o_field_text').text(), '+32494444444', + 'Should have the initial value'); + + form.destroy(); + }); + + QUnit.test('Sms widgets with empty initial value', async function (assert) { + assert.expect(1); + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: `
`, + res_id: 1, + res_ids: [1], + }); + + assert.strictEqual(form.$('.o_field_text').text(), '', + 'Should have the empty initial value'); + + form.destroy(); + }); }); }); diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 3be9b68cd0d..0d1fc77737f 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -1465,9 +1465,13 @@ var FieldEmail = InputField.extend({ * @private */ _renderReadonly: function () { - this.$el.text(this.value) - .addClass('o_form_uri o_text_overflow') - .attr('href', this.prefix + ':' + this.value); + if (this.value) { + this.$el.text(this.value) + .addClass('o_form_uri o_text_overflow') + .attr('href', this.prefix + ':' + this.value); + } else { + this.$el.text(''); + } }, //-------------------------------------------------------------------------- diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index 21e8ef25159..ede054eb5a9 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -31,6 +31,7 @@ QUnit.module('basic_fields', { display_name: {string: "Displayed name", type: "char", searchable: true}, foo: {string: "Foo", type: "char", default: "My little Foo Value", searchable: true, trim: true}, bar: {string: "Bar", type: "boolean", default: true, searchable: true}, + empty_string: {string: "Empty string", type: "char", default: false, searchable: true, trim: true}, txt: {string: "txt", type: "text", default: "My little txt Value\nHo-ho-hoooo Merry Christmas"}, int_field: {string: "int_field", type: "integer", sortable: true, searchable: true}, qux: {string: "Qux", type: "float", digits: [16,1], searchable: true}, @@ -996,6 +997,30 @@ QUnit.module('basic_fields', { list.destroy(); }); + QUnit.test('email field with empty value', async function (assert) { + assert.expect(1); + + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '
', + res_id: 1, + }); + + var $mailtoLink = form.$('a.o_form_uri.o_field_widget.o_text_overflow'); + assert.strictEqual($mailtoLink.text(), '', + "the value should be displayed properly"); + + form.destroy(); + }); + QUnit.module('FieldChar'); From 3808fae4b24cdc5e177f2d5c24c2bc66eae42499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Debauche=20St=C3=A9phane?= Date: Wed, 15 Jan 2020 12:45:18 +0000 Subject: [PATCH 3/5] [MOV] website_event_track: move sponsors views in their own file As sponsor feature of website_event_track is going to be improved we take the opportunity to move views in their own file. It eases module and views readability. Some XML Ids are also renamed according to guidelines. Task ID 2119333 PR #40949 --- addons/website_event_track/__manifest__.py | 1 + .../views/event_sponsor_views.xml | 68 ++++++++++++++++++ .../views/event_track_views.xml | 69 ------------------- .../website_event_track/views/event_views.xml | 2 +- 4 files changed, 70 insertions(+), 70 deletions(-) create mode 100644 addons/website_event_track/views/event_sponsor_views.xml diff --git a/addons/website_event_track/__manifest__.py b/addons/website_event_track/__manifest__.py index 73e3ab6cda0..b99d9bdcde9 100644 --- a/addons/website_event_track/__manifest__.py +++ b/addons/website_event_track/__manifest__.py @@ -15,6 +15,7 @@ 'data/event_track_data.xml', 'views/event_track_templates.xml', 'views/event_track_views.xml', + 'views/event_sponsor_views.xml', 'views/event_views.xml', ], 'demo': [ diff --git a/addons/website_event_track/views/event_sponsor_views.xml b/addons/website_event_track/views/event_sponsor_views.xml new file mode 100644 index 00000000000..dd44044f9b6 --- /dev/null +++ b/addons/website_event_track/views/event_sponsor_views.xml @@ -0,0 +1,68 @@ + + + + + + Sponsor Types + event.sponsor.type + +
+ + + + + + +
+
+
+ + + Sponsor Types + event.sponsor.type + + + + + + + + + + Sponsor Types + event.sponsor.type + + + + + + event.sponsor.search + event.sponsor + + + + + + + + + + Event Sponsors + event.sponsor + tree,form + {'search_default_event_id': active_id, 'default_event_id': active_id} + + + + event.sponsor.tree + event.sponsor + + + + + + + + +
+
diff --git a/addons/website_event_track/views/event_track_views.xml b/addons/website_event_track/views/event_track_views.xml index 633ea4495b3..aff706c133e 100644 --- a/addons/website_event_track/views/event_track_views.xml +++ b/addons/website_event_track/views/event_track_views.xml @@ -263,75 +263,6 @@ action="action_event_track_location" parent="event.menu_event_configuration"/> - - - Sponsor Types - event.sponsor.type - -
- - - - - - -
-
-
- - - Sponsor Types - event.sponsor.type - - - - - - - - - - Sponsor Types - event.sponsor.type - - - - - - - event.sponsor.tree - event.sponsor - - - - - - - - - - - event.sponsor.search - event.sponsor - - - - - - - - - - Event Tracks - event.sponsor - tree,form - {'search_default_event_id': active_id, 'default_event_id': active_id} - - Track Tags diff --git a/addons/website_event_track/views/event_views.xml b/addons/website_event_track/views/event_views.xml index 1fa4543a456..52a09a4ffd6 100644 --- a/addons/website_event_track/views/event_views.xml +++ b/addons/website_event_track/views/event_views.xml @@ -31,7 +31,7 @@ context="{'default_date': date_begin}"> -