summaryrefslogtreecommitdiff
path: root/src/mailman/rest/addresses.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/rest/addresses.py')
-rw-r--r--src/mailman/rest/addresses.py31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/mailman/rest/addresses.py b/src/mailman/rest/addresses.py
index 51bbe2046..cb8861a2e 100644
--- a/src/mailman/rest/addresses.py
+++ b/src/mailman/rest/addresses.py
@@ -31,10 +31,13 @@ from operator import attrgetter
from restish import http, resource
from zope.component import getUtility
+from mailman.interfaces.address import (
+ ExistingAddressError, InvalidEmailAddressError)
+from mailman.interfaces.usermanager import IUserManager
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.usermanager import IUserManager
+from mailman.rest.validator import Validator
from mailman.utilities.datetime import now
@@ -174,6 +177,32 @@ class UserAddresses(_AddressBase):
resource = self._make_collection(request)
return http.ok([], etag(resource))
+ @resource.POST()
+ def create(self, request):
+ """POST to /addresses
+
+ Add a new address to the user record.
+ """
+ if self._user is None:
+ return http.not_found()
+ user_manager = getUtility(IUserManager)
+ validator = Validator(email=unicode,
+ display_name=unicode,
+ _optional=('display_name',))
+ try:
+ address = user_manager.create_address(**validator(request))
+ except ValueError as error:
+ return http.bad_request([], str(error))
+ except InvalidEmailAddressError:
+ return http.bad_request([], b'Invalid email address')
+ except ExistingAddressError:
+ return http.bad_request([], b'Address already exists')
+ else:
+ # Link the address to the current user and return it.
+ address.user = self._user
+ location = path_to('addresses/{0}'.format(address.email))
+ return http.created(location, [], None)
+
def membership_key(member):