From a6cd7c13d30ef8b93b78cc3454a11a3eeb663d0d Mon Sep 17 00:00:00 2001 From: Parthiv Patel Date: Tue, 19 Oct 2021 09:36:47 +0000 Subject: [PATCH] [PATCH] Upstream patch - 19102021 --- .../event_sale/views/event_ticket_views.xml | 8 +-- addons/l10n_lt/i18n_extra/l10n_lt.pot | 5 -- addons/l10n_lt/i18n_extra/lt.po | 5 -- .../l10n_vn/data/account.account.template.csv | 2 +- addons/l10n_vn/i18n_extra/l10n_vn.pot | 4 +- addons/l10n_vn/i18n_extra/vi_VN.po | 4 +- addons/link_tracker/models/link_tracker.py | 13 ++++ addons/link_tracker/tests/__init__.py | 1 + .../link_tracker/tests/test_link_tracker.py | 70 +++++++++++++++++++ .../static/src/models/composer/composer.js | 2 +- .../mrp/report/mrp_production_templates.xml | 2 +- .../static/src/js/components/datepicker.js | 8 +++ .../web/static/src/js/fields/basic_fields.js | 2 + .../tests/components/datepicker_tests.js | 39 +++++++++++ .../static/src/js/editor/snippets.options.js | 1 + 15 files changed, 145 insertions(+), 21 deletions(-) create mode 100644 addons/link_tracker/tests/test_link_tracker.py diff --git a/addons/event_sale/views/event_ticket_views.xml b/addons/event_sale/views/event_ticket_views.xml index fec6052e76..e369add90b 100644 --- a/addons/event_sale/views/event_ticket_views.xml +++ b/addons/event_sale/views/event_ticket_views.xml @@ -8,7 +8,7 @@ - + @@ -22,7 +22,7 @@ - + @@ -43,7 +43,7 @@ Sales End - + @@ -57,7 +57,7 @@ - + diff --git a/addons/l10n_lt/i18n_extra/l10n_lt.pot b/addons/l10n_lt/i18n_extra/l10n_lt.pot index 1b85a457a6..af00a9c69e 100644 --- a/addons/l10n_lt/i18n_extra/l10n_lt.pot +++ b/addons/l10n_lt/i18n_extra/l10n_lt.pot @@ -994,11 +994,6 @@ msgstr "" msgid "Liabilities under Short-Term Loan Agreements" msgstr "" -#. module: l10n_lt -#: model:account.account.template,name:l10n_lt.account_chart_template_lithuania_liquidity_transfer -msgid "Liquidity Transfer" -msgstr "" - #. module: l10n_lt #: model:account.account.template,name:l10n_lt.account_account_template_4220 msgid "Long-Term Liabilities under Loan Agreements" diff --git a/addons/l10n_lt/i18n_extra/lt.po b/addons/l10n_lt/i18n_extra/lt.po index 126c2cb676..6094513bf2 100644 --- a/addons/l10n_lt/i18n_extra/lt.po +++ b/addons/l10n_lt/i18n_extra/lt.po @@ -994,11 +994,6 @@ msgstr "Atostoginių kaupiniai" msgid "Liabilities under Short-Term Loan Agreements" msgstr "Įsipareigojimai pagal trumpalaikių paskolų sutartis" -#. module: l10n_lt -#: model:account.account.template,name:l10n_lt.account_chart_template_lithuania_liquidity_transfer -msgid "Liquidity Transfer" -msgstr "Likvidumo pervedimas" - #. module: l10n_lt #: model:account.account.template,name:l10n_lt.account_account_template_4220 msgid "Long-Term Liabilities under Loan Agreements" diff --git a/addons/l10n_vn/data/account.account.template.csv b/addons/l10n_vn/data/account.account.template.csv index a412f97705..972914a537 100644 --- a/addons/l10n_vn/data/account.account.template.csv +++ b/addons/l10n_vn/data/account.account.template.csv @@ -184,7 +184,7 @@ "chart6427","Outside services",6427,"account.data_account_type_expenses","vn_template","False" "chart6428","Other expenses",6428,"account.data_account_type_expenses","vn_template","False" "chart711","Other Income",711,"account.data_account_type_other_income","vn_template","False" -"chart8111","Other Expenses",811,"account.data_account_type_expenses","vn_template","False" +"chart811","Other Expenses",811,"account.data_account_type_expenses","vn_template","False" "chart8211","Current tax expense",8211,"account.data_account_type_expenses","vn_template","False" "chart8212","Deferred tax expense",8212,"account.data_account_type_expenses","vn_template","False" "chart911","Income Summary",911,"account.data_unaffected_earnings","vn_template","False" diff --git a/addons/l10n_vn/i18n_extra/l10n_vn.pot b/addons/l10n_vn/i18n_extra/l10n_vn.pot index f068fd353e..a9f1c8f4e8 100644 --- a/addons/l10n_vn/i18n_extra/l10n_vn.pot +++ b/addons/l10n_vn/i18n_extra/l10n_vn.pot @@ -631,8 +631,8 @@ msgid "Ordinary shares with voting rights" msgstr "" #. module: l10n_vn -#: model:account.account,name:l10n_vn.1_chart8111 -#: model:account.account.template,name:l10n_vn.chart8111 +#: model:account.account,name:l10n_vn.1_chart811 +#: model:account.account.template,name:l10n_vn.chart811 msgid "Other Expenses" msgstr "" diff --git a/addons/l10n_vn/i18n_extra/vi_VN.po b/addons/l10n_vn/i18n_extra/vi_VN.po index 3da72a4730..4f9be03c45 100644 --- a/addons/l10n_vn/i18n_extra/vi_VN.po +++ b/addons/l10n_vn/i18n_extra/vi_VN.po @@ -632,8 +632,8 @@ msgid "Ordinary shares with voting rights" msgstr "Cổ phiếu phổ thông có quyền biểu quyết" #. module: l10n_vn -#: model:account.account,name:l10n_vn.1_chart8111 -#: model:account.account.template,name:l10n_vn.chart8111 +#: model:account.account,name:l10n_vn.1_chart811 +#: model:account.account.template,name:l10n_vn.chart811 msgid "Other Expenses" msgstr "Chi phí bằng tiền khác" diff --git a/addons/link_tracker/models/link_tracker.py b/addons/link_tracker/models/link_tracker.py index d1ae15deb2..e899624fdb 100644 --- a/addons/link_tracker/models/link_tracker.py +++ b/addons/link_tracker/models/link_tracker.py @@ -82,8 +82,21 @@ class LinkTracker(models.Model): @api.depends('url') def _compute_redirected_url(self): + """Compute the URL to which we will redirect the user. + + By default, add UTM values as GET parameters. But if the system parameter + `link_tracker.no_external_tracking` is set, we add the UTM values in the URL + *only* for URLs that redirect to the local website (base URL). + """ + no_external_tracking = self.env['ir.config_parameter'].sudo().get_param('link_tracker.no_external_tracking') + for tracker in self: + base_domain = urls.url_parse(tracker.get_base_url()).netloc parsed = urls.url_parse(tracker.url) + if no_external_tracking and parsed.netloc and parsed.netloc != base_domain: + tracker.redirected_url = parsed.to_url() + continue + utms = {} for key, field_name, cook in self.env['utm.mixin'].tracking_fields(): field = self._fields[field_name] diff --git a/addons/link_tracker/tests/__init__.py b/addons/link_tracker/tests/__init__.py index 8cccbc6348..eaa2ece6f2 100644 --- a/addons/link_tracker/tests/__init__.py +++ b/addons/link_tracker/tests/__init__.py @@ -2,4 +2,5 @@ # Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. from . import common +from . import test_link_tracker from . import test_mail_render_mixin diff --git a/addons/link_tracker/tests/test_link_tracker.py b/addons/link_tracker/tests/test_link_tracker.py new file mode 100644 index 0000000000..b5697058c7 --- /dev/null +++ b/addons/link_tracker/tests/test_link_tracker.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details. + +from unittest.mock import patch + +from .common import MockLinkTracker +from flectra.tests import common + + +class TestLinkTracker(common.TransactionCase, MockLinkTracker): + @patch('flectra.addons.link_tracker.models.link_tracker.LinkTracker.get_base_url', + return_value='http://example.com') + def test_no_external_tracking(self, mocked_get_base_url): + self.env['ir.config_parameter'].set_param('link_tracker.no_external_tracking', '1') + + campaign = self.env['utm.campaign'].create({'name': 'campaign'}) + source = self.env['utm.source'].create({'name': 'source'}) + medium = self.env['utm.medium'].create({'name': 'medium'}) + + expected_utm_params = { + 'utm_campaign': campaign.name, + 'utm_source': source.name, + 'utm_medium': medium.name, + } + + # URL to an external website -> UTM parameters should no be added + # because the system parameter "no_external_tracking" is set + link = self.env['link.tracker'].create({ + 'url': 'http://external.com/test?a=example.com', + 'campaign_id': campaign.id, + 'source_id': source.id, + 'medium_id': medium.id, + 'title': 'Title', + }) + self.assertLinkParams( + 'http://external.com/test', + link, + {'a': 'example.com'} + ) + + # URL to the local website -> UTM parameters should be added since we know we handle them + # even though the parameter "no_external_tracking" is enabled + link.url = 'http://example.com/test?a=example.com' + self.assertLinkParams( + 'http://example.com/test', + link, + {**expected_utm_params, 'a': 'example.com'} + ) + + # Relative URL to the local website -> UTM parameters should be added since we know we handle them + # even though the parameter "no_external_tracking" is enabled + link.url = '/test?a=example.com' + + self.assertLinkParams( + '/test', + link, + {**expected_utm_params, 'a': 'example.com'} + ) + + # Deactivate the system parameter + self.env['ir.config_parameter'].set_param('link_tracker.no_external_tracking', False) + + # URL to an external website -> UTM parameters should be added since + # the system parameter "link_tracker.no_external_tracking" is disabled + link.url = 'http://external.com/test?a=example.com' + self.assertLinkParams( + 'http://external.com/test', + link, + {**expected_utm_params, 'a': 'example.com'} + ) diff --git a/addons/mail/static/src/models/composer/composer.js b/addons/mail/static/src/models/composer/composer.js index 546c342fbb..0e725645a9 100644 --- a/addons/mail/static/src/models/composer/composer.js +++ b/addons/mail/static/src/models/composer/composer.js @@ -1216,7 +1216,7 @@ function factory(dependencies) { * If true composer will log a note, else a comment will be posted. */ isLog: attr({ - default: false, + default: true, }), /** * Determines whether a post_message request is currently pending. diff --git a/addons/mrp/report/mrp_production_templates.xml b/addons/mrp/report/mrp_production_templates.xml index 07c6764696..a09be3d1c2 100644 --- a/addons/mrp/report/mrp_production_templates.xml +++ b/addons/mrp/report/mrp_production_templates.xml @@ -43,7 +43,7 @@ -
+

Operations Done Operations Planned diff --git a/addons/web/static/src/js/components/datepicker.js b/addons/web/static/src/js/components/datepicker.js index 2eddd4024e..bb9b4dcdef 100644 --- a/addons/web/static/src/js/components/datepicker.js +++ b/addons/web/static/src/js/components/datepicker.js @@ -81,7 +81,9 @@ flectra.define('web.DatePickerOwl', function (require) { * @param {...any} args anything that will be passed to the datetimepicker function. */ _datetimepicker(...args) { + this.ignoreBootstrapEvents = true; $(this.el).datetimepicker(...args); + this.ignoreBootstrapEvents = false; } /** @@ -120,6 +122,9 @@ flectra.define('web.DatePickerOwl', function (require) { * @private */ _onDateTimePickerHide() { + if (this.ignoreBootstrapEvents) { + return; + } const date = this._parseInput(this.inputRef.el.value); this.state.warning = date.format('YYYY-MM-DD') > moment().format('YYYY-MM-DD'); this.trigger('datetime-changed', { date }); @@ -132,6 +137,9 @@ flectra.define('web.DatePickerOwl', function (require) { * @private */ _onDateTimePickerShow() { + if (this.ignoreBootstrapEvents) { + return; + } this.inputRef.el.select(); } diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 125adc171d..acfef0f605 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -628,6 +628,8 @@ var FieldDateRange = InputField.extend({ autoUpdateInput: false, timePickerIncrement: 5, locale: { + applyLabel: _t('Apply'), + cancelLabel: _t('Cancel'), format: this.isDateField ? time.getLangDateFormat() : time.getLangDatetimeFormat(), }, } diff --git a/addons/web/static/tests/components/datepicker_tests.js b/addons/web/static/tests/components/datepicker_tests.js index 12af5fe056..2cd2276d9b 100644 --- a/addons/web/static/tests/components/datepicker_tests.js +++ b/addons/web/static/tests/components/datepicker_tests.js @@ -4,6 +4,8 @@ flectra.define('web.datepicker_tests', function (require) { const { DatePicker, DateTimePicker } = require('web.DatePickerOwl'); const testUtils = require('web.test_utils'); const time = require('web.time'); + const CustomFilterItem = require('web.CustomFilterItem'); + const ActionModel = require('web/static/src/js/views/action_model.js'); const { createComponent } = testUtils; @@ -163,6 +165,43 @@ flectra.define('web.datepicker_tests', function (require) { testUtils.unpatch(time); }); + QUnit.test('custom filter date', async function (assert) { + assert.expect(5); + + class MockedSearchModel extends ActionModel { + dispatch(method, ...args) { + assert.strictEqual(method, 'createNewFilters'); + const preFilters = args[0]; + const preFilter = preFilters[0]; + assert.strictEqual(preFilter.description, + 'A date is equal to "05/05/2005"', + "description should be in localized format"); + assert.deepEqual(preFilter.domain, + '[["date_field","=","2005-05-05"]]', + "domain should be in UTC format"); + } + } + const searchModel = new MockedSearchModel(); + const date_field = { name: 'date_field', string: "A date", type: 'date', searchable: true }; + const cfi = await createComponent(CustomFilterItem, { + props: { + fields: { date_field }, + }, + env: { searchModel }, + }); + + await testUtils.controlPanel.toggleAddCustomFilter(cfi); + await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'date_field'); + const valueInput = cfi.el.querySelector('.o_generator_menu_value .o_input'); + await testUtils.dom.click(valueInput); + assert.containsOnce(document.body, '.datepicker'); + await testUtils.fields.editSelect(valueInput, '05/05/2005'); + await testUtils.controlPanel.applyFilter(cfi); + assert.containsNone(document.body, '.datepicker'); + cfi.destroy(); + }); + + QUnit.module('DateTimePicker'); QUnit.test("basic rendering", async function (assert) { diff --git a/addons/website/static/src/js/editor/snippets.options.js b/addons/website/static/src/js/editor/snippets.options.js index f808163158..f19f4cdeb4 100644 --- a/addons/website/static/src/js/editor/snippets.options.js +++ b/addons/website/static/src/js/editor/snippets.options.js @@ -2574,6 +2574,7 @@ options.registry.ScrollButton = options.Class.extend({ 'justify-content-center', 'mx-auto', 'bg-primary', + 'o_not_editable', ); anchor.href = '#'; anchor.contentEditable = "false";