Nested same set_user should keep the original context user

- set_context of Transaction.set_user is restricted to root

issue3523
review1961002
This commit is contained in:
Cédric Krier
2013-12-12 13:53:01 +01:00
parent e8bdcd5550
commit d6f22e01c3
3 changed files with 44 additions and 2 deletions
+1
View File
@@ -1,3 +1,4 @@
* set_context of Transaction.set_user is restricted to root
* Add a "copy" action to One2Many and Many2Many's set method
* Force UTC as timezone (migration script available on tryton-tools)
* Add relation_field for many2one
+35
View File
@@ -56,6 +56,41 @@ class TransactionTestCase(unittest.TestCase):
Exception, manipulate_cursor, DB_NAME, USER, context=CONTEXT)
self.assertTrue(empty_transaction(DB_NAME, USER, context=CONTEXT))
def test0030set_user(self):
'''
Test set_user
'''
with Transaction().start(DB_NAME, USER, context=CONTEXT) \
as transaction:
self.assertEqual(transaction.user, USER)
self.assertEqual(transaction.context.get('user'), None)
with Transaction().set_user(0):
self.assertEqual(transaction.user, 0)
self.assertEqual(transaction.context.get('user'), None)
with Transaction().set_user(0, set_context=True):
self.assertEqual(transaction.user, 0)
self.assertEqual(transaction.context.get('user'), USER)
# Nested same set_user should keep original context user
with Transaction().set_user(0, set_context=True):
self.assertEqual(transaction.user, 0)
self.assertEqual(transaction.context.get('user'), USER)
# Unset user context
with Transaction().set_user(0, set_context=False):
self.assertEqual(transaction.user, 0)
self.assertEqual(transaction.context.get('user'), None)
# set context for non root
self.assertRaises(ValueError,
Transaction().set_user, 2, set_context=True)
# not set context for non root
with Transaction().set_user(2):
self.assertEqual(transaction.user, 2)
def suite():
return unittest.TestLoader().loadTestsFromTestCase(TransactionTestCase)
+8 -2
View File
@@ -118,10 +118,16 @@ class Transaction(local):
return manager
def set_user(self, user, set_context=False):
if user != 0 and set_context:
raise ValueError('set_context only allowed for root')
manager = _AttributeManager(user=self.user,
context=self.context.copy())
context=self.context)
self.context = self.context.copy()
if set_context:
self.context.update({'user': self.user})
if user != self.user:
self.context['user'] = self.user
else:
self.context.pop('user', None)
self.user = user
return manager