# HG changeset patch # User Sylvain Thénault # Date 1484921778 -3600 # Node ID c38e13988c10129ec7bff0207cdac27dba6dcb9f # Parent 244cd7f407b86fc8dee91daa3c2a03f0c6f75634 Fix str(Unauthorized) which is really problematic on python 3 where __unicode__ is never called anymore. This was caused because in PY3, CubicWebException.__str__ was referencing __unicode__ implementation of CubicWebException, not of its subclass that implements it. Fix a flake8 style warning about lambda assignment as a bonus. diff -r 244cd7f407b8 -r c38e13988c10 cubicweb/_exceptions.py --- a/cubicweb/_exceptions.py Fri Jan 20 03:54:43 2017 +0100 +++ b/cubicweb/_exceptions.py Fri Jan 20 15:16:18 2017 +0100 @@ -21,7 +21,7 @@ from warnings import warn -from six import PY3, text_type +from six import PY2, text_type from logilab.common.decorators import cachedproperty @@ -40,7 +40,13 @@ return self.msg else: return u' '.join(text_type(arg) for arg in self.args) - __str__ = __unicode__ if PY3 else lambda self: self.__unicode__().encode('utf-8') + + def __str__(self): + res = self.__unicode__() + if PY2: + res = res.encode('utf-8') + return res + class ConfigurationError(CubicWebException): """a misconfiguration error""" diff -r 244cd7f407b8 -r c38e13988c10 cubicweb/test/unittest_utils.py --- a/cubicweb/test/unittest_utils.py Fri Jan 20 03:54:43 2017 +0100 +++ b/cubicweb/test/unittest_utils.py Fri Jan 20 15:16:18 2017 +0100 @@ -1,4 +1,4 @@ -# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# copyright 2003-2017 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of CubicWeb. @@ -27,9 +27,10 @@ except ImportError: # Python3 from unittest import TestCase +from six import PY2 from six.moves import range -from cubicweb import Binary +from cubicweb import Binary, Unauthorized from cubicweb.devtools.testlib import CubicWebTC from cubicweb.utils import (make_uid, UStringIO, RepeatList, HTMLHead, QueryCache, parse_repo_uri) @@ -40,6 +41,7 @@ except ImportError: json = None + class MakeUidTC(TestCase): def test_1(self): self.assertNotEqual(make_uid('xyz'), make_uid('abcd')) @@ -325,6 +327,26 @@ self.config.global_set_option('concat-resources', True) +def UnauthorizedTC(TestCase): + + def _test(self, func): + self.assertEqual(func(Unauthorized()), + 'You are not allowed to perform this operation') + self.assertEqual(func(Unauthorized('a')), + 'a') + self.assertEqual(func(Unauthorized('a', 'b')), + 'You are not allowed to perform a operation on b') + self.assertEqual(func(Unauthorized('a', 'b', 'c')), + 'a b c') + + def test_str(self): + self._test(str) + + if PY2: + def test_unicode(self): + self._test(unicode) + + def load_tests(loader, tests, ignore): import cubicweb.utils tests.addTests(doctest.DocTestSuite(cubicweb.utils))