[REM] project: remove task dependency sub-type feature

Before this commit there is a sub-type to notify parent
if child stage change but with new to-do state feature
we don't to unnecessory notification on parent which is
more problemation then informative.

This commit remove task dependency sub-type and it's related
code.

task-3252755

closes odoo/odoo#118418

Related: odoo/enterprise#39972
Related: odoo/upgrade#4542
Signed-off-by: Xavier Bol (xbo) <xbo@odoo.com>
This commit is contained in:
Kartik Chavda
2023-04-21 18:46:48 +02:00
parent 38c3861d78
commit b4ac7f54fa
5 changed files with 5 additions and 111 deletions
@@ -58,13 +58,6 @@
<field name="description">Task Waiting</field>
<field name="hidden" eval="True"/>
</record>
<record id="mt_task_dependency_change" model="mail.message.subtype">
<field name="name">Task Dependency Changes</field>
<field name="res_model">project.task</field>
<field name="default" eval="False"/>
<field name="sequence" eval="107"/>
<field name="hidden" eval="True"/>
</record>
<record id="mt_task_rating" model="mail.message.subtype">
<field name="name">Task Rating</field>
<field name="res_model">project.task</field>
@@ -113,15 +106,6 @@
<field name="relation_field">project_id</field>
<field name="hidden" eval="True"/>
</record>
<record id="mt_project_task_dependency_change" model="mail.message.subtype">
<field name="name">Task Dependency Changes</field>
<field name="sequence">26</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" ref="mt_task_dependency_change"/>
<field name="relation_field">project_id</field>
<field name="hidden" eval="True"/>
</record>
<record id="mt_project_update_create" model="mail.message.subtype">
<field name="name">Update Created</field>
<field name="sequence">19</field>
+1 -3
View File
@@ -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
+4 -44
View File
@@ -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
@@ -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']
@@ -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):