Odoo Mindscape. Understand Odoo faster. Explore modules, fields, dependencies and version differences in one place instead of digging through the source code.

Module: Project

Entity: project.project

Compute Method: _compute_next_milestone_id

Inputs Method Outputs
  • id
  • is_deadline_exceeded
milestones_per_project_id = self.env['project.milestone'].search([
            ('project_id', 'in', self.ids),
            ('is_reached', '=', False),
        ]).grouped(lambda milestone: milestone.project_id.id)
task_read_group = self.env['project.task']._read_group(
            [('milestone_id.project_id', 'in', self.ids), ('milestone_id.is_reached', '=', False)],
            ['milestone_id', 'state'],
            ['__count'],
        )
task_count_per_milestones = defaultdict(lambda: (0, 0))
for milestone, state, count in task_read_group:
            opened_task_count, closed_task_count = task_count_per_milestones[milestone.id]
            if state in CLOSED_STATES:
                closed_task_count += count
            else:
                opened_task_count += count
            task_count_per_milestones[milestone.id] = opened_task_count, closed_task_count
for project in self:
            milestones = milestones_per_project_id.get(project.id, self.env['project.milestone'])
            project.next_milestone_id = milestones[:1]
            milestone_deadline_exceeded = False
            milestone_marked_as_done = False
            for m in milestones:
                opened_task_count, closed_task_count = task_count_per_milestones[m.id]
                if (
                    not milestone_deadline_exceeded
                    and m.is_deadline_exceeded
                    and (opened_task_count > 0 or closed_task_count == 0)
                ):
                    milestone_deadline_exceeded = True
                    break
                if not milestone_marked_as_done and opened_task_count == 0 and closed_task_count > 0:
                    milestone_marked_as_done = True
            project.is_milestone_deadline_exceeded = milestone_deadline_exceeded
            project.can_mark_milestone_as_done = milestone_marked_as_done

Back to entity