From 02f7a0798e897f25915521c187d2f3de621af130 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Thu, 6 Nov 2025 19:06:29 -0300 Subject: [PATCH 01/11] [ADD] document_page_project_task: add new module --- document_page_project_task/README.rst | 262 ++++++++ document_page_project_task/__init__.py | 1 + document_page_project_task/__manifest__.py | 16 + document_page_project_task/models/__init__.py | 2 + .../models/document_page.py | 67 ++ .../models/project_task.py | 22 + document_page_project_task/pyproject.toml | 3 + .../readme/CONFIGURE.md | 24 + .../readme/CONTRIBUTORS.md | 2 + .../readme/DESCRIPTION.md | 23 + document_page_project_task/readme/USAGE.md | 79 +++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 593 ++++++++++++++++++ document_page_project_task/tests/__init__.py | 2 + .../tests/test_document_page.py | 185 ++++++ .../tests/test_project_task.py | 87 +++ .../views/document_page_views.xml | 40 ++ .../views/project_task_views.xml | 24 + 18 files changed, 1432 insertions(+) create mode 100644 document_page_project_task/README.rst create mode 100644 document_page_project_task/__init__.py create mode 100644 document_page_project_task/__manifest__.py create mode 100644 document_page_project_task/models/__init__.py create mode 100644 document_page_project_task/models/document_page.py create mode 100644 document_page_project_task/models/project_task.py create mode 100644 document_page_project_task/pyproject.toml create mode 100644 document_page_project_task/readme/CONFIGURE.md create mode 100644 document_page_project_task/readme/CONTRIBUTORS.md create mode 100644 document_page_project_task/readme/DESCRIPTION.md create mode 100644 document_page_project_task/readme/USAGE.md create mode 100644 document_page_project_task/static/description/icon.png create mode 100644 document_page_project_task/static/description/index.html create mode 100644 document_page_project_task/tests/__init__.py create mode 100644 document_page_project_task/tests/test_document_page.py create mode 100644 document_page_project_task/tests/test_project_task.py create mode 100644 document_page_project_task/views/document_page_views.xml create mode 100644 document_page_project_task/views/project_task_views.xml diff --git a/document_page_project_task/README.rst b/document_page_project_task/README.rst new file mode 100644 index 00000000000..d536358ed79 --- /dev/null +++ b/document_page_project_task/README.rst @@ -0,0 +1,262 @@ +========================== +Document Page Project Task +========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:792f27beb9e30e02336420e9ffafb95a1a3027dc4b2ff368b4d350c683de3b01 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github + :target: https://github.com/OCA/knowledge/tree/18.0/document_page_project_task + :alt: OCA/knowledge +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/knowledge-18-0/knowledge-18-0-document_page_project_task + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/knowledge&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the document page (wiki) functionality by allowing +you to link them directly to project tasks. + +Main Features +------------- + +- **Link Wiki Pages to Multiple Tasks**: Allows associating document + pages to one or more project tasks via a Many2many relationship +- **Automatic Project Filling**: When all linked tasks share the same + project, it is automatically filled on the document +- **Consistency Validation**: If a project is defined on the wiki page, + all linked tasks must belong to that project +- **Smart Filtering**: When a project is selected, only tasks from that + project are displayed for selection +- **Page Counter**: Displays the number of wiki pages linked to each + task directly in the task view + +Benefits +-------- + +- Organize project documentation hierarchically (Project → Tasks → Wiki) +- A single wiki page can document multiple related tasks (e.g., a spec + shared by several tasks) +- A task can reference multiple wiki pages for different aspects of its + work +- Keep documentation close to the work context (tasks) +- Quickly access all documentation related to a specific task + +Dependencies +------------ + +This module requires: + +- ``document_page_project``: Module that links document pages to + projects +- ``project``: Odoo's project management module + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +This module does not require additional configuration after +installation. It works automatically once installed. + +Installation +------------ + +1. Go to the **Apps** menu +2. Remove the "Apps" filter if necessary +3. Search for "Document Page Project Task" +4. Click **Install** + +Prerequisites +------------- + +Make sure the following modules are installed: + +- **Project** (base project module) +- **Document Page Project** (links wiki pages to projects) + +The system will automatically install the necessary dependencies during +installation. + +Permissions +----------- + +The module uses the same access permissions as the base modules: + +- Users with access to **Projects** can view and create wiki pages + linked to tasks +- Users with access to **Documents/Knowledge** can manage wiki page + content + +No additional permission configuration is required. + +Usage +===== + +This guide explains how to use the Document Page Project Task module to +link wiki pages to project tasks. + +Create a Wiki Page from a Task +------------------------------ + +**Method 1: From the Task** + +1. Go to the **Projects** module +2. Open the desired project and select a task +3. In the task view, locate the **Wiki Pages** button (book icon) +4. Click the button to see linked pages or create a new one +5. Click **Create** to add a new wiki page +6. The task and project will be automatically filled + +**Method 2: From the Wiki Page** + +1. Go to the **Knowledge** or **Documents** module +2. Create a new wiki page or edit an existing one +3. In the page form, you will see the fields: + + - **Project**: Select the project + - **Tasks**: Select one or more tasks (when a project is selected, + only tasks from that project are shown) + +4. Save the page + +Automatic Behaviors +------------------- + +**Automatic Project Filling** + +When you add tasks and no project is yet selected: + +- If all linked tasks belong to the same project, the **Project** field + is automatically filled + +**Task Filtering** + +When a project is selected: + +- Only tasks from that project appear in the task selection list +- Tasks from other projects are automatically removed from the list + +**Consistency Validation** + +The system validates that: + +- If a project is defined on the wiki page, all linked tasks must belong + to that project +- Attempting to link a task from a different project will be prevented + +**No Project Restriction** + +If no project is selected on the wiki page, tasks from any project can +be linked freely — useful for cross-project reference documents. + +Link a Page to Multiple Tasks +----------------------------- + +A wiki page can be linked to several tasks at the same time: + +1. Open or create a wiki page +2. In the **Tasks** field (shown as tags), add all relevant tasks +3. The page will appear in the **Wiki Pages** counter on each of those + tasks + +View Wiki Pages of a Task +------------------------- + +1. Access a project task +2. At the top of the form, you will see the **Wiki Pages** button with a + counter +3. The number indicates how many wiki pages are linked to the task +4. Click the button to see all linked pages + +Usage Examples +-------------- + +**Example 1: Shared Requirements Document** + +1. Create a wiki page "Functional Requirements" +2. Link it to tasks "Backend Implementation", "Frontend Implementation", + and "QA Testing" +3. All three tasks will reference the same documentation + +**Example 2: Technical Specification** + +1. Create a task "Develop Module X" +2. From the task, create multiple wiki pages: "Technical Spec", "API + Design", "Database Schema" +3. Each page is linked to the task and accessible via the Wiki Pages + button + +**Example 3: Cross-Task Reference** + +1. Create a wiki page without a project +2. Link tasks from different projects that share a common dependency or + context +3. The page acts as a cross-project reference document + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Escodoo + +Contributors +------------ + +- `ESCODOO `__: + + - Marcel Savegnago + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-marcelsavegnago| image:: https://github.com/marcelsavegnago.png?size=40px + :target: https://github.com/marcelsavegnago + :alt: marcelsavegnago + +Current `maintainer `__: + +|maintainer-marcelsavegnago| + +This module is part of the `OCA/knowledge `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/document_page_project_task/__init__.py b/document_page_project_task/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/document_page_project_task/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/document_page_project_task/__manifest__.py b/document_page_project_task/__manifest__.py new file mode 100644 index 00000000000..87775b7dc48 --- /dev/null +++ b/document_page_project_task/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2025 Escodoo +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Document Page Project Task", + "summary": "This module links document pages to project tasks", + "version": "18.0.2.0.0", + "category": "Project", + "author": "Escodoo, Odoo Community Association (OCA)", + "maintainers": ["marcelsavegnago"], + "website": "https://github.com/OCA/knowledge", + "license": "AGPL-3", + "depends": ["document_page_project"], + "data": ["views/document_page_views.xml", "views/project_task_views.xml"], + "installable": True, +} diff --git a/document_page_project_task/models/__init__.py b/document_page_project_task/models/__init__.py new file mode 100644 index 00000000000..6b90bf138ac --- /dev/null +++ b/document_page_project_task/models/__init__.py @@ -0,0 +1,2 @@ +from . import document_page +from . import project_task diff --git a/document_page_project_task/models/document_page.py b/document_page_project_task/models/document_page.py new file mode 100644 index 00000000000..9ed357890e1 --- /dev/null +++ b/document_page_project_task/models/document_page.py @@ -0,0 +1,67 @@ +# Copyright 2025 Marcel Savegnago - Escodoo +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class DocumentPage(models.Model): + _inherit = "document.page" + + task_ids = fields.Many2many( + string="Tasks", + comodel_name="project.task", + relation="document_page_project_task_rel", + column1="document_page_id", + column2="task_id", + ) + + @api.onchange("task_ids") + def _onchange_task_ids(self): + """If no project is set and all tasks share the same project, fill it.""" + if self.task_ids and not self.project_id: + projects = self.task_ids.mapped("project_id") + if len(projects) == 1: + self.project_id = projects + + @api.onchange("project_id") + def _onchange_project_id(self): + """Remove tasks that don't belong to the newly selected project.""" + if self.project_id and self.task_ids: + self.task_ids = self.task_ids.filtered( + lambda t: t.project_id == self.project_id + ) + + @api.constrains("task_ids", "project_id") + def _check_task_project_consistency(self): + """Ensure all linked tasks belong to the document's project.""" + for record in self: + if record.project_id and record.task_ids: + invalid_tasks = record.task_ids.filtered( + lambda t, r=record: t.project_id != r.project_id + ) + if invalid_tasks: + raise ValidationError( + _( + "All linked tasks must belong to the document's project " + "'%(project)s'. The following tasks belong to a different " + "project: %(tasks)s.", + project=record.project_id.name, + tasks=", ".join(invalid_tasks.mapped("name")), + ) + ) + + @api.model + def default_get(self, fields_list): + """Fill task_ids and project_id when created with default_task_id in context.""" + res = super().default_get(fields_list) + if "default_task_id" in self.env.context: + task = self.env["project.task"].browse( + self.env.context.get("default_task_id") + ) + if task.exists(): + if "task_ids" in fields_list: + res["task_ids"] = [(4, task.id)] + if "project_id" in fields_list and task.project_id: + res["project_id"] = task.project_id.id + return res diff --git a/document_page_project_task/models/project_task.py b/document_page_project_task/models/project_task.py new file mode 100644 index 00000000000..e11a5f64bba --- /dev/null +++ b/document_page_project_task/models/project_task.py @@ -0,0 +1,22 @@ +# Copyright 2025 Marcel Savegnago - Escodoo +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class ProjectTask(models.Model): + _inherit = "project.task" + + document_page_ids = fields.Many2many( + string="Wiki Pages", + comodel_name="document.page", + relation="document_page_project_task_rel", + column1="task_id", + column2="document_page_id", + ) + document_page_count = fields.Integer(compute="_compute_document_page_count") + + @api.depends("document_page_ids") + def _compute_document_page_count(self): + for rec in self: + rec.document_page_count = len(rec.document_page_ids) diff --git a/document_page_project_task/pyproject.toml b/document_page_project_task/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/document_page_project_task/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/document_page_project_task/readme/CONFIGURE.md b/document_page_project_task/readme/CONFIGURE.md new file mode 100644 index 00000000000..8fa021c31b7 --- /dev/null +++ b/document_page_project_task/readme/CONFIGURE.md @@ -0,0 +1,24 @@ +This module does not require additional configuration after installation. It works automatically once installed. + +## Installation + +1. Go to the **Apps** menu +2. Remove the "Apps" filter if necessary +3. Search for "Document Page Project Task" +4. Click **Install** + +## Prerequisites + +Make sure the following modules are installed: +* **Project** (base project module) +* **Document Page Project** (links wiki pages to projects) + +The system will automatically install the necessary dependencies during installation. + +## Permissions + +The module uses the same access permissions as the base modules: +* Users with access to **Projects** can view and create wiki pages linked to tasks +* Users with access to **Documents/Knowledge** can manage wiki page content + +No additional permission configuration is required. diff --git a/document_page_project_task/readme/CONTRIBUTORS.md b/document_page_project_task/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..efe359c4713 --- /dev/null +++ b/document_page_project_task/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [ESCODOO](https://escodoo.com.br): + - Marcel Savegnago \<\> diff --git a/document_page_project_task/readme/DESCRIPTION.md b/document_page_project_task/readme/DESCRIPTION.md new file mode 100644 index 00000000000..04004cf0c7c --- /dev/null +++ b/document_page_project_task/readme/DESCRIPTION.md @@ -0,0 +1,23 @@ +This module extends the document page (wiki) functionality by allowing you to link them directly to project tasks. + +## Main Features + +* **Link Wiki Pages to Multiple Tasks**: Allows associating document pages to one or more project tasks via a Many2many relationship +* **Automatic Project Filling**: When all linked tasks share the same project, it is automatically filled on the document +* **Consistency Validation**: If a project is defined on the wiki page, all linked tasks must belong to that project +* **Smart Filtering**: When a project is selected, only tasks from that project are displayed for selection +* **Page Counter**: Displays the number of wiki pages linked to each task directly in the task view + +## Benefits + +* Organize project documentation hierarchically (Project → Tasks → Wiki) +* A single wiki page can document multiple related tasks (e.g., a spec shared by several tasks) +* A task can reference multiple wiki pages for different aspects of its work +* Keep documentation close to the work context (tasks) +* Quickly access all documentation related to a specific task + +## Dependencies + +This module requires: +* `document_page_project`: Module that links document pages to projects +* `project`: Odoo's project management module diff --git a/document_page_project_task/readme/USAGE.md b/document_page_project_task/readme/USAGE.md new file mode 100644 index 00000000000..d6bea95a9e5 --- /dev/null +++ b/document_page_project_task/readme/USAGE.md @@ -0,0 +1,79 @@ +This guide explains how to use the Document Page Project Task module to link wiki pages to project tasks. + +## Create a Wiki Page from a Task + +**Method 1: From the Task** + +1. Go to the **Projects** module +2. Open the desired project and select a task +3. In the task view, locate the **Wiki Pages** button (book icon) +4. Click the button to see linked pages or create a new one +5. Click **Create** to add a new wiki page +6. The task and project will be automatically filled + +**Method 2: From the Wiki Page** + +1. Go to the **Knowledge** or **Documents** module +2. Create a new wiki page or edit an existing one +3. In the page form, you will see the fields: + * **Project**: Select the project + * **Tasks**: Select one or more tasks (when a project is selected, only tasks from that project are shown) +4. Save the page + +## Automatic Behaviors + +**Automatic Project Filling** + +When you add tasks and no project is yet selected: +* If all linked tasks belong to the same project, the **Project** field is automatically filled + +**Task Filtering** + +When a project is selected: +* Only tasks from that project appear in the task selection list +* Tasks from other projects are automatically removed from the list + +**Consistency Validation** + +The system validates that: +* If a project is defined on the wiki page, all linked tasks must belong to that project +* Attempting to link a task from a different project will be prevented + +**No Project Restriction** + +If no project is selected on the wiki page, tasks from any project can be linked freely — useful for cross-project reference documents. + +## Link a Page to Multiple Tasks + +A wiki page can be linked to several tasks at the same time: + +1. Open or create a wiki page +2. In the **Tasks** field (shown as tags), add all relevant tasks +3. The page will appear in the **Wiki Pages** counter on each of those tasks + +## View Wiki Pages of a Task + +1. Access a project task +2. At the top of the form, you will see the **Wiki Pages** button with a counter +3. The number indicates how many wiki pages are linked to the task +4. Click the button to see all linked pages + +## Usage Examples + +**Example 1: Shared Requirements Document** + +1. Create a wiki page "Functional Requirements" +2. Link it to tasks "Backend Implementation", "Frontend Implementation", and "QA Testing" +3. All three tasks will reference the same documentation + +**Example 2: Technical Specification** + +1. Create a task "Develop Module X" +2. From the task, create multiple wiki pages: "Technical Spec", "API Design", "Database Schema" +3. Each page is linked to the task and accessible via the Wiki Pages button + +**Example 3: Cross-Task Reference** + +1. Create a wiki page without a project +2. Link tasks from different projects that share a common dependency or context +3. The page acts as a cross-project reference document diff --git a/document_page_project_task/static/description/icon.png b/document_page_project_task/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/document_page_project_task/static/description/index.html b/document_page_project_task/static/description/index.html new file mode 100644 index 00000000000..44af33577d2 --- /dev/null +++ b/document_page_project_task/static/description/index.html @@ -0,0 +1,593 @@ + + + + + +Document Page Project Task + + + +
+

Document Page Project Task

+ + +

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

+

This module extends the document page (wiki) functionality by allowing +you to link them directly to project tasks.

+
+

Main Features

+
    +
  • Link Wiki Pages to Multiple Tasks: Allows associating document +pages to one or more project tasks via a Many2many relationship
  • +
  • Automatic Project Filling: When all linked tasks share the same +project, it is automatically filled on the document
  • +
  • Consistency Validation: If a project is defined on the wiki page, +all linked tasks must belong to that project
  • +
  • Smart Filtering: When a project is selected, only tasks from that +project are displayed for selection
  • +
  • Page Counter: Displays the number of wiki pages linked to each +task directly in the task view
  • +
+
+
+

Benefits

+
    +
  • Organize project documentation hierarchically (Project → Tasks → Wiki)
  • +
  • A single wiki page can document multiple related tasks (e.g., a spec +shared by several tasks)
  • +
  • A task can reference multiple wiki pages for different aspects of its +work
  • +
  • Keep documentation close to the work context (tasks)
  • +
  • Quickly access all documentation related to a specific task
  • +
+
+
+

Dependencies

+

This module requires:

+
    +
  • document_page_project: Module that links document pages to +projects
  • +
  • project: Odoo’s project management module
  • +
+

Table of contents

+ +
+

Configuration

+

This module does not require additional configuration after +installation. It works automatically once installed.

+
+
+
+

Installation

+
    +
  1. Go to the Apps menu
  2. +
  3. Remove the “Apps” filter if necessary
  4. +
  5. Search for “Document Page Project Task”
  6. +
  7. Click Install
  8. +
+
+
+

Prerequisites

+

Make sure the following modules are installed:

+
    +
  • Project (base project module)
  • +
  • Document Page Project (links wiki pages to projects)
  • +
+

The system will automatically install the necessary dependencies during +installation.

+
+
+

Permissions

+

The module uses the same access permissions as the base modules:

+
    +
  • Users with access to Projects can view and create wiki pages +linked to tasks
  • +
  • Users with access to Documents/Knowledge can manage wiki page +content
  • +
+

No additional permission configuration is required.

+
+

Usage

+

This guide explains how to use the Document Page Project Task module to +link wiki pages to project tasks.

+
+
+
+

Create a Wiki Page from a Task

+

Method 1: From the Task

+
    +
  1. Go to the Projects module
  2. +
  3. Open the desired project and select a task
  4. +
  5. In the task view, locate the Wiki Pages button (book icon)
  6. +
  7. Click the button to see linked pages or create a new one
  8. +
  9. Click Create to add a new wiki page
  10. +
  11. The task and project will be automatically filled
  12. +
+

Method 2: From the Wiki Page

+
    +
  1. Go to the Knowledge or Documents module
  2. +
  3. Create a new wiki page or edit an existing one
  4. +
  5. In the page form, you will see the fields:
      +
    • Project: Select the project
    • +
    • Tasks: Select one or more tasks (when a project is selected, +only tasks from that project are shown)
    • +
    +
  6. +
  7. Save the page
  8. +
+
+
+

Automatic Behaviors

+

Automatic Project Filling

+

When you add tasks and no project is yet selected:

+
    +
  • If all linked tasks belong to the same project, the Project field +is automatically filled
  • +
+

Task Filtering

+

When a project is selected:

+
    +
  • Only tasks from that project appear in the task selection list
  • +
  • Tasks from other projects are automatically removed from the list
  • +
+

Consistency Validation

+

The system validates that:

+
    +
  • If a project is defined on the wiki page, all linked tasks must belong +to that project
  • +
  • Attempting to link a task from a different project will be prevented
  • +
+

No Project Restriction

+

If no project is selected on the wiki page, tasks from any project can +be linked freely — useful for cross-project reference documents.

+
+ +
+

View Wiki Pages of a Task

+
    +
  1. Access a project task
  2. +
  3. At the top of the form, you will see the Wiki Pages button with a +counter
  4. +
  5. The number indicates how many wiki pages are linked to the task
  6. +
  7. Click the button to see all linked pages
  8. +
+
+
+

Usage Examples

+

Example 1: Shared Requirements Document

+
    +
  1. Create a wiki page “Functional Requirements”
  2. +
  3. Link it to tasks “Backend Implementation”, “Frontend Implementation”, +and “QA Testing”
  4. +
  5. All three tasks will reference the same documentation
  6. +
+

Example 2: Technical Specification

+
    +
  1. Create a task “Develop Module X”
  2. +
  3. From the task, create multiple wiki pages: “Technical Spec”, “API +Design”, “Database Schema”
  4. +
  5. Each page is linked to the task and accessible via the Wiki Pages +button
  6. +
+

Example 3: Cross-Task Reference

+
    +
  1. Create a wiki page without a project
  2. +
  3. Link tasks from different projects that share a common dependency or +context
  4. +
  5. The page acts as a cross-project reference document
  6. +
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+
+
+

Authors

+
    +
  • Escodoo
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

marcelsavegnago

+

This module is part of the OCA/knowledge project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+ + diff --git a/document_page_project_task/tests/__init__.py b/document_page_project_task/tests/__init__.py new file mode 100644 index 00000000000..8a79e33d2ee --- /dev/null +++ b/document_page_project_task/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_project_task +from . import test_document_page diff --git a/document_page_project_task/tests/test_document_page.py b/document_page_project_task/tests/test_document_page.py new file mode 100644 index 00000000000..3ba175c1496 --- /dev/null +++ b/document_page_project_task/tests/test_document_page.py @@ -0,0 +1,185 @@ +# Copyright 2025 Marcel Savegnago - Escodoo +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo.exceptions import ValidationError +from odoo.tests import common + + +class TestDocumentPage(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.Page = cls.env["document.page"] + cls.Project = cls.env["project.project"] + cls.Task = cls.env["project.task"] + + cls.project1 = cls.Project.create({"name": "Project 1"}) + cls.project2 = cls.Project.create({"name": "Project 2"}) + cls.task1 = cls.Task.create({"name": "Task 1", "project_id": cls.project1.id}) + cls.task2 = cls.Task.create({"name": "Task 2", "project_id": cls.project2.id}) + cls.task3 = cls.Task.create({"name": "Task 3", "project_id": cls.project1.id}) + + def test_onchange_task_ids_fills_project_single_project(self): + """When all tasks share the same project, it is auto-filled.""" + page = self.Page.new({"name": "Test Page"}) + page.task_ids = self.task1 | self.task3 + page._onchange_task_ids() + + self.assertEqual( + page.project_id, + self.project1, + "Project should be auto-filled when all tasks share the same project", + ) + + def test_onchange_task_ids_does_not_fill_project_multiple_projects(self): + """When tasks span different projects, project is not auto-filled.""" + page = self.Page.new({"name": "Test Page"}) + page.task_ids = self.task1 | self.task2 + page._onchange_task_ids() + + self.assertFalse( + page.project_id, + "Project should not be auto-filled when tasks belong to different projects", + ) + + def test_onchange_task_ids_skips_when_project_already_set(self): + """When project is already set, onchange does not overwrite it.""" + page = self.Page.new({"name": "Test Page", "project_id": self.project1.id}) + page.task_ids = self.task1 + page._onchange_task_ids() + + self.assertEqual( + page.project_id, + self.project1, + "Existing project should not be overwritten by onchange", + ) + + def test_onchange_project_id_filters_incompatible_tasks(self): + """When project changes, tasks not belonging to it are removed.""" + page = self.Page.new( + { + "name": "Test Page", + "task_ids": [(4, self.task1.id), (4, self.task2.id)], + } + ) + page.project_id = self.project1 + page._onchange_project_id() + + self.assertIn(self.task1.id, page.task_ids.ids) + self.assertNotIn( + self.task2.id, + page.task_ids.ids, + "Task from a different project should be removed after project change", + ) + + def test_onchange_project_id_keeps_compatible_tasks(self): + """Tasks already belonging to the selected project are kept.""" + page = self.Page.new( + { + "name": "Test Page", + "project_id": self.project1.id, + "task_ids": [(4, self.task1.id), (4, self.task3.id)], + } + ) + page._onchange_project_id() + + self.assertIn(self.task1.id, page.task_ids.ids) + self.assertIn(self.task3.id, page.task_ids.ids) + + def test_onchange_project_cleared_keeps_tasks(self): + """Clearing the project does not remove linked tasks.""" + page = self.Page.new( + { + "name": "Test Page", + "project_id": self.project1.id, + "task_ids": [(4, self.task1.id)], + } + ) + page.project_id = False + page._onchange_project_id() + + self.assertIn( + self.task1.id, + page.task_ids.ids, + "Tasks should be kept when project is cleared", + ) + + def test_default_get_with_task_in_context(self): + """default_get fills task_ids and project_id from default_task_id context.""" + context = {"default_task_id": self.task1.id} + fields_list = ["name", "project_id", "task_ids"] + defaults = self.Page.with_context(**context).default_get(fields_list) + + self.assertEqual( + defaults.get("project_id"), + self.project1.id, + "project_id should be filled from the context task's project", + ) + self.assertIn( + (4, self.task1.id), + defaults.get("task_ids", []), + "task_ids should contain the task from context", + ) + + def test_constraint_valid_tasks_same_project(self): + """Creating a page with tasks all from the same project is allowed.""" + page = self.Page.create( + { + "name": "Test Page", + "project_id": self.project1.id, + "task_ids": [(4, self.task1.id), (4, self.task3.id)], + } + ) + self.assertTrue(page.exists()) + + def test_constraint_invalid_task_different_project(self): + """Linking a task from a different project raises ValidationError.""" + with self.assertRaises(ValidationError): + self.Page.create( + { + "name": "Test Page", + "project_id": self.project1.id, + "task_ids": [(4, self.task2.id)], + } + ) + + def test_constraint_no_project_allows_any_tasks(self): + """Without project_id, tasks from any project can be linked.""" + page = self.Page.create( + { + "name": "Test Page", + "task_ids": [(4, self.task1.id), (4, self.task2.id)], + } + ) + self.assertTrue(page.exists()) + + def test_constraint_no_tasks_no_project(self): + """A page with no tasks and no project is valid.""" + page = self.Page.create({"name": "Test Page"}) + self.assertTrue(page.exists()) + + def test_write_adding_incompatible_task_raises(self): + """Writing a task from a different project raises ValidationError.""" + page = self.Page.create( + { + "name": "Test Page", + "project_id": self.project1.id, + "task_ids": [(4, self.task1.id)], + } + ) + with self.assertRaises(ValidationError): + page.write({"task_ids": [(4, self.task2.id)]}) + + def test_create_page_with_multiple_tasks_same_project(self): + """A page can be linked to multiple tasks from the same project.""" + page = self.Page.create( + { + "name": "Test Page", + "project_id": self.project1.id, + "task_ids": [(4, self.task1.id), (4, self.task3.id)], + } + ) + self.assertEqual(len(page.task_ids), 2) + self.assertIn(self.task1, page.task_ids) + self.assertIn(self.task3, page.task_ids) diff --git a/document_page_project_task/tests/test_project_task.py b/document_page_project_task/tests/test_project_task.py new file mode 100644 index 00000000000..59b6da2f913 --- /dev/null +++ b/document_page_project_task/tests/test_project_task.py @@ -0,0 +1,87 @@ +# Copyright 2025 Marcel Savegnago - Escodoo +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo.tests import common + + +class TestProjectTask(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.Page = cls.env["document.page"] + cls.Project = cls.env["project.project"] + cls.Task = cls.env["project.task"] + + cls.project = cls.Project.create({"name": "Test Project"}) + cls.task = cls.Task.create({"name": "Test Task", "project_id": cls.project.id}) + cls.default_page = cls.Page.create({"name": "My page"}) + + def test_page_count(self): + """Page counter starts at zero and increments when a page is linked.""" + self.assertEqual( + self.task.document_page_count, + 0, + "Initial page count should be zero", + ) + + self.default_page.write( + { + "project_id": self.task.project_id.id, + "task_ids": [(4, self.task.id)], + } + ) + self.task._compute_document_page_count() + + self.assertEqual( + self.task.document_page_count, + 1, + "After linking a page to the task, count should be one", + ) + self.assertIn( + self.default_page, + self.task.document_page_ids, + "The page should appear in the task's document_page_ids", + ) + + def test_page_count_multiple_pages(self): + """Counter reflects the correct total when multiple pages are linked.""" + page2 = self.Page.create( + { + "name": "Second page", + "project_id": self.task.project_id.id, + "task_ids": [(4, self.task.id)], + } + ) + page3 = self.Page.create( + { + "name": "Third page", + "project_id": self.task.project_id.id, + "task_ids": [(4, self.task.id)], + } + ) + + self.task._compute_document_page_count() + + self.assertEqual( + self.task.document_page_count, + 2, + "Count should be two with two pages associated", + ) + self.assertIn(page2, self.task.document_page_ids) + self.assertIn(page3, self.task.document_page_ids) + + def test_page_linked_to_multiple_tasks(self): + """A single page can be linked to multiple tasks via M2M.""" + task2 = self.Task.create({"name": "Task 2", "project_id": self.project.id}) + page = self.Page.create( + { + "name": "Shared page", + "project_id": self.project.id, + "task_ids": [(4, self.task.id), (4, task2.id)], + } + ) + + self.assertIn(page, self.task.document_page_ids) + self.assertIn(page, task2.document_page_ids) + self.assertEqual(len(page.task_ids), 2) diff --git a/document_page_project_task/views/document_page_views.xml b/document_page_project_task/views/document_page_views.xml new file mode 100644 index 00000000000..5592a2e9122 --- /dev/null +++ b/document_page_project_task/views/document_page_views.xml @@ -0,0 +1,40 @@ + + + + document.page.form - document_page_project_task + document.page + + + + + + + + + Task Wiki + document.page + [('type','=','content'), ('task_ids', 'in', [active_id])] + { + 'default_type': 'content', + 'default_task_id': active_id} + list,form + + + +

+ Click to create a new web page. +

+
+
+
diff --git a/document_page_project_task/views/project_task_views.xml b/document_page_project_task/views/project_task_views.xml new file mode 100644 index 00000000000..24b8d815f76 --- /dev/null +++ b/document_page_project_task/views/project_task_views.xml @@ -0,0 +1,24 @@ + + + + project.task.form - document_page_project_task + project.task + + +
+ +
+
+
+
From 2aaa6c9e8d609f7d13bba43465cb20898f9be45b Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 21 Apr 2026 04:44:20 +0000 Subject: [PATCH 02/11] [UPD] Update document_page_project_task.pot --- .../i18n/document_page_project_task.pot | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 document_page_project_task/i18n/document_page_project_task.pot diff --git a/document_page_project_task/i18n/document_page_project_task.pot b/document_page_project_task/i18n/document_page_project_task.pot new file mode 100644 index 00000000000..37798e5c517 --- /dev/null +++ b/document_page_project_task/i18n/document_page_project_task.pot @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_project_task +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: document_page_project_task +#. odoo-python +#: code:addons/document_page_project_task/models/document_page.py:0 +msgid "" +"All linked tasks must belong to the document's project '%(project)s'. The " +"following tasks belong to a different project: %(tasks)s." +msgstr "" + +#. module: document_page_project_task +#: model_terms:ir.actions.act_window,help:document_page_project_task.action_document_page_tasks +msgid "Click to create a new web page." +msgstr "" + +#. module: document_page_project_task +#: model:ir.model,name:document_page_project_task.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_count +msgid "Document Page Count" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model,name:document_page_project_task.model_project_task +msgid "Task" +msgstr "" + +#. module: document_page_project_task +#: model:ir.actions.act_window,name:document_page_project_task.action_document_page_tasks +msgid "Task Wiki" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_document_page__task_ids +msgid "Tasks" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_ids +#: model_terms:ir.ui.view,arch_db:document_page_project_task.view_task_form2 +msgid "Wiki Pages" +msgstr "" From 6ad695143c9bb3787490a2c74973a20505be1554 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 21 Apr 2026 04:46:48 +0000 Subject: [PATCH 03/11] [BOT] post-merge updates --- document_page_project_task/README.rst | 8 ++- .../static/description/index.html | 52 +++++++++++-------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/document_page_project_task/README.rst b/document_page_project_task/README.rst index d536358ed79..3bd2d086ece 100644 --- a/document_page_project_task/README.rst +++ b/document_page_project_task/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ========================== Document Page Project Task ========================== @@ -7,13 +11,13 @@ Document Page Project Task !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:792f27beb9e30e02336420e9ffafb95a1a3027dc4b2ff368b4d350c683de3b01 + !! source digest: sha256:f14fb8adbf76ea1407bbbb520b91ca4eca922fcdf8050b7e89042d123315efc3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github diff --git a/document_page_project_task/static/description/index.html b/document_page_project_task/static/description/index.html index 44af33577d2..f386155a5f6 100644 --- a/document_page_project_task/static/description/index.html +++ b/document_page_project_task/static/description/index.html @@ -3,7 +3,7 @@ -Document Page Project Task +README.rst -
-

Document Page Project Task

+
+ + +Odoo Community Association + +
+

Document Page Project Task

-

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

This module extends the document page (wiki) functionality by allowing you to link them directly to project tasks.

-

Main Features

+

Main Features

  • Link Wiki Pages to Multiple Tasks: Allows associating document pages to one or more project tasks via a Many2many relationship
  • @@ -388,7 +393,7 @@

    Main Features

-

Benefits

+

Benefits

  • Organize project documentation hierarchically (Project → Tasks → Wiki)
  • A single wiki page can document multiple related tasks (e.g., a spec @@ -400,7 +405,7 @@

    Benefits

-

Dependencies

+

Dependencies

This module requires:

  • document_page_project: Module that links document pages to @@ -414,13 +419,13 @@

    Dependencies

-

Configuration

+

Configuration

This module does not require additional configuration after installation. It works automatically once installed.

-

Installation

+

Installation

  1. Go to the Apps menu
  2. Remove the “Apps” filter if necessary
  3. @@ -429,7 +434,7 @@

    Installation

-

Prerequisites

+

Prerequisites

Make sure the following modules are installed:

  • Project (base project module)
  • @@ -439,7 +444,7 @@

    Prerequisites

    installation.

-

Permissions

+

Permissions

The module uses the same access permissions as the base modules:

  • Users with access to Projects can view and create wiki pages @@ -449,13 +454,13 @@

    Permissions

No additional permission configuration is required.

-

Usage

+

Usage

This guide explains how to use the Document Page Project Task module to link wiki pages to project tasks.

-

Create a Wiki Page from a Task

+

Create a Wiki Page from a Task

Method 1: From the Task

  1. Go to the Projects module
  2. @@ -479,7 +484,7 @@

    Create a Wiki Page from a Task

-

Automatic Behaviors

+

Automatic Behaviors

Automatic Project Filling

When you add tasks and no project is yet selected:

    @@ -504,7 +509,7 @@

    Automatic Behaviors

    be linked freely — useful for cross-project reference documents.

-

View Wiki Pages of a Task

+

View Wiki Pages of a Task

  1. Access a project task
  2. At the top of the form, you will see the Wiki Pages button with a @@ -524,7 +529,7 @@

    View Wiki Pages of a Task

-

Usage Examples

+

Usage Examples

Example 1: Shared Requirements Document

  1. Create a wiki page “Functional Requirements”
  2. @@ -548,7 +553,7 @@

    Usage Examples

  3. The page acts as a cross-project reference document
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -556,17 +561,17 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Escodoo
-

Contributors

+

Contributors

+
From edd7b6bc0f82dba244d69af6063d6a5874a9425c Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 21 Apr 2026 07:24:46 +0000 Subject: [PATCH 04/11] Added translation using Weblate (Italian) --- document_page_project_task/i18n/it.po | 59 +++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 document_page_project_task/i18n/it.po diff --git a/document_page_project_task/i18n/it.po b/document_page_project_task/i18n/it.po new file mode 100644 index 00000000000..dfe66abc46b --- /dev/null +++ b/document_page_project_task/i18n/it.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_project_task +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: document_page_project_task +#. odoo-python +#: code:addons/document_page_project_task/models/document_page.py:0 +msgid "" +"All linked tasks must belong to the document's project '%(project)s'. The " +"following tasks belong to a different project: %(tasks)s." +msgstr "" + +#. module: document_page_project_task +#: model_terms:ir.actions.act_window,help:document_page_project_task.action_document_page_tasks +msgid "Click to create a new web page." +msgstr "" + +#. module: document_page_project_task +#: model:ir.model,name:document_page_project_task.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_count +msgid "Document Page Count" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model,name:document_page_project_task.model_project_task +msgid "Task" +msgstr "" + +#. module: document_page_project_task +#: model:ir.actions.act_window,name:document_page_project_task.action_document_page_tasks +msgid "Task Wiki" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_document_page__task_ids +msgid "Tasks" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_ids +#: model_terms:ir.ui.view,arch_db:document_page_project_task.view_task_form2 +msgid "Wiki Pages" +msgstr "" From e958b0b3621558b133408e28587ce9ebb6593be4 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 21 Apr 2026 08:44:05 +0000 Subject: [PATCH 05/11] Translated using Weblate (Italian) Currently translated at 100.0% (8 of 8 strings) Translation: knowledge-18.0/knowledge-18.0-document_page_project_task Translate-URL: https://translation.odoo-community.org/projects/knowledge-18-0/knowledge-18-0-document_page_project_task/it/ --- document_page_project_task/i18n/it.po | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/document_page_project_task/i18n/it.po b/document_page_project_task/i18n/it.po index dfe66abc46b..1a6de26d444 100644 --- a/document_page_project_task/i18n/it.po +++ b/document_page_project_task/i18n/it.po @@ -6,13 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-04-21 10:45+0000\n" +"Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: document_page_project_task #. odoo-python @@ -21,39 +23,42 @@ msgid "" "All linked tasks must belong to the document's project '%(project)s'. The " "following tasks belong to a different project: %(tasks)s." msgstr "" +"Tutte le attività collegate devono appartenere al progetto del documento '%" +"(project)s'. Le seguenti attività appartengono a un progetto diverso: %" +"(tasks)s." #. module: document_page_project_task #: model_terms:ir.actions.act_window,help:document_page_project_task.action_document_page_tasks msgid "Click to create a new web page." -msgstr "" +msgstr "Fare clic per creare una nuova pagina web." #. module: document_page_project_task #: model:ir.model,name:document_page_project_task.model_document_page msgid "Document Page" -msgstr "" +msgstr "Pagina documento" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_count msgid "Document Page Count" -msgstr "" +msgstr "Conteggio pagina documento" #. module: document_page_project_task #: model:ir.model,name:document_page_project_task.model_project_task msgid "Task" -msgstr "" +msgstr "Lavoro" #. module: document_page_project_task #: model:ir.actions.act_window,name:document_page_project_task.action_document_page_tasks msgid "Task Wiki" -msgstr "" +msgstr "WiKi lavoro" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_document_page__task_ids msgid "Tasks" -msgstr "" +msgstr "Lavori" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_ids #: model_terms:ir.ui.view,arch_db:document_page_project_task.view_task_form2 msgid "Wiki Pages" -msgstr "" +msgstr "Pagine Wiki" From 9e0eed5d2430acb923a993aefcd4a3ff580c5a84 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Sun, 7 Jun 2026 11:38:19 +0000 Subject: [PATCH 06/11] Added translation using Weblate (Slovenian) --- document_page_project_task/i18n/sl.po | 60 +++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 document_page_project_task/i18n/sl.po diff --git a/document_page_project_task/i18n/sl.po b/document_page_project_task/i18n/sl.po new file mode 100644 index 00000000000..a2ebe5355ca --- /dev/null +++ b/document_page_project_task/i18n/sl.po @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_project_task +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" + +#. module: document_page_project_task +#. odoo-python +#: code:addons/document_page_project_task/models/document_page.py:0 +msgid "" +"All linked tasks must belong to the document's project '%(project)s'. The " +"following tasks belong to a different project: %(tasks)s." +msgstr "" + +#. module: document_page_project_task +#: model_terms:ir.actions.act_window,help:document_page_project_task.action_document_page_tasks +msgid "Click to create a new web page." +msgstr "" + +#. module: document_page_project_task +#: model:ir.model,name:document_page_project_task.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_count +msgid "Document Page Count" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model,name:document_page_project_task.model_project_task +msgid "Task" +msgstr "" + +#. module: document_page_project_task +#: model:ir.actions.act_window,name:document_page_project_task.action_document_page_tasks +msgid "Task Wiki" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_document_page__task_ids +msgid "Tasks" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_ids +#: model_terms:ir.ui.view,arch_db:document_page_project_task.view_task_form2 +msgid "Wiki Pages" +msgstr "" From 46d426f1005d4a9815f4e499fa295a69e154bee4 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Sun, 7 Jun 2026 11:40:01 +0000 Subject: [PATCH 07/11] Translated using Weblate (Slovenian) Currently translated at 100.0% (8 of 8 strings) Translation: knowledge-18.0/knowledge-18.0-document_page_project_task Translate-URL: https://translation.odoo-community.org/projects/knowledge-18-0/knowledge-18-0-document_page_project_task/sl/ --- document_page_project_task/i18n/sl.po | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/document_page_project_task/i18n/sl.po b/document_page_project_task/i18n/sl.po index a2ebe5355ca..d17c573b7d7 100644 --- a/document_page_project_task/i18n/sl.po +++ b/document_page_project_task/i18n/sl.po @@ -6,7 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-06-07 11:41+0000\n" +"Last-Translator: Matjaz Mozetic \n" "Language-Team: none\n" "Language: sl\n" "MIME-Version: 1.0\n" @@ -14,6 +15,7 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 5.15.2\n" #. module: document_page_project_task #. odoo-python @@ -22,39 +24,41 @@ msgid "" "All linked tasks must belong to the document's project '%(project)s'. The " "following tasks belong to a different project: %(tasks)s." msgstr "" +"Vse povezane naloge morajo pripadati projektu dokumenta '%(project)s'. " +"Naslednja opravila pripadajo drugemu projektu: %(tasks)s." #. module: document_page_project_task #: model_terms:ir.actions.act_window,help:document_page_project_task.action_document_page_tasks msgid "Click to create a new web page." -msgstr "" +msgstr "Ustvari novo stran." #. module: document_page_project_task #: model:ir.model,name:document_page_project_task.model_document_page msgid "Document Page" -msgstr "" +msgstr "Stran dokumenta" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_count msgid "Document Page Count" -msgstr "" +msgstr "Število dokumentov" #. module: document_page_project_task #: model:ir.model,name:document_page_project_task.model_project_task msgid "Task" -msgstr "" +msgstr "Opravilo" #. module: document_page_project_task #: model:ir.actions.act_window,name:document_page_project_task.action_document_page_tasks msgid "Task Wiki" -msgstr "" +msgstr "Wiki opravila" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_document_page__task_ids msgid "Tasks" -msgstr "" +msgstr "Opravila" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_ids #: model_terms:ir.ui.view,arch_db:document_page_project_task.view_task_form2 msgid "Wiki Pages" -msgstr "" +msgstr "Wiki strani" From 61bd094de5d5124c21dd1ea11b6df1c28d324680 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Sun, 7 Jun 2026 11:43:54 +0000 Subject: [PATCH 08/11] Translated using Weblate (Slovenian) Currently translated at 100.0% (8 of 8 strings) Translation: knowledge-18.0/knowledge-18.0-document_page_project_task Translate-URL: https://translation.odoo-community.org/projects/knowledge-18-0/knowledge-18-0-document_page_project_task/sl/ --- document_page_project_task/i18n/sl.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/document_page_project_task/i18n/sl.po b/document_page_project_task/i18n/sl.po index d17c573b7d7..a89715fb685 100644 --- a/document_page_project_task/i18n/sl.po +++ b/document_page_project_task/i18n/sl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-06-07 11:41+0000\n" +"PO-Revision-Date: 2026-06-07 13:47+0000\n" "Last-Translator: Matjaz Mozetic \n" "Language-Team: none\n" "Language: sl\n" @@ -61,4 +61,4 @@ msgstr "Opravila" #: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_ids #: model_terms:ir.ui.view,arch_db:document_page_project_task.view_task_form2 msgid "Wiki Pages" -msgstr "Wiki strani" +msgstr "Dokumentov" From 2ac1e9efcb7e2f3d231b0dcd2feb4d8a422d8255 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Tue, 9 Jun 2026 14:33:49 +0000 Subject: [PATCH 09/11] Added translation using Weblate (French) --- document_page_project_task/i18n/fr.po | 59 +++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 document_page_project_task/i18n/fr.po diff --git a/document_page_project_task/i18n/fr.po b/document_page_project_task/i18n/fr.po new file mode 100644 index 00000000000..a50bf24f8b1 --- /dev/null +++ b/document_page_project_task/i18n/fr.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_project_task +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: document_page_project_task +#. odoo-python +#: code:addons/document_page_project_task/models/document_page.py:0 +msgid "" +"All linked tasks must belong to the document's project '%(project)s'. The " +"following tasks belong to a different project: %(tasks)s." +msgstr "" + +#. module: document_page_project_task +#: model_terms:ir.actions.act_window,help:document_page_project_task.action_document_page_tasks +msgid "Click to create a new web page." +msgstr "" + +#. module: document_page_project_task +#: model:ir.model,name:document_page_project_task.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_count +msgid "Document Page Count" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model,name:document_page_project_task.model_project_task +msgid "Task" +msgstr "" + +#. module: document_page_project_task +#: model:ir.actions.act_window,name:document_page_project_task.action_document_page_tasks +msgid "Task Wiki" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_document_page__task_ids +msgid "Tasks" +msgstr "" + +#. module: document_page_project_task +#: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_ids +#: model_terms:ir.ui.view,arch_db:document_page_project_task.view_task_form2 +msgid "Wiki Pages" +msgstr "" From 302f77be54616488d09175a4f828a30b3c41b900 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Tue, 9 Jun 2026 14:34:56 +0000 Subject: [PATCH 10/11] Translated using Weblate (French) Currently translated at 100.0% (8 of 8 strings) Translation: knowledge-18.0/knowledge-18.0-document_page_project_task Translate-URL: https://translation.odoo-community.org/projects/knowledge-18-0/knowledge-18-0-document_page_project_task/fr/ --- document_page_project_task/i18n/fr.po | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/document_page_project_task/i18n/fr.po b/document_page_project_task/i18n/fr.po index a50bf24f8b1..c809ec79dec 100644 --- a/document_page_project_task/i18n/fr.po +++ b/document_page_project_task/i18n/fr.po @@ -6,13 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-06-09 14:35+0000\n" +"Last-Translator: Yann Papouin \n" "Language-Team: none\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: document_page_project_task #. odoo-python @@ -21,39 +23,41 @@ msgid "" "All linked tasks must belong to the document's project '%(project)s'. The " "following tasks belong to a different project: %(tasks)s." msgstr "" +"Toutes les tâches liées doivent appartenir au projet '%(project)s' du " +"document. Les tâches suivantes appartiennent à un autre projet : %(tasks)s." #. module: document_page_project_task #: model_terms:ir.actions.act_window,help:document_page_project_task.action_document_page_tasks msgid "Click to create a new web page." -msgstr "" +msgstr "Cliquer pour créer une nouvelle page Web." #. module: document_page_project_task #: model:ir.model,name:document_page_project_task.model_document_page msgid "Document Page" -msgstr "" +msgstr "Page" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_count msgid "Document Page Count" -msgstr "" +msgstr "Nombre de pages" #. module: document_page_project_task #: model:ir.model,name:document_page_project_task.model_project_task msgid "Task" -msgstr "" +msgstr "Tâche" #. module: document_page_project_task #: model:ir.actions.act_window,name:document_page_project_task.action_document_page_tasks msgid "Task Wiki" -msgstr "" +msgstr "Wiki de la tâche" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_document_page__task_ids msgid "Tasks" -msgstr "" +msgstr "Tâches" #. module: document_page_project_task #: model:ir.model.fields,field_description:document_page_project_task.field_project_task__document_page_ids #: model_terms:ir.ui.view,arch_db:document_page_project_task.view_task_form2 msgid "Wiki Pages" -msgstr "" +msgstr "Pages du wiki" From b790965e66a008da4421a8763c489037bbb8a43a Mon Sep 17 00:00:00 2001 From: FHubert Date: Tue, 8 Sep 2026 21:18:04 +0200 Subject: [PATCH 11/11] [MIG] document_page_project_task: Migration to 19.0 --- document_page_project_task/__manifest__.py | 2 +- document_page_project_task/models/document_page.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/document_page_project_task/__manifest__.py b/document_page_project_task/__manifest__.py index 87775b7dc48..5348594ef17 100644 --- a/document_page_project_task/__manifest__.py +++ b/document_page_project_task/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Document Page Project Task", "summary": "This module links document pages to project tasks", - "version": "18.0.2.0.0", + "version": "19.0.1.0.0", "category": "Project", "author": "Escodoo, Odoo Community Association (OCA)", "maintainers": ["marcelsavegnago"], diff --git a/document_page_project_task/models/document_page.py b/document_page_project_task/models/document_page.py index 9ed357890e1..79dda572917 100644 --- a/document_page_project_task/models/document_page.py +++ b/document_page_project_task/models/document_page.py @@ -1,7 +1,7 @@ # Copyright 2025 Marcel Savegnago - Escodoo # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import _, api, fields, models +from odoo import api, fields, models from odoo.exceptions import ValidationError @@ -42,7 +42,7 @@ def _check_task_project_consistency(self): ) if invalid_tasks: raise ValidationError( - _( + self.env._( "All linked tasks must belong to the document's project " "'%(project)s'. The following tasks belong to a different " "project: %(tasks)s.",