Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions project_milestone_usability/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://opensource.org/licenses/AGPL-3.0
:alt: License: AGPL-3

===========================
Project Milestone Usability
===========================

This module improves the usability of project milestones in Odoo.

**Features**

- Menu under Project → Tasks to access Milestones.
- 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.
- Stored computed field "Missing Tasks" (task_count - done_task_count).
- Search view adds filters for Project, Customer, and "Has Missing Tasks" (> 0), plus group by Project and Customer.

**Quick usage**

1. Go to Project → Tasks → Milestones.
2. Use the list view columns (optional show) to review/edit milestones; project/customer stay read-only.
3. Filter by "Has Missing Tasks" to focus on pending work; group by Project or Customer as needed.

**Technical details**

- Model extension: `project.milestone` (stored computed `tasks_missing`).
- Views: inherits the milestone list and adds a search view with filters/groups.
- Action & menu: milestones action with list/form; menu under `project.menu_project_management`.
- Dependencies: `project`, `sale_management`, `sale_project`.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues
<https://github.com/avanzosc/project-addons/issues>`_.

Credits
=======

Authors
-------

* AvanzOSC

Contributors
------------

* Aner Arregi <aneravanzosc@gmail.com>
* Ana Juaristi <anajuaristi@avanzosc.es>

Maintainer
----------

This module is maintained by AvanzOSC.
54 changes: 54 additions & 0 deletions project_milestone_usability/README.rts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://opensource.org/licenses/AGPL-3.0
:alt: License: AGPL-3

===========================
Project Milestone Usability
===========================

This module improves the usability of project milestones in Odoo.

**Features**

- Menu under Project → Tasks to access Milestones.
- 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.
- Stored computed field "Missing Tasks" (task_count - done_task_count).
- Search view adds filters for Project, Customer, and "Has Missing Tasks" (> 0), plus group by Project and Customer.

**Quick usage**

1. Go to Project → Tasks → Milestones.
2. Use the list view columns (optional show) to review/edit milestones; project/customer stay read-only.
3. Filter by "Has Missing Tasks" to focus on pending work; group by Project or Customer as needed.

**Technical details**

- Model extension: `project.milestone` (stored computed `tasks_missing`).
- Views: inherits the milestone list and adds a search view with filters/groups.
- Action & menu: milestones action with list/form; menu under `project.menu_project_management`.
- Dependencies: `project`, `sale_management`, `sale_project`.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues
<https://github.com/avanzosc/project-addons/issues>`_.

Credits
=======

Authors
-------

* AvanzOSC

Contributors
------------

* Aner Arregi <aneravanzosc@gmail.com>
* Ana Juaristi <anajuaristi@avanzosc.es>

Maintainer
----------

This module is maintained by AvanzOSC.
1 change: 1 addition & 0 deletions project_milestone_usability/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
18 changes: 18 additions & 0 deletions project_milestone_usability/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Copyright 2025 Aner Arregi - AvanzOSC
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Project Milestone Usability",
"version": "18.0.1.0.0",
"category": "Project",
"summary": "Expose project milestones list with extra fields and filters",
"depends": ["project", "sale_management", "sale_project"],
"data": [
"views/project_milestone_views.xml",
],
"application": False,
"installable": True,
"auto_install": False,
"author": "AvanzOSC",
"license": "AGPL-3",
"website": "https://github.com/avanzosc/project-addons",
}
76 changes: 76 additions & 0 deletions project_milestone_usability/i18n/es.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * project_milestone_usability
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-18 00:00+0000\n"
"PO-Revision-Date: 2025-12-18 00:00+0000\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. module: project_milestone_usability
#: model:ir.ui.menu,menu_project_milestone
#: model:ir.actions.act_window,name:project_milestone_usability.action_project_milestone
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
msgid "Milestones"
msgstr "Hitos"

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
msgid "Has Missing Tasks"
msgstr "Tiene tareas faltantes"

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
msgid "Project"
msgstr "Proyecto"

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
msgid "Customer"
msgstr "Cliente"

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
msgid "Tasks"
msgstr "Tareas"

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
msgid "Done Tasks"
msgstr "Tareas hechas"

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
#: model:ir.model.fields,field_description:project_milestone_usability.field_project_milestone_tasks_missing
msgid "Missing Tasks"
msgstr "Tareas faltantes"

#. module: project_milestone_usability
#: model:ir.model.fields,help:project_milestone_usability.field_project_milestone_tasks_missing
msgid "Difference between total tasks and completed tasks."
msgstr "Diferencia entre el total de tareas y las tareas completadas."

#. module: project_milestone_usability
#: model:ir.model,name:project_milestone_usability.model_project_milestone
msgid "Project Milestone"
msgstr "Hito de proyecto"

#. module: project_milestone_usability
#: model:ir.ui.view,name:project_milestone_usability.view_project_milestone_tree_enhanced
msgid "project.milestone.tree.enhanced"
msgstr "project.milestone.tree.enhanced"

#. module: project_milestone_usability
#: model:ir.ui.view,name:project_milestone_usability.view_project_milestone_search_enhanced
msgid "project.milestone.search.enhanced"
msgstr "project.milestone.search.enhanced"

75 changes: 75 additions & 0 deletions project_milestone_usability/i18n/project_milestone_usability.pot
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * project_milestone_usability
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-18 00:00+0000\n"
"PO-Revision-Date: 2025-12-18 00:00+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. module: project_milestone_usability
#: model:ir.ui.menu,menu_project_milestone
#: model:ir.actions.act_window,name:project_milestone_usability.action_project_milestone
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
msgid "Milestones"
msgstr ""

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
msgid "Has Missing Tasks"
msgstr ""

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
msgid "Project"
msgstr ""

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_search_enhanced
msgid "Customer"
msgstr ""

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
msgid "Tasks"
msgstr ""

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
msgid "Done Tasks"
msgstr ""

#. module: project_milestone_usability
#: model_terms:ir.ui.view,arch_db:project_milestone_usability.view_project_milestone_tree_enhanced
#: model:ir.model.fields,field_description:project_milestone_usability.field_project_milestone_tasks_missing
msgid "Missing Tasks"
msgstr ""

#. module: project_milestone_usability
#: model:ir.model.fields,help:project_milestone_usability.field_project_milestone_tasks_missing
msgid "Difference between total tasks and completed tasks."
msgstr ""

#. module: project_milestone_usability
#: model:ir.model,name:project_milestone_usability.model_project_milestone
msgid "Project Milestone"
msgstr ""

#. module: project_milestone_usability
#: model:ir.ui.view,name:project_milestone_usability.view_project_milestone_tree_enhanced
msgid "project.milestone.tree.enhanced"
msgstr ""

#. module: project_milestone_usability
#: model:ir.ui.view,name:project_milestone_usability.view_project_milestone_search_enhanced
msgid "project.milestone.search.enhanced"
msgstr ""

1 change: 1 addition & 0 deletions project_milestone_usability/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import milestone
22 changes: 22 additions & 0 deletions project_milestone_usability/models/milestone.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copyright 2025 AvanzOSC
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

from odoo import api, fields, models


class ProjectMilestone(models.Model):
_inherit = "project.milestone"

tasks_missing = fields.Integer(
string="Missing Tasks",
compute="_compute_tasks_missing",
store=True,
help="Difference between total tasks and completed tasks.",
)

@api.depends("task_count", "done_task_count")
def _compute_tasks_missing(self):
for milestone in self:
milestone.tasks_missing = (milestone.task_count or 0) - (
milestone.done_task_count or 0
)
3 changes: 3 additions & 0 deletions project_milestone_usability/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
74 changes: 74 additions & 0 deletions project_milestone_usability/views/project_milestone_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_project_milestone_tree_enhanced" model="ir.ui.view">
<field name="name">project.milestone.tree.enhanced</field>
<field name="model">project.milestone</field>
<field name="inherit_id" ref="project.project_milestone_view_tree" />
<field name="arch" type="xml">
<xpath expr="//list/button" position="before">
<field name="allow_billable" optional="show" />
<field name="can_be_marked_as_done" optional="show" />
<field name="task_count" string="Tasks" optional="show" />
<field name="done_task_count" string="Done Tasks" optional="show" />
<field name="tasks_missing" string="Missing Tasks" optional="show" />
<field name="product_uom" optional="show" />
<field name="product_uom_qty" optional="show" />
<field name="project_id" optional="show" readonly="1" />
<field
name="project_partner_id"
string="Customer"
optional="show"
readonly="1"
/>
<field name="quantity_percentage" optional="show" />
<field name="reached_date" optional="show" />
<field name="sale_line_display_name" optional="show" />
<field name="is_deadline_exceeded" optional="show" />
<field name="is_deadline_future" optional="show" />
</xpath>
</field>
</record>

<record id="view_project_milestone_search_enhanced" model="ir.ui.view">
<field name="name">project.milestone.search.enhanced</field>
<field name="model">project.milestone</field>
<field name="arch" type="xml">
<search string="Milestones">
<field name="project_id" />
<field name="project_partner_id" string="Customer" />
<filter
name="missing_tasks"
string="Has Missing Tasks"
domain="[('tasks_missing', '>', 0)]"
/>
<separator />
<filter
name="group_project"
string="Project"
context="{'group_by': 'project_id'}"
/>
<filter
name="group_customer"
string="Customer"
context="{'group_by': 'project_partner_id'}"
/>
</search>
</field>
</record>

<record id="action_project_milestone" model="ir.actions.act_window">
<field name="name">Milestones</field>
<field name="res_model">project.milestone</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="project.project_milestone_view_tree" />
<field name="search_view_id" ref="view_project_milestone_search_enhanced" />
</record>

<menuitem
id="menu_project_milestone"
name="Milestones"
parent="project.menu_project_management"
action="action_project_milestone"
sequence="40"
/>
</odoo>