|
|
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
|
|