oca-project/odoo-bringout-oca-project-project_milestone_status/project_milestone_status/models/project.py
Ernad Husremovic 6094c218b2 Move 124 sale modules to oca-sale, create oca-project with 56 project modules from oca-workflow-process
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 18:04:10 +02:00

103 lines
3.4 KiB
Python

import ast
import json
from odoo import _, models
class Project(models.Model):
_inherit = "project.project"
def _get_execution(self):
all_tasks = self.env["project.task"].search(
[
("project_id", "=", self.id),
]
)
executed_tasks = all_tasks.filtered("stage_id.fold")
total_planned_hours = sum(all_tasks.mapped("planned_hours"))
total_excuted_hours = sum(executed_tasks.mapped("planned_hours"))
if total_excuted_hours and total_planned_hours:
execution = total_excuted_hours * 100 / total_planned_hours
else:
execution = 0
return {
"all_task": len(all_tasks),
"excuted": round(total_excuted_hours),
"percent": round(execution),
}
def _get_dedication(self):
all_tasks = self.env["project.task"].search(
[
("project_id", "=", self.id),
]
)
total_planned_hours = sum(all_tasks.mapped("planned_hours"))
total_dedicated_hours = sum(all_tasks.mapped("effective_hours"))
if total_dedicated_hours and total_planned_hours:
dedication = total_dedicated_hours * 100 / total_planned_hours
else:
dedication = 0
return {"dedicated": round(total_dedicated_hours), "percent": round(dedication)}
def action_view_excuted_tasks(self):
action = (
self.env["ir.actions.act_window"]
.with_context(active_id=self.id)
._for_xml_id("project_milestone_status.act_excuted_project_task")
)
action["display_name"] = _("%(name)s", name=self.name)
context = action["context"].replace("active_id", str(self.id))
context = ast.literal_eval(context)
context.update({"create": self.active, "active_test": self.active})
action["context"] = context
action["domain"] = [("project_id", "=", self.id), ("stage_id.fold", "=", True)]
return action
def _get_stat_buttons(self):
buttons = super()._get_stat_buttons()
execution = self._get_execution()
dedication = self._get_dedication()
if self.task_count and execution["all_task"]:
percent_tasks = round(self.task_count * 100 / execution["all_task"])
else:
percent_tasks = 0
buttons[0][
"number"
] = f"{self.task_count} / {execution['all_task']} ({percent_tasks}%)"
buttons.append(
{
"icon": "check-circle-o",
"text": _("Execution"),
"number": f"{execution['percent']}% ({execution['excuted']}h)",
"action_type": "object",
"action": "action_view_excuted_tasks",
"show": True,
"sequence": 5,
}
)
buttons.append(
{
"icon": "clock-o",
"text": _("Dedication"),
"number": f"{dedication['percent']}% ({dedication['dedicated']}h)",
"action_type": "action",
"action": "hr_timesheet.act_hr_timesheet_line_by_project",
"additional_context": json.dumps(
{
"active_id": self.id,
}
),
"show": True,
"sequence": 6,
}
)
return buttons