Barry Warsaw pushed to branch release-3.0 at mailman / Mailman
Commits:
6cfe2ecc by Barry Warsaw at 2015-07-31T21:22:05Z
By POSTing to a user resource with an existing unlinked address, you can link
the address to the user. Given by Abhilash Raj.
- - - - -
3 changed files:
- src/mailman/docs/NEWS.rst
- src/mailman/rest/addresses.py
- src/mailman/rest/tests/test_addresses.py
Changes:
=====================================
src/mailman/docs/NEWS.rst
=====================================
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -28,6 +28,8 @@ Bugs
``list_url`` or permalink. Given by Aurélien Bompard.
* The REST API incorrectly parsed `is_server_owner` values when given
explicitly in the POST that creates a user. (Closes #136)
+ * By POSTing to a user resource with an existing unlinked address, you can
+ link the address to the user. Given by Abhilash Raj.
3.0.0 -- "Show Don't Tell"
=====================================
src/mailman/rest/addresses.py
=====================================
--- a/src/mailman/rest/addresses.py
+++ b/src/mailman/rest/addresses.py
@@ -211,11 +211,20 @@ class UserAddresses(_AddressBase):
except InvalidEmailAddressError:
bad_request(response, b'Invalid email address')
except ExistingAddressError:
- bad_request(response, b'Address already exists')
+ # Check if the address is not linked to any user, link it to the
+ # current user and return it. Since we're linking to an existing
+ # address, ignore any given display_name attribute.
+ address = user_manager.get_address(validator(request)['email'])
+ if address.user is None:
+ address.user = self._user
+ location = path_to('addresses/{}'.format(address.email))
+ created(response, location)
+ else:
+ bad_request(response, 'Address belongs to other user.')
else:
# Link the address to the current user and return it.
address.user = self._user
- created(response, path_to('addresses/{0}'.format(address.email)))
+ created(response, path_to('addresses/{}'.format(address.email)))
=====================================
src/mailman/rest/tests/test_addresses.py
=====================================
--- a/src/mailman/rest/tests/test_addresses.py
+++ b/src/mailman/rest/tests/test_addresses.py
@@ -168,7 +168,48 @@ class TestAddresses(unittest.TestCase):
'email': '[email protected]',
})
self.assertEqual(cm.exception.code, 400)
- self.assertEqual(cm.exception.reason, b'Address already exists')
+ self.assertEqual(cm.exception.reason,
+ b'Address belongs to other user.')
+
+ def test_add_unlinked_address_to_user(self):
+ user_manager = getUtility(IUserManager)
+ with transaction():
+ anne = user_manager.create_user('[email protected]')
+ user_manager.create_address('[email protected]')
+ response, content = call_api(
+ 'http://localhost:9001/3.0/users/[email protected]/addresses', {
+ 'email': '[email protected]',
+ })
+ self.assertIn('[email protected]',
+ [address.email for address in anne.addresses])
+ self.assertEqual(content['status'], '201')
+ self.assertEqual(
+ content['location'],
+ 'http://localhost:9001/3.0/addresses/[email protected]')
+ # The address has no display name.
+ anne_person = user_manager.get_address('[email protected]')
+ self.assertEqual(anne_person.display_name, '')
+
+ def test_add_unlinked_address_to_user_with_ignored_display_name(self):
+ user_manager = getUtility(IUserManager)
+ with transaction():
+ anne = user_manager.create_user('[email protected]')
+ user_manager.create_address('[email protected]')
+ response, content = call_api(
+ 'http://localhost:9001/3.0/users/[email protected]/addresses', {
+ 'email': '[email protected]',
+ 'display_name': 'Anne Person',
+ })
+ self.assertIn('[email protected]',
+ [address.email for address in anne.addresses])
+ self.assertEqual(content['status'], '201')
+ self.assertEqual(
+ content['location'],
+ 'http://localhost:9001/3.0/addresses/[email protected]')
+ # Even though a display_name was given in the POST data, because the
+ # address already existed, it still has no display name.
+ anne_person = user_manager.get_address('[email protected]')
+ self.assertEqual(anne_person.display_name, '')
def test_invalid_address_bad_request(self):
# Trying to add an invalid address string returns 400.
View it on GitLab:
https://gitlab.com/mailman/mailman/commit/6cfe2eccc5e4655df51c776c02887b72d0ff37c3
_______________________________________________
Mailman-checkins mailing list
[email protected]
Unsubscribe:
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org