diff --git a/addons/project/models/project_project.py b/addons/project/models/project_project.py index 1e957861302..402dcbe5942 100644 --- a/addons/project/models/project_project.py +++ b/addons/project/models/project_project.py @@ -160,7 +160,6 @@ class Project(models.Model): date_start = fields.Date(string='Start Date') date = fields.Date(string='Expiration Date', index=True, tracking=True, help="Date on which this project ends. The timeframe defined on the project is taken into account when viewing its planning.") - allow_recurring_tasks = fields.Boolean('Recurring Tasks', default=lambda self: self.env.user.has_group('project.group_project_recurring_tasks')) allow_task_dependencies = fields.Boolean('Task Dependencies', default=lambda self: self.env.user.has_group('project.group_project_task_dependencies')) allow_milestones = fields.Boolean('Milestones', default=lambda self: self.env.user.has_group('project.group_project_milestone')) tag_ids = fields.Many2many('project.tags', relation='project_project_project_tags_rel', string='Tags') @@ -434,9 +433,6 @@ class Project(models.Model): res = super(Project, self).write(vals) if vals else True - if 'allow_recurring_tasks' in vals and not vals.get('allow_recurring_tasks'): - self.env['project.task'].search([('project_id', 'in', self.ids), ('recurring_task', '=', True)]).write({'recurring_task': False}) - if 'allow_task_dependencies' in vals and not vals.get('allow_task_dependencies'): self.env['project.task'].search([('project_id', 'in', self.ids), ('state', '=', '04_waiting_normal')]).write({'state': '01_in_progress'}) diff --git a/addons/project/models/project_task.py b/addons/project/models/project_task.py index fe75eedc0a8..aed023842bc 100644 --- a/addons/project/models/project_task.py +++ b/addons/project/models/project_task.py @@ -233,7 +233,6 @@ class Task(models.Model): display_parent_task_button = fields.Boolean(compute='_compute_display_parent_task_button', compute_sudo=True) # recurrence fields - allow_recurring_tasks = fields.Boolean(related='project_id.allow_recurring_tasks') recurring_task = fields.Boolean(string="Recurrent") recurring_count = fields.Integer(string="Tasks in Recurrence", compute='_compute_recurring_count') recurrence_id = fields.Many2one('project.task.recurrence', copy=False) diff --git a/addons/project/models/project_task_recurrence.py b/addons/project/models/project_task_recurrence.py index 89f74460c3c..c3f38006353 100644 --- a/addons/project/models/project_task_recurrence.py +++ b/addons/project/models/project_task_recurrence.py @@ -81,10 +81,9 @@ class ProjectTaskRecurrence(models.Model): def _create_next_occurrence(self, occurrence_from): self.ensure_one() - if occurrence_from.allow_recurring_tasks: - self.env['project.task'].sudo().create( - self._create_next_occurrence_values(occurrence_from) - ) + self.env['project.task'].sudo().create( + self._create_next_occurrence_values(occurrence_from) + ) def _create_next_occurrence_values(self, occurrence_from): self.ensure_one() diff --git a/addons/project/models/res_config_settings.py b/addons/project/models/res_config_settings.py index 9238f737cbf..71c54fb221c 100644 --- a/addons/project/models/res_config_settings.py +++ b/addons/project/models/res_config_settings.py @@ -35,7 +35,6 @@ class ResConfigSettings(models.TransientModel): features = { # key: (config_flag, is_global), value: project_flag ("group_project_rating", True): "rating_active", - ("group_project_recurring_tasks", True): "allow_recurring_tasks", ("group_project_task_dependencies", False): "allow_task_dependencies", ("group_project_milestone", False): "allow_milestones", } @@ -66,5 +65,7 @@ class ResConfigSettings(models.TransientModel): rating_project_request_email_template = self.env.ref('project.rating_project_request_email_template') if rating_project_request_email_template.active != self['group_project_rating']: rating_project_request_email_template.active = self['group_project_rating'] + if not self['group_project_recurring_tasks']: + self.env['project.task'].sudo().search([('recurring_task', '=', True)]).write({'recurring_task': False}) super().set_values() diff --git a/addons/project/static/src/components/project_state_selection/project_state_selection.js b/addons/project/static/src/components/project_state_selection/project_state_selection.js index 5f6460b9eac..f6041ca1570 100644 --- a/addons/project/static/src/components/project_state_selection/project_state_selection.js +++ b/addons/project/static/src/components/project_state_selection/project_state_selection.js @@ -28,4 +28,4 @@ export const projectStateSelectionField = { component: ProjectStateSelectionField, }; -registry.category("fields").add("kanban.project_state_selection", projectStateSelectionField); +registry.category("fields").add("project_state_selection", projectStateSelectionField); diff --git a/addons/project/tests/test_project_config.py b/addons/project/tests/test_project_config.py index 2662509c367..50975fd02af 100644 --- a/addons/project/tests/test_project_config.py +++ b/addons/project/tests/test_project_config.py @@ -17,7 +17,6 @@ class TestProjectConfig(TestProjectCommon): cls.Settings = cls.env["res.config.settings"] cls.features = ( # Pairs of associated (config_flag, project_flag) - ("group_project_recurring_tasks", "allow_recurring_tasks"), ("group_project_rating", "rating_active"), ) diff --git a/addons/project/tests/test_project_recurrence.py b/addons/project/tests/test_project_recurrence.py index 8a33c02a79b..df97a2abc4a 100644 --- a/addons/project/tests/test_project_recurrence.py +++ b/addons/project/tests/test_project_recurrence.py @@ -19,7 +19,6 @@ class TestProjectRecurrence(TransactionCase): cls.stage_b = cls.env['project.task.type'].create({'name': 'b'}) cls.project_recurring = cls.env['project.project'].with_context({'mail_create_nolog': True}).create({ 'name': 'Recurring', - 'allow_recurring_tasks': True, 'type_ids': [ (4, cls.stage_a.id), (4, cls.stage_b.id), @@ -99,3 +98,18 @@ class TestProjectRecurrence(TransactionCase): with freeze_time(self.date_01_01 + relativedelta(days=32)): task.state = '1_done' self.assertEqual(len(task.recurrence_id.task_ids), 2, "Since this is after repeat_until, next occurrence shouldn't have been created") + + def test_recurring_settings_change(self): + self.env['res.config.settings'] \ + .create({'group_project_recurring_tasks': True}) \ + .execute() + test_task = self.env['project.task'].create({ + 'name': "Recurring Task", + 'project_id': self.project_recurring.id, + 'recurring_task': True, + }) + self.assertTrue(test_task.recurring_task, 'The "Recurring" feature should be enabled from settings.') + self.env['res.config.settings'] \ + .create({'group_project_recurring_tasks': False}) \ + .execute() + self.assertFalse(test_task.recurring_task, 'The "Recurring" feature should not be enabled by default.') diff --git a/addons/project/views/project_project_views.xml b/addons/project/views/project_project_views.xml index 8ec6cbe8ad4..83b128f5a17 100644 --- a/addons/project/views/project_project_views.xml +++ b/addons/project/views/project_project_views.xml @@ -28,6 +28,9 @@
+
diff --git a/addons/sale_project/views/project_task_views.xml b/addons/sale_project/views/project_task_views.xml index 35fdad2b848..8e6cb1504b6 100644 --- a/addons/sale_project/views/project_task_views.xml +++ b/addons/sale_project/views/project_task_views.xml @@ -68,6 +68,19 @@ + + + project.task.view.inherit + project.task + + + + {'default_allow_billable': True, 'default_type_ids': [(4, context.get('default_stage_id', False))]} + + + + + project.task.view.inherit project.task @@ -117,6 +130,9 @@ {'column_invisible': [('parent.allow_billable', '=', False)], 'invisible': [('allow_billable', '=', False)]} + + {'default_allow_billable': True} +