summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/rest/addresses.py18
-rw-r--r--src/mailman/rest/docs/addresses.rst34
-rw-r--r--src/mailman/rest/tests/test_addresses.py35
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.')