From 0635c4d6b1b34dc9e0dca7d81e54e0e437608cca Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Mon, 26 Aug 2019 10:40:18 +0200 Subject: [PATCH 01/17] [ADD] project_task_project_required --- project_task_project_required/README.rst | 81 ++++ project_task_project_required/__init__.py | 3 + project_task_project_required/__manifest__.py | 21 + .../i18n/project_task_project_required.pot | 57 +++ .../models/__init__.py | 5 + .../models/project_task.py | 22 + .../models/res_company.py | 12 + .../models/res_config_settings.py | 14 + .../readme/CONFIGURE.rst | 4 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 426 ++++++++++++++++++ .../tests/__init__.py | 3 + .../test_project_task_project_required.py | 39 ++ .../views/project_task.xml | 48 ++ .../views/res_config_settings.xml | 30 ++ 17 files changed, 767 insertions(+) create mode 100644 project_task_project_required/README.rst create mode 100644 project_task_project_required/__init__.py create mode 100644 project_task_project_required/__manifest__.py create mode 100644 project_task_project_required/i18n/project_task_project_required.pot create mode 100644 project_task_project_required/models/__init__.py create mode 100644 project_task_project_required/models/project_task.py create mode 100644 project_task_project_required/models/res_company.py create mode 100644 project_task_project_required/models/res_config_settings.py create mode 100644 project_task_project_required/readme/CONFIGURE.rst create mode 100644 project_task_project_required/readme/CONTRIBUTORS.rst create mode 100644 project_task_project_required/readme/DESCRIPTION.rst create mode 100644 project_task_project_required/static/description/icon.png create mode 100644 project_task_project_required/static/description/index.html create mode 100644 project_task_project_required/tests/__init__.py create mode 100644 project_task_project_required/tests/test_project_task_project_required.py create mode 100644 project_task_project_required/views/project_task.xml create mode 100644 project_task_project_required/views/res_config_settings.xml diff --git a/project_task_project_required/README.rst b/project_task_project_required/README.rst new file mode 100644 index 0000000000..d2df0e5056 --- /dev/null +++ b/project_task_project_required/README.rst @@ -0,0 +1,81 @@ +================================ +Project: require Project on Task +================================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/12.0/project_task_project_required + :alt: OCA/project +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/project-12-0/project-12-0-project_task_project_required + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/140/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to configure task as having project as a mandatory field. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To make project selection mandatory on task: + +# Go to *Project > Configuration > Settings* +# Make task selection mandatory for new tasks by checking *Require Projects on Tasks* + +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Brainbean Apps + +Contributors +~~~~~~~~~~~~ + +* Alexey Pelykh + +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_task_project_required/__init__.py b/project_task_project_required/__init__.py new file mode 100644 index 0000000000..31660d6a96 --- /dev/null +++ b/project_task_project_required/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/project_task_project_required/__manifest__.py b/project_task_project_required/__manifest__.py new file mode 100644 index 0000000000..9da074eb1a --- /dev/null +++ b/project_task_project_required/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + 'name': 'Project: require Project on Task', + 'summary': """ + Set project on task as a mandatory field""", + 'version': '12.0.1.0.0', + 'license': 'AGPL-3', + 'author': + 'Brainbean Apps, ' + 'Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/project', + 'depends': [ + 'project', + ], + 'data': [ + 'views/project_task.xml', + 'views/res_config_settings.xml', + ], +} diff --git a/project_task_project_required/i18n/project_task_project_required.pot b/project_task_project_required/i18n/project_task_project_required.pot new file mode 100644 index 0000000000..cf5aca23d3 --- /dev/null +++ b/project_task_project_required/i18n/project_task_project_required.pot @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_task_project_required +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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_task_project_required +#: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form +msgid "" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_res_company +msgid "Companies" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task__is_project_required +msgid "Is Project Required" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company__is_project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__is_project_task_project_required +msgid "Require Projects on Tasks" +msgstr "" + +#. module: project_task_project_required +#: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form +msgid "Require project selection on each task by default" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_project_task +msgid "Task" +msgstr "" + +#. module: project_task_project_required +#: code:addons/project_task_project_required/models/project_task.py:20 +#, python-format +msgid "You must specify a project for the task." +msgstr "" + diff --git a/project_task_project_required/models/__init__.py b/project_task_project_required/models/__init__.py new file mode 100644 index 0000000000..21d993b212 --- /dev/null +++ b/project_task_project_required/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import res_company +from . import project_task +from . import res_config_settings diff --git a/project_task_project_required/models/project_task.py b/project_task_project_required/models/project_task.py new file mode 100644 index 0000000000..8a669ab23f --- /dev/null +++ b/project_task_project_required/models/project_task.py @@ -0,0 +1,22 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class ProjectTask(models.Model): + _inherit = 'project.task' + + is_project_required = fields.Boolean( + string='Is Project Required', + related='company_id.is_project_task_project_required', + ) + + @api.constrains('project_id') + def _check_project_id(self): + for task in self: + if task.is_project_required and not task.project_id: + raise ValidationError(_( + 'You must specify a project for the task.' + )) diff --git a/project_task_project_required/models/res_company.py b/project_task_project_required/models/res_company.py new file mode 100644 index 0000000000..42727e7ac1 --- /dev/null +++ b/project_task_project_required/models/res_company.py @@ -0,0 +1,12 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = 'res.company' + + is_project_task_project_required = fields.Boolean( + string='Require Projects on Tasks', + ) diff --git a/project_task_project_required/models/res_config_settings.py b/project_task_project_required/models/res_config_settings.py new file mode 100644 index 0000000000..21dd8a8dd9 --- /dev/null +++ b/project_task_project_required/models/res_config_settings.py @@ -0,0 +1,14 @@ +# Copyright 2018-2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + is_project_task_project_required = fields.Boolean( + string='Require Projects on Tasks', + related='company_id.is_project_task_project_required', + readonly=False, + ) diff --git a/project_task_project_required/readme/CONFIGURE.rst b/project_task_project_required/readme/CONFIGURE.rst new file mode 100644 index 0000000000..f188b0381b --- /dev/null +++ b/project_task_project_required/readme/CONFIGURE.rst @@ -0,0 +1,4 @@ +To make project selection mandatory on task: + +# Go to *Project > Configuration > Settings* +# Make task selection mandatory for new tasks by checking *Require Projects on Tasks* diff --git a/project_task_project_required/readme/CONTRIBUTORS.rst b/project_task_project_required/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..1c6a35a1e3 --- /dev/null +++ b/project_task_project_required/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexey Pelykh diff --git a/project_task_project_required/readme/DESCRIPTION.rst b/project_task_project_required/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..e358832c9f --- /dev/null +++ b/project_task_project_required/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows to configure task as having project as a mandatory field. diff --git a/project_task_project_required/static/description/icon.png b/project_task_project_required/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_task_project_required/static/description/index.html b/project_task_project_required/static/description/index.html new file mode 100644 index 0000000000..d4395e4277 --- /dev/null +++ b/project_task_project_required/static/description/index.html @@ -0,0 +1,426 @@ + + + + + + +Project: require Project on Task + + + +
+

Project: require Project on Task

+ + +

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

+

This module allows to configure task as having project as a mandatory field.

+

Table of contents

+ +
+

Configuration

+

To make project selection mandatory on task:

+

# Go to Project > Configuration > Settings +# Make task selection mandatory for new tasks by checking Require Projects on Tasks

+
+
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Brainbean Apps
  • +
+
+ +
+

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_task_project_required/tests/__init__.py b/project_task_project_required/tests/__init__.py new file mode 100644 index 0000000000..a945ea0723 --- /dev/null +++ b/project_task_project_required/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_project_task_project_required diff --git a/project_task_project_required/tests/test_project_task_project_required.py b/project_task_project_required/tests/test_project_task_project_required.py new file mode 100644 index 0000000000..ceee59cd71 --- /dev/null +++ b/project_task_project_required/tests/test_project_task_project_required.py @@ -0,0 +1,39 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.exceptions import ValidationError +from odoo.tests import TransactionCase + + +class TestProjectTaskProjectRequired(TransactionCase): + + def setUp(self): + super().setUp() + + self.Project = self.env['project.project'] + self.ProjectTask = self.env['project.task'] + + self.project = self.Project.create({ + 'name': 'Project', + }) + + def test_project_required(self): + self.env.user.company_id.is_project_task_project_required = True + with self.assertRaises(ValidationError): + self.ProjectTask.create({ + 'name': 'Task A', + }) + self.ProjectTask.create({ + 'name': 'Task B', + 'project_id': self.project.id, + }) + + def test_project_not_required(self): + self.env.user.company_id.is_project_task_project_required = False + self.ProjectTask.create({ + 'name': 'Task A', + }) + self.ProjectTask.create({ + 'name': 'Task B', + 'project_id': self.project.id, + }) diff --git a/project_task_project_required/views/project_task.xml b/project_task_project_required/views/project_task.xml new file mode 100644 index 0000000000..f0adeb9e13 --- /dev/null +++ b/project_task_project_required/views/project_task.xml @@ -0,0 +1,48 @@ + + + + + + project.task.tree + project.task + + + + + + + {'required':[('is_project_required','=',True)]} + + + + + + project.task.form + project.task + + + + + + + {'required':[('is_project_required','=',True)]} + + + + + + project.task.form.quick_create + project.task + + + + + + + + + + diff --git a/project_task_project_required/views/res_config_settings.xml b/project_task_project_required/views/res_config_settings.xml new file mode 100644 index 0000000000..a5d339cd12 --- /dev/null +++ b/project_task_project_required/views/res_config_settings.xml @@ -0,0 +1,30 @@ + + + + + + res.config.settings.view.form + res.config.settings + + + +
+
+ +
+
+
+
+
+
+
+ +
From f19d9c608f43fb3e0016b3d67f0351482eb00bd4 Mon Sep 17 00:00:00 2001 From: Sergio Zanchetta Date: Sun, 31 May 2020 09:26:02 +0000 Subject: [PATCH 02/17] Added translation using Weblate (Italian) --- project_task_project_required/i18n/it.po | 62 ++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 project_task_project_required/i18n/it.po diff --git a/project_task_project_required/i18n/it.po b/project_task_project_required/i18n/it.po new file mode 100644 index 0000000000..2bbc336e4e --- /dev/null +++ b/project_task_project_required/i18n/it.po @@ -0,0 +1,62 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_task_project_required +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-05-31 10:09+0000\n" +"Last-Translator: Sergio Zanchetta \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 3.10\n" + +#. module: project_task_project_required +#: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form +msgid "" +msgstr "" +"" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni di configurazione" + +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task__is_project_required +msgid "Is Project Required" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company__is_project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__is_project_task_project_required +msgid "Require Projects on Tasks" +msgstr "" + +#. module: project_task_project_required +#: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form +msgid "Require project selection on each task by default" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_project_task +msgid "Task" +msgstr "Lavoro" + +#. module: project_task_project_required +#: code:addons/project_task_project_required/models/project_task.py:20 +#, python-format +msgid "You must specify a project for the task." +msgstr "Deve essere specificato un progetto per il lavoro." From db08cdb23090a5834a51f9fc04f82530dbc333b0 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 4 Nov 2020 12:51:55 +0200 Subject: [PATCH 03/17] [UPD] Brainbean Apps => CorporateHub --- project_task_project_required/README.rst | 6 ++++-- project_task_project_required/__manifest__.py | 3 ++- project_task_project_required/readme/CONTRIBUTORS.rst | 4 +++- .../static/description/index.html | 7 +++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/project_task_project_required/README.rst b/project_task_project_required/README.rst index d2df0e5056..1751369267 100644 --- a/project_task_project_required/README.rst +++ b/project_task_project_required/README.rst @@ -56,12 +56,14 @@ Credits Authors ~~~~~~~ -* Brainbean Apps +* CorporateHub Contributors ~~~~~~~~~~~~ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh Maintainers ~~~~~~~~~~~ diff --git a/project_task_project_required/__manifest__.py b/project_task_project_required/__manifest__.py index 9da074eb1a..24fa500402 100644 --- a/project_task_project_required/__manifest__.py +++ b/project_task_project_required/__manifest__.py @@ -1,4 +1,5 @@ # Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { @@ -8,7 +9,7 @@ 'version': '12.0.1.0.0', 'license': 'AGPL-3', 'author': - 'Brainbean Apps, ' + 'CorporateHub, ' 'Odoo Community Association (OCA)', 'website': 'https://github.com/OCA/project', 'depends': [ diff --git a/project_task_project_required/readme/CONTRIBUTORS.rst b/project_task_project_required/readme/CONTRIBUTORS.rst index 1c6a35a1e3..724bc1d03a 100644 --- a/project_task_project_required/readme/CONTRIBUTORS.rst +++ b/project_task_project_required/readme/CONTRIBUTORS.rst @@ -1 +1,3 @@ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh diff --git a/project_task_project_required/static/description/index.html b/project_task_project_required/static/description/index.html index d4395e4277..8708f4c3b2 100644 --- a/project_task_project_required/static/description/index.html +++ b/project_task_project_required/static/description/index.html @@ -401,13 +401,16 @@

Credits

Authors

    -
  • Brainbean Apps
  • +
  • CorporateHub
From 93751905cfdbfbf74fef5bbb4104e0ab7f6ca653 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Thu, 13 May 2021 03:01:35 +0000 Subject: [PATCH 04/17] Added translation using Weblate (Portuguese (Brazil)) --- project_task_project_required/i18n/pt_BR.po | 57 +++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 project_task_project_required/i18n/pt_BR.po diff --git a/project_task_project_required/i18n/pt_BR.po b/project_task_project_required/i18n/pt_BR.po new file mode 100644 index 0000000000..ccc65a2c8a --- /dev/null +++ b/project_task_project_required/i18n/pt_BR.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_task_project_required +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt_BR\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_task_project_required +#: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form +msgid "" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_res_company +msgid "Companies" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task__is_project_required +msgid "Is Project Required" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company__is_project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__is_project_task_project_required +msgid "Require Projects on Tasks" +msgstr "" + +#. module: project_task_project_required +#: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form +msgid "Require project selection on each task by default" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model,name:project_task_project_required.model_project_task +msgid "Task" +msgstr "" + +#. module: project_task_project_required +#: code:addons/project_task_project_required/models/project_task.py:20 +#, python-format +msgid "You must specify a project for the task." +msgstr "" From 68bdc9728c36776d075a316921f9c61aac3494e0 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Fri, 14 Jan 2022 20:12:48 +0100 Subject: [PATCH 05/17] [IMP] project_task_project_required : project field mandatory by default --- project_task_project_required/README.rst | 7 +++++-- project_task_project_required/__manifest__.py | 5 ++++- .../demo/res_company.xml | 16 ++++++++++++++++ .../models/res_company.py | 1 + .../readme/CONFIGURE.rst | 7 +++++-- .../static/description/index.html | 6 ++++-- 6 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 project_task_project_required/demo/res_company.xml diff --git a/project_task_project_required/README.rst b/project_task_project_required/README.rst index 1751369267..2ae8b16d93 100644 --- a/project_task_project_required/README.rst +++ b/project_task_project_required/README.rst @@ -35,10 +35,13 @@ This module allows to configure task as having project as a mandatory field. Configuration ============= -To make project selection mandatory on task: +By installing this module, the project field +will be mandatory for all the companies. + +To make project selection optional on task for a given company: # Go to *Project > Configuration > Settings* -# Make task selection mandatory for new tasks by checking *Require Projects on Tasks* +# Uncheck *Require Projects on Tasks* Bug Tracker =========== diff --git a/project_task_project_required/__manifest__.py b/project_task_project_required/__manifest__.py index 24fa500402..931535a34a 100644 --- a/project_task_project_required/__manifest__.py +++ b/project_task_project_required/__manifest__.py @@ -6,7 +6,7 @@ 'name': 'Project: require Project on Task', 'summary': """ Set project on task as a mandatory field""", - 'version': '12.0.1.0.0', + 'version': '12.0.1.1.0', 'license': 'AGPL-3', 'author': 'CorporateHub, ' @@ -19,4 +19,7 @@ 'views/project_task.xml', 'views/res_config_settings.xml', ], + 'demo': [ + 'demo/res_company.xml', + ], } diff --git a/project_task_project_required/demo/res_company.xml b/project_task_project_required/demo/res_company.xml new file mode 100644 index 0000000000..f2baf8e64a --- /dev/null +++ b/project_task_project_required/demo/res_company.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/project_task_project_required/models/res_company.py b/project_task_project_required/models/res_company.py index 42727e7ac1..78c938e0e5 100644 --- a/project_task_project_required/models/res_company.py +++ b/project_task_project_required/models/res_company.py @@ -9,4 +9,5 @@ class ResCompany(models.Model): is_project_task_project_required = fields.Boolean( string='Require Projects on Tasks', + default=True, ) diff --git a/project_task_project_required/readme/CONFIGURE.rst b/project_task_project_required/readme/CONFIGURE.rst index f188b0381b..51ed7ea8d2 100644 --- a/project_task_project_required/readme/CONFIGURE.rst +++ b/project_task_project_required/readme/CONFIGURE.rst @@ -1,4 +1,7 @@ -To make project selection mandatory on task: +By installing this module, the project field +will be mandatory for all the companies. + +To make project selection optional on task for a given company: # Go to *Project > Configuration > Settings* -# Make task selection mandatory for new tasks by checking *Require Projects on Tasks* +# Uncheck *Require Projects on Tasks* diff --git a/project_task_project_required/static/description/index.html b/project_task_project_required/static/description/index.html index 8708f4c3b2..3ead26b296 100644 --- a/project_task_project_required/static/description/index.html +++ b/project_task_project_required/static/description/index.html @@ -384,9 +384,11 @@

Project: require Project on Task

Configuration

-

To make project selection mandatory on task:

+

By installing this module, the project field +will be mandatory for all the companies.

+

To make project selection optional on task for a given company:

# Go to Project > Configuration > Settings -# Make task selection mandatory for new tasks by checking Require Projects on Tasks

+# Uncheck Require Projects on Tasks

Bug Tracker

From c9c68eeec0d6427f5a3d25855d9bf6eec583b45a Mon Sep 17 00:00:00 2001 From: Alessandro Uffreduzzi Date: Mon, 6 Mar 2023 13:01:21 +0100 Subject: [PATCH 06/17] [IMP] project_task_project_required: pre-commit execution --- project_task_project_required/__manifest__.py | 28 +++++------ .../demo/res_company.xml | 4 +- .../models/project_task.py | 14 +++--- .../models/res_company.py | 4 +- .../models/res_config_settings.py | 6 +-- .../test_project_task_project_required.py | 49 +++++++++++-------- .../views/project_task.xml | 27 ++++++---- .../views/res_config_settings.xml | 19 +++++-- 8 files changed, 86 insertions(+), 65 deletions(-) diff --git a/project_task_project_required/__manifest__.py b/project_task_project_required/__manifest__.py index 931535a34a..f1bcd52843 100644 --- a/project_task_project_required/__manifest__.py +++ b/project_task_project_required/__manifest__.py @@ -3,23 +3,21 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { - 'name': 'Project: require Project on Task', - 'summary': """ + "name": "Project: require Project on Task", + "summary": """ Set project on task as a mandatory field""", - 'version': '12.0.1.1.0', - 'license': 'AGPL-3', - 'author': - 'CorporateHub, ' - 'Odoo Community Association (OCA)', - 'website': 'https://github.com/OCA/project', - 'depends': [ - 'project', + "version": "12.0.1.1.0", + "license": "AGPL-3", + "author": "CorporateHub, " "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/project", + "depends": [ + "project", ], - 'data': [ - 'views/project_task.xml', - 'views/res_config_settings.xml', + "data": [ + "views/project_task.xml", + "views/res_config_settings.xml", ], - 'demo': [ - 'demo/res_company.xml', + "demo": [ + "demo/res_company.xml", ], } diff --git a/project_task_project_required/demo/res_company.xml b/project_task_project_required/demo/res_company.xml index f2baf8e64a..21ef9f3cee 100644 --- a/project_task_project_required/demo/res_company.xml +++ b/project_task_project_required/demo/res_company.xml @@ -1,4 +1,4 @@ - + - + diff --git a/project_task_project_required/models/project_task.py b/project_task_project_required/models/project_task.py index 8a669ab23f..c8ad74b27c 100644 --- a/project_task_project_required/models/project_task.py +++ b/project_task_project_required/models/project_task.py @@ -1,22 +1,20 @@ # Copyright 2019 Brainbean Apps (https://brainbeanapps.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import ValidationError class ProjectTask(models.Model): - _inherit = 'project.task' + _inherit = "project.task" is_project_required = fields.Boolean( - string='Is Project Required', - related='company_id.is_project_task_project_required', + string="Is Project Required", + related="company_id.is_project_task_project_required", ) - @api.constrains('project_id') + @api.constrains("project_id") def _check_project_id(self): for task in self: if task.is_project_required and not task.project_id: - raise ValidationError(_( - 'You must specify a project for the task.' - )) + raise ValidationError(_("You must specify a project for the task.")) diff --git a/project_task_project_required/models/res_company.py b/project_task_project_required/models/res_company.py index 78c938e0e5..227d061030 100644 --- a/project_task_project_required/models/res_company.py +++ b/project_task_project_required/models/res_company.py @@ -5,9 +5,9 @@ class ResCompany(models.Model): - _inherit = 'res.company' + _inherit = "res.company" is_project_task_project_required = fields.Boolean( - string='Require Projects on Tasks', + string="Require Projects on Tasks", default=True, ) diff --git a/project_task_project_required/models/res_config_settings.py b/project_task_project_required/models/res_config_settings.py index 21dd8a8dd9..5b265fe520 100644 --- a/project_task_project_required/models/res_config_settings.py +++ b/project_task_project_required/models/res_config_settings.py @@ -5,10 +5,10 @@ class ResConfigSettings(models.TransientModel): - _inherit = 'res.config.settings' + _inherit = "res.config.settings" is_project_task_project_required = fields.Boolean( - string='Require Projects on Tasks', - related='company_id.is_project_task_project_required', + string="Require Projects on Tasks", + related="company_id.is_project_task_project_required", readonly=False, ) diff --git a/project_task_project_required/tests/test_project_task_project_required.py b/project_task_project_required/tests/test_project_task_project_required.py index ceee59cd71..e49960da41 100644 --- a/project_task_project_required/tests/test_project_task_project_required.py +++ b/project_task_project_required/tests/test_project_task_project_required.py @@ -6,34 +6,43 @@ class TestProjectTaskProjectRequired(TransactionCase): - def setUp(self): super().setUp() - self.Project = self.env['project.project'] - self.ProjectTask = self.env['project.task'] + self.Project = self.env["project.project"] + self.ProjectTask = self.env["project.task"] - self.project = self.Project.create({ - 'name': 'Project', - }) + self.project = self.Project.create( + { + "name": "Project", + } + ) def test_project_required(self): self.env.user.company_id.is_project_task_project_required = True with self.assertRaises(ValidationError): - self.ProjectTask.create({ - 'name': 'Task A', - }) - self.ProjectTask.create({ - 'name': 'Task B', - 'project_id': self.project.id, - }) + self.ProjectTask.create( + { + "name": "Task A", + } + ) + self.ProjectTask.create( + { + "name": "Task B", + "project_id": self.project.id, + } + ) def test_project_not_required(self): self.env.user.company_id.is_project_task_project_required = False - self.ProjectTask.create({ - 'name': 'Task A', - }) - self.ProjectTask.create({ - 'name': 'Task B', - 'project_id': self.project.id, - }) + self.ProjectTask.create( + { + "name": "Task A", + } + ) + self.ProjectTask.create( + { + "name": "Task B", + "project_id": self.project.id, + } + ) diff --git a/project_task_project_required/views/project_task.xml b/project_task_project_required/views/project_task.xml index f0adeb9e13..7609844269 100644 --- a/project_task_project_required/views/project_task.xml +++ b/project_task_project_required/views/project_task.xml @@ -1,4 +1,4 @@ - + - + diff --git a/project_task_project_required/i18n/it.po b/project_task_project_required/i18n/it.po index 2bbc336e4e..a63d647815 100644 --- a/project_task_project_required/i18n/it.po +++ b/project_task_project_required/i18n/it.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * project_task_project_required +# * project_task_project_required # msgid "" msgstr "" @@ -18,7 +18,10 @@ msgstr "" #. module: project_task_project_required #: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form -msgid "" +msgid "" +"" msgstr "" "\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -15,7 +15,10 @@ msgstr "" #. module: project_task_project_required #: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form -msgid "" +msgid "" +"" msgstr "" #. module: project_task_project_required @@ -28,11 +31,32 @@ msgstr "" msgid "Config Settings" msgstr "" +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task__display_name +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company__display_name +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__display_name +msgid "Display Name" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task__id +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company__id +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__id +msgid "ID" +msgstr "" + #. module: project_task_project_required #: model:ir.model.fields,field_description:project_task_project_required.field_project_task__is_project_required msgid "Is Project Required" msgstr "" +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task____last_update +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company____last_update +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings____last_update +msgid "Last Modified on" +msgstr "" + #. module: project_task_project_required #: model:ir.model.fields,field_description:project_task_project_required.field_res_company__is_project_task_project_required #: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__is_project_task_project_required @@ -50,8 +74,7 @@ msgid "Task" msgstr "" #. module: project_task_project_required -#: code:addons/project_task_project_required/models/project_task.py:20 +#: code:addons/project_task_project_required/models/project_task.py:0 #, python-format msgid "You must specify a project for the task." msgstr "" - diff --git a/project_task_project_required/i18n/pt_BR.po b/project_task_project_required/i18n/pt_BR.po index ccc65a2c8a..c6f6c18745 100644 --- a/project_task_project_required/i18n/pt_BR.po +++ b/project_task_project_required/i18n/pt_BR.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * project_task_project_required +# * project_task_project_required # msgid "" msgstr "" @@ -16,7 +16,10 @@ msgstr "" #. module: project_task_project_required #: model_terms:ir.ui.view,arch_db:project_task_project_required.res_config_settings_view_form -msgid "" +msgid "" +"" msgstr "" #. module: project_task_project_required @@ -29,11 +32,32 @@ msgstr "" msgid "Config Settings" msgstr "" +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task__display_name +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company__display_name +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__display_name +msgid "Display Name" +msgstr "" + +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task__id +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company__id +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__id +msgid "ID" +msgstr "" + #. module: project_task_project_required #: model:ir.model.fields,field_description:project_task_project_required.field_project_task__is_project_required msgid "Is Project Required" msgstr "" +#. module: project_task_project_required +#: model:ir.model.fields,field_description:project_task_project_required.field_project_task____last_update +#: model:ir.model.fields,field_description:project_task_project_required.field_res_company____last_update +#: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings____last_update +msgid "Last Modified on" +msgstr "" + #. module: project_task_project_required #: model:ir.model.fields,field_description:project_task_project_required.field_res_company__is_project_task_project_required #: model:ir.model.fields,field_description:project_task_project_required.field_res_config_settings__is_project_task_project_required @@ -51,7 +75,7 @@ msgid "Task" msgstr "" #. module: project_task_project_required -#: code:addons/project_task_project_required/models/project_task.py:20 +#: code:addons/project_task_project_required/models/project_task.py:0 #, python-format msgid "You must specify a project for the task." msgstr "" diff --git a/project_task_project_required/static/description/index.html b/project_task_project_required/static/description/index.html index 3ead26b296..5d61a7cc5d 100644 --- a/project_task_project_required/static/description/index.html +++ b/project_task_project_required/static/description/index.html @@ -1,20 +1,20 @@ - + - + Project: require Project on Task -
-

Project: require Project on Task

+
+ + +Odoo Community Association + +
+

Project: require Project on Task

-

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

+

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

This module allows to configure task as having project as a mandatory field.

Table of contents

@@ -385,7 +390,7 @@

Project: require Project on Task

-

Configuration

+

Configuration

By installing this module, the project field will be mandatory for all the companies.

To make project selection optional on task for a given company:

@@ -393,7 +398,7 @@

Configuration

# Uncheck Require Projects on Tasks

-

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 @@ -401,15 +406,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • CorporateHub
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -431,5 +436,6 @@

Maintainers

+
From a6275c58fa3c96afeafb427c78fa9b15a1c7e71a Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Thu, 13 Aug 2026 10:14:18 +0200 Subject: [PATCH 16/17] [IMP] project_task_project_required: pre-commit execution --- project_task_project_required/README.rst | 37 ++++++++--------- .../demo/res_company.xml | 2 - project_task_project_required/pyproject.toml | 3 ++ .../readme/CONFIGURE.md | 7 ++++ .../readme/CONFIGURE.rst | 7 ---- .../readme/CONTRIBUTORS.md | 2 + .../readme/CONTRIBUTORS.rst | 3 -- .../{DESCRIPTION.rst => DESCRIPTION.md} | 3 +- .../static/description/index.html | 41 ++++++++----------- .../views/project_task.xml | 2 - .../views/res_config_settings_views.xml | 2 - 11 files changed, 49 insertions(+), 60 deletions(-) create mode 100644 project_task_project_required/pyproject.toml create mode 100644 project_task_project_required/readme/CONFIGURE.md delete mode 100644 project_task_project_required/readme/CONFIGURE.rst create mode 100644 project_task_project_required/readme/CONTRIBUTORS.md delete mode 100644 project_task_project_required/readme/CONTRIBUTORS.rst rename project_task_project_required/readme/{DESCRIPTION.rst => DESCRIPTION.md} (83%) diff --git a/project_task_project_required/README.rst b/project_task_project_required/README.rst index 5ded271dfe..925c565f0c 100644 --- a/project_task_project_required/README.rst +++ b/project_task_project_required/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ================================ Project: require Project on Task ================================ @@ -17,22 +13,23 @@ Project: require Project on Task .. |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/license-AGPL--3-blue.png +.. |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_task_project_required + :target: https://github.com/OCA/project/tree/18.0/project_task_project_required :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_task_project_required + :target: https://translation.odoo-community.org/projects/project-18-0/project-18-0-project_task_project_required :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 + :target: https://runboat.odoo-community.org/builds?repo=OCA/project&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -This module allows to configure task as having project as a mandatory field. +This module allows to configure task as having project as a mandatory +field. **Table of contents** @@ -42,13 +39,13 @@ This module allows to configure task as having project as a mandatory field. Configuration ============= -By installing this module, the project field -will be mandatory for all the companies. +By installing this module, the project field will be mandatory for all +the companies. To make project selection optional on task for a given company: -# Go to *Project > Configuration > Settings* -# Uncheck *Require Projects on Tasks* +# Go to *Project > Configuration > Settings* # Uncheck *Require Projects +on Tasks* Bug Tracker =========== @@ -56,7 +53,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -64,19 +61,19 @@ Credits ======= Authors -~~~~~~~ +------- * CorporateHub Contributors -~~~~~~~~~~~~ +------------ -* `CorporateHub `__ +- `CorporateHub `__ - * Alexey Pelykh + - Alexey Pelykh Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -88,6 +85,6 @@ 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. +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_task_project_required/demo/res_company.xml b/project_task_project_required/demo/res_company.xml index 8669ee4d95..e0f2997b18 100644 --- a/project_task_project_required/demo/res_company.xml +++ b/project_task_project_required/demo/res_company.xml @@ -5,12 +5,10 @@ Copyright (C) 2022 - Today: GRAP (http://www.grap.coop) License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). --> - - diff --git a/project_task_project_required/pyproject.toml b/project_task_project_required/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/project_task_project_required/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/project_task_project_required/readme/CONFIGURE.md b/project_task_project_required/readme/CONFIGURE.md new file mode 100644 index 0000000000..b53d3424c1 --- /dev/null +++ b/project_task_project_required/readme/CONFIGURE.md @@ -0,0 +1,7 @@ +By installing this module, the project field will be mandatory for all +the companies. + +To make project selection optional on task for a given company: + +\# Go to *Project \> Configuration \> Settings* \# Uncheck *Require +Projects on Tasks* diff --git a/project_task_project_required/readme/CONFIGURE.rst b/project_task_project_required/readme/CONFIGURE.rst deleted file mode 100644 index 51ed7ea8d2..0000000000 --- a/project_task_project_required/readme/CONFIGURE.rst +++ /dev/null @@ -1,7 +0,0 @@ -By installing this module, the project field -will be mandatory for all the companies. - -To make project selection optional on task for a given company: - -# Go to *Project > Configuration > Settings* -# Uncheck *Require Projects on Tasks* diff --git a/project_task_project_required/readme/CONTRIBUTORS.md b/project_task_project_required/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..2bd0e1fc9a --- /dev/null +++ b/project_task_project_required/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [CorporateHub](https://corporatehub.eu/) + - Alexey Pelykh \ diff --git a/project_task_project_required/readme/CONTRIBUTORS.rst b/project_task_project_required/readme/CONTRIBUTORS.rst deleted file mode 100644 index 724bc1d03a..0000000000 --- a/project_task_project_required/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,3 +0,0 @@ -* `CorporateHub `__ - - * Alexey Pelykh diff --git a/project_task_project_required/readme/DESCRIPTION.rst b/project_task_project_required/readme/DESCRIPTION.md similarity index 83% rename from project_task_project_required/readme/DESCRIPTION.rst rename to project_task_project_required/readme/DESCRIPTION.md index e358832c9f..214a0cec82 100644 --- a/project_task_project_required/readme/DESCRIPTION.rst +++ b/project_task_project_required/readme/DESCRIPTION.md @@ -1 +1,2 @@ -This module allows to configure task as having project as a mandatory field. +This module allows to configure task as having project as a mandatory +field. diff --git a/project_task_project_required/static/description/index.html b/project_task_project_required/static/description/index.html index eb2c1891e5..c2bad93c90 100644 --- a/project_task_project_required/static/description/index.html +++ b/project_task_project_required/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Project: require Project on Task -
+
+

Project: require Project on Task

- - -Odoo Community Association - -
-

Project: require Project on Task

-

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

-

This module allows to configure task as having project as a mandatory field.

+

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

+

This module allows to configure task as having project as a mandatory +field.

Table of contents

    @@ -390,31 +386,31 @@

    Project: require Project on Task

-

Configuration

-

By installing this module, the project field -will be mandatory for all the companies.

+

Configuration

+

By installing this module, the project field will be mandatory for all +the companies.

To make project selection optional on task for a given company:

-

# Go to Project > Configuration > Settings -# Uncheck Require Projects on Tasks

+

# Go to Project > Configuration > Settings # Uncheck Require Projects +on Tasks

-

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 -feedback.

+feedback.

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

-

Credits

+

Credits

-

Authors

+

Authors

  • CorporateHub
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -431,11 +427,10 @@

Maintainers

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.

+

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_task_project_required/views/project_task.xml b/project_task_project_required/views/project_task.xml index 2871c6cfd8..dc8866c9cf 100644 --- a/project_task_project_required/views/project_task.xml +++ b/project_task_project_required/views/project_task.xml @@ -4,7 +4,6 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - project.task.tree project.task @@ -52,5 +51,4 @@ - diff --git a/project_task_project_required/views/res_config_settings_views.xml b/project_task_project_required/views/res_config_settings_views.xml index 200c10581a..e8d776a1c5 100644 --- a/project_task_project_required/views/res_config_settings_views.xml +++ b/project_task_project_required/views/res_config_settings_views.xml @@ -4,7 +4,6 @@ License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - res.config.settings.view.form res.config.settings @@ -35,5 +34,4 @@ - From ad699234b7a1a83232dd58417e8a20dd4df4a0d8 Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Thu, 13 Aug 2026 10:14:37 +0200 Subject: [PATCH 17/17] [MIG] project_task_project_required: Migration to 18.0 --- project_task_project_required/__manifest__.py | 2 +- .../models/project_task.py | 13 +++++++-- .../test_project_task_project_required.py | 20 +++++++------ .../views/project_task.xml | 28 ++++++------------- .../views/res_config_settings_views.xml | 26 ++++------------- 5 files changed, 38 insertions(+), 51 deletions(-) diff --git a/project_task_project_required/__manifest__.py b/project_task_project_required/__manifest__.py index e1895ce8a2..b786bfc4b6 100644 --- a/project_task_project_required/__manifest__.py +++ b/project_task_project_required/__manifest__.py @@ -6,7 +6,7 @@ "name": "Project: require Project on Task", "summary": """ Set project on task as a mandatory field""", - "version": "16.0.1.1.0", + "version": "18.0.1.0.0", "license": "AGPL-3", "author": "CorporateHub, " "Odoo Community Association (OCA)", "website": "https://github.com/OCA/project", diff --git a/project_task_project_required/models/project_task.py b/project_task_project_required/models/project_task.py index c8ad74b27c..9a246a8e93 100644 --- a/project_task_project_required/models/project_task.py +++ b/project_task_project_required/models/project_task.py @@ -9,10 +9,19 @@ class ProjectTask(models.Model): _inherit = "project.task" is_project_required = fields.Boolean( - string="Is Project Required", - related="company_id.is_project_task_project_required", + compute="_compute_is_project_required", ) + @api.depends_context("company") + @api.depends( + "company_id.is_project_task_project_required", + ) + def _compute_is_project_required(self): + current_company = self.env.company + for task in self: + company = task.company_id or current_company + task.is_project_required = company.is_project_task_project_required + @api.constrains("project_id") def _check_project_id(self): for task in self: diff --git a/project_task_project_required/tests/test_project_task_project_required.py b/project_task_project_required/tests/test_project_task_project_required.py index e49960da41..e7d4e84f47 100644 --- a/project_task_project_required/tests/test_project_task_project_required.py +++ b/project_task_project_required/tests/test_project_task_project_required.py @@ -2,24 +2,26 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo.exceptions import ValidationError -from odoo.tests import TransactionCase +from odoo.addons.base.tests.common import BaseCommon -class TestProjectTaskProjectRequired(TransactionCase): - def setUp(self): - super().setUp() - self.Project = self.env["project.project"] - self.ProjectTask = self.env["project.task"] +class TestProjectTaskProjectRequired(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() - self.project = self.Project.create( + cls.Project = cls.env["project.project"] + cls.ProjectTask = cls.env["project.task"] + + cls.project = cls.Project.create( { "name": "Project", } ) def test_project_required(self): - self.env.user.company_id.is_project_task_project_required = True + self.env.company.is_project_task_project_required = True with self.assertRaises(ValidationError): self.ProjectTask.create( { @@ -34,7 +36,7 @@ def test_project_required(self): ) def test_project_not_required(self): - self.env.user.company_id.is_project_task_project_required = False + self.env.company.is_project_task_project_required = False self.ProjectTask.create( { "name": "Task A", diff --git a/project_task_project_required/views/project_task.xml b/project_task_project_required/views/project_task.xml index dc8866c9cf..5a007c7d1b 100644 --- a/project_task_project_required/views/project_task.xml +++ b/project_task_project_required/views/project_task.xml @@ -5,17 +5,12 @@ --> - project.task.tree + project.task.list project.task - - - - {'required':[('is_project_required','=',True)]} + is_project_required @@ -25,14 +20,8 @@ project.task - - - - - {'invisible': [('parent_id', '!=', False)], 'required': [('is_project_required', '=', True)]} + is_project_required @@ -42,11 +31,12 @@ project.task - - - + is_project_required + diff --git a/project_task_project_required/views/res_config_settings_views.xml b/project_task_project_required/views/res_config_settings_views.xml index e8d776a1c5..58dc6b83ed 100644 --- a/project_task_project_required/views/res_config_settings_views.xml +++ b/project_task_project_required/views/res_config_settings_views.xml @@ -9,28 +9,14 @@ res.config.settings - -
+ -
- -
-
-
-
+ +