[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:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user