Skip to content

Commit a2fd815

Browse files
AnerAvanzoscanajuaristi
authored andcommitted
[18.0][ADD] project_milestone_usability: Creates menu for project milestones
1 parent da77592 commit a2fd815

10 files changed

Lines changed: 378 additions & 0 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
2+
:target: https://opensource.org/licenses/AGPL-3.0
3+
:alt: License: AGPL-3
4+
5+
===========================
6+
Project Milestone Usability
7+
===========================
8+
9+
This module improves the usability of project milestones in Odoo.
10+
11+
**Features**
12+
13+
- Menu under Project → Tasks to access Milestones.
14+
- Extends the milestone list view with billable status, completion status, task counts, missing tasks, UoM, quantities, project, customer, quantity percentage, reached date, sale line info, and deadline indicators (future/exceeded). Project and Customer columns are read-only here.
15+
- Stored computed field "Missing Tasks" (task_count - done_task_count).
16+
- Search view adds filters for Project, Customer, and "Has Missing Tasks" (> 0), plus group by Project and Customer.
17+
18+
**Quick usage**
19+
20+
1. Go to Project → Tasks → Milestones.
21+
2. Use the list view columns (optional show) to review/edit milestones; project/customer stay read-only.
22+
3. Filter by "Has Missing Tasks" to focus on pending work; group by Project or Customer as needed.
23+
24+
**Technical details**
25+
26+
- Model extension: `project.milestone` (stored computed `tasks_missing`).
27+
- Views: inherits the milestone list and adds a search view with filters/groups.
28+
- Action & menu: milestones action with list/form; menu under `project.menu_project_management`.
29+
- Dependencies: `project`, `sale_management`, `sale_project`.
30+
31+
Bug Tracker
32+
===========
33+
34+
Bugs are tracked on `GitHub Issues
35+
<https://github.com/avanzosc/project-addons/issues>`_.
36+
37+
Credits
38+
=======
39+
40+
Authors
41+
-------
42+
43+
* AvanzOSC
44+
45+
Contributors
46+
------------
47+
48+
* Aner Arregi <[email protected]>
49+
* Ana Juaristi <[email protected]>
50+
51+
Maintainer
52+
----------
53+
54+
This module is maintained by AvanzOSC.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
2+
:target: https://opensource.org/licenses/AGPL-3.0
3+
:alt: License: AGPL-3
4+
5+
===========================
6+
Project Milestone Usability
7+
===========================
8+
9+
This module improves the usability of project milestones in Odoo.
10+
11+
**Features**
12+
13+
- Menu under Project → Tasks to access Milestones.
14+
- Extends the milestone list view with billable status, completion status, task counts, missing tasks, UoM, quantities, project, customer, quantity percentage, reached date, sale line info, and deadline indicators (future/exceeded). Project and Customer columns are read-only here.
15+
- Stored computed field "Missing Tasks" (task_count - done_task_count).
16+
- Search view adds filters for Project, Customer, and "Has Missing Tasks" (> 0), plus group by Project and Customer.
17+
18+
**Quick usage**
19+
20+
1. Go to Project → Tasks → Milestones.
21+
2. Use the list view columns (optional show) to review/edit milestones; project/customer stay read-only.
22+
3. Filter by "Has Missing Tasks" to focus on pending work; group by Project or Customer as needed.
23+
24+
**Technical details**
25+
26+
- Model extension: `project.milestone` (stored computed `tasks_missing`).
27+
- Views: inherits the milestone list and adds a search view with filters/groups.
28+
- Action & menu: milestones action with list/form; menu under `project.menu_project_management`.
29+
- Dependencies: `project`, `sale_management`, `sale_project`.
30+
31+
Bug Tracker
32+
===========
33+
34+
Bugs are tracked on `GitHub Issues
35+
<https://github.com/avanzosc/project-addons/issues>`_.
36+
37+
Credits
38+
=======
39+
40+
Authors
41+
-------
42+
43+
* AvanzOSC
44+
45+
Contributors
46+
------------
47+
48+
* Aner Arregi <[email protected]>
49+
* Ana Juaristi <[email protected]>
50+
51+
Maintainer
52+
----------
53+
54+
This module is maintained by AvanzOSC.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import models
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Copyright 2025 Aner Arregi - AvanzOSC
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
3+
{
4+
"name": "Project Milestone Usability",
5+
"version": "18.0.1.0.0",
6+
"category": "Project",
7+
"summary": "Expose project milestones list with extra fields and filters",
8+
"depends": ["project", "sale_management", "sale_project"],
9+
"data": [
10+
"views/project_milestone_views.xml",
11+
],
12+
"application": False,
13+
"installable": True,
14+
"auto_install": False,
15+
"author": "AvanzOSC",
16+
"license": "AGPL-3",
17+
"website": "https://github.com/avanzosc/project-addons",
18+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Translation of Odoo Server.
2+
# This file contains the translation of the following modules:
3+
# * project_milestone_usability
4+
#
5+
msgid ""
6+
msgstr ""
7+
"Project-Id-Version: Odoo Server 18.0\n"
8+
"Report-Msgid-Bugs-To: \n"
9+
"POT-Creation-Date: 2025-12-18 00:00+0000\n"
10+
"PO-Revision-Date: 2025-12-18 00:00+0000\n"
11+
"Last-Translator: \n"
12+
"Language-Team: Spanish\n"
13+
"Language: es\n"
14+
"MIME-Version: 1.0\n"
15+
"Content-Type: text/plain; charset=UTF-8\n"
16+
"Content-Transfer-Encoding: 8bit\n"
17+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
18+
19+
#. module: project_milestone_usability
20+
#: model:ir.ui.menu,menu_project_milestone
21+
#: model:ir.actions.act_window,name:project_milestone_usability.action_project_milestone
22+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
23+
msgid "Milestones"
24+
msgstr "Hitos"
25+
26+
#. module: project_milestone_usability
27+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
28+
msgid "Has Missing Tasks"
29+
msgstr "Tiene tareas faltantes"
30+
31+
#. module: project_milestone_usability
32+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
33+
msgid "Project"
34+
msgstr "Proyecto"
35+
36+
#. module: project_milestone_usability
37+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
38+
msgid "Customer"
39+
msgstr "Cliente"
40+
41+
#. module: project_milestone_usability
42+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
43+
msgid "Tasks"
44+
msgstr "Tareas"
45+
46+
#. module: project_milestone_usability
47+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
48+
msgid "Done Tasks"
49+
msgstr "Tareas hechas"
50+
51+
#. module: project_milestone_usability
52+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
53+
#: model:ir.model.fields,field_description:project_milestone_usability.field_project_milestone_tasks_missing
54+
msgid "Missing Tasks"
55+
msgstr "Tareas faltantes"
56+
57+
#. module: project_milestone_usability
58+
#: model:ir.model.fields,help:project_milestone_usability.field_project_milestone_tasks_missing
59+
msgid "Difference between total tasks and completed tasks."
60+
msgstr "Diferencia entre el total de tareas y las tareas completadas."
61+
62+
#. module: project_milestone_usability
63+
#: model:ir.model,name:project_milestone_usability.model_project_milestone
64+
msgid "Project Milestone"
65+
msgstr "Hito de proyecto"
66+
67+
#. module: project_milestone_usability
68+
#: model:ir.ui.view,name:project_milestone_usability.view_project_milestone_tree_enhanced
69+
msgid "project.milestone.tree.enhanced"
70+
msgstr "project.milestone.tree.enhanced"
71+
72+
#. module: project_milestone_usability
73+
#: model:ir.ui.view,name:project_milestone_usability.view_project_milestone_search_enhanced
74+
msgid "project.milestone.search.enhanced"
75+
msgstr "project.milestone.search.enhanced"
76+
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Translation of Odoo Server.
2+
# This file contains the translation of the following modules:
3+
# * project_milestone_usability
4+
#
5+
msgid ""
6+
msgstr ""
7+
"Project-Id-Version: Odoo Server 18.0\n"
8+
"Report-Msgid-Bugs-To: \n"
9+
"POT-Creation-Date: 2025-12-18 00:00+0000\n"
10+
"PO-Revision-Date: 2025-12-18 00:00+0000\n"
11+
"Last-Translator: \n"
12+
"Language-Team: \n"
13+
"MIME-Version: 1.0\n"
14+
"Content-Type: text/plain; charset=UTF-8\n"
15+
"Content-Transfer-Encoding: 8bit\n"
16+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
17+
18+
#. module: project_milestone_usability
19+
#: model:ir.ui.menu,menu_project_milestone
20+
#: model:ir.actions.act_window,name:project_milestone_usability.action_project_milestone
21+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
22+
msgid "Milestones"
23+
msgstr ""
24+
25+
#. module: project_milestone_usability
26+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
27+
msgid "Has Missing Tasks"
28+
msgstr ""
29+
30+
#. module: project_milestone_usability
31+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
32+
msgid "Project"
33+
msgstr ""
34+
35+
#. module: project_milestone_usability
36+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
37+
msgid "Customer"
38+
msgstr ""
39+
40+
#. module: project_milestone_usability
41+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
42+
msgid "Tasks"
43+
msgstr ""
44+
45+
#. module: project_milestone_usability
46+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
47+
msgid "Done Tasks"
48+
msgstr ""
49+
50+
#. module: project_milestone_usability
51+
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
52+
#: model:ir.model.fields,field_description:project_milestone_usability.field_project_milestone_tasks_missing
53+
msgid "Missing Tasks"
54+
msgstr ""
55+
56+
#. module: project_milestone_usability
57+
#: model:ir.model.fields,help:project_milestone_usability.field_project_milestone_tasks_missing
58+
msgid "Difference between total tasks and completed tasks."
59+
msgstr ""
60+
61+
#. module: project_milestone_usability
62+
#: model:ir.model,name:project_milestone_usability.model_project_milestone
63+
msgid "Project Milestone"
64+
msgstr ""
65+
66+
#. module: project_milestone_usability
67+
#: model:ir.ui.view,name:project_milestone_usability.view_project_milestone_tree_enhanced
68+
msgid "project.milestone.tree.enhanced"
69+
msgstr ""
70+
71+
#. module: project_milestone_usability
72+
#: model:ir.ui.view,name:project_milestone_usability.view_project_milestone_search_enhanced
73+
msgid "project.milestone.search.enhanced"
74+
msgstr ""
75+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import milestone
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Copyright 2025 AvanzOSC
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
3+
4+
from odoo import api, fields, models
5+
6+
7+
class ProjectMilestone(models.Model):
8+
_inherit = "project.milestone"
9+
10+
tasks_missing = fields.Integer(
11+
string="Missing Tasks",
12+
compute="_compute_tasks_missing",
13+
store=True,
14+
help="Difference between total tasks and completed tasks.",
15+
)
16+
17+
@api.depends("task_count", "done_task_count")
18+
def _compute_tasks_missing(self):
19+
for milestone in self:
20+
milestone.tasks_missing = (milestone.task_count or 0) - (
21+
milestone.done_task_count or 0
22+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[build-system]
2+
requires = ["whool"]
3+
build-backend = "whool.buildapi"
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<odoo>
3+
<record id="view_project_milestone_tree_enhanced" model="ir.ui.view">
4+
<field name="name">project.milestone.tree.enhanced</field>
5+
<field name="model">project.milestone</field>
6+
<field name="inherit_id" ref="project.project_milestone_view_tree" />
7+
<field name="arch" type="xml">
8+
<xpath expr="//list/button" position="before">
9+
<field name="allow_billable" optional="show" />
10+
<field name="can_be_marked_as_done" optional="show" />
11+
<field name="task_count" string="Tasks" optional="show" />
12+
<field name="done_task_count" string="Done Tasks" optional="show" />
13+
<field name="tasks_missing" string="Missing Tasks" optional="show" />
14+
<field name="product_uom" optional="show" />
15+
<field name="product_uom_qty" optional="show" />
16+
<field name="project_id" optional="show" readonly="1" />
17+
<field
18+
name="project_partner_id"
19+
string="Customer"
20+
optional="show"
21+
readonly="1"
22+
/>
23+
<field name="quantity_percentage" optional="show" />
24+
<field name="reached_date" optional="show" />
25+
<field name="sale_line_display_name" optional="show" />
26+
<field name="is_deadline_exceeded" optional="show" />
27+
<field name="is_deadline_future" optional="show" />
28+
</xpath>
29+
</field>
30+
</record>
31+
32+
<record id="view_project_milestone_search_enhanced" model="ir.ui.view">
33+
<field name="name">project.milestone.search.enhanced</field>
34+
<field name="model">project.milestone</field>
35+
<field name="arch" type="xml">
36+
<search string="Milestones">
37+
<field name="project_id" />
38+
<field name="project_partner_id" string="Customer" />
39+
<filter
40+
name="missing_tasks"
41+
string="Has Missing Tasks"
42+
domain="[('tasks_missing', '>', 0)]"
43+
/>
44+
<separator />
45+
<filter
46+
name="group_project"
47+
string="Project"
48+
context="{'group_by': 'project_id'}"
49+
/>
50+
<filter
51+
name="group_customer"
52+
string="Customer"
53+
context="{'group_by': 'project_partner_id'}"
54+
/>
55+
</search>
56+
</field>
57+
</record>
58+
59+
<record id="action_project_milestone" model="ir.actions.act_window">
60+
<field name="name">Milestones</field>
61+
<field name="res_model">project.milestone</field>
62+
<field name="view_mode">list,form</field>
63+
<field name="view_id" ref="project.project_milestone_view_tree" />
64+
<field name="search_view_id" ref="view_project_milestone_search_enhanced" />
65+
</record>
66+
67+
<menuitem
68+
id="menu_project_milestone"
69+
name="Milestones"
70+
parent="project.menu_project_management"
71+
action="action_project_milestone"
72+
sequence="40"
73+
/>
74+
</odoo>

0 commit comments

Comments
 (0)