Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions news/4292.bugfix
Comment thread
davisagli marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix ``plone.api.user.create()`` to respect ``use_uuid_as_userid`` and
``use_email_as_login`` registry settings, as well as custom ``IUserIdGenerator``
and ``ILoginNameGenerator`` utilities.
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"Products.PlonePAS",
"Products.CMFPlone",
"decorator",
"plone.app.users",
"plone.app.uuid",
"plone.app.dexterity",
"plone.app.intid",
Expand Down
30 changes: 26 additions & 4 deletions src/plone/api/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,24 +65,46 @@ def create(
"that is not email so you need to pass a username.",
)

# Generate user_id and login_name using the canonical implementation
# from plone.app.users, respecting use_uuid_as_userid,
# use_email_as_login, IUserIdGenerator, and ILoginNameGenerator.
from plone.app.users.utils import generate_login_name
from plone.app.users.utils import generate_user_id

site = portal.get()
data = {
"username": username,
"email": email,
"fullname": properties.get("fullname", ""),
}
generate_user_id(site, data)
generate_login_name(site, data)
user_id = data["user_id"]
login_name = data.get("login_name", username or email)
Comment thread
jensens marked this conversation as resolved.
Outdated

registration = portal.get_tool("portal_registration")
user_id = use_email_as_username and email or username

# Generate a random 8-char password
if not password:
chars = string.ascii_letters + string.digits
password = "".join(random.choice(chars) for char in range(8))

properties.update(username=user_id)
properties.update(email=email)
properties.update(username=user_id, email=email)

registration.addMember(
user_id,
password,
roles,
properties=properties,
)
return get(username=user_id)

# If user_id differs from login_name (e.g. UUID as user id with
# email as login), update the login name accordingly.
if user_id != login_name:
pas = portal.get_tool("acl_users")
pas.updateLoginName(user_id, login_name)

return get(userid=user_id)


@mutually_exclusive_parameters("userid", "username")
Expand Down
Loading