Barry Warsaw pushed to branch master at mailman / Mailman
Commits: 6a8cbd3b by Barry Warsaw at 2016-02-15T12:10:44-05:00 Handle AlreadySubscribedError in REST. When approving a subscription request via the REST API, for a user who is already a member, return an HTTP 409 Conflict code instead of the previous server traceback (and resulting HTTP 500 code). Closes #193 - - - - - 3 changed files: - src/mailman/docs/NEWS.rst - src/mailman/rest/sub_moderation.py - src/mailman/rest/tests/test_moderation.py Changes: ===================================== src/mailman/docs/NEWS.rst ===================================== --- a/src/mailman/docs/NEWS.rst +++ b/src/mailman/docs/NEWS.rst @@ -59,6 +59,9 @@ Bugs * Fix membership query when multiple users are subscribed to a mailing list. Reported by Darrell Kresge. (Closes: #190) * Prevent moderation of messages held for a different list. (Closes: #161) + * When approving a subscription request via the REST API, for a user who is + already a member, return an HTTP 409 Conflict code instead of the previous + server traceback (and resulting HTTP 500 code). (Closes: #193) Configuration ------------- ===================================== src/mailman/rest/sub_moderation.py ===================================== --- a/src/mailman/rest/sub_moderation.py +++ b/src/mailman/rest/sub_moderation.py @@ -24,10 +24,12 @@ __all__ = [ from mailman.app.moderator import send_rejection from mailman.interfaces.action import Action +from mailman.interfaces.member import AlreadySubscribedError from mailman.interfaces.pending import IPendings from mailman.interfaces.registrar import IRegistrar from mailman.rest.helpers import ( - CollectionMixin, bad_request, child, etag, no_content, not_found, okay) + CollectionMixin, bad_request, child, conflict, etag, no_content, + not_found, okay) from mailman.rest.validator import Validator, enum_validator from mailman.utilities.i18n import _ from zope.component import getUtility @@ -91,6 +93,8 @@ class IndividualRequest(_ModerationBase): self._registrar.confirm(self._token) except LookupError: not_found(response) + except AlreadySubscribedError: + conflict(response, 'Already subscribed') else: no_content(response) elif action is Action.discard: ===================================== src/mailman/rest/tests/test_moderation.py ===================================== --- a/src/mailman/rest/tests/test_moderation.py +++ b/src/mailman/rest/tests/test_moderation.py @@ -250,6 +250,21 @@ class TestSubscriptionModeration(unittest.TestCase): )) self.assertEqual(cm.exception.code, 404) + def test_accept_already_subscribed(self): + # POST to a subscription request, but the user is already subscribed. + with transaction(): + token, token_owner, member = self._registrar.register(self._anne) + # Make Anne already a member. + self._mlist.subscribe(self._anne) + # Accept the pending subscription, which raises an error. + url = 'http://localhost:9001/3.0/lists/ant.example.com/requests/{}' + with self.assertRaises(HTTPError) as cm: + call_api(url.format(token), dict( + action='accept', + )) + self.assertEqual(cm.exception.code, 409) + self.assertEqual(cm.exception.reason, b'Already subscribed') + def test_accept_bad_token(self): # Try to accept a request with a bogus token. with self.assertRaises(HTTPError) as cm: View it on GitLab: https://gitlab.com/mailman/mailman/commit/6a8cbd3b1f3fb7f3806eadb131700091d32a31b4
_______________________________________________ Mailman-checkins mailing list Mailman-checkins@python.org Unsubscribe: https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org