Barry Warsaw pushed to branch master at mailman / Mailman

Commits:
0c5c9def by Barry Warsaw at 2017-04-22T20:42:31+00:00
Fix two problems and close #260

- - - - -
23be50d1 by Barry Warsaw at 2017-04-22T20:42:32+00:00
Merge branch 'issue260' into 'master'

Fix two problems and close #260

Closes #260

See merge request !261
- - - - -


3 changed files:

- src/mailman/app/subscriptions.py
- src/mailman/rest/members.py
- src/mailman/rest/tests/test_membership.py


Changes:

=====================================
src/mailman/app/subscriptions.py
=====================================
--- a/src/mailman/app/subscriptions.py
+++ b/src/mailman/app/subscriptions.py
@@ -32,7 +32,9 @@ from mailman.interfaces.address import IAddress
 from mailman.interfaces.bans import IBanManager
 from mailman.interfaces.listmanager import ListDeletingEvent
 from mailman.interfaces.mailinglist import SubscriptionPolicy
-from mailman.interfaces.member import MembershipIsBannedError, NotAMemberError
+from mailman.interfaces.member import (
+    AlreadySubscribedError, MemberRole, MembershipIsBannedError,
+    NotAMemberError)
 from mailman.interfaces.pending import IPendable, IPendings
 from mailman.interfaces.subscriptions import (
     ISubscriptionManager, ISubscriptionService,
@@ -198,6 +200,21 @@ class SubscriptionWorkflow(_SubscriptionWorkflowCommon):
             self.address = addresses[0]
         assert self.user is not None and self.address is not None, (
             'Insane sanity check results')
+        # Is this subscriber already a member?
+        if (self.which is WhichSubscriber.user and
+                self.user.preferred_address is not None):
+            subscriber = self.user
+        else:
+            subscriber = self.address
+        if self.mlist.is_subscribed(subscriber):
+            # 2017-04-22 BAW: This branch actually *does* get covered, as I've
+            # verified by a full coverage run, but diffcov for some reason
+            # claims that the test added in the branch that added this code
+            # does not cover the change.  That seems like a bug in diffcov.
+            raise AlreadySubscribedError(           # pragma: no cover
+                self.mlist.fqdn_listname,
+                self.address.email,
+                MemberRole.member)
         # Is this email address banned?
         if IBanManager(self.mlist).is_banned(self.address.email):
             raise MembershipIsBannedError(self.mlist, self.address.email)


=====================================
src/mailman/rest/members.py
=====================================
--- a/src/mailman/rest/members.py
+++ b/src/mailman/rest/members.py
@@ -17,6 +17,7 @@
 
 """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
@@ -204,9 +205,9 @@ class AllMembers(_MemberBase):
                 display_name=str,
                 delivery_mode=enum_validator(DeliveryMode),
                 role=enum_validator(MemberRole),
-                pre_verified=bool,
-                pre_confirmed=bool,
-                pre_approved=bool,
+                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)


=====================================
src/mailman/rest/tests/test_membership.py
=====================================
--- a/src/mailman/rest/tests/test_membership.py
+++ b/src/mailman/rest/tests/test_membership.py
@@ -98,6 +98,21 @@ class TestMembership(unittest.TestCase):
         self.assertEqual(cm.exception.code, 409)
         self.assertEqual(cm.exception.reason, 'Member already subscribed')
 
+    def test_try_to_join_a_list_twice_issue260(self):
+        with transaction():
+            anne = self._usermanager.create_address('a...@example.com')
+            self._mlist.subscribe(anne)
+        with self.assertRaises(HTTPError) as cm:
+            call_api('http://localhost:9001/3.0/members', {
+                'list_id': 'test.example.com',
+                'subscriber': 'a...@example.com',
+                'pre_verified': False,
+                'pre_confirmed': False,
+                'pre_approved': False,
+                })
+        self.assertEqual(cm.exception.code, 409)
+        self.assertEqual(cm.exception.reason, 'Member already subscribed')
+
     def test_subscribe_user_without_preferred_address(self):
         with transaction():
             getUtility(IUserManager).create_user('a...@example.com')



View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/c975738f775398c255f63f0a9853212d7f024262...23be50d1555977438e295ab219109ee1d934d14a

---
View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/c975738f775398c255f63f0a9853212d7f024262...23be50d1555977438e295ab219109ee1d934d14a
You're receiving this email because of your account on gitlab.com.
_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to