Aurélien Bompard has proposed merging lp:~abompard/mailman/link_on_creation
into lp:mailman.
Requested reviews:
Mailman Coders (mailman-coders)
For more details, see:
https://code.launchpad.net/~abompard/mailman/link_on_creation/+merge/225118
In the REST interface, when creating a user with an existing address, the
server currently replies with a Bad Request error. This changes creates the
user and links the existing address to it.
A unit test is provided.
--
https://code.launchpad.net/~abompard/mailman/link_on_creation/+merge/225118
Your team Mailman Coders is requested to review the proposed merge of
lp:~abompard/mailman/link_on_creation into lp:mailman.
=== modified file 'src/mailman/rest/tests/test_users.py'
--- src/mailman/rest/tests/test_users.py 2014-04-15 21:54:35 +0000
+++ src/mailman/rest/tests/test_users.py 2014-07-01 08:25:55 +0000
@@ -120,7 +120,20 @@
})
self.assertEqual(cm.exception.code, 400)
self.assertEqual(cm.exception.reason,
- 'Address already exists: [email protected]')
+ 'User already exists: [email protected]')
+
+ def test_existing_address_link(self):
+ # Creating a user with an existing address links them
+ user_manager = getUtility(IUserManager)
+ with transaction():
+ user_manager.create_address('[email protected]')
+ call_api('http://localhost:9001/3.0/users', {
+ 'email': '[email protected]',
+ })
+ anne = user_manager.get_user('[email protected]')
+ self.assertNotEqual(anne, None)
+ self.assertTrue('[email protected]' in
+ [ a.email for a in anne.addresses ])
def test_addresses_of_missing_user_id(self):
# Trying to get the /addresses of a missing user id results in error.
=== modified file 'src/mailman/rest/users.py'
--- src/mailman/rest/users.py 2014-04-28 15:23:35 +0000
+++ src/mailman/rest/users.py 2014-07-01 08:25:55 +0000
@@ -117,11 +117,21 @@
# so strip that out (if it exists), then create the user, adding the
# password after the fact if successful.
password = arguments.pop('password', None)
+ user_manager = getUtility(IUserManager)
try:
- user = getUtility(IUserManager).create_user(**arguments)
+ user = user_manager.create_user(**arguments)
except ExistingAddressError as error:
- return http.bad_request(
- [], b'Address already exists: {0}'.format(error.address))
+ user = user_manager.get_user(arguments["email"])
+ if user is None:
+ # existing address but no user: link it
+ address = user_manager.get_address(arguments["email"])
+ args_no_email = arguments.copy()
+ del args_no_email["email"]
+ user = user_manager.create_user(**args_no_email)
+ user.link(address)
+ else:
+ return http.bad_request(
+ [], b'User already exists: {0}'.format(error.address))
if password is None:
# This will have to be reset since it cannot be retrieved.
password = generate(int(config.passwords.password_length))
_______________________________________________
Mailman-coders mailing list
[email protected]
https://mail.python.org/mailman/listinfo/mailman-coders