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