From be7f183a70bfc44439a2a26c7ce6d8ead3a3764c Mon Sep 17 00:00:00 2001 From: Pierre Verkest Date: Thu, 27 May 2021 18:49:17 +0200 Subject: [PATCH 1/4] [ADD] 14.0 new module project_analytic_code This module add related Analytic account code in project name () and you can search projects by the analytic account code () from any list (like in timesheets). Apply suggestions from code review Co-authored-by: Akim Juillerat --- project_analytic_code/README.rst | 3 ++ project_analytic_code/__init__.py | 2 + project_analytic_code/__manifest__.py | 18 +++++++ project_analytic_code/i18n/fr.po | 45 ++++++++++++++++++ .../i18n/project_analytic_code.pot | 44 +++++++++++++++++ project_analytic_code/models/__init__.py | 2 + project_analytic_code/models/project.py | 31 ++++++++++++ project_analytic_code/readme/CONTRIBUTORS.rst | 1 + project_analytic_code/readme/DESCRIPTION.rst | 10 ++++ project_analytic_code/readme/USAGE.rst | 3 ++ .../static/description/icon.png | Bin 0 -> 9455 bytes project_analytic_code/tests/__init__.py | 3 ++ project_analytic_code/tests/test_project.py | 26 ++++++++++ project_analytic_code/views/project.xml | 41 ++++++++++++++++ 14 files changed, 229 insertions(+) create mode 100644 project_analytic_code/README.rst create mode 100644 project_analytic_code/__init__.py create mode 100644 project_analytic_code/__manifest__.py create mode 100644 project_analytic_code/i18n/fr.po create mode 100644 project_analytic_code/i18n/project_analytic_code.pot create mode 100644 project_analytic_code/models/__init__.py create mode 100644 project_analytic_code/models/project.py create mode 100644 project_analytic_code/readme/CONTRIBUTORS.rst create mode 100644 project_analytic_code/readme/DESCRIPTION.rst create mode 100644 project_analytic_code/readme/USAGE.rst create mode 100644 project_analytic_code/static/description/icon.png create mode 100644 project_analytic_code/tests/__init__.py create mode 100644 project_analytic_code/tests/test_project.py create mode 100644 project_analytic_code/views/project.xml diff --git a/project_analytic_code/README.rst b/project_analytic_code/README.rst new file mode 100644 index 0000000000..e487e400a9 --- /dev/null +++ b/project_analytic_code/README.rst @@ -0,0 +1,3 @@ +===================== +Project Analytic Code +===================== diff --git a/project_analytic_code/__init__.py b/project_analytic_code/__init__.py new file mode 100644 index 0000000000..cb45f2710a --- /dev/null +++ b/project_analytic_code/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import models diff --git a/project_analytic_code/__manifest__.py b/project_analytic_code/__manifest__.py new file mode 100644 index 0000000000..8f7d740f88 --- /dev/null +++ b/project_analytic_code/__manifest__.py @@ -0,0 +1,18 @@ +# Copyright 2021 Pierre Verkest +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Project analytic code", + "summary": "Search projects by analytic account code.", + "author": "Pierre Verkest, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/project", + "category": "Project Management", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "depends": [ + "project", + ], + "data": [ + "views/project.xml", + ], +} diff --git a/project_analytic_code/i18n/fr.po b/project_analytic_code/i18n/fr.po new file mode 100644 index 0000000000..8a749bfdf1 --- /dev/null +++ b/project_analytic_code/i18n/fr.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_analytic_code +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: project_analytic_code +#: model_terms:ir.ui.view,arch_db:project_analytic_code.view_project_project_filter +msgid "Analytic account" +msgstr "Compte analytique" + +#. module: project_analytic_code +#: model:ir.model.fields,field_description:project_analytic_code.field_project_project__analytic_account_code +msgid "Analytic code" +msgstr "Code analytique" + +#. module: project_analytic_code +#: model:ir.model.fields,field_description:project_analytic_code.field_project_project__display_name +msgid "Display Name" +msgstr "Libellé" + +#. module: project_analytic_code +#: model:ir.model.fields,field_description:project_analytic_code.field_project_project__id +msgid "ID" +msgstr "" + +#. module: project_analytic_code +#: model:ir.model.fields,field_description:project_analytic_code.field_project_project____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: project_analytic_code +#: model:ir.model,name:project_analytic_code.model_project_project +msgid "Project" +msgstr "Projet" diff --git a/project_analytic_code/i18n/project_analytic_code.pot b/project_analytic_code/i18n/project_analytic_code.pot new file mode 100644 index 0000000000..e087676c1f --- /dev/null +++ b/project_analytic_code/i18n/project_analytic_code.pot @@ -0,0 +1,44 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_analytic_code +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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_analytic_code +#: model_terms:ir.ui.view,arch_db:project_analytic_code.view_project_project_filter +msgid "Analytic account" +msgstr "" + +#. module: project_analytic_code +#: model:ir.model.fields,field_description:project_analytic_code.field_project_project__analytic_account_code +msgid "Analytic code" +msgstr "" + +#. module: project_analytic_code +#: model:ir.model.fields,field_description:project_analytic_code.field_project_project__display_name +msgid "Display Name" +msgstr "" + +#. module: project_analytic_code +#: model:ir.model.fields,field_description:project_analytic_code.field_project_project__id +msgid "ID" +msgstr "" + +#. module: project_analytic_code +#: model:ir.model.fields,field_description:project_analytic_code.field_project_project____last_update +msgid "Last Modified on" +msgstr "" + +#. module: project_analytic_code +#: model:ir.model,name:project_analytic_code.model_project_project +msgid "Project" +msgstr "" diff --git a/project_analytic_code/models/__init__.py b/project_analytic_code/models/__init__.py new file mode 100644 index 0000000000..0364439211 --- /dev/null +++ b/project_analytic_code/models/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import project diff --git a/project_analytic_code/models/project.py b/project_analytic_code/models/project.py new file mode 100644 index 0000000000..4eecaad723 --- /dev/null +++ b/project_analytic_code/models/project.py @@ -0,0 +1,31 @@ +# Copyright 2021 Pierre Verkest +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class Project(models.Model): + _inherit = "project.project" + + analytic_account_code = fields.Char( + string="Analytic code", + related="analytic_account_id.code", + store=True, + index=True, + ) + + @api.model + def name_search(self, name="", args=None, operator="ilike", limit=100): + args = list(args or []) + if name: + args += ["|", ("analytic_account_code", "=", name)] + return super().name_search(name=name, args=args, operator=operator, limit=limit) + + def name_get(self): + result = super().name_get() + # Prepend analytic_account_code to display_name + for i, (res_item, project) in enumerate(zip(result, self)): + code = project.analytic_account_code + if code: + result[i] = (res_item[0], "[%s] %s" % (code, res_item[1])) + return result diff --git a/project_analytic_code/readme/CONTRIBUTORS.rst b/project_analytic_code/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..638be86631 --- /dev/null +++ b/project_analytic_code/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Pierre Verkest diff --git a/project_analytic_code/readme/DESCRIPTION.rst b/project_analytic_code/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..f35cc63ca5 --- /dev/null +++ b/project_analytic_code/readme/DESCRIPTION.rst @@ -0,0 +1,10 @@ +This module add related Analytic account code ( +related field `analytic_account_code`) on project model. + +The name of the project in related model display the analytic +account code (using `name_get`) and you can search projects by +the analytic account code (`name_search`) from any list ( +ie: collecting timesheets). + +Add analytic account code in project kanban card view and +add group by and search by account analytic. diff --git a/project_analytic_code/readme/USAGE.rst b/project_analytic_code/readme/USAGE.rst new file mode 100644 index 0000000000..4160f31505 --- /dev/null +++ b/project_analytic_code/readme/USAGE.rst @@ -0,0 +1,3 @@ +Once this module is installed you can search project +per analytic account code from any list that point to +a project (name search). diff --git a/project_analytic_code/static/description/icon.png b/project_analytic_code/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/project_analytic_code/tests/__init__.py b/project_analytic_code/tests/__init__.py new file mode 100644 index 0000000000..1cb1c7f5b5 --- /dev/null +++ b/project_analytic_code/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2021 Pierre Verkest +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import test_project diff --git a/project_analytic_code/tests/test_project.py b/project_analytic_code/tests/test_project.py new file mode 100644 index 0000000000..00f353fe4f --- /dev/null +++ b/project_analytic_code/tests/test_project.py @@ -0,0 +1,26 @@ +# Copyright 2021 Pierre Verkest +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.tests import tagged +from odoo.tests.common import SavepointCase + + +@tagged("post_install", "-at_install") +class TestProject(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.project = cls.env.ref("project.project_project_1") + cls.project.name = "Test project name" + cls.project.analytic_account_id = cls.env["account.analytic.account"].create( + {"name": "Test Analytic account name", "code": "Test Weird code"} + ) + + def test_search_project_by_account_analytic_code(self): + result = self.env["project.project"].name_search( + name=self.project.analytic_account_id.code + ) + self.assertEqual( + result[0][1], + f"[{self.project.analytic_account_id.code}] {self.project.name}", + ) diff --git a/project_analytic_code/views/project.xml b/project_analytic_code/views/project.xml new file mode 100644 index 0000000000..ae5ebb30cf --- /dev/null +++ b/project_analytic_code/views/project.xml @@ -0,0 +1,41 @@ + + + + + + project_analytic_code.project.select + project.project + + + ["|", ("name", "ilike", self), ("analytic_account_code", "=", self)] + + + + + + + + + + project.project.kanban.project_analytic_code + project.project + 200 + + + + + + + [] + + + + + + From 08e00a616cd2b3a1d5f7adc3ef157f71daa3df82 Mon Sep 17 00:00:00 2001 From: Pierre Verkest Date: Tue, 18 Feb 2025 12:15:04 +0100 Subject: [PATCH 2/4] [IMP] project_analytic_code: pre-commit auto fixes --- project_analytic_code/README.rst | 89 +++- project_analytic_code/pyproject.toml | 3 + project_analytic_code/readme/CONTRIBUTORS.md | 1 + project_analytic_code/readme/CONTRIBUTORS.rst | 1 - project_analytic_code/readme/DESCRIPTION.md | 9 + project_analytic_code/readme/DESCRIPTION.rst | 10 - project_analytic_code/readme/USAGE.md | 2 + project_analytic_code/readme/USAGE.rst | 3 - .../static/description/index.html | 435 ++++++++++++++++++ 9 files changed, 538 insertions(+), 15 deletions(-) create mode 100644 project_analytic_code/pyproject.toml create mode 100644 project_analytic_code/readme/CONTRIBUTORS.md delete mode 100644 project_analytic_code/readme/CONTRIBUTORS.rst create mode 100644 project_analytic_code/readme/DESCRIPTION.md delete mode 100644 project_analytic_code/readme/DESCRIPTION.rst create mode 100644 project_analytic_code/readme/USAGE.md delete mode 100644 project_analytic_code/readme/USAGE.rst create mode 100644 project_analytic_code/static/description/index.html diff --git a/project_analytic_code/README.rst b/project_analytic_code/README.rst index e487e400a9..90938fa488 100644 --- a/project_analytic_code/README.rst +++ b/project_analytic_code/README.rst @@ -1,3 +1,90 @@ ===================== -Project Analytic Code +Project analytic code ===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d4ad14e9e09293d8fe3b7c2e9eecf6a5a3d3f4a8f75905d186baf466c38f4908 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fproject-lightgray.png?logo=github + :target: https://github.com/OCA/project/tree/17.0/project_analytic_code + :alt: OCA/project +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/project-17-0/project-17-0-project_analytic_code + :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=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module add related Analytic account code ( related field +analytic_account_code) on project model. + +The name of the project in related model display the analytic account +code (using name_get) and you can search projects by the analytic +account code (name_search) from any list ( ie: collecting timesheets). + +Add analytic account code in project kanban card view and add group by +and search by account analytic. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Once this module is installed you can search project per analytic +account code from any list that point to a project (name search). + +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 +------- + +* Pierre Verkest + +Contributors +------------ + +- Pierre Verkest + +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_analytic_code/pyproject.toml b/project_analytic_code/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/project_analytic_code/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/project_analytic_code/readme/CONTRIBUTORS.md b/project_analytic_code/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..926261edf6 --- /dev/null +++ b/project_analytic_code/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Pierre Verkest \<\> diff --git a/project_analytic_code/readme/CONTRIBUTORS.rst b/project_analytic_code/readme/CONTRIBUTORS.rst deleted file mode 100644 index 638be86631..0000000000 --- a/project_analytic_code/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1 +0,0 @@ -* Pierre Verkest diff --git a/project_analytic_code/readme/DESCRIPTION.md b/project_analytic_code/readme/DESCRIPTION.md new file mode 100644 index 0000000000..7a1d59a29c --- /dev/null +++ b/project_analytic_code/readme/DESCRIPTION.md @@ -0,0 +1,9 @@ +This module add related Analytic account code ( related field +analytic_account_code) on project model. + +The name of the project in related model display the analytic account +code (using name_get) and you can search projects by the analytic +account code (name_search) from any list ( ie: collecting timesheets). + +Add analytic account code in project kanban card view and add group by +and search by account analytic. diff --git a/project_analytic_code/readme/DESCRIPTION.rst b/project_analytic_code/readme/DESCRIPTION.rst deleted file mode 100644 index f35cc63ca5..0000000000 --- a/project_analytic_code/readme/DESCRIPTION.rst +++ /dev/null @@ -1,10 +0,0 @@ -This module add related Analytic account code ( -related field `analytic_account_code`) on project model. - -The name of the project in related model display the analytic -account code (using `name_get`) and you can search projects by -the analytic account code (`name_search`) from any list ( -ie: collecting timesheets). - -Add analytic account code in project kanban card view and -add group by and search by account analytic. diff --git a/project_analytic_code/readme/USAGE.md b/project_analytic_code/readme/USAGE.md new file mode 100644 index 0000000000..c24ea7c57d --- /dev/null +++ b/project_analytic_code/readme/USAGE.md @@ -0,0 +1,2 @@ +Once this module is installed you can search project per analytic +account code from any list that point to a project (name search). diff --git a/project_analytic_code/readme/USAGE.rst b/project_analytic_code/readme/USAGE.rst deleted file mode 100644 index 4160f31505..0000000000 --- a/project_analytic_code/readme/USAGE.rst +++ /dev/null @@ -1,3 +0,0 @@ -Once this module is installed you can search project -per analytic account code from any list that point to -a project (name search). diff --git a/project_analytic_code/static/description/index.html b/project_analytic_code/static/description/index.html new file mode 100644 index 0000000000..a495c60f8d --- /dev/null +++ b/project_analytic_code/static/description/index.html @@ -0,0 +1,435 @@ + + + + + +Project analytic code + + + +
+

Project analytic code

+ + +

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

+

This module add related Analytic account code ( related field +analytic_account_code) on project model.

+

The name of the project in related model display the analytic account +code (using name_get) and you can search projects by the analytic +account code (name_search) from any list ( ie: collecting timesheets).

+

Add analytic account code in project kanban card view and add group by +and search by account analytic.

+

Table of contents

+ +
+

Usage

+

Once this module is installed you can search project per analytic +account code from any list that point to a project (name search).

+
+
+

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

+
    +
  • Pierre Verkest
  • +
+
+
+

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.

+
+
+
+ + From ad29b912492bebaa7c515f9afb10278f70787f9e Mon Sep 17 00:00:00 2001 From: Pierre Verkest Date: Tue, 18 Feb 2025 12:50:41 +0100 Subject: [PATCH 3/4] [MIG] project_analytic_code: Migration to 17.0 --- project_analytic_code/__manifest__.py | 2 +- project_analytic_code/models/project.py | 27 +++++------ project_analytic_code/tests/test_project.py | 23 +++++++-- project_analytic_code/views/project.xml | 54 +++++++-------------- 4 files changed, 52 insertions(+), 54 deletions(-) diff --git a/project_analytic_code/__manifest__.py b/project_analytic_code/__manifest__.py index 8f7d740f88..e89603c0a9 100644 --- a/project_analytic_code/__manifest__.py +++ b/project_analytic_code/__manifest__.py @@ -7,7 +7,7 @@ "author": "Pierre Verkest, Odoo Community Association (OCA)", "website": "https://github.com/OCA/project", "category": "Project Management", - "version": "14.0.1.0.0", + "version": "17.0.0.1.0", "license": "AGPL-3", "depends": [ "project", diff --git a/project_analytic_code/models/project.py b/project_analytic_code/models/project.py index 4eecaad723..20e3a3cfd0 100644 --- a/project_analytic_code/models/project.py +++ b/project_analytic_code/models/project.py @@ -7,25 +7,24 @@ class Project(models.Model): _inherit = "project.project" + _rec_names_search = [ + "name", + "analytic_account_code", + ] + analytic_account_code = fields.Char( string="Analytic code", related="analytic_account_id.code", store=True, - index=True, + index="btree_not_null", ) - @api.model - def name_search(self, name="", args=None, operator="ilike", limit=100): - args = list(args or []) - if name: - args += ["|", ("analytic_account_code", "=", name)] - return super().name_search(name=name, args=args, operator=operator, limit=limit) - - def name_get(self): - result = super().name_get() - # Prepend analytic_account_code to display_name - for i, (res_item, project) in enumerate(zip(result, self)): + @api.depends("analytic_account_code") + def _compute_display_name(self): + # res is null but avoid noqa: W8110 + res = super()._compute_display_name() + for project in self: code = project.analytic_account_code if code: - result[i] = (res_item[0], "[%s] %s" % (code, res_item[1])) - return result + project.display_name = f"[{code}] {project.display_name}" + return res diff --git a/project_analytic_code/tests/test_project.py b/project_analytic_code/tests/test_project.py index 00f353fe4f..c71fcc3f7d 100644 --- a/project_analytic_code/tests/test_project.py +++ b/project_analytic_code/tests/test_project.py @@ -2,18 +2,23 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo.tests import tagged -from odoo.tests.common import SavepointCase +from odoo.tests.common import TransactionCase @tagged("post_install", "-at_install") -class TestProject(SavepointCase): +class TestProject(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() cls.project = cls.env.ref("project.project_project_1") cls.project.name = "Test project name" + cls.plan = cls.env["account.analytic.plan"].create({"name": "Test plan"}) cls.project.analytic_account_id = cls.env["account.analytic.account"].create( - {"name": "Test Analytic account name", "code": "Test Weird code"} + { + "name": "Test Analytic account name", + "code": "Test Weird code", + "plan_id": cls.plan.id, + } ) def test_search_project_by_account_analytic_code(self): @@ -24,3 +29,15 @@ def test_search_project_by_account_analytic_code(self): result[0][1], f"[{self.project.analytic_account_id.code}] {self.project.name}", ) + + def test_project_display_name(self): + self.assertEqual( + self.project.display_name, + f"[{self.project.analytic_account_id.code}] {self.project.name}", + ) + self.project.analytic_account_id = False + + self.assertEqual( + self.project.display_name, + f"{self.project.name}", + ) diff --git a/project_analytic_code/views/project.xml b/project_analytic_code/views/project.xml index ae5ebb30cf..cecb7253eb 100644 --- a/project_analytic_code/views/project.xml +++ b/project_analytic_code/views/project.xml @@ -1,41 +1,23 @@ - - - - project_analytic_code.project.select - project.project - - - ["|", ("name", "ilike", self), ("analytic_account_code", "=", self)] - - - - + + + project_analytic_code.project.select + project.project + + + ["|", ("name", "ilike", self), ("analytic_account_code", "=", self)] - + + + + + - - - project.project.kanban.project_analytic_code - project.project - 200 - - - - - - - [] - - - - - From 2acef4614b819966aff0c516ca5a3d37d5c94124 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Mon, 2 Jun 2025 16:00:05 +0100 Subject: [PATCH 4/4] [FIX] project_analytic_code: fix tests --- project_analytic_code/README.rst | 3 ++- project_analytic_code/readme/CONTRIBUTORS.md | 1 + project_analytic_code/static/description/index.html | 1 + project_analytic_code/tests/test_project.py | 12 +++--------- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/project_analytic_code/README.rst b/project_analytic_code/README.rst index 90938fa488..919542dcd2 100644 --- a/project_analytic_code/README.rst +++ b/project_analytic_code/README.rst @@ -70,7 +70,8 @@ Authors Contributors ------------ -- Pierre Verkest +- Pierre Verkest +- Daniel Reis Maintainers ----------- diff --git a/project_analytic_code/readme/CONTRIBUTORS.md b/project_analytic_code/readme/CONTRIBUTORS.md index 926261edf6..5d93d5bae5 100644 --- a/project_analytic_code/readme/CONTRIBUTORS.md +++ b/project_analytic_code/readme/CONTRIBUTORS.md @@ -1 +1,2 @@ - Pierre Verkest \<\> +- Daniel Reis \<\> diff --git a/project_analytic_code/static/description/index.html b/project_analytic_code/static/description/index.html index a495c60f8d..f4e855b44d 100644 --- a/project_analytic_code/static/description/index.html +++ b/project_analytic_code/static/description/index.html @@ -415,6 +415,7 @@

Authors

Contributors

diff --git a/project_analytic_code/tests/test_project.py b/project_analytic_code/tests/test_project.py index c71fcc3f7d..1ea1f07e26 100644 --- a/project_analytic_code/tests/test_project.py +++ b/project_analytic_code/tests/test_project.py @@ -25,10 +25,8 @@ def test_search_project_by_account_analytic_code(self): result = self.env["project.project"].name_search( name=self.project.analytic_account_id.code ) - self.assertEqual( - result[0][1], - f"[{self.project.analytic_account_id.code}] {self.project.name}", - ) + expected = f"[{self.project.analytic_account_id.code}] {self.project.name}" + self.assertEqual(result[0].display_name, expected) def test_project_display_name(self): self.assertEqual( @@ -36,8 +34,4 @@ def test_project_display_name(self): f"[{self.project.analytic_account_id.code}] {self.project.name}", ) self.project.analytic_account_id = False - - self.assertEqual( - self.project.display_name, - f"{self.project.name}", - ) + self.assertEqual(self.project.display_name, f"{self.project.name}")