summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhilash Raj2015-07-30 15:25:22 +0530
committerAbhilash Raj2015-07-30 15:25:22 +0530
commitc76660e4fd34948e96ea2a00b5f52f50b4845dda (patch)
treed1e0d66efd4f41ee91e59c9d5c2154548a25b473
parentd903aa4ba57dc19699972bf22b7874edd90434a8 (diff)
downloadmailman-c76660e4fd34948e96ea2a00b5f52f50b4845dda.tar.gz
mailman-c76660e4fd34948e96ea2a00b5f52f50b4845dda.tar.zst
mailman-c76660e4fd34948e96ea2a00b5f52f50b4845dda.zip
-rw-r--r--src/mailman/rest/addresses.py10
-rw-r--r--src/mailman/rest/tests/test_addresses.py21
2 files changed, 29 insertions, 2 deletions
diff --git a/src/mailman/rest/addresses.py b/src/mailman/rest/addresses.py
index 9dbbf3fc8..c62048b6a 100644
--- a/src/mailman/rest/addresses.py
+++ b/src/mailman/rest/addresses.py
@@ -211,7 +211,15 @@ 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.
+ address = user_manager.get_address(**validator(request))
+ if address.user is None:
+ address.user = self._user
+ location = self.path_to('addresses/{0}'.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
diff --git a/src/mailman/rest/tests/test_addresses.py b/src/mailman/rest/tests/test_addresses.py
index d03dc79d7..02c190c08 100644
--- a/src/mailman/rest/tests/test_addresses.py
+++ b/src/mailman/rest/tests/test_addresses.py
@@ -168,7 +168,26 @@ class TestAddresses(unittest.TestCase):
'email': 'anne@example.com',
})
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('anne.person@example.com')
+ user_manager.create_address('anne@example.com')
+ response, content = call_api(
+ 'http://localhost:9001/3.0/users/anne.person@example.com/addresses',
+ { 'email': 'anne@example.com'})
+
+ self.assertIn('anne@example.com',
+ [addr.email for addr in anne.addresses])
+ self.assertEqual(content['status'], '201')
+ self.assertEqual(
+ content['location'],
+ 'http://localhost:9001/3.0/addresses/anne@example.com')
+ # The address has no display name.
+ anne_person = user_manager.get_address('anne@example.com')
+ self.assertEqual(anne_person.display_name, '')
def test_invalid_address_bad_request(self):
# Trying to add an invalid address string returns 400.