Barry Warsaw pushed to branch release-3.0 at mailman / Mailman

Commits:
640e1c57 by Barry Warsaw at 2016-02-06T18:23:17-05:00
Fix membership query for preferred addresses.

When multiple users are subscribed to a mailing list via their preferred
address, too many results are returned from a membership query,
resulting in an assertion error.  Reported by Darrell Kresge.
(Closes: #190)

- - - - -
1fd0b90e by Barry Warsaw at 2016-02-06T18:31:02-05:00
Update the CI file.

- - - - -
14746ad2 by Barry Warsaw at 2016-02-06T18:32:47-05:00
More CI fixes.

- - - - -


4 changed files:

- .gitlab-ci.yml
- src/mailman/docs/NEWS.rst
- src/mailman/model/roster.py
- src/mailman/model/tests/test_roster.py


Changes:

=====================================
.gitlab-ci.yml
=====================================
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,18 +1,24 @@
 # This is core test runner
-before_script:
-  - pip install tox
 
-sqlite:
-  script:
-  - tox
+image: maxking/mailman-ci-runner
 
-  tags:
-  - sqlite
+variables:
+  POSTGRES_DB: "mailman_test"
+  POSTGRES_USER: "runner"
+  POSTGRES_PASSWORD: "runner"
+  MYSQL_ROOT_PASSWORD: "runner"
+  MYSQL_USER: "runner"
+  MYSQL_USER_PASSWORD: "runner"
+  MYSQL_DATABASE: "test_mailman"
 
+sqlite:
+  script:
+  - tox -e py34
 
 pgsql:
+  services:
+  - postgres:latest
   script:
-  - MAILMAN_EXTRA_TESTING_CFG=/data/postgres.cfg tox -e pg
-
+  - MAILMAN_EXTRA_TESTING_CFG=/home/runner/configs/postgres.cfg tox -e pg
   tags:
   - postgres


=====================================
src/mailman/docs/NEWS.rst
=====================================
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -22,6 +22,8 @@ Bugs
    subcommand extensions.  Given by Aurélien Bompard.  (Closes: #168)
  * Don't traceback if a nonexistent message-id is deleted from the message
    store.  Given by Aurélien Bompard, tweaked by Barry Warsaw.  (Closes: #167)
+ * Fix membership query when multiple users are subscribed to a mailing list.
+   Reported by Darrell Kresge.  (Closes: #190)
 
 Interfaces
 ----------


=====================================
src/mailman/model/roster.py
=====================================
--- a/src/mailman/model/roster.py
+++ b/src/mailman/model/roster.py
@@ -112,8 +112,9 @@ class AbstractRoster:
         members_u = store.query(Member).filter(
             Member.list_id == self._mlist.list_id,
             Member.role == self.role,
-            Address.email==email,
-            Member.user_id == User.id)
+            Address.email == email,
+            Member.user_id == User.id,
+            User._preferred_address_id == Address.id)
         return members_a.union(members_u).all()
 
     def get_member(self, email):


=====================================
src/mailman/model/tests/test_roster.py
=====================================
--- a/src/mailman/model/tests/test_roster.py
+++ b/src/mailman/model/tests/test_roster.py
@@ -20,6 +20,7 @@
 __all__ = [
     'TestMailingListRoster',
     'TestMembershipsRoster',
+    'TestUserRoster',
     ]
 
 
@@ -36,6 +37,16 @@ from zope.component import getUtility
 
 
 
+def _set_preferred(user):
+    # Avoid circular imports.
+    from mailman.utilities.datetime import now
+    preferred = list(user.addresses)[0]
+    preferred.verified_on = now()
+    user.preferred_address = preferred
+    return preferred
+
+
+
 class TestMailingListRoster(unittest.TestCase):
     """Test various aspects of a mailing list's roster."""
 
@@ -200,3 +211,33 @@ class TestMembershipsRoster(unittest.TestCase):
         self.assertEqual(
             [record.address.email for record in memberships],
             ['a...@example.com', 'a...@example.com'])
+
+
+
+class TestUserRoster(unittest.TestCase):
+    """Test aspects of rosters when users are subscribed."""
+
+    layer = ConfigLayer
+
+    def setUp(self):
+        self._mlist = create_list('a...@example.com')
+        user_manager = getUtility(IUserManager)
+        self._anne = user_manager.create_user('a...@example.com')
+        self._bart = user_manager.create_user('b...@example.com')
+        self._cris = user_manager.create_user('c...@example.com')
+        self._dave = user_manager.create_user('d...@example.com')
+        _set_preferred(self._anne)
+        _set_preferred(self._bart)
+        _set_preferred(self._cris)
+        _set_preferred(self._dave)
+
+    def test_narrow_get_member(self):
+        # Ensure that when multiple users are subscribed to the same mailing
+        # list via their preferred address, only the member in question is
+        # returned from .get_member().
+        self._mlist.subscribe(self._anne)
+        self._mlist.subscribe(self._bart)
+        self._mlist.subscribe(self._cris)
+        self._mlist.subscribe(self._dave)
+        member = self._mlist.members.get_member('b...@example.com')
+        self.assertEqual(member.user, self._bart)



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

Reply via email to