From f46010803548eed968f06fb798a166e322f0a927 Mon Sep 17 00:00:00 2001 From: Maurits van Rees Date: Thu, 12 Nov 2020 21:22:25 +0100 Subject: [PATCH] Fixed compatibility with Zope 4.5.2 by making sure Location header is string. (#1020) On Python 2 it could be unicode for the users and groups end points. Fixes https://github.com/plone/plone.restapi/issues/1019 --- news/1019.bugfix | 4 ++++ src/plone/restapi/services/groups/add.py | 5 +++++ src/plone/restapi/services/users/add.py | 5 +++++ 3 files changed, 14 insertions(+) create mode 100644 news/1019.bugfix diff --git a/news/1019.bugfix b/news/1019.bugfix new file mode 100644 index 0000000000..78e29d48f8 --- /dev/null +++ b/news/1019.bugfix @@ -0,0 +1,4 @@ +Fixed compatibility with Zope 4.5.2 by making sure Location header is string. +On Python 2 it could be unicode for the users and groups end points. +Fixes `issue 1019 `_. +[maurits] \ No newline at end of file diff --git a/src/plone/restapi/services/groups/add.py b/src/plone/restapi/services/groups/add.py index 958a39e2fe..1432fde32f 100644 --- a/src/plone/restapi/services/groups/add.py +++ b/src/plone/restapi/services/groups/add.py @@ -9,6 +9,7 @@ from zope.interface import alsoProvides import plone.protect.interfaces +import six class GroupsPost(Service): @@ -65,6 +66,10 @@ def reply(self): group.addMember(userid) self.request.response.setStatus(201) + # Note: to please Zope 4.5.2+ we make sure the header is a string, + # and not unicode on Python 2. + if six.PY2 and not isinstance(groupname, str): + groupname = groupname.encode("utf-8") self.request.response.setHeader( "Location", portal.absolute_url() + "/@groups/" + groupname ) diff --git a/src/plone/restapi/services/users/add.py b/src/plone/restapi/services/users/add.py index 82c9093a9e..c73e05e76f 100644 --- a/src/plone/restapi/services/users/add.py +++ b/src/plone/restapi/services/users/add.py @@ -18,6 +18,7 @@ from zope.publisher.interfaces import IPublishTraverse import plone.protect.interfaces +import six try: # pragma: no cover @@ -215,6 +216,10 @@ def reply(self): if send_password_reset: registration.registeredNotify(username) self.request.response.setStatus(201) + # Note: to please Zope 4.5.2+ we make sure the header is a string, + # and not unicode on Python 2. + if six.PY2 and not isinstance(username, str): + username = username.encode("utf-8") self.request.response.setHeader( "Location", portal.absolute_url() + "/@users/" + username )