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