From 233c7780e69fec1453da8eaa297d4999437a2e91 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Mon, 25 Apr 2016 12:13:14 +0200 Subject: [PATCH] [FIX] fields: filter result of 2many related fields with related_sudo When traversing relational fields as superuser, you end up with a recordset for which only a subset is accessible to the current user. An earlier fix to this issue completely dropped the `related_sudo` feature; change its implementation to keep the feature. --- openerp/fields.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/openerp/fields.py b/openerp/fields.py index 3133227f758..94e15f1bac9 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -1713,12 +1713,15 @@ class _RelationalMulti(_Relational): def _compute_related(self, records): """ Compute the related field ``self`` on ``records``. """ - for record in records: - value = record - # traverse the intermediate fields, and keep at most one record - for name in self.related[:-1]: - value = value[name][:1] - record[self.name] = value[self.related[-1]] + super(_RelationalMulti, self)._compute_related(records) + if self.related_sudo: + # determine which records in the relation are actually accessible + target = records.mapped(self.name) + target_ids = set(target.search([('id', 'in', target.ids)]).ids) + accessible = lambda target: target.id in target_ids + # filter values to keep the accessible records only + for record in records: + record[self.name] = record[self.name].filtered(accessible) class One2many(_RelationalMulti):