bemade-addons/project_task_date_deadline_cascade_update/models/project_task.py
2025-02-05 16:13:34 -05:00

60 lines
2.5 KiB
Python

# -*- coding: utf-8 -*-
import logging
from odoo import api, fields, models
_logger = logging.getLogger(__name__)
class ProjectTask(models.Model):
_inherit = 'project.task'
def _update_child_dates_recursive(self, date_deadline=None, planned_date_begin=None):
"""Update dates for all subtasks at all levels using _get_all_subtasks.
Args:
date_deadline: The deadline date to set for all subtasks
planned_date_begin: The planned start date to set for all subtasks
"""
if not self.child_ids:
return
_logger.info(
'Starting update for all subtasks of: %s (ID: %s)',
self.name, self.id
)
# Get all subtasks at all levels
all_subtasks = self._get_all_subtasks()
if all_subtasks:
# Update both dates for all subtasks at once
values = {
'date_deadline': date_deadline,
'planned_date_begin': planned_date_begin
}
_logger.info(
'Updating %d subtasks with values: %s',
len(all_subtasks), values
)
all_subtasks.write(values)
@api.onchange('date_deadline')
def _onchange_date_deadline(self):
"""When parent task deadline changes, update all child tasks deadlines and planned dates recursively."""
if self.date_deadline and self.child_ids and not self.env.context.get('skip_onchange'):
_logger.info('Recursively updating deadline and planned date for all subtasks of: %s', self.name)
self.with_context(skip_onchange=True)._update_child_dates_recursive(
date_deadline=self.date_deadline,
planned_date_begin=self.planned_date_begin # Always pass planned_date_begin
)
@api.onchange('planned_date_begin')
def _onchange_planned_date_begin(self):
"""When parent task planned date changes, update all child tasks planned dates and deadlines recursively."""
if self.planned_date_begin and self.child_ids and not self.env.context.get('skip_onchange'):
_logger.info('Recursively updating planned date and deadline for all subtasks of: %s', self.name)
self.with_context(skip_onchange=True)._update_child_dates_recursive(
planned_date_begin=self.planned_date_begin,
date_deadline=self.date_deadline # Always pass date_deadline
)