Abhilash Raj pushed to branch master at GNU Mailman / Mailman Core


Commits:
61b323a4 by Abhilash Raj at 2020-12-16T12:14:59+00:00
Add support to specify rejection reason for subscription request.

Closes #767

- - - - -
b14f7290 by Abhilash Raj at 2020-12-16T12:14:59+00:00
Merge branch 'sub-mod-reason' into 'master'

Add support to specify rejection reason for subscription request.

Closes #767

See merge request mailman/mailman!747
- - - - -


4 changed files:

- src/mailman/docs/NEWS.rst
- src/mailman/rest/docs/sub-moderation.rst
- src/mailman/rest/sub_moderation.py
- src/mailman/rest/tests/test_moderation.py


Changes:

=====================================
src/mailman/docs/NEWS.rst
=====================================
@@ -42,6 +42,8 @@ REST
 * List configuration option ``send_goodbye_message`` is now exposed through
   the REST API. (See !737)
 * Allow updating an Addresses' display_name attribute. (Closes #786)
+* Allow specifying a reason when rejecting a subscription request. (Closes
+  #767)
 
 3.3.2
 =====


=====================================
src/mailman/rest/docs/sub-moderation.rst
=====================================
@@ -110,3 +110,57 @@ There are no more membership change requests.
     http_etag: "..."
     start: 0
     total_size: 0
+
+
+..  >>> # Clear the virgin queue.
+    >>> from mailman.testing.helpers import get_queue_messages
+         >>> items = get_queue_messages('virgin')
+
+When rejecting subscription requests, an optional reason can be specified. When
+Bart tries to subscribe to Ant mailing list, the request is held for moderator
+approval::
+
+    >>> dump_json('http://localhost:9001/3.0/members', {
+    ...           'list_id': 'ant.example.com',
+    ...           'subscriber': 'bper...@example.com',
+    ...           'display_name': 'Bart Person',
+    ...           'pre_verified': True,
+    ...           'pre_confirmed': True,
+    ...           })
+    http_etag: ...
+    token: 0000000000000000000000000000000000000002
+    token_owner: moderator
+
+
+The moderator can then reject the request stating the reason for rejection::
+
+    >>> dump_json('http://localhost:9001/3.0/lists/ant.example.com/requests'
+    ...           '/0000000000000000000000000000000000000002',
+    ...           {'action': 'reject', 'reason': 'This is a private list'})
+    date: ...
+    server: ...
+    status: 204
+
+This will send an email to Bart with the rejection reason::
+
+    >>> from mailman.testing.helpers import get_queue_messages
+         >>> items = get_queue_messages('virgin')
+    >>> message = items[0].msg
+    >>> print(message.as_string())
+    MIME-Version: 1.0
+               ...
+    <BLANKLINE>
+    Your request to the a...@example.com mailing list
+    <BLANKLINE>
+        Subscription request
+    <BLANKLINE>
+    has been rejected by the list moderator.  The moderator gave the
+    following reason for rejecting your request:
+    <BLANKLINE>
+    "This is a private list"
+    <BLANKLINE>
+    Any questions or comments should be directed to the list administrator
+    at:
+    <BLANKLINE>
+        ant-ow...@example.com
+    <BLANKLINE>


=====================================
src/mailman/rest/sub_moderation.py
=====================================
@@ -70,7 +70,9 @@ class IndividualRequest(_ModerationBase):
 
     def on_post(self, request, response):
         try:
-            validator = Validator(action=enum_validator(Action))
+            validator = Validator(action=enum_validator(Action),
+                                  reason=str,
+                                  _optional=('reason',))
             arguments = validator(request)
         except ValueError as error:
             bad_request(response, str(error))
@@ -107,10 +109,10 @@ class IndividualRequest(_ModerationBase):
                 not_found(response)
             else:
                 no_content(response)
+                reason = arguments.get('reason', _('[No reason given]'))
                 send_rejection(
                     self._mlist, _('Subscription request'),
-                    pendable['email'],
-                    _('[No reason given]'))
+                    pendable['email'], reason)
 
 
 class _SubscriptionRequestsFound(_ModerationBase, CollectionMixin):


=====================================
src/mailman/rest/tests/test_moderation.py
=====================================
@@ -502,6 +502,33 @@ class TestSubscriptionModeration(unittest.TestCase):
                      dict(action='reject'))
         self.assertEqual(cm.exception.code, 404)
 
+    def test_reject_with_reason(self):
+        # Try to reject a request with an additional comment/reason.
+        # POST to the request to reject it.  This leaves a bounce message in
+        # the virgin queue.
+        with transaction():
+            token, token_owner, member = self._registrar.register(self._anne)
+        # Anne's subscription request got held.
+        self.assertIsNone(member)
+        # Clear out the virgin queue, which currently contains the
+        # confirmation message sent to Anne.
+        get_queue_messages('virgin')
+        url = 'http://localhost:9001/3.0/lists/a...@example.com/requests/{}'
+        reason = 'You are not authorized!'
+        json, response = call_api(url.format(token), dict(
+            action='reject',
+            reason=reason))
+        self.assertEqual(response.status_code, 204)
+        # And the rejection message to Anne is now in the virgin queue.
+        items = get_queue_messages('virgin')
+        self.assertEqual(len(items), 1)
+        message = items[0].msg
+        self.assertEqual(message['From'], 'ant-boun...@example.com')
+        self.assertEqual(message['To'], 'a...@example.com')
+        self.assertEqual(message['Subject'],
+                         'Request to mailing list "Ant" rejected')
+        self.assertTrue(reason in message.as_string())
+
     def test_hold_keeps_holding(self):
         # POST to the request to continue holding it.
         with transaction():



View it on GitLab: 
https://gitlab.com/mailman/mailman/-/compare/551f6facd65d99bdff3591b50442a889e92dee5e...b14f729023a7ed267cb54db68e5092dbaeab1d98

-- 
View it on GitLab: 
https://gitlab.com/mailman/mailman/-/compare/551f6facd65d99bdff3591b50442a889e92dee5e...b14f729023a7ed267cb54db68e5092dbaeab1d98
You're receiving this email because of your account on gitlab.com.


_______________________________________________
Mailman-checkins mailing list -- mailman-checkins@python.org
To unsubscribe send an email to mailman-checkins-le...@python.org
https://mail.python.org/mailman3/lists/mailman-checkins.python.org/
Member address: arch...@jab.org

Reply via email to