From 4f91e6986c77a8a85dcecca66cce1b4e7d5fd49b Mon Sep 17 00:00:00 2001 From: ntsirintanis Date: Fri, 2 Feb 2024 16:09:18 +0100 Subject: [PATCH] [UPD] selection field in res.config.settings --- .../models/project_task.py | 39 +++++---- .../models/res_config_settings.py | 57 +++++++++++-- .../views/res_config_settings.xml | 84 ++++++++++++++----- 3 files changed, 138 insertions(+), 42 deletions(-) diff --git a/project_forecast_line_priority/models/project_task.py b/project_forecast_line_priority/models/project_task.py index e047f9d256..de0c6de4b8 100644 --- a/project_forecast_line_priority/models/project_task.py +++ b/project_forecast_line_priority/models/project_task.py @@ -15,9 +15,7 @@ def write(self, vals): return super().write(vals) if "priority" not in vals: return super().write(vals) - config_model = self.env["ir.config_parameter"] priority = int(vals.get("priority", 0)) - today = fields.Date.today() for this in self: # date deadline is set, so ignore this one if this.date_deadline: @@ -25,20 +23,27 @@ def write(self, vals): # if priority is 0, do nothing if priority < 1: continue - if priority == 1: - # add weeks to end date - vals["forecast_date_planned_end"] = config_model.get_param( - "project_forecast_line_priority.priority_1" - ) - else: - # priorities 2 and 3 - # add days to end date - interval = timedelta( - days=int( - config_model.get_param( - "project_forecast_line_priority.priority_%s" % priority - ) + forecast_date_planned_end = self._get_forecast_date_planned(priority) + if forecast_date_planned_end: + vals["forecast_date_planned_end"] = forecast_date_planned_end + return super().write(vals) + + def _get_forecast_date_planned(self, priority): + config_model = self.env["ir.config_parameter"] + selection = config_model.get_param( + "project_forecast_line_priority.priority_%s_selection" % priority + ) + if selection == "none": + return False + if selection == "delta": + return fields.Date.today() + timedelta( + days=int( + config_model.get_param( + "project_forecast_line_priority.priority_%s_delta" % priority ) ) - vals["forecast_date_planned_end"] = today + interval - return super().write(vals) + ) + if selection == "date": + return config_model.get_param( + "project_forecast_line_priority.priority_%s_date" % priority + ) diff --git a/project_forecast_line_priority/models/res_config_settings.py b/project_forecast_line_priority/models/res_config_settings.py index ff03ebd57f..514d5d56dd 100644 --- a/project_forecast_line_priority/models/res_config_settings.py +++ b/project_forecast_line_priority/models/res_config_settings.py @@ -3,24 +3,63 @@ from odoo import fields, models +TYPE_FORECAST_ENDDATE = [ + ("none", "None"), + ("date", "Date"), + ("delta", "Delta (in days)"), +] + class ResConfigSettings(models.TransientModel): _inherit = "res.config.settings" forecast_line_priority_1_date = fields.Date( - inverse="_inverse__compute_forecast_line_priority_1_date_str" + inverse="_inverse_forecast_line_priority_1_date_str" ) forecast_line_priority_1_date_str = fields.Char( - config_parameter="project_forecast_line_priority.priority_1" + config_parameter="project_forecast_line_priority.priority_1_date" + ) + forecast_line_priority_2_date = fields.Date( + inverse="_inverse_forecast_line_priority_1_date_str" + ) + forecast_line_priority_2_date_str = fields.Char( + config_parameter="project_forecast_line_priority.priority_2_date" + ) + forecast_line_priority_3_date = fields.Date( + inverse="_inverse_forecast_line_priority_1_date_str" + ) + forecast_line_priority_3_date_str = fields.Char( + config_parameter="project_forecast_line_priority.priority_3_date" + ) + forecast_line_priority_1 = fields.Integer( + config_parameter="project_forecast_line_priority.priority_1_delta" ) forecast_line_priority_2 = fields.Integer( - config_parameter="project_forecast_line_priority.priority_2" + config_parameter="project_forecast_line_priority.priority_2_delta" ) forecast_line_priority_3 = fields.Integer( - config_parameter="project_forecast_line_priority.priority_3" + config_parameter="project_forecast_line_priority.priority_3_delta" + ) + forecast_line_priority_1_selection = fields.Selection( + TYPE_FORECAST_ENDDATE, + default="none", + config_parameter="project_forecast_line_priority.priority_1_selection", + required=True, + ) + forecast_line_priority_2_selection = fields.Selection( + TYPE_FORECAST_ENDDATE, + default="none", + config_parameter="project_forecast_line_priority.priority_2_selection", + required=True, + ) + forecast_line_priority_3_selection = fields.Selection( + TYPE_FORECAST_ENDDATE, + default="none", + config_parameter="project_forecast_line_priority.priority_3_selection", + required=True, ) - def _inverse__compute_forecast_line_priority_1_date_str(self): + def _inverse_forecast_line_priority_1_date_str(self): """As config_parameters does not accept Date field, we store the date formated string into a Char config field""" for setting in self: @@ -28,3 +67,11 @@ def _inverse__compute_forecast_line_priority_1_date_str(self): setting.forecast_line_priority_1_date_str = fields.Date.to_string( setting.forecast_line_priority_1_date ) + if setting.forecast_line_priority_2_date: + setting.forecast_line_priority_2_date_str = fields.Date.to_string( + setting.forecast_line_priority_2_date + ) + if setting.forecast_line_priority_3_date: + setting.forecast_line_priority_3_date_str = fields.Date.to_string( + setting.forecast_line_priority_3_date + ) diff --git a/project_forecast_line_priority/views/res_config_settings.xml b/project_forecast_line_priority/views/res_config_settings.xml index fcec30838e..a7eabbbbb7 100644 --- a/project_forecast_line_priority/views/res_config_settings.xml +++ b/project_forecast_line_priority/views/res_config_settings.xml @@ -24,58 +24,102 @@
Priority 1 -
- Set Forecast End Date -
+ + -
-
+
Priority 2 -
- Set timedelta in days -
+ + +
+
Priority 3 -
- Set timedelta in days -
+ + +
+