diff --git a/addons/crm/models/res_config_settings.py b/addons/crm/models/res_config_settings.py index 3d470f5734a..f9165f22188 100644 --- a/addons/crm/models/res_config_settings.py +++ b/addons/crm/models/res_config_settings.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from datetime import timedelta from dateutil.relativedelta import relativedelta from odoo import api, exceptions, fields, models, _ @@ -102,7 +103,16 @@ class ResConfigSettings(models.TransientModel): """ As config_parameters does not accept Date field, we get the date back from the Char config field, to ease the configuration in config panel """ for setting in self: - setting.predictive_lead_scoring_start_date = fields.Date.to_date(setting.predictive_lead_scoring_start_date_str) + lead_scoring_start_date = setting.predictive_lead_scoring_start_date_str + # if config param is deleted / empty, set the date 8 days prior to current date + if not lead_scoring_start_date: + setting.predictive_lead_scoring_start_date = fields.Date.to_date(fields.Date.today() - timedelta(days=8)) + else: + try: + setting.predictive_lead_scoring_start_date = fields.Date.to_date(lead_scoring_start_date) + except ValueError: + # the config parameter is malformed, so set the date 8 days prior to current date + setting.predictive_lead_scoring_start_date = fields.Date.to_date(fields.Date.today() - timedelta(days=8)) def _inverse_pls_start_date_str(self): """ As config_parameters does not accept Date field, diff --git a/addons/crm/tests/test_crm_pls.py b/addons/crm/tests/test_crm_pls.py index eca2d36dcdc..0f408149de1 100644 --- a/addons/crm/tests/test_crm_pls.py +++ b/addons/crm/tests/test_crm_pls.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from datetime import timedelta + from odoo.tests.common import TransactionCase from odoo.tests import Form from odoo import tools @@ -425,3 +427,24 @@ class TestCRMPLS(TransactionCase): self.assertEqual(tools.float_compare(lead_tag_1.automated_probability, 28.6, 2), 0) self.assertEqual(tools.float_compare(lead_tag_2.automated_probability, 28.6, 2), 0) self.assertEqual(tools.float_compare(lead_tag_1_2.automated_probability, 28.6, 2), 0) + + def test_settings_pls_start_date(self): + # We test here that settings never crash due to ill-configured config param 'crm.pls_start_date' + set_param = self.env['ir.config_parameter'].sudo().set_param + str_date_8_days_ago = Date.to_string(Date.today() - timedelta(days=8)) + resConfig = self.env['res.config.settings'] + + set_param("crm.pls_start_date", "2021-10-10") + res_config_new = resConfig.new() + self.assertEqual(Date.to_string(res_config_new.predictive_lead_scoring_start_date), + "2021-10-10", "If config param is a valid date, date in settings should match with config param") + + set_param("crm.pls_start_date", "") + res_config_new = resConfig.new() + self.assertEqual(Date.to_string(res_config_new.predictive_lead_scoring_start_date), + str_date_8_days_ago, "If config param is empty, date in settings should be set to 8 days before today") + + set_param("crm.pls_start_date", "One does not simply walk into system parameters to corrupt them") + res_config_new = resConfig.new() + self.assertEqual(Date.to_string(res_config_new.predictive_lead_scoring_start_date), + str_date_8_days_ago, "If config param is not a valid date, date in settings should be set to 8 days before today")