Barry Warsaw pushed to branch master at mailman / Mailman

Commits:
96469964 by Aditya at 2016-05-31T10:51:24-07:00
Remove nonmember subscriptions if susbcribed as member.

On subscribing an address as a member, we check if the related user
is subscribed as a nonmember through any address. If yes, we remove
the nonmember subscription.

- - - - -
4836d06c by Aditya at 2016-05-31T11:00:10-07:00
Add test to check deletion of nonmmeber record.

- - - - -
bcf2514e by Barry Warsaw at 2016-06-03T11:49:23-07:00
Fixes #237

Nonmember subscriptions are removed when one of the addresses controlled by
a user is subscribed as a member.  Given by Aditya Divekar.  (Closes #237)

- - - - -


3 changed files:

- src/mailman/app/membership.py
- src/mailman/app/tests/test_membership.py
- src/mailman/docs/NEWS.rst


Changes:

=====================================
src/mailman/app/membership.py
=====================================
--- a/src/mailman/app/membership.py
+++ b/src/mailman/app/membership.py
@@ -90,6 +90,12 @@ def add_member(mlist, record, role=MemberRole.member):
             error.fqdn_listname, record.email, error.role)
     member.preferences.preferred_language = record.language
     member.preferences.delivery_mode = record.delivery_mode
+    # Check for and remove nonmember subscriptions of the user to this list.
+    if role is MemberRole.member:
+        for address in user.addresses:
+            nonmember = mlist.nonmembers.get_member(address.email)
+            if nonmember is not None:
+                nonmember.unsubscribe()
     return member
 
 


=====================================
src/mailman/app/tests/test_membership.py
=====================================
--- a/src/mailman/app/tests/test_membership.py
+++ b/src/mailman/app/tests/test_membership.py
@@ -29,6 +29,7 @@ from mailman.interfaces.member import (
 from mailman.interfaces.subscriptions import RequestRecord
 from mailman.interfaces.usermanager import IUserManager
 from mailman.testing.layers import ConfigLayer
+from mailman.utilities.datetime import now
 from zope.component import getUtility
 
 
@@ -221,6 +222,42 @@ class TestAddMember(unittest.TestCase):
                               system_preferences.preferred_language))
         self.assertEqual(cm.exception.email, email.lower())
 
+    def test_delete_nonmembers_on_adding_member(self):
+        # GL: #237 - When a new address is subscribed, any existing nonmember
+        # subscriptions for this address; or any addresses also controlled by
+        # this user, are deleted.
+        anne_nonmember = add_member(
+            self._mlist,
+            RequestRecord('aper...@example.com', 'Anne Person',
+                          DeliveryMode.regular,
+                          system_preferences.preferred_language),
+            MemberRole.nonmember)
+        # Add a few other validated addresses to this user, and subscribe them
+        # as nonmembers.
+        for email in ('anne.per...@example.com', 'a.per...@example.com'):
+            address = anne_nonmember.user.register(email)
+            address.verified_on = now()
+            self._mlist.subscribe(address, MemberRole.nonmember)
+        # There are now three nonmembers.
+        self.assertEqual(
+            {address.email for address in self._mlist.nonmembers.addresses},
+            {'aper...@example.com',
+             'anne.per...@example.com',
+             'a.per...@example.com',
+             })
+        # Let's now add one of Anne's addresses as a member.  This deletes all
+        # of Anne's nonmember memberships.
+        anne_member = add_member(
+            self._mlist,
+            RequestRecord('a.per...@example.com', 'Anne Person',
+                          DeliveryMode.regular,
+                          system_preferences.preferred_language),
+            MemberRole.member)
+        self.assertEqual(self._mlist.nonmembers.member_count, 0)
+        members = list(self._mlist.members.members)
+        self.assertEqual(len(members), 1)
+        self.assertEqual(members[0], anne_member)
+
 
 class TestDeleteMember(unittest.TestCase):
     layer = ConfigLayer


=====================================
src/mailman/docs/NEWS.rst
=====================================
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -83,6 +83,8 @@ Bugs
    (Closes #226)
  * MIME digests now put the individual message/rfc822 messages inside a
    multipart/digest subpart.  (Closes #234)
+ * Nonmember subscriptions are removed when one of the addresses controlled by
+   a user is subscribed as a member.  Given by Aditya Divekar.  (Closes #237)
 
 Configuration
 -------------



View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/6e6d041cf0c069ba25ce174e6dc431595e0a7222...bcf2514e1484bdd824201decb5f25dc5788d0ca7
_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to