diff --git a/addons/project/data/mail_message_subtype_data.xml b/addons/project/data/mail_message_subtype_data.xml index 9ba57898e96..85eaee475f7 100644 --- a/addons/project/data/mail_message_subtype_data.xml +++ b/addons/project/data/mail_message_subtype_data.xml @@ -58,13 +58,6 @@ Task Waiting - - Task Dependency Changes - project.task - - - - Task Rating project.task @@ -113,15 +106,6 @@ project_id - - Task Dependency Changes - 26 - project.project - - - project_id - - Update Created 19 diff --git a/addons/project/models/project_project.py b/addons/project/models/project_project.py index aa5d0b7db8f..926867e6ded 100644 --- a/addons/project/models/project_project.py +++ b/addons/project/models/project_project.py @@ -543,10 +543,8 @@ class Project(models.Model): if not self.rating_active: res -= self.env.ref('project.mt_project_task_rating') if len(self) == 1: - dependency_subtype = self.env.ref('project.mt_project_task_dependency_change') waiting_subtype = self.env.ref('project.mt_project_task_waiting') - if not self.allow_task_dependencies and dependency_subtype in res: - res -= dependency_subtype + if not self.allow_task_dependencies and waiting_subtype in res: res -= waiting_subtype return res diff --git a/addons/project/models/project_task.py b/addons/project/models/project_task.py index 21cb0b52693..6bdf9dbcdfb 100644 --- a/addons/project/models/project_task.py +++ b/addons/project/models/project_task.py @@ -123,7 +123,7 @@ class Task(models.Model): stage_id = fields.Many2one('project.task.type', string='Stage', compute='_compute_stage_id', store=True, readonly=False, ondelete='restrict', tracking=True, index=True, default=_get_default_stage_id, group_expand='_read_group_stage_ids', - domain="[('project_ids', '=', project_id)]", task_dependency_tracking=True) + domain="[('project_ids', '=', project_id)]") tag_ids = fields.Many2many('project.tags', string='Tags') state = fields.Selection([ @@ -132,14 +132,14 @@ class Task(models.Model): ('03_approved', 'Approved'), *CLOSED_STATES.items(), ('04_waiting_normal', 'Waiting'), - ], string='Status', copy=False, default='01_in_progress', required=True, compute='_compute_state', inverse='_inverse_state', readonly=False, store=True, recursive=True, task_dependency_tracking=True, tracking=True) + ], string='Status', copy=False, default='01_in_progress', required=True, compute='_compute_state', inverse='_inverse_state', readonly=False, store=True, recursive=True, tracking=True) create_date = fields.Datetime("Created On", readonly=True) write_date = fields.Datetime("Last Updated On", readonly=True) date_end = fields.Datetime(string='Ending Date', index=True, copy=False) date_assign = fields.Datetime(string='Assigning Date', copy=False, readonly=True, help="Date on which this task was last assigned (or unassigned). Based on this, you can get statistics on the time it usually takes to assign tasks.") - date_deadline = fields.Date(string='Deadline', index=True, copy=False, tracking=True, task_dependency_tracking=True) + date_deadline = fields.Date(string='Deadline', index=True, copy=False, tracking=True) date_last_stage_update = fields.Datetime(string='Last Stage Update', index=True, @@ -694,19 +694,6 @@ class Task(models.Model): ) return super(Task, self).get_empty_list_help(help) - def _valid_field_parameter(self, field, name): - # If the field has `task_dependency_tracking` on we track the changes made in the dependent task on the parent task - return name == 'task_dependency_tracking' or super()._valid_field_parameter(field, name) - - @tools.ormcache('self.env.uid', 'self.env.su') - def _get_depends_tracked_fields(self): - """ Returns the set of tracked field names for the current model. - Those fields are the ones tracked in the parent task when using task dependencies. - - See :meth:`mail.models.MailThread._track_get_fields`""" - fields = {name for name, field in self._fields.items() if getattr(field, 'task_dependency_tracking', None)} - return fields and set(self.fields_get(fields)) - # ---------------------------------------- # Case management # ---------------------------------------- @@ -1179,31 +1166,6 @@ class Task(models.Model): 'new_value_char': ', '.join(self[changed_field].mapped('name')), } tracking_value_ids.append(Command.create(vals)) - # Track changes on depending tasks - depends_tracked_fields = self._get_depends_tracked_fields() - depends_changes = changes & depends_tracked_fields - if depends_changes and self.allow_task_dependencies and self.user_has_groups('project.group_project_task_dependencies'): - parent_ids = self.dependent_ids - if parent_ids: - fields_to_ids = self.env['ir.model.fields']._get_ids('project.task') - field_ids = [fields_to_ids.get(name) for name in depends_changes] - depends_tracking_value_ids = [ - tracking_values for tracking_values in tracking_value_ids - if tracking_values[2]['field'] in field_ids - ] - subtype = self.env['ir.model.data']._xmlid_to_res_id('project.mt_task_dependency_change') - # We want to include the original subtype message coming from the child task - # for example when the stage changes the message in the chatter starts with 'Stage Changed' - child_subtype = self._track_subtype(dict((col_name, initial_values[col_name]) for col_name in changes)) - child_subtype_info = child_subtype.description or child_subtype.name if child_subtype else False - # NOTE: the subtype does not have a description on purpose, otherwise the description would be put - # at the end of the message instead of at the top, we use the name here - body = self.env['ir.qweb']._render('project.task_track_depending_tasks', { - 'child': self, - 'child_subtype': child_subtype_info, - }) - for p in parent_ids: - p.message_post(body=body, subtype_id=subtype, tracking_value_ids=depends_tracking_value_ids) return changes, tracking_value_ids def _track_template(self, changes): @@ -1242,12 +1204,10 @@ class Task(models.Model): if not self.project_id.rating_active: res -= self.env.ref('project.mt_task_rating') if len(self) == 1: - dependency_subtype = self.env.ref('project.mt_task_dependency_change') waiting_subtype = self.env.ref('project.mt_task_waiting') if ((self.project_id and not self.project_id.allow_task_dependencies)\ or (not self.project_id and not self.user_has_groups('project.group_project_task_dependencies')))\ - and dependency_subtype in res: - res -= dependency_subtype + and waiting_subtype in res: res -= waiting_subtype return res diff --git a/addons/project/models/res_config_settings.py b/addons/project/models/res_config_settings.py index 0104a1fc762..9238f737cbf 100644 --- a/addons/project/models/res_config_settings.py +++ b/addons/project/models/res_config_settings.py @@ -49,14 +49,8 @@ class ResConfigSettings(models.TransientModel): else: projects[project_flag] = config_feature_enabled - # Hide the task dependency changes subtype when the dependency setting is disabled - task_dep_change_subtype_id = self.env.ref('project.mt_task_dependency_change') - project_task_dep_change_subtype_id = self.env.ref('project.mt_project_task_dependency_change') task_waiting_subtype_id = self.env.ref('project.mt_task_waiting') project_task_waiting_subtype_id = self.env.ref('project.mt_project_task_waiting') - if task_dep_change_subtype_id.hidden != (not self['group_project_task_dependencies']): - task_dep_change_subtype_id.hidden = not self['group_project_task_dependencies'] - project_task_dep_change_subtype_id.hidden = not self['group_project_task_dependencies'] if task_waiting_subtype_id.hidden != (not self['group_project_task_dependencies']): task_waiting_subtype_id.hidden = not self['group_project_task_dependencies'] project_task_waiting_subtype_id.hidden = not self['group_project_task_dependencies'] diff --git a/addons/project/tests/test_task_dependencies.py b/addons/project/tests/test_task_dependencies.py index aa43c4f53c8..b52647ae20b 100644 --- a/addons/project/tests/test_task_dependencies.py +++ b/addons/project/tests/test_task_dependencies.py @@ -93,48 +93,6 @@ class TestTaskDependencies(TestProjectCommon): }) self.assertEqual(len(self.task_2.depend_on_ids), 1, "The number of dependencies should no change in the task 2 because of a cyclic dependency.") - def test_tracking_dependencies(self): - # Enable the company setting - self.env['res.config.settings'].create({ - 'group_project_task_dependencies': True - }).execute() - # `depend_on_ids` is tracked - self.task_1.with_context(mail_notrack=True).write({ - 'depend_on_ids': [Command.link(self.task_2.id)] - }) - self.cr.precommit.clear() - # Check that adding a dependency changes the stage then logs a message in task_1 - self.flush_tracking() - self.assertEqual(len(self.task_1.message_ids), 1, - 'Adding task 2 as a dependencie should have logged a message in task 1.') - - # Check that changing a dependency tracked field in task_2 logs a message in task_1. - self.task_2.write({'date_deadline': date(1983, 3, 1)}) # + 1 message in task_1 and task_2 - self.flush_tracking() - self.assertEqual(len(self.task_1.message_ids), 2, - 'Changing the deadline on task 2 should have logged a message in task 1.') - - # Check that changing a dependency tracked field in task_1 does not log a message in task_2. - self.task_1.date_deadline = date(2020, 1, 2) # + 1 message in task_1 - self.flush_tracking() - self.assertEqual(len(self.task_2.message_ids), 1, - 'Changing the deadline on task 1 should not have logged a message in task 2.') - - # Check that changing a field that is not tracked at all on task 2 does not impact task 1. - self.task_2.color = 100 # no new message - self.flush_tracking() - self.assertEqual(len(self.task_1.message_ids), 3, - 'Changing the color on task 2 should not have logged a message in task 1 since it is not tracked.') - - # Check that changing multiple fields does not log more than one message. - self.task_2.write({ - 'date_deadline': date(2020, 1, 1), - 'state': '02_changes_requested', - }) # + 1 message in task_1 and task_2 - self.flush_tracking() - self.assertEqual(len(self.task_1.message_ids), 4, - 'Changing multiple fields on task 2 should only log one message in task 1.') - def test_task_dependencies_settings_change(self): def set_task_dependencies_setting(enabled):