-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
project_workload: several fix and simplify code
- fix removing user - fix creating a task without user - simplify code by introducing a hook "_get_main_workload" - improve test coverage
- Loading branch information
1 parent
13b760c
commit 7955d70
Showing
9 changed files
with
196 additions
and
83 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from . import test_workload_addition |
105 changes: 105 additions & 0 deletions
105
project_workload_additions/tests/test_workload_addition.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
# Copyright 2024 Akretion (https://www.akretion.com). | ||
# @author Sébastien BEAU <[email protected]> | ||
# @author Florian Mounier <[email protected]> | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). | ||
|
||
from datetime import datetime, timedelta | ||
|
||
from odoo.addons.project_workload.tests.common import TestWorkloadCommon | ||
|
||
|
||
class TestWorkload(TestWorkloadCommon): | ||
@classmethod | ||
def setUpClass(cls): | ||
super().setUpClass() | ||
cls.task_management, cls.task_review = cls.env["project.task"].create( | ||
[ | ||
{"name": "Management", "project_id": cls.project.id}, | ||
{"name": "Review", "project_id": cls.project.id}, | ||
] | ||
) | ||
cls.type_management, cls.type_review = cls.env[ | ||
"project.task.workload.addition.type" | ||
].create( | ||
[ | ||
{"name": "Management", "default_percentage": 15}, | ||
{"name": "Review", "default_percentage": 20}, | ||
] | ||
) | ||
cls.add_work_management, cls.add_work_review = cls.env[ | ||
"project.task.workload.addition" | ||
].create( | ||
[ | ||
{ | ||
"project_id": cls.project.id, | ||
"type_id": cls.type_management.id, | ||
"user_id": cls.user_1.id, | ||
"task_id": cls.task_management.id, | ||
}, | ||
{ | ||
"project_id": cls.project.id, | ||
"type_id": cls.type_review.id, | ||
"user_id": cls.user_2.id, | ||
"task_id": cls.task_review.id, | ||
}, | ||
] | ||
) | ||
|
||
def _create_task(self, user_id=None): | ||
now = datetime.now() | ||
return self.env["project.task"].create( | ||
{ | ||
"name": "Task 1", | ||
"project_id": self.project.id, | ||
"user_id": user_id, | ||
"date_start": now, | ||
"date_end": now + timedelta(days=20), | ||
"planned_hours": 21, | ||
} | ||
) | ||
|
||
def test_task_assign_with_hours(self): | ||
task = self._create_task(self.user_1.id) | ||
workloads = task.workload_ids | ||
|
||
self.assertEqual(len(workloads), 3) | ||
worload, workload_management, workload_review = workloads | ||
|
||
self.assertEqual(workload_management.date_start, task.date_start.date()) | ||
self.assertEqual(workload_management.date_end, task.date_end.date()) | ||
self.assertEqual(workload_management.hours, 3.15) | ||
self.assertEqual(workload_management.user_id, self.user_1) | ||
self.assertEqual( | ||
workload_management.additional_workload_id, self.add_work_management | ||
) | ||
|
||
self.assertEqual(workload_review.date_start, task.date_start.date()) | ||
self.assertEqual(workload_review.date_end, task.date_end.date()) | ||
self.assertEqual(workload_review.hours, 4.2) | ||
self.assertEqual(workload_review.user_id, self.user_2) | ||
self.assertEqual(workload_review.additional_workload_id, self.add_work_review) | ||
|
||
def _assert_only_additionnal_workload(self, workloads): | ||
self.assertEqual(len(workloads), 2) | ||
workload_management, workload_review = workloads | ||
self.assertEqual( | ||
workload_management.additional_workload_id, self.add_work_management | ||
) | ||
self.assertEqual(workload_review.additional_workload_id, self.add_work_review) | ||
|
||
def test_create_unasign_task(self): | ||
task = self._create_task(None) | ||
self._assert_only_additionnal_workload(task.workload_ids) | ||
|
||
def test_remove_user(self): | ||
task = self._create_task(self.user_1.id) | ||
task.user_id = False | ||
self._assert_only_additionnal_workload(task.workload_ids) | ||
|
||
def test_update_hours(self): | ||
task = self._create_task(self.user_1.id) | ||
task.planned_hours = 42 | ||
self.assertEqual(len(task.workload_ids), 3) | ||
worload, workload_management, workload_review = task.workload_ids | ||
self.assertEqual(workload_management.hours, 6.30) | ||
self.assertEqual(workload_review.hours, 8.4) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,26 +2,25 @@ | |
# @author Florian Mounier <[email protected]> | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||
|
||
from odoo import api, models | ||
from odoo import api, fields, models | ||
|
||
|
||
class ProjectTask(models.Model): | ||
_inherit = "project.task" | ||
|
||
def _prepare_task_dates_vals_from_milestone(self, vals): | ||
# If we create a task with a milestone or affect it after, | ||
# we set the task dates to the milestone dates | ||
date_start = fields.Datetime( | ||
compute="_compute_date_start_end", | ||
store=True, | ||
readonly=False, | ||
) | ||
date_end = fields.Datetime( | ||
compute="_compute_date_start_end", | ||
store=True, | ||
readonly=False, | ||
) | ||
|
||
if "milestone_id" in vals: | ||
milestone = self.env["project.milestone"].browse(vals["milestone_id"]) | ||
if milestone: | ||
vals["date_end"] = milestone.target_date | ||
vals["date_start"] = milestone.start_date | ||
return vals | ||
|
||
@api.model | ||
def create(self, vals): | ||
return super().create(self._prepare_task_dates_vals_from_milestone(vals)) | ||
|
||
def write(self, vals): | ||
return super().write(self._prepare_task_dates_vals_from_milestone(vals)) | ||
@api.depends("milestone_id.start_date", "milestone_id.target_date") | ||
def _compute_date_start_end(self): | ||
for record in self: | ||
record.date_end = record.milestone_id.target_date | ||
record.date_start = record.milestone_id.start_date |