summaryrefslogtreecommitdiff
path: root/src/mailman/rest/members.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/rest/members.py')
-rw-r--r--src/mailman/rest/members.py61
1 files changed, 37 insertions, 24 deletions
diff --git a/src/mailman/rest/members.py b/src/mailman/rest/members.py
index 3ff712259..2d5b95115 100644
--- a/src/mailman/rest/members.py
+++ b/src/mailman/rest/members.py
@@ -17,7 +17,6 @@
"""REST for members."""
-from lazr.config import as_boolean
from mailman.app.membership import add_member, delete_member
from mailman.interfaces.action import Action
from mailman.interfaces.address import IAddress
@@ -198,22 +197,43 @@ class AllMembers(_MemberBase):
def on_post(self, request, response):
"""Create a new member."""
- try:
- validator = Validator(
- list_id=str,
- subscriber=subscriber_validator(self.api),
- display_name=str,
- delivery_mode=enum_validator(DeliveryMode),
- role=enum_validator(MemberRole),
- pre_verified=as_boolean,
- pre_confirmed=as_boolean,
- pre_approved=as_boolean,
- _optional=('delivery_mode', 'display_name', 'role',
- 'pre_verified', 'pre_confirmed', 'pre_approved'))
- arguments = validator(request)
- except ValueError as error:
- bad_request(response, str(error))
+ # Validate the params manually as the subscription_policy workflow
+ # attributes are dynamic, so parse all known and optional attirbutes
+ # and leave the rest to policy_kwargs.
+ required_arguments = ['list_id', 'subscriber']
+ known_arguments = dict(list_id=str,
+ subscriber=subscriber_validator(self.api),
+ display_name=str,
+ delivery_mode=enum_validator(DeliveryMode),
+ role=enum_validator(MemberRole))
+
+ arguments = {}
+ policy_kwargs = {}
+
+ wrong = []
+ for key, value in request.params.items():
+ try:
+ if key in known_arguments:
+ converter = known_arguments[key]
+ arguments[key] = converter(value)
+ else:
+ policy_kwargs[key] = value
+ except ValueError:
+ wrong.append(key)
+
+ if len(wrong) > 0:
+ params = ', '.join(wrong)
+ bad_request(response,
+ 'Cannot convert parameters: {}'.format(params))
return
+
+ missing = [key for key in required_arguments if key not in arguments]
+ if len(missing) > 0:
+ bad_request(response, 'Missing parameters: {}'.format(missing))
+ return
+ # XXX policy_kwargs are string, while subscription workflows expects
+ # whatever.
+
# Dig the mailing list out of the arguments.
list_id = arguments.pop('list_id')
mlist = getUtility(IListManager).get_by_list_id(list_id)
@@ -247,20 +267,13 @@ class AllMembers(_MemberBase):
# nonmembers go through the legacy API for now.
role = arguments.pop('role', MemberRole.member)
if role is MemberRole.member:
- # Get the pre_ flags for the subscription workflow.
- pre_verified = arguments.pop('pre_verified', False)
- pre_confirmed = arguments.pop('pre_confirmed', False)
- pre_approved = arguments.pop('pre_approved', False)
# Now we can run the registration process until either the
# subscriber is subscribed, or the workflow is paused for
# verification, confirmation, or approval.
registrar = ISubscriptionManager(mlist)
try:
token, token_owner, member = registrar.register(
- subscriber,
- pre_verified=pre_verified,
- pre_confirmed=pre_confirmed,
- pre_approved=pre_approved)
+ subscriber, **policy_kwargs)
except AlreadySubscribedError:
conflict(response, b'Member already subscribed')
return