diff --git a/addons/project/i18n/project.pot b/addons/project/i18n/project.pot index 8b072f5ab0f..6cef246111d 100644 --- a/addons/project/i18n/project.pot +++ b/addons/project/i18n/project.pot @@ -576,6 +576,14 @@ msgstr "" msgid "A tag with the same name already exists." msgstr "" +#. module: project +#: code:addons/project/models/project.py:0 +#, python-format +msgid "" +"A personal stage cannot be linked to a project because it is only visible to" +" its corresponding user." +msgstr "" + #. module: project #: model:ir.model.constraint,message:project.constraint_project_task_user_rel_project_personal_stage_unique msgid "A task can only have a single personal stage per user." diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 25f40dcd2ab..9b12cbaac24 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -169,6 +169,11 @@ class ProjectTaskType(models.Model): else: stage.disabled_rating_warning = False + @api.constrains('user_id', 'project_ids') + def _check_personal_stage_not_linked_to_projects(self): + if any(stage.user_id and stage.project_ids for stage in self): + raise UserError(_('A personal stage cannot be linked to a project because it is only visible to its corresponding user.')) + def remove_personal_stage(self): """ Remove a personal stage, tasks using that stage will move to the first diff --git a/addons/project/tests/__init__.py b/addons/project/tests/__init__.py index fb617a77540..c0c2e69792c 100644 --- a/addons/project/tests/__init__.py +++ b/addons/project/tests/__init__.py @@ -12,6 +12,7 @@ from . import test_project_sharing from . import test_project_sharing_portal_access from . import test_project_sharing_ui from . import test_project_subtasks +from . import test_project_task_type from . import test_project_ui from . import test_project_update_access_rights from . import test_project_update_flow diff --git a/addons/project/tests/test_project_task_type.py b/addons/project/tests/test_project_task_type.py new file mode 100644 index 00000000000..98f0e965008 --- /dev/null +++ b/addons/project/tests/test_project_task_type.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.exceptions import UserError +from odoo.addons.project.tests.test_project_base import TestProjectCommon + + +class TestProjectTaskType(TestProjectCommon): + + @classmethod + def setUpClass(cls): + super(TestProjectTaskType, cls).setUpClass() + + cls.stage_created = cls.env['project.task.type'].create({ + 'name': 'Stage Already Created', + }) + + def test_create_stage(self): + ''' + Verify that it is not possible to add to a newly created stage a `user_id` and a `project_ids` + ''' + with self.assertRaises(UserError): + self.env['project.task.type'].create({ + 'name': 'New Stage', + 'user_id': self.uid, + 'project_ids': [self.project_goats.id], + }) + + def test_modify_existing_stage(self): + ''' + - case 1: [`user_id`: not set, `project_ids`: not set] | Add `user_id` and `project_ids` => UserError + - case 2: [`user_id`: set, `project_ids`: not set] | Add `project_ids` => UserError + - case 3: [`user_id`: not set, `project_ids`: set] | Add `user_id` => UserError + ''' + # case 1 + with self.assertRaises(UserError): + self.stage_created.write({ + 'user_id': self.uid, + 'project_ids': [self.project_goats.id], + }) + + # case 2 + self.stage_created.write({ + 'user_id': self.uid, + }) + with self.assertRaises(UserError): + self.stage_created.write({ + 'project_ids': [self.project_goats.id], + }) + + # case 3 + self.stage_created.write({ + 'user_id': False, + 'project_ids': [self.project_goats.id], + }) + with self.assertRaises(UserError): + self.stage_created.write({ + 'user_id': self.uid, + })