Files
enterprise-addons/project_enterprise/models/project_project.py
T

68 lines
3.4 KiB
Python

from datetime import datetime, time, timedelta
from odoo import fields, models
class ProjectProject(models.Model):
_inherit = 'project.project'
def web_gantt_write(self, data):
# If it's schedule context (One of the projects doesn't have date)
# we need to remove m2o field like user_id from data if they are empty to keep the old values
if not self[0].date:
for field in [
f_name for f_name, value in data.items()
if (
not value
and f_name in self._fields
and self._fields[f_name].type == 'many2one'
)
]:
del data[field]
return self.write(data)
def action_view_tasks(self):
action = super().action_view_tasks()
if not self.allow_milestones:
action['views'] = [
(view_id if view_type != 'map' else self.env.ref('project_enterprise.project_task_map_view_no_title_no_milestone').id, view_type)
for view_id, view_type in action['views']
]
if self._get_hide_partner() or self.is_template:
action['views'] = [(view_id, view_type) for view_id, view_type in action['views'] if view_type != 'map']
return action
def action_create_from_template(self, values=None, role_to_users_mapping=None):
project = super().action_create_from_template(values=values, role_to_users_mapping=role_to_users_mapping)
if project.date_start and self.date_start:
delta = project.date_start - self.date_start
first_possible_date_per_task = {}
tasks_to_schedule = self.env['project.task']
project_start_datetime = datetime.combine(project.date_start, time.min)
project_end_datetime = datetime.combine(project.date + timedelta(days=1), time.min)
sorted_original_tasks = self.task_ids.sorted(key=lambda t: (t.stage_id.id, t.sequence))
sorted_copied_tasks = project.task_ids.sorted(key=lambda t: (t.stage_id.id, t.sequence))
for original_task, copied_task in zip(sorted_original_tasks, sorted_copied_tasks):
if original_task.planned_date_begin:
first_possible_date_per_task[copied_task.id] = original_task.planned_date_begin + delta
tasks_to_schedule += copied_task
tasks_to_schedule._scheduling({
"planned_date_begin": datetime.strftime(project_start_datetime, '%Y-%m-%d %H:%M:%S'),
"date_deadline": datetime.strftime(project_end_datetime, '%Y-%m-%d %H:%M:%S'),
}, project_end_datetime, first_possible_date_per_task=first_possible_date_per_task)
else:
tasks_to_schedule = self.env['project.task']
project_start_datetime = datetime.combine(project.date_start or fields.Date.today(), time.min)
project_end_datetime = project_start_datetime + timedelta(days=365)
for original_task, copied_task in zip(self.task_ids, project.task_ids):
if original_task.planned_date_begin:
tasks_to_schedule += copied_task
tasks_to_schedule._scheduling({
"planned_date_begin": datetime.strftime(project_start_datetime, '%Y-%m-%d %H:%M:%S'),
"date_deadline": datetime.strftime(project_end_datetime, '%Y-%m-%d %H:%M:%S'),
}, project_end_datetime)
return project