summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Ledoux <dle@odoo.com>2016-01-29 16:55:23 +0100
committerDenis Ledoux <dle@odoo.com>2016-01-29 16:55:23 +0100
commit6c8bbc3d466b9d5d83d3b7f46f3a904bd433cdaf (patch)
tree21a24130a0133440ed8bc9e9f3a55f96290b912f
parenta157fcd8cd5108586d1f59685393ce172dbd67ac (diff)
Revert "[FIX] fields: make `related_sudo` work for draft records (used by onchange)"
This reverts commits - 995b257a6c09b9dfd89eedac3a84ff36948b095b - 2ebdb5f36e2f83dac4ec67c2e54e55a4d30bf986 - 748a719fd939cf1028cc217d8b5a8ef8dc39ee08. The commit 748a719fd939cf1028cc217d8b5a8ef8dc39ee08 leads to an issue bigger than what it aims to solve: - as demo user - create a new invoice - add a new line - select a product -> traceback opw-668141
-rw-r--r--openerp/addons/test_new_api/tests/test_new_fields.py46
-rw-r--r--openerp/fields.py15
2 files changed, 4 insertions, 57 deletions
diff --git a/openerp/addons/test_new_api/tests/test_new_fields.py b/openerp/addons/test_new_api/tests/test_new_fields.py
index 8a7d9225f3b..e1ceca9ea51 100644
--- a/openerp/addons/test_new_api/tests/test_new_fields.py
+++ b/openerp/addons/test_new_api/tests/test_new_fields.py
@@ -5,7 +5,7 @@ from datetime import date, datetime
from openerp.exceptions import AccessError
from openerp.tests import common
-from openerp.tools import mute_logger
+from openerp.exceptions import except_orm
class TestNewFields(common.TransactionCase):
@@ -420,49 +420,7 @@ class TestNewFields(common.TransactionCase):
self.assertEqual(message.name, "[%s] %s" % (discussion.name, ''))
self.assertEqual(message.size, len(BODY))
- @mute_logger('openerp.addons.base.ir.ir_model')
- def test_41_new_related(self):
- """ test the behavior of related fields starting on new records. """
- # make discussions unreadable for demo user
- access = self.env.ref('test_new_api.access_discussion')
- access.write({'perm_read': False})
-
- # create an environment for demo user
- env = self.env(user=self.env.ref('base.user_demo'))
- self.assertEqual(env.user.login, "demo")
-
- # create a new message as demo user
- discussion = self.env.ref('test_new_api.discussion_0')
- message = env['test_new_api.message'].new({'discussion': discussion})
- self.assertEqual(message.discussion, discussion)
-
- # read the related field discussion_name
- self.assertEqual(message.discussion.env, env)
- self.assertEqual(message.discussion_name, discussion.name)
- with self.assertRaises(AccessError):
- message.discussion.name
-
- @mute_logger('openerp.addons.base.ir.ir_model')
- def test_42_new_related(self):
- """ test the behavior of related fields traversing new records. """
- # make discussions unreadable for demo user
- access = self.env.ref('test_new_api.access_discussion')
- access.write({'perm_read': False})
-
- # create an environment for demo user
- env = self.env(user=self.env.ref('base.user_demo'))
- self.assertEqual(env.user.login, "demo")
-
- # create a new discussion and a new message as demo user
- discussion = env['test_new_api.discussion'].new({'name': 'Stuff'})
- message = env['test_new_api.message'].new({'discussion': discussion})
- self.assertEqual(message.discussion, discussion)
-
- # read the related field discussion_name
- self.assertNotEqual(message.sudo().env, message.env)
- self.assertEqual(message.discussion_name, discussion.name)
-
- def test_50_defaults(self):
+ def test_41_defaults(self):
""" test default values. """
fields = ['discussion', 'body', 'author', 'size']
defaults = self.env['test_new_api.message'].default_get(fields)
diff --git a/openerp/fields.py b/openerp/fields.py
index e86e3582f59..19bf4184574 100644
--- a/openerp/fields.py
+++ b/openerp/fields.py
@@ -42,15 +42,6 @@ def _check_value(value):
""" Return ``value``, or call its getter if ``value`` is a :class:`SpecialValue`. """
return value.get() if isinstance(value, SpecialValue) else value
-def copy_cache(records, env):
- """ Recursively copy the cache of ``records`` to the environment ``env``. """
- for record, target in zip(records, records.with_env(env)):
- if not target._cache:
- for name, value in record._cache.iteritems():
- target[name] = value
- if isinstance(value, BaseModel):
- copy_cache(value, env)
-
def resolve_mro(model, name, predicate):
""" Return the list of successively overridden values of attribute ``name``
@@ -570,10 +561,8 @@ class Field(object):
# when related_sudo, bypass access rights checks when reading values
others = records.sudo() if self.related_sudo else records
for record, other in zip(records, others):
- if not record.id and record.env != other.env:
- # draft records: copy record's cache to other's cache first
- copy_cache(record, other.env)
- other, field = self.traverse_related(other)
+ # do not switch to another environment if record is a draft one
+ other, field = self.traverse_related(other if record.id else record)
record[self.name] = other[field.name]
def _inverse_related(self, records):