diff --git a/addons/project/models/project_tags.py b/addons/project/models/project_tags.py index 5ababfccdd1..1ab86ea6dc2 100644 --- a/addons/project/models/project_tags.py +++ b/addons/project/models/project_tags.py @@ -27,22 +27,38 @@ class ProjectTags(models.Model): ] def _get_project_tags_domain(self, domain, project_id): - tag_ids = list(self.with_user(SUPERUSER_ID)._search( - ['|', ('task_ids.project_id', '=', project_id), ('project_ids', 'in', project_id)])) - return expression.AND([domain, [('id', 'in', tag_ids)]]) + # TODO: Remove in master + return domain @api.model def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True): if 'project_id' in self.env.context: - domain = self._get_project_tags_domain(domain, self.env.context.get('project_id')) + tag_ids = self._name_search('') + domain = expression.AND([domain, [('id', 'in', tag_ids)]]) return super().read_group(domain, fields, groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy) @api.model def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None): if 'project_id' in self.env.context: - domain = self._get_project_tags_domain(domain, self.env.context.get('project_id')) + tag_ids = self._name_search('') + domain = expression.AND([domain, [('id', 'in', tag_ids)]]) + return self.arrange_tag_list_by_id(super().search_read(domain=domain, fields=fields, offset=offset, limit=limit), tag_ids) return super().search_read(domain=domain, fields=fields, offset=offset, limit=limit, order=order) + @api.model + def arrange_tag_list_by_id(self, tag_list, id_order): + """arrange_tag_list_by_id re-order a list of record values (dict) following a given id sequence + complexity: O(n) + param: + - tag_list: ordered (by id) list of record values, each record being a dict + containing at least an 'id' key + - id_order: list of value (int) corresponding to the id of the records to re-arrange + result: + - Sorted list of record values (dict) + """ + tags_by_id = {tag['id']: tag for tag in tag_list} + return [tags_by_id[id] for id in id_order if id in tags_by_id] + @api.model def _name_search(self, name, domain=None, operator='ilike', limit=None, order=None): if self.env.context.get('project_id') and operator == 'ilike':