~opencrea/+junk/helpdesk

« back to all changes in this revision

Viewing changes to project_task_dependency/models/project_task.py

  • Committer: joannes
  • Date: 2019-10-22 08:35:02 UTC
  • Revision ID: joannes@debian-20191022083502-mt30yw9vxj0jkkwi
init

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2016-2018 Onestein (<http://www.onestein.eu>)
 
2
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
3
 
 
4
from odoo import _, api, fields, models
 
5
from odoo.exceptions import ValidationError
 
6
 
 
7
 
 
8
class ProjectTask(models.Model):
 
9
    _inherit = 'project.task'
 
10
 
 
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'
 
16
    )
 
17
 
 
18
    recursive_dependency_task_ids = fields.Many2many(
 
19
        string='Recursive Dependencies',
 
20
        comodel_name='project.task',
 
21
        compute='_compute_recursive_dependency_task_ids'
 
22
    )
 
23
 
 
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'
 
29
    )
 
30
 
 
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'
 
36
    )
 
37
 
 
38
    @api.depends('dependency_task_ids')
 
39
    def _compute_recursive_dependency_task_ids(self):
 
40
        for task in self:
 
41
            task.recursive_dependency_task_ids = task.get_dependency_tasks(
 
42
                task, True,
 
43
            )
 
44
 
 
45
    @api.depends('dependency_task_ids')
 
46
    def _compute_depending_task_ids(self):
 
47
        for task in self:
 
48
            task.depending_task_ids = task.get_depending_tasks(task)
 
49
 
 
50
    @api.depends('dependency_task_ids')
 
51
    def _compute_recursive_depending_task_ids(self):
 
52
        for task in self:
 
53
            task.recursive_depending_task_ids = task.get_depending_tasks(
 
54
                task, True,
 
55
            )
 
56
 
 
57
    @api.model
 
58
    def get_dependency_tasks(self, task, recursive=False):
 
59
        dependency_tasks = task.with_context(
 
60
            prefetch_fields=False,
 
61
        ).dependency_task_ids
 
62
        if recursive:
 
63
            for t in dependency_tasks:
 
64
                dependency_tasks |= self.get_dependency_tasks(t, recursive)
 
65
        return dependency_tasks
 
66
 
 
67
    @api.model
 
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)
 
72
            ])
 
73
            if recursive:
 
74
                for t in depending_tasks:
 
75
                    depending_tasks += self.get_depending_tasks(t, recursive)
 
76
            return depending_tasks
 
77
 
 
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.')
 
83
            )
 
84
 
 
85
    @api.multi
 
86
    def copy(self, default=None):
 
87
        self.ensure_one()
 
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,
 
92
                'new_task_id': res.id
 
93
            })
 
94
        return res