From 37c975eaf7b3c422fb1b21ead1db7ac1d46c7c88 Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Sun, 18 Sep 2016 11:21:33 +0200 Subject: [PATCH] Allow both unicode and bytes dotted string in utils.import_attr --- CHANGELOG.rst | 4 ++++ cas_server/utils.py | 12 ++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c119e1c..ab149b6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,10 @@ Added ----- * Add a test for login with missing parameter (username or password or both) +Fixed +----- +* Allow both unicode and bytes dotted string in utils.import_attr + v0.7.4 - 2016-09-07 =================== diff --git a/cas_server/utils.py b/cas_server/utils.py index 78fde92..af1e81e 100644 --- a/cas_server/utils.py +++ b/cas_server/utils.py @@ -117,14 +117,18 @@ def import_attr(path): transform a python dotted path to the attr :param path: A dotted path to a python object or a python object - :type path: :obj:`unicode` or anything + :type path: :obj:`unicode` or :obj:`str` or anything :return: The python object pointed by the dotted path or the python object unchanged """ - if not isinstance(path, str): + # if we got a str, decode it to unicode (normally it should only contain ascii) + if isinstance(path, six.binary_type): + path = path.decode("utf-8") + # if path is not an unicode, return it unchanged (may be it is already the attribute to import) + if not isinstance(path, six.text_type): return path - if "." not in path: + if u"." not in path: ValueError("%r should be of the form `module.attr` and we just got `attr`" % path) - module, attr = path.rsplit('.', 1) + module, attr = path.rsplit(u'.', 1) try: return getattr(import_module(module), attr) except ImportError: