From 2b08476718ac6f64a2991d1a70f81f506271f061 Mon Sep 17 00:00:00 2001 From: "Jens W. Klein" Date: Tue, 17 Mar 2026 14:19:28 +0100 Subject: [PATCH 1/4] Use standalone generate_user_id/generate_login_name functions Replace register form view instantiation with direct calls to standalone functions from plone.app.users.utils. Includes BBB fallback for older plone.app.users versions. Part of PLIP 4292. Co-Authored-By: Claude Opus 4.6 --- news/4292.internal | 2 ++ src/plone/restapi/services/users/add.py | 23 +++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 news/4292.internal diff --git a/news/4292.internal b/news/4292.internal new file mode 100644 index 000000000..a2e6b1b63 --- /dev/null +++ b/news/4292.internal @@ -0,0 +1,2 @@ +Use standalone ``generate_user_id`` / ``generate_login_name`` functions +from ``plone.app.users.utils`` instead of instantiating the registration form view. diff --git a/src/plone/restapi/services/users/add.py b/src/plone/restapi/services/users/add.py index 90a4bf19d..b98c88cce 100644 --- a/src/plone/restapi/services/users/add.py +++ b/src/plone/restapi/services/users/add.py @@ -1,5 +1,14 @@ from AccessControl import getSecurityManager from plone.app.users.schema import ICombinedRegisterSchema + +try: + from plone.app.users.utils import generate_login_name + from plone.app.users.utils import generate_user_id + + HAS_STANDALONE_GENERATORS = True +except ImportError: + # BBB: plone.app.users without standalone generators (Plone < 6.2) + HAS_STANDALONE_GENERATORS = False from plone.restapi import _ from plone.restapi.bbb import ISecuritySchema from plone.restapi.deserializer import json_body @@ -234,10 +243,16 @@ def _add_user(self, data, location=True): "fullname": data.get("fullname", ""), } - register_view = getMultiAdapter((self.context, self.request), name="register") - - register_view.generate_user_id(user_id_login_name_data) - register_view.generate_login_name(user_id_login_name_data) + if HAS_STANDALONE_GENERATORS: + generate_user_id(self.context, user_id_login_name_data) + generate_login_name(self.context, user_id_login_name_data) + else: + # BBB: plone.app.users without standalone generators (Plone < 6.2) + register_view = getMultiAdapter( + (self.context, self.request), name="register" + ) + register_view.generate_user_id(user_id_login_name_data) + register_view.generate_login_name(user_id_login_name_data) user_id = user_id_login_name_data.get("user_id", data.get("username")) login_name = user_id_login_name_data.get("login_name", data.get("username")) From e2c6355a0ea43e8607d6ce7cf5f9a0e5126dfb19 Mon Sep 17 00:00:00 2001 From: David Glick Date: Thu, 19 Mar 2026 21:45:56 -0700 Subject: [PATCH 2/4] Update news/4292.internal --- news/4292.internal | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/news/4292.internal b/news/4292.internal index a2e6b1b63..9743ba52b 100644 --- a/news/4292.internal +++ b/news/4292.internal @@ -1,2 +1 @@ -Use standalone ``generate_user_id`` / ``generate_login_name`` functions -from ``plone.app.users.utils`` instead of instantiating the registration form view. +Use standalone ``generate_user_id`` / ``generate_login_name`` functions from ``plone.app.users.utils`` instead of instantiating the registration form view. @jensens From 42bb91269896554bd5150a77b12863a404b9257f Mon Sep 17 00:00:00 2001 From: "Jens W. Klein" Date: Mon, 23 Mar 2026 17:06:25 +0100 Subject: [PATCH 3/4] Update src/plone/restapi/services/users/add.py Co-authored-by: Maurits van Rees --- src/plone/restapi/services/users/add.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/plone/restapi/services/users/add.py b/src/plone/restapi/services/users/add.py index b98c88cce..1027a4e3c 100644 --- a/src/plone/restapi/services/users/add.py +++ b/src/plone/restapi/services/users/add.py @@ -244,18 +244,18 @@ def _add_user(self, data, location=True): } if HAS_STANDALONE_GENERATORS: - generate_user_id(self.context, user_id_login_name_data) - generate_login_name(self.context, user_id_login_name_data) + user_id = generate_user_id(self.context, user_id_login_name_data) + login_name = generate_login_name(self.context, user_id_login_name_data) else: # BBB: plone.app.users without standalone generators (Plone < 6.2) register_view = getMultiAdapter( (self.context, self.request), name="register" ) - register_view.generate_user_id(user_id_login_name_data) - register_view.generate_login_name(user_id_login_name_data) + user_id = register_view.generate_user_id(user_id_login_name_data) + login_name = register_view.generate_login_name(user_id_login_name_data) - user_id = user_id_login_name_data.get("user_id", data.get("username")) - login_name = user_id_login_name_data.get("login_name", data.get("username")) +user_id = user_id or username or email +login_name = login_name or username or email username = user_id properties["username"] = user_id From 48f7ae4ba1421b1389fdfc5442ab13eee92aff79 Mon Sep 17 00:00:00 2001 From: "Jens W. Klein" Date: Mon, 23 Mar 2026 18:17:02 +0100 Subject: [PATCH 4/4] Fix indentation error in users/add.py Lines 257-258 were missing indentation, causing syntax errors that broke QA (pyupgrade, black, flake8) and coverage CI jobs. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/plone/restapi/services/users/add.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plone/restapi/services/users/add.py b/src/plone/restapi/services/users/add.py index 1027a4e3c..052d0f099 100644 --- a/src/plone/restapi/services/users/add.py +++ b/src/plone/restapi/services/users/add.py @@ -254,8 +254,8 @@ def _add_user(self, data, location=True): user_id = register_view.generate_user_id(user_id_login_name_data) login_name = register_view.generate_login_name(user_id_login_name_data) -user_id = user_id or username or email -login_name = login_name or username or email + user_id = user_id or username or email + login_name = login_name or username or email username = user_id properties["username"] = user_id