From 8af50a0da6d6c44498577c6b0611f58133d6a250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Mon, 3 Nov 2025 11:05:34 +0100 Subject: [PATCH 1/7] [ADD] add project_reviewer --- project_reviewer/README.rst | 81 ++++ project_reviewer/__init__.py | 1 + project_reviewer/__manifest__.py | 26 ++ project_reviewer/models/__init__.py | 1 + project_reviewer/models/project_task.py | 14 + project_reviewer/readme/CONTRIBUTORS.md | 1 + project_reviewer/readme/DESCRIPTION.md | 1 + .../static/description/index.html | 429 ++++++++++++++++++ project_reviewer/views/project_task_view.xml | 41 ++ .../odoo/addons/project_reviewer | 1 + setup/project_reviewer/setup.py | 6 + 11 files changed, 602 insertions(+) create mode 100644 project_reviewer/README.rst create mode 100644 project_reviewer/__init__.py create mode 100644 project_reviewer/__manifest__.py create mode 100644 project_reviewer/models/__init__.py create mode 100644 project_reviewer/models/project_task.py create mode 100644 project_reviewer/readme/CONTRIBUTORS.md create mode 100644 project_reviewer/readme/DESCRIPTION.md create mode 100644 project_reviewer/static/description/index.html create mode 100644 project_reviewer/views/project_task_view.xml create mode 120000 setup/project_reviewer/odoo/addons/project_reviewer create mode 100644 setup/project_reviewer/setup.py diff --git a/project_reviewer/README.rst b/project_reviewer/README.rst new file mode 100644 index 0000000000..a4099acfe9 --- /dev/null +++ b/project_reviewer/README.rst @@ -0,0 +1,81 @@ +================ +Project Reviewer +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:71e4502b1b35f7ff4a7872d6bce91afb0353e5237a81b3b6bba800984afd24a8 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |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%2Fproject-lightgray.png?logo=github + :target: https://github.com/OCA/project/tree/16.0/project_reviewer + :alt: OCA/project +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/project-16-0/project-16-0-project_reviewer + :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/project&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allow to set several reviewers on a project task + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +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 +------- + +* Akretion + +Contributors +------------ + +- Sébastien Beau sebastien.beau@akretion.com + +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. + +This module is part of the `OCA/project `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_reviewer/__init__.py b/project_reviewer/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/project_reviewer/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/project_reviewer/__manifest__.py b/project_reviewer/__manifest__.py new file mode 100644 index 0000000000..e51437a161 --- /dev/null +++ b/project_reviewer/__manifest__.py @@ -0,0 +1,26 @@ +# Copyright 2025 Akretion (https://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +{ + "name": "Project Reviewer", + "summary": "Add the possibility to assign reviewer to a task", + "version": "16.0.1.0.0", + "development_status": "Alpha", + "category": "Project", + "website": "https://github.com/OCA/project", + "author": "Akretion, Odoo Community Association (OCA)", + "license": "AGPL-3", + "external_dependencies": { + "python": [], + "bin": [], + }, + "depends": [ + "project", + ], + "data": [ + "views/project_task_view.xml", + ], + "demo": [], +} diff --git a/project_reviewer/models/__init__.py b/project_reviewer/models/__init__.py new file mode 100644 index 0000000000..edf2d36b9c --- /dev/null +++ b/project_reviewer/models/__init__.py @@ -0,0 +1 @@ +from . import project_task diff --git a/project_reviewer/models/project_task.py b/project_reviewer/models/project_task.py new file mode 100644 index 0000000000..eab490c6cb --- /dev/null +++ b/project_reviewer/models/project_task.py @@ -0,0 +1,14 @@ +# Copyright 2025 Akretion (https://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class ProjectTask(models.Model): + _inherit = "project.task" + + reviewer_ids = fields.Many2many( + comodel_name="res.users", string="Reviewers", tracking=True + ) diff --git a/project_reviewer/readme/CONTRIBUTORS.md b/project_reviewer/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..91fcd94cc9 --- /dev/null +++ b/project_reviewer/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +* Sébastien Beau diff --git a/project_reviewer/readme/DESCRIPTION.md b/project_reviewer/readme/DESCRIPTION.md new file mode 100644 index 0000000000..7934b2b4a0 --- /dev/null +++ b/project_reviewer/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module allow to set several reviewers on a project task diff --git a/project_reviewer/static/description/index.html b/project_reviewer/static/description/index.html new file mode 100644 index 0000000000..5ec0fbb572 --- /dev/null +++ b/project_reviewer/static/description/index.html @@ -0,0 +1,429 @@ + + + + + +Project Reviewer + + + +
+

Project Reviewer

+ + +

Alpha License: AGPL-3 OCA/project Translate me on Weblate Try me on Runboat

+

This module allow to set several reviewers on a project task

+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

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

+
    +
  • Akretion
  • +
+
+
+

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.

+

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

+

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

+
+
+
+ + diff --git a/project_reviewer/views/project_task_view.xml b/project_reviewer/views/project_task_view.xml new file mode 100644 index 0000000000..be3872cdd6 --- /dev/null +++ b/project_reviewer/views/project_task_view.xml @@ -0,0 +1,41 @@ + + + + + project.task + + + + + + + + + + project.task + + + + + +
+ +
+
+
+ + + project.task + + + + + + + + +
diff --git a/setup/project_reviewer/odoo/addons/project_reviewer b/setup/project_reviewer/odoo/addons/project_reviewer new file mode 120000 index 0000000000..143108511e --- /dev/null +++ b/setup/project_reviewer/odoo/addons/project_reviewer @@ -0,0 +1 @@ +../../../../project_reviewer \ No newline at end of file diff --git a/setup/project_reviewer/setup.py b/setup/project_reviewer/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/project_reviewer/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 7e3eefc65a2982e987996115f558376c5655103c Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 10 Feb 2026 12:43:19 +0000 Subject: [PATCH 2/7] [UPD] Update project_reviewer.pot --- project_reviewer/i18n/project_reviewer.pot | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 project_reviewer/i18n/project_reviewer.pot diff --git a/project_reviewer/i18n/project_reviewer.pot b/project_reviewer/i18n/project_reviewer.pot new file mode 100644 index 0000000000..8f092eb094 --- /dev/null +++ b/project_reviewer/i18n/project_reviewer.pot @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_reviewer +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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: project_reviewer +#: model_terms:ir.ui.view,arch_db:project_reviewer.view_task_search_form +msgid "My review" +msgstr "" + +#. module: project_reviewer +#: model:ir.model.fields,field_description:project_reviewer.field_project_task__reviewer_ids +msgid "Reviewers" +msgstr "" + +#. module: project_reviewer +#: model:ir.model,name:project_reviewer.model_project_task +msgid "Task" +msgstr "" From fbbb8a6a278c92729a1d46d0f8fc813df4d1b91f Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 10 Feb 2026 12:48:57 +0000 Subject: [PATCH 3/7] [BOT] post-merge updates --- README.md | 1 + project_reviewer/README.rst | 8 ++++-- project_reviewer/static/description/icon.png | Bin 0 -> 10254 bytes .../static/description/index.html | 26 +++++++++++------- setup/_metapackage/VERSION.txt | 2 +- setup/_metapackage/setup.py | 1 + 6 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 project_reviewer/static/description/icon.png diff --git a/README.md b/README.md index 38d3edb887..8a31ff0b9b 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ addon | version | maintainers | summary [project_pivot](project_pivot/) | 16.0.1.0.1 | | Pivot view for projects [project_portal_task_visibility](project_portal_task_visibility/) | 16.0.1.1.0 | | Project Portal Task Visibility [project_purchase_link](project_purchase_link/) | 16.0.1.0.0 | | Project Purchase Link +[project_reviewer](project_reviewer/) | 16.0.1.0.0 | | Add the possibility to assign reviewer to a task [project_risk](project_risk/) | 16.0.1.0.0 | | MOR risk management method [project_role](project_role/) | 16.0.1.0.4 | alexey-pelykh | Project role-based roster [project_sale_order_link](project_sale_order_link/) | 16.0.1.0.0 | EmilioPascual | Sales order linked to project, tasks or employee map diff --git a/project_reviewer/README.rst b/project_reviewer/README.rst index a4099acfe9..867ef4102b 100644 --- a/project_reviewer/README.rst +++ b/project_reviewer/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 + ================ Project Reviewer ================ @@ -7,13 +11,13 @@ Project Reviewer !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:71e4502b1b35f7ff4a7872d6bce91afb0353e5237a81b3b6bba800984afd24a8 + !! source digest: sha256:b7d9076205c52457b13075dad2302f2b7613d9625d2697957009761e3675ce1b !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png :target: https://odoo-community.org/page/development-status :alt: Alpha -.. |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%2Fproject-lightgray.png?logo=github diff --git a/project_reviewer/static/description/icon.png b/project_reviewer/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11 GIT binary patch literal 10254 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 -Project Reviewer +README.rst -
-

Project Reviewer

+
+ + +Odoo Community Association + +
+

Project Reviewer

-

Alpha License: AGPL-3 OCA/project Translate me on Weblate Try me on Runboat

+

Alpha License: AGPL-3 OCA/project Translate me on Weblate Try me on Runboat

This module allow to set several reviewers on a project task

Important

@@ -390,7 +395,7 @@

Project Reviewer

-

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 @@ -398,21 +403,21 @@

Bug Tracker

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

+
diff --git a/setup/_metapackage/VERSION.txt b/setup/_metapackage/VERSION.txt index c73bc8284f..e18fb0924d 100644 --- a/setup/_metapackage/VERSION.txt +++ b/setup/_metapackage/VERSION.txt @@ -1 +1 @@ -16.0.20251209.1 \ No newline at end of file +16.0.20260210.0 \ No newline at end of file diff --git a/setup/_metapackage/setup.py b/setup/_metapackage/setup.py index a8f46bfe42..6809478186 100644 --- a/setup/_metapackage/setup.py +++ b/setup/_metapackage/setup.py @@ -23,6 +23,7 @@ 'odoo-addon-project_pivot>=16.0dev,<16.1dev', 'odoo-addon-project_portal_task_visibility>=16.0dev,<16.1dev', 'odoo-addon-project_purchase_link>=16.0dev,<16.1dev', + 'odoo-addon-project_reviewer>=16.0dev,<16.1dev', 'odoo-addon-project_risk>=16.0dev,<16.1dev', 'odoo-addon-project_role>=16.0dev,<16.1dev', 'odoo-addon-project_sale_order_link>=16.0dev,<16.1dev', From a0e9f2bed57c8eee9fb867b1b490f7b31c34a544 Mon Sep 17 00:00:00 2001 From: mymage Date: Thu, 12 Feb 2026 07:59:55 +0000 Subject: [PATCH 4/7] Added translation using Weblate (Italian) --- project_reviewer/i18n/it.po | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 project_reviewer/i18n/it.po diff --git a/project_reviewer/i18n/it.po b/project_reviewer/i18n/it.po new file mode 100644 index 0000000000..55a3798af2 --- /dev/null +++ b/project_reviewer/i18n/it.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_reviewer +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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: project_reviewer +#: model_terms:ir.ui.view,arch_db:project_reviewer.view_task_search_form +msgid "My review" +msgstr "" + +#. module: project_reviewer +#: model:ir.model.fields,field_description:project_reviewer.field_project_task__reviewer_ids +msgid "Reviewers" +msgstr "" + +#. module: project_reviewer +#: model:ir.model,name:project_reviewer.model_project_task +msgid "Task" +msgstr "" From 16bab5edb69f741e382646dfbe92405b3005e38f Mon Sep 17 00:00:00 2001 From: mymage Date: Thu, 12 Feb 2026 09:26:15 +0000 Subject: [PATCH 5/7] Translated using Weblate (Italian) Currently translated at 100.0% (3 of 3 strings) Translation: project-16.0/project-16.0-project_reviewer Translate-URL: https://translation.odoo-community.org/projects/project-16-0/project-16-0-project_reviewer/it/ --- project_reviewer/i18n/it.po | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/project_reviewer/i18n/it.po b/project_reviewer/i18n/it.po index 55a3798af2..2185ad6941 100644 --- a/project_reviewer/i18n/it.po +++ b/project_reviewer/i18n/it.po @@ -6,25 +6,27 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-02-12 12:09+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: project_reviewer #: model_terms:ir.ui.view,arch_db:project_reviewer.view_task_search_form msgid "My review" -msgstr "" +msgstr "Mia revisione" #. module: project_reviewer #: model:ir.model.fields,field_description:project_reviewer.field_project_task__reviewer_ids msgid "Reviewers" -msgstr "" +msgstr "Revisori" #. module: project_reviewer #: model:ir.model,name:project_reviewer.model_project_task msgid "Task" -msgstr "" +msgstr "Lavoro" From 91bc831a539644555e9e97aea74a48f7eac18422 Mon Sep 17 00:00:00 2001 From: Arnaud LAYEC Date: Tue, 24 Feb 2026 12:14:00 +0100 Subject: [PATCH 6/7] [FIX] Prevent at uninstall the error "No default view of type 'timeline'" By adding an `uninstall_hook` which trims "timeline" from the "view_mode" attributes of "ir_act_window" model to merge with previous to merge with previous --- project_timeline/__init__.py | 1 + project_timeline/__manifest__.py | 1 + project_timeline/hooks.py | 33 ++++++++++++++++++ .../tests/test_project_timeline.py | 34 +++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 project_timeline/hooks.py diff --git a/project_timeline/__init__.py b/project_timeline/__init__.py index 4a509f6e6c..3f5aab177f 100644 --- a/project_timeline/__init__.py +++ b/project_timeline/__init__.py @@ -2,3 +2,4 @@ from . import models from . import report +from .hooks import uninstall_hook diff --git a/project_timeline/__manifest__.py b/project_timeline/__manifest__.py index 7e0ee9a958..f6a4b360a5 100644 --- a/project_timeline/__manifest__.py +++ b/project_timeline/__manifest__.py @@ -22,4 +22,5 @@ "/project_timeline/static/src/scss/project_timeline.scss" ] }, + "uninstall_hook": "uninstall_hook", } diff --git a/project_timeline/hooks.py b/project_timeline/hooks.py new file mode 100644 index 0000000000..10796e8a93 --- /dev/null +++ b/project_timeline/hooks.py @@ -0,0 +1,33 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import SUPERUSER_ID, api + + +def uninstall_hook(cr, _): + env = api.Environment(cr, SUPERUSER_ID, {}) + _clean_action_view_mode_timeline(env) + + +def _clean_action_view_mode_timeline(env): + models = ["project.project", "project.task", "report.project.task.user"] + domain = [ + ("view_mode", "ilike", "timeline"), + ("res_model", "in", models), + ] + Action = env["ir.actions.act_window"] + for action in Action.search(domain): + view_mode = [ + m for m in action.view_mode.split(",") if m.lower().strip() != "timeline" + ] + # If 'view_mode' is now empty: unlink related menus and the action + if not view_mode: + _unlink_action(env, action) + else: + action.view_mode = ",".join(view_mode) + + +def _unlink_action(env, action): + env["ir.ui.menu"].search( + [("action", "=", "ir.actions.act_window,%d" % action.id)] + ).unlink() + action.unlink() diff --git a/project_timeline/tests/test_project_timeline.py b/project_timeline/tests/test_project_timeline.py index 12f7237166..4313c4ae72 100644 --- a/project_timeline/tests/test_project_timeline.py +++ b/project_timeline/tests/test_project_timeline.py @@ -64,3 +64,37 @@ def test_invalid_dates(self): self.task.planned_date_end = fields.Datetime.subtract( self.task.planned_date_start, days=1 ) + + def test_uninstall_clean_action(self): + """Test uninstall hook cleans 'timeline' from view_mode of act_window actions. + - Case 1: action with multiple view modes: just remove 'timeline' + - Case 2: action with 'timeline' only: unlink action + related menus + """ + # Test data + Action = self.env["ir.actions.act_window"] + Menu = self.env["ir.ui.menu"] + action1 = Action.create( + { + "name": "Test Action Multi", + "res_model": "project.task", + "view_mode": "tree,timeline,form", + } + ) + action2 = action1.copy({"view_mode": "timeline"}) + menu2 = Menu.create( + { + "name": "Test Menu Solo", + "action": "ir.actions.act_window,%d" % action2.id, + } + ) + + # Run the uninstall hook logic + from ..hooks import _clean_action_view_mode_timeline + + _clean_action_view_mode_timeline(self.env) + + # Case 1: 'timeline' removed, other modes preserved + self.assertEqual(action1.view_mode, "tree,form") + # Case 2: action and its menu are deleted + self.assertFalse(Action.browse(action2.id).exists()) + self.assertFalse(Menu.browse(menu2.id).exists()) From c286c9d31bcf0dbea0bc75010e21dfa8d592a06e Mon Sep 17 00:00:00 2001 From: Arnaud LAYEC Date: Mon, 2 Mar 2026 10:40:25 +0100 Subject: [PATCH 7/7] [FIX] Tests independent of demo data --- project_timeline/tests/test_project_timeline.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/project_timeline/tests/test_project_timeline.py b/project_timeline/tests/test_project_timeline.py index 4313c4ae72..c52b19d0c2 100644 --- a/project_timeline/tests/test_project_timeline.py +++ b/project_timeline/tests/test_project_timeline.py @@ -12,8 +12,13 @@ class TestProjectTimeline(BaseCommon): @classmethod def setUpClass(cls): super().setUpClass() - cls.project = cls.env.ref("project.project_project_1") - cls.stage = cls.env.ref("project.project_stage_2") + cls.project = cls.env["project.project"].create({"name": "Project Test"}) + cls.stage_done = cls.env["project.task.type"].create( + { + "name": "Done", + "fold": True, + } + ) cls.task = cls.env["project.task"].create( {"name": "test", "user_ids": False, "project_id": cls.project.id} ) @@ -25,7 +30,7 @@ def test_01_flow_filling(self): self.assertFalse(self.task.planned_date_end) self.task.write( { - "stage_id": self.stage.id, + "stage_id": self.stage_done.id, "date_end": fields.Datetime.add(self.task.planned_date_start, days=1), } ) @@ -44,7 +49,7 @@ def test_02_no_filling(self): self.assertEqual( task.planned_date_start, fields.Datetime.from_string("2018-05-01") ) - task.stage_id = self.stage + task.stage_id = self.stage_done self.assertEqual( task.planned_date_end, fields.Datetime.from_string("2018-05-07") )