diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman/rest/addresses.py | 18 | ||||
| -rw-r--r-- | src/mailman/rest/docs/addresses.rst | 34 | ||||
| -rw-r--r-- | src/mailman/rest/tests/test_addresses.py | 35 |
3 files changed, 87 insertions, 0 deletions
diff --git a/src/mailman/rest/addresses.py b/src/mailman/rest/addresses.py index 51bbe2046..3949944b1 100644 --- a/src/mailman/rest/addresses.py +++ b/src/mailman/rest/addresses.py @@ -34,6 +34,7 @@ from zope.component import getUtility from mailman.rest.helpers import CollectionMixin, etag, no_content, path_to from mailman.rest.members import MemberCollection from mailman.rest.preferences import Preferences +from mailman.interfaces.address import ExistingAddressError from mailman.interfaces.usermanager import IUserManager from mailman.utilities.datetime import now @@ -174,6 +175,23 @@ class UserAddresses(_AddressBase): resource = self._make_collection(request) return http.ok([], etag(resource)) + @resource.POST() + def create(self, request): + """Add a new address to the user record.""" + email = request.POST.get('email') + if not email: + return http.bad_request([], b'No email address provided.') + # Create a new address and connect it to the current user + try: + address = getUtility(IUserManager).create_address(email) + address.user = self._user + location = path_to('addresses/{0}'.format(address.email)) + return http.created(location, [], None) + # ... except the address already exists. + except ExistingAddressError: + return http.bad_request( + [], b'Address already exists: {0}'.format(email)) + def membership_key(member): diff --git a/src/mailman/rest/docs/addresses.rst b/src/mailman/rest/docs/addresses.rst index f05b6b9b2..a12d2cbbc 100644 --- a/src/mailman/rest/docs/addresses.rst +++ b/src/mailman/rest/docs/addresses.rst @@ -174,6 +174,40 @@ addresses live in the /addresses namespace. self_link: http://localhost:9001/3.0/addresses/dave@example.com +A user record can have multiple email addresses associated with it. +Adding a new address can be done by posting to the /addresses namespace. + + >>> dump_json('http://localhost:9001/3.0/users/dave@example.com/' + ... 'addresses', { + ... 'email': 'dave.person@example.org' + ... }) + content-length: 0 + date: ... + location: http://localhost:9001/3.0/addresses/dave.person@example.org + server: ... + status: 201 + +The new address now shows up in the result of the user's /addresses endpoint. + + >>> dump_json('http://localhost:9001/3.0/users/dave@example.com/addresses') + entry 0: + email: dave.person@example.org + http_etag: "..." + original_email: dave.person@example.org + registered_on: 2005-08-01T07:49:23 + self_link: http://localhost:9001/3.0/addresses/dave.person@example.org + entry 1: + display_name: Dave Person + email: dave@example.com + http_etag: "..." + original_email: dave@example.com + registered_on: 2005-08-01T07:49:23 + self_link: http://localhost:9001/3.0/addresses/dave@example.com + http_etag: "..." + start: 0 + total_size: 2 + + Memberships =========== diff --git a/src/mailman/rest/tests/test_addresses.py b/src/mailman/rest/tests/test_addresses.py index 9d9e44c22..7b89d79de 100644 --- a/src/mailman/rest/tests/test_addresses.py +++ b/src/mailman/rest/tests/test_addresses.py @@ -109,3 +109,38 @@ class TestAddresses(unittest.TestCase): call_api('http://localhost:9001/3.0/addresses/' 'anne@example.com/unverify/foo', {}) self.assertEqual(cm.exception.code, 400) + + def test_address_added_to_user(self): + # Address is added to a user record. + with transaction(): + anne = getUtility(IUserManager).create_user('anne@example.com') + response, content = call_api('http://localhost:9001/3.0/users/' + 'anne@example.com/addresses', { + 'email': 'anne.person@example.org' + }) + self.assertTrue('anne.person@example.org' in [a.email for a in + anne.addresses]) + self.assertEqual(content['status'], '201') + + def test_existing_address_bad_request(self): + # Posting an existing address returns 400. + with transaction(): + anne = getUtility(IUserManager).create_user('anne@example.com') + with self.assertRaises(HTTPError) as cm: + call_api('http://localhost:9001/3.0/users/' + 'anne@example.com/addresses', { + 'email': 'anne@example.com' + }) + self.assertEqual(cm.exception.code, 400) + self.assertEqual(cm.exception.reason, 'Address already exists: ' + 'anne@example.com') + + def test_empty_address_bad_request(self): + # Posting no address returns 400. + with transaction(): + anne = getUtility(IUserManager).create_user('anne@example.com') + with self.assertRaises(HTTPError) as cm: + call_api('http://localhost:9001/3.0/users/' + 'anne@example.com/addresses', {}) + self.assertEqual(cm.exception.code, 400) + self.assertEqual(cm.exception.reason, 'No email address provided.') |
