Skip to content

Commit 0b18f9f

Browse files
[IMP] project_task_prioritize: add form view and today in formula paramenters.
1 parent 7f73663 commit 0b18f9f

File tree

7 files changed

+82
-34
lines changed

7 files changed

+82
-34
lines changed

project_task_prioritize/models/project.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class ProjectProject(models.Model):
1414
"# - prioritizer_sum: sum of prioritizer line values\n"
1515
"# - max_value: sum of max values from prioritizer categories\n"
1616
"# - allocated_hours: hours allocated to the project/task\n"
17+
"# - today: datetime.datetime.today()\n"
1718
"# - rec: current record (project/task)\n"
1819
"\n"
1920
"# Example:\n"

project_task_prioritize/models/project_task.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
# Copyright 2025 ForgeFlow S.L. (https://www.forgeflow.com)
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
import datetime
4+
import logging
5+
36
from odoo import api, fields, models
47
from odoo.tools.safe_eval import safe_eval
58

9+
_logger = logging.getLogger(__name__)
10+
611

712
class ProjectTask(models.Model):
813
_inherit = "project.task"
@@ -21,10 +26,12 @@ def _compute_prioritizer_value(self):
2126
"prioritizer_sum": prioritizer_sum,
2227
"max_value": max_value,
2328
"allocated_hours": rec.allocated_hours,
29+
"today": datetime.datetime.today(),
2430
"rec": rec,
2531
}
2632
formula = rec.project_id.prioritizer_formula or "0"
2733
try:
2834
rec.prioritizer_value = safe_eval(formula, locals_dict=locals_dict)
29-
except Exception:
35+
except Exception as e:
36+
_logger.error(e)
3037
rec.prioritizer_value = 0

project_task_prioritize/tests/test_prioritizer_category.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def setUp(self):
1010
self.PrioritizerCategory = self.env["prioritizer.category"]
1111
self.PrioritizerCategoryLine = self.env["prioritizer.category.line"]
1212

13-
def test_create_prioritizer_category(self):
13+
def test_01_create_prioritizer_category(self):
1414
"""Test creation of a prioritizer category with lines"""
1515
# Create a prioritizer category with lines
1616
category = self.PrioritizerCategory.create(
@@ -26,7 +26,7 @@ def test_create_prioritizer_category(self):
2626
self.assertEqual(len(category.prioritizer_category_line_ids), 3)
2727
self.assertEqual(category.max_value, 3)
2828

29-
def test_compute_max_value(self):
29+
def test_02_compute_max_value(self):
3030
"""Test computation of max_value field"""
3131
# Create a prioritizer category with lines
3232
category = self.PrioritizerCategory.create(
@@ -50,7 +50,7 @@ def test_compute_max_value(self):
5050
)
5151
self.assertEqual(category.max_value, 15)
5252

53-
def test_empty_category(self):
53+
def test_03_empty_category(self):
5454
"""Test behavior with empty category"""
5555
category = self.PrioritizerCategory.create({"name": "Empty Category"})
5656
self.assertEqual(category.max_value, 1) # Default value when no lines exist

project_task_prioritize/tests/test_project_task.py

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Copyright 2025 ForgeFlow S.L. (https://www.forgeflow.com)
22
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
33

4+
import datetime
5+
46
from odoo.tests import common
57

68

@@ -46,7 +48,7 @@ def setUp(self):
4648
}
4749
)
4850

49-
def test_task_prioritizer_value(self):
51+
def test_01_task_prioritizer_value(self):
5052
"""Test computation of prioritizer_value"""
5153
# Create a task
5254
task = self.ProjectTask.create(
@@ -74,7 +76,7 @@ def test_task_prioritizer_value(self):
7476
expected_value = (3 + 5) / (10 * (3 + 5 - (3 + 5) + 1)) # Default formula
7577
self.assertEqual(task.prioritizer_value, expected_value)
7678

77-
def test_custom_prioritizer_formula(self):
79+
def test_02_custom_prioritizer_formula(self):
7880
"""Test custom prioritizer formula"""
7981
# Set a custom formula
8082
custom_formula = "prioritizer_sum / allocated_hours"
@@ -103,7 +105,7 @@ def test_custom_prioritizer_formula(self):
103105
# Test with custom formula (3 + 5) / 4 = 2.0
104106
self.assertEqual(task.prioritizer_value, 2.0)
105107

106-
def test_invalid_formula(self):
108+
def test_03_invalid_formula(self):
107109
"""Test behavior with invalid formula"""
108110
# Set an invalid formula
109111
self.project.write(
@@ -127,3 +129,33 @@ def test_invalid_formula(self):
127129

128130
# Should default to 0 on error
129131
self.assertEqual(task.prioritizer_value, 0)
132+
133+
def test_04_using_today_value(self):
134+
"""Test custom prioritizer formula"""
135+
# Set a custom formula
136+
custom_formula = "(rec.date_deadline - today).days / allocated_hours"
137+
self.project.write({"prioritizer_formula": custom_formula})
138+
139+
# Create a task
140+
task = self.ProjectTask.create(
141+
{
142+
"name": "Custom Formula Task",
143+
"project_id": self.project.id,
144+
"allocated_hours": 4,
145+
"date_deadline": datetime.datetime.today() + datetime.timedelta(days=8),
146+
}
147+
)
148+
149+
# Assign prioritizer lines (High importance = 3, High urgency = 5)
150+
importance_high = self.category1.prioritizer_category_line_ids.filtered(
151+
lambda x: x.name == "High"
152+
)
153+
urgency_high = self.category2.prioritizer_category_line_ids.filtered(
154+
lambda x: x.name == "High"
155+
)
156+
task.write(
157+
{"prioritizer_line_ids": [(6, 0, (importance_high + urgency_high).ids)]}
158+
)
159+
160+
# Test with custom formula 7 / 4 = 1.75
161+
self.assertEqual(task.prioritizer_value, 1.75)

project_task_prioritize/tests/test_project_task_prioritizer.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def setUp(self):
4545
}
4646
)
4747

48-
def test_prioritizer_wizard_default_get(self):
48+
def test_01_prioritizer_wizard_default_get(self):
4949
"""Test default_get method of the wizard"""
5050
# Create wizard with task context
5151
wizard = self.ProjectTaskPrioritizer.with_context(
@@ -58,7 +58,7 @@ def test_prioritizer_wizard_default_get(self):
5858
self.assertIn(self.task1, wizard.task_ids)
5959
self.assertIn(self.task2, wizard.task_ids)
6060

61-
def test_prioritizer_wizard_validate(self):
61+
def test_02_prioritizer_wizard_validate(self):
6262
"""Test button_validate method of the wizard"""
6363
# Get category lines
6464
importance_high = self.category1.prioritizer_category_line_ids.filtered(
@@ -87,7 +87,7 @@ def test_prioritizer_wizard_validate(self):
8787
self.assertEqual(self.task1.prioritizer_line_ids, importance_high)
8888
self.assertEqual(self.task2.prioritizer_line_ids, importance_medium)
8989

90-
def test_prioritizer_wizard_no_tasks(self):
90+
def test_03_prioritizer_wizard_no_tasks(self):
9191
"""Test wizard with no tasks in context"""
9292
# Create wizard with no task context
9393
wizard = self.ProjectTaskPrioritizer.with_context(
@@ -98,15 +98,15 @@ def test_prioritizer_wizard_no_tasks(self):
9898
self.assertEqual(len(wizard.task_ids), 0)
9999
self.assertEqual(len(wizard.line_ids), 0)
100100

101-
def test_prioritizer_wizard_wrong_model(self):
101+
def test_04_prioritizer_wizard_wrong_model(self):
102102
"""Test wizard with wrong model in context"""
103103
# Should raise assertion for wrong model
104104
with self.assertRaises(AssertionError):
105105
self.ProjectTaskPrioritizer.with_context(
106106
active_model="wrong.model", active_ids=[1, 2, 3]
107107
).create({})
108108

109-
def test_prioritizer_wizard_line_creation(self):
109+
def test_05_prioritizer_wizard_line_creation(self):
110110
"""Test _get_matrix_lines method"""
111111
# Create a second category
112112
category2 = self.PrioritizerCategory.create(

project_task_prioritize/views/prioritizer_category_views.xml

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,36 @@
1414
</list>
1515
</field>
1616
</record>
17-
<record id="prioritizer_category_line_list" model="ir.ui.view">
18-
<field name="name">prioritizer.category.line.list</field>
19-
<field name="model">prioritizer.category.line</field>
17+
<record id="prioritizer_category_form" model="ir.ui.view">
18+
<field name="name">prioritizer.category.form</field>
19+
<field name="model">prioritizer.category</field>
2020
<field name="arch" type="xml">
21-
<list>
22-
<field name="prioritizer_category_id" />
23-
<field name="name" />
24-
<field name="value" />
25-
</list>
21+
<form>
22+
<sheet>
23+
<div class="oe_title">
24+
<h1 class="d-flex">
25+
<field name="name" placeholder="New Category" nolabel="1" />
26+
</h1>
27+
</div>
28+
<group>
29+
<field name="max_value" readonly="1" />
30+
</group>
31+
<notebook>
32+
<page name="category_lines" string="Category Lines">
33+
<field name="prioritizer_category_line_ids">
34+
<list editable="bottom">
35+
<field name="name" />
36+
<field name="value" />
37+
<field
38+
name="prioritizer_category_id"
39+
invisible="1"
40+
/>
41+
</list>
42+
</field>
43+
</page>
44+
</notebook>
45+
</sheet>
46+
</form>
2647
</field>
2748
</record>
2849

@@ -33,13 +54,6 @@
3354
<field name="target">main</field>
3455
<field name="view_id" ref="prioritizer_category_list" />
3556
</record>
36-
<record id="action_prioritizer_category_line" model="ir.actions.act_window">
37-
<field name="name">Prioritizer Category Line</field>
38-
<field name="res_model">prioritizer.category.line</field>
39-
<field name="view_mode">list,form</field>
40-
<field name="target">main</field>
41-
<field name="view_id" ref="prioritizer_category_line_list" />
42-
</record>
4357
<menuitem
4458
id="menu_prioritizer"
4559
parent="project.menu_project_config"
@@ -52,10 +66,4 @@
5266
action="action_prioritizer_category"
5367
sequence="1"
5468
/>
55-
<menuitem
56-
id="menu_action_prioritizer_category_line"
57-
parent="menu_prioritizer"
58-
action="action_prioritizer_category_line"
59-
sequence="2"
60-
/>
6169
</odoo>

project_task_prioritize/wizards/project_task_prioritizer_view.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<field
2828
name="prioritizer_category_line_id"
2929
options='{"no_create": True, "no_open": True}'
30-
domain="[('prioritizer_category_id','in', prioritizer_category_id)]"
30+
domain="[('prioritizer_category_id','=', prioritizer_category_id)]"
3131
/>
3232
<field name="task_id" invisible="1" />
3333
<field name="prioritizer_category_id" invisible="1" />

0 commit comments

Comments
 (0)