1
# Copyright 2016-2018 Onestein (<http://www.onestein.eu>)
2
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
4
from odoo import _, api, fields, models
5
from odoo.exceptions import ValidationError
8
class ProjectTask(models.Model):
9
_inherit = 'project.task'
11
dependency_task_ids = fields.Many2many(
12
string='Dependencies',
13
comodel_name='project.task',
14
relation='project_task_dependency_task_rel',
15
column1='task_id', column2='dependency_task_id'
18
recursive_dependency_task_ids = fields.Many2many(
19
string='Recursive Dependencies',
20
comodel_name='project.task',
21
compute='_compute_recursive_dependency_task_ids'
24
depending_task_ids = fields.Many2many(
25
string='Depending Tasks',
26
comodel_name='project.task',
27
help='Tasks that are dependent on this task.',
28
compute='_compute_depending_task_ids'
31
recursive_depending_task_ids = fields.Many2many(
32
string='Recursive Depending Tasks',
33
comodel_name='project.task',
34
help='Tasks that are dependent on this task (recursive).',
35
compute='_compute_recursive_depending_task_ids'
38
@api.depends('dependency_task_ids')
39
def _compute_recursive_dependency_task_ids(self):
41
task.recursive_dependency_task_ids = task.get_dependency_tasks(
45
@api.depends('dependency_task_ids')
46
def _compute_depending_task_ids(self):
48
task.depending_task_ids = task.get_depending_tasks(task)
50
@api.depends('dependency_task_ids')
51
def _compute_recursive_depending_task_ids(self):
53
task.recursive_depending_task_ids = task.get_depending_tasks(
58
def get_dependency_tasks(self, task, recursive=False):
59
dependency_tasks = task.with_context(
60
prefetch_fields=False,
63
for t in dependency_tasks:
64
dependency_tasks |= self.get_dependency_tasks(t, recursive)
65
return dependency_tasks
68
def get_depending_tasks(self, task, recursive=False):
69
if not isinstance(task.id, models.NewId):
70
depending_tasks = self.search([(
71
'dependency_task_ids', 'in', task.id)
74
for t in depending_tasks:
75
depending_tasks += self.get_depending_tasks(t, recursive)
76
return depending_tasks
78
@api.constrains('dependency_task_ids')
79
def _check_dependency_recursion(self):
80
if not self._check_m2m_recursion('dependency_task_ids'):
81
raise ValidationError(
82
_('You cannot create recursive dependencies between tasks.')
86
def copy(self, default=None):
88
res = super(ProjectTask, self).copy(default)
89
if self.env.context.get('project_copy'):
90
self.env['project.task.copy.map'].create({
91
'old_task_id': self.id,