diff --git a/addons/project/models/project.py b/addons/project/models/project.py
index 6c67bc69a2d..00faf9fed40 100644
--- a/addons/project/models/project.py
+++ b/addons/project/models/project.py
@@ -11,7 +11,7 @@ from random import randint
from odoo import api, Command, fields, models, tools, SUPERUSER_ID, _
from odoo.exceptions import UserError, ValidationError, AccessError
from odoo.tools import format_amount
-from odoo.osv.expression import OR
+from odoo.osv.expression import OR, AND
from odoo.tools.misc import get_lang
from .project_task_recurrence import DAYS, WEEKS
@@ -2233,7 +2233,27 @@ class ProjectTags(models.Model):
name = fields.Char('Name', required=True, translate=True)
color = fields.Integer(string='Color', default=_get_default_color)
+ project_ids = fields.Many2many('project.project', 'project_project_project_tags_rel', string='Projects')
+ task_ids = fields.Many2many('project.task', string='Tasks')
_sql_constraints = [
('name_uniq', 'unique (name)', "Tag name already exists!"),
]
+
+ @api.model
+ def _name_search(self, name='', args=None, operator='ilike', limit=100, name_get_uid=None):
+ domain = args
+ if 'project_id' in self.env.context:
+ project_id = self.env.context.get('project_id')
+ domain = AND([
+ domain,
+ ['|', ('task_ids.project_id', '=', project_id), ('project_ids', 'in', project_id)]
+ ])
+ return super()._name_search(name, domain, operator, limit, name_get_uid)
+
+ @api.model
+ def name_create(self, name):
+ existing_tag = self.search([('name', '=ilike', name.strip())], limit=1)
+ if existing_tag:
+ return existing_tag.name_get()[0]
+ return super().name_create(name)
diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml
index 528be4cdb08..8dc9e751a2d 100644
--- a/addons/project/views/project_views.xml
+++ b/addons/project/views/project_views.xml
@@ -923,7 +923,7 @@
-
+
@@ -1210,7 +1210,7 @@
-
+