REST error 500 when accepting a subscription request for a subscribed member
Here's the situation: there's a moderated list. A user subcribes, the subscription is thus held for moderator approval. Then the moderator realises the list should actually be opened to subscription, and changes the setting. The user subscribes again, and becomes a member. Then the moderator realises there's a pending subscription request and clicks on "Accept" in Postorius. The result is a traceback and an error 500:
Traceback (most recent call last):
File "mailman/src/mailman/app/workflow.py", line 73, in __next__
return step()
File "mailman/src/mailman/app/subscriptions.py", line 285, in _step_do_subscription
self.member = self.mlist.subscribe(self.subscriber)
File "mailman/src/mailman/database/transaction.py", line 92, in wrapper
return function(args[0], config.db.store, *args[1:], **kws)
File "mailman/src/mailman/model/mailinglist.py", line 474, in subscribe
self.fqdn_listname, subscriber.email, role)
mailman.interfaces.member.AlreadySubscribedError: test@example.com is already a MemberRole.member of mailing list moderate_subs@example.com
Traceback (most recent call last):
File "/usr/lib64/python3.4/wsgiref/handlers.py", line 137, in run
self.result = application(self.environ, self.start_response)
File "mailman/src/mailman/database/transaction.py", line 57, in wrapper
rtn = function(*args, **kws)
File "mailman/src/mailman/rest/wsgiapp.py", line 104, in __call__
return super().__call__(environ, start_response)
File "lib/python3.4/site-packages/falcon-0.3.0-py3.4.egg/falcon/api.py", line 182, in __call__
responder(req, resp, **params)
File "mailman/src/mailman/rest/sub_moderation.py", line 91, in on_post
self._registrar.confirm(self._token)
File "mailman/src/mailman/app/registrar.py", line 73, in confirm
list(workflow)
File "mailman/src/mailman/app/workflow.py", line 73, in __next__
return step()
File "mailman/src/mailman/app/subscriptions.py", line 285, in _step_do_subscription
self.member = self.mlist.subscribe(self.subscriber)
File "mailman/src/mailman/database/transaction.py", line 92, in wrapper
return function(args[0], config.db.store, *args[1:], **kws)
File "mailman/src/mailman/model/mailinglist.py", line 474, in subscribe
self.fqdn_listname, subscriber.email, role)
mailman.interfaces.member.AlreadySubscribedError: test@example.com is already a MemberRole.member of mailing list moderate_subs@example.com
"POST /3.0/lists/moderate_subs.example.com/requests/0000000000000000000000000000000000000006 HTTP/1.1" 500 59
I see several ways out of this situation:
- Return a specific error to the client and let Postorius ignore it
- Silentely ignore the error in Mailman's REST server
- Automatically accept pending subscription requests when switching a list to open
Anything else? I'd vote for option 2 but I'd love to have your opinion.