diff --git a/docs/portal.md b/docs/portal.md index f3a22a3e..468af179 100644 --- a/docs/portal.md +++ b/docs/portal.md @@ -205,12 +205,7 @@ api.portal.send_email( % % self.assertEqual(len(mailhost.messages), 1) % -% try: -% # Python 3 -% from email import message_from_bytes -% except ImportError: -% # Python 2 -% from email import message_from_string as message_from_bytes +% from email import message_from_bytes % msg = message_from_bytes(mailhost.messages[0]) % self.assertEqual(msg['To'], 'bob@plone.org') % self.assertEqual(msg['From'], 'noreply@plone.org') diff --git a/news/592.bugfix.md b/news/592.bugfix.md new file mode 100644 index 00000000..b55dbc5e --- /dev/null +++ b/news/592.bugfix.md @@ -0,0 +1 @@ +Clean up. @ale-rt diff --git a/src/plone/api/content.py b/src/plone/api/content.py index 9d4c6d91..552afffd 100644 --- a/src/plone/api/content.py +++ b/src/plone/api/content.py @@ -25,7 +25,7 @@ import transaction import uuid -_marker = [] +_marker = object() # Maximum number of attempts to generate a unique random ID MAX_UNIQUE_ID_ATTEMPTS = 100 @@ -753,7 +753,7 @@ def iter_ancestors(obj=None, function=None, interface=None, stop_at=_marker): # # This is useful if we want to have an empty iterator when checking # for ancestors in the portal. - return iter(()) + yield from () chain = aq_chain(aq_inner(obj)) diff --git a/src/plone/api/portal.py b/src/plone/api/portal.py index 6d3f1b46..74e8bf98 100644 --- a/src/plone/api/portal.py +++ b/src/plone/api/portal.py @@ -170,11 +170,6 @@ def send_email( # formataddr probably got confused by special characters. sender = from_address - # If the mail headers are not properly encoded we need to extract - # them and let MailHost manage the encoding. - if isinstance(body, str): - body = body.encode(encoding) - host = get_tool("MailHost") host.send( body, diff --git a/src/plone/api/tests/test_portal.py b/src/plone/api/tests/test_portal.py index ac8124d7..e5bb0076 100644 --- a/src/plone/api/tests/test_portal.py +++ b/src/plone/api/tests/test_portal.py @@ -2,6 +2,7 @@ from datetime import date from datetime import datetime +from email import message_from_bytes from packaging import version from plone.api import content from plone.api import env @@ -25,14 +26,6 @@ import DateTime import unittest -try: - # Python 3 - from email import message_from_bytes -except ImportError: - # Python 2 - from email import message_from_string as message_from_bytes - - HAS_PLONE5 = version.parse(env.plone_version()) >= version.parse("5.0b2") diff --git a/src/plone/api/user.py b/src/plone/api/user.py index 2e93b98f..a82de89c 100644 --- a/src/plone/api/user.py +++ b/src/plone/api/user.py @@ -438,9 +438,16 @@ def revoke_roles(username=None, user=None, obj=None, roles=None): if user is None: raise InvalidParameterError("User could not be found") - roles = set(roles) - - if "Anonymous" in roles or "Authenticated" in roles: + try: + roles_set = set(roles) + if not all(isinstance(role, str) for role in roles_set): + raise InvalidParameterError( + "Roles must be an iterable containing only strings" + ) + except TypeError: + raise InvalidParameterError("Roles must be an iterable containing only strings") + + if "Anonymous" in roles_set or "Authenticated" in roles_set: raise InvalidParameterError inherit = True @@ -454,7 +461,7 @@ def revoke_roles(username=None, user=None, obj=None, roles=None): if role not in ["Anonymous", "Authenticated"] } - roles = list(actual_roles - roles) + roles = list(actual_roles - roles_set) if obj is None: user.setSecurityProfile(roles=roles)