trytond-patches/issue1961002_60001.diff

74 lines
2.7 KiB
Diff

Index: trytond/tests/test_transaction.py
===================================================================
--- a/trytond/trytond/tests/test_transaction.py
+++ b/trytond/trytond/tests/test_transaction.py
@@ -56,6 +56,41 @@
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)
Index: trytond/transaction.py
===================================================================
--- a/trytond/trytond/transaction.py
+++ b/trytond/trytond/transaction.py
@@ -118,10 +118,16 @@
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