summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mailman/model/subscriptions.py16
-rw-r--r--src/mailman/model/tests/test_subscriptions.py31
2 files changed, 36 insertions, 11 deletions
diff --git a/src/mailman/model/subscriptions.py b/src/mailman/model/subscriptions.py
index 443128edb..6819c112c 100644
--- a/src/mailman/model/subscriptions.py
+++ b/src/mailman/model/subscriptions.py
@@ -88,7 +88,8 @@ class SubscriptionService:
# joined on the member's user. Add the resulting email address to the
# selected values to be able to sort on it later on.
q_address = store.query(Member, Address.email).join(Member._address)
- q_user = store.query(Member, Address.email).join(Member._user)
+ q_user = store.query(Member, Address.email).join(
+ User, User.id == Member.user_id).join(User._preferred_address)
if subscriber is not None:
if isinstance(subscriber, str):
# subscriber is an email address.
@@ -97,19 +98,20 @@ class SubscriptionService:
subscriber = subscriber.replace('*', '%')
q_address = q_address.filter(
Address.email.like(subscriber))
- q_user = q_user.join(User.addresses).filter(
- Address.email.like(subscriber))
+ q_user = q_user.filter(Address.email.like(subscriber))
else:
q_address = q_address.filter(
Address.email == subscriber)
- q_user = q_user.join(User.addresses).filter(
- Address.email == subscriber)
+ q_user = q_user.filter(Address.email == subscriber)
else:
# subscriber is a user id.
q_address = q_address.join(Address.user).filter(
User._user_id == subscriber)
- q_user = q_user.join(User._preferred_address).filter(
- User._user_id == subscriber)
+ q_user = q_user.filter(User._user_id == subscriber)
+ else:
+ # We're not searching for a subscriber, only select preferred
+ # addresses (see issue 227).
+ q_user = q_user.filter(Address.id == User._preferred_address_id)
# Add additional filters to both queries.
if list_id is not None:
q_address = q_address.filter(Member.list_id == list_id)
diff --git a/src/mailman/model/tests/test_subscriptions.py b/src/mailman/model/tests/test_subscriptions.py
index 3b3a7a7e5..ede1ed1ca 100644
--- a/src/mailman/model/tests/test_subscriptions.py
+++ b/src/mailman/model/tests/test_subscriptions.py
@@ -71,8 +71,9 @@ class TestSubscriptionService(unittest.TestCase):
self.assertEqual(len(members), 1)
self.assertEqual(members[0].user, user)
- def test_find_member_user_secondary_address(self):
- # Find user-based memberships using a secondary address.
+ def test_wont_find_member_user_secondary_address(self):
+ # Finding user-based memberships using a secondary address is not
+ # supported; the subscription is not returned.
user = self._user_manager.create_user(
'anne@example.com', 'Anne User')
set_preferred(user)
@@ -84,8 +85,7 @@ class TestSubscriptionService(unittest.TestCase):
self._mlist.subscribe(user)
# Search for the secondary address.
members = self._service.find_members('anne2@example.com')
- self.assertEqual(len(members), 1)
- self.assertEqual(members[0].user, user)
+ self.assertEqual(len(members), 0)
def test_wont_find_member_secondary_address(self):
# A user is subscribed with one of their address, and a search is
@@ -396,3 +396,26 @@ class TestSubscriptionService(unittest.TestCase):
self.assertEqual(
[address.email for address in bee_owners.addresses],
['anne_1@example.com'])
+
+ def test_find_members_issue_227(self):
+ # https://gitlab.com/mailman/mailman/issues/227
+ user = self._user_manager.create_user(
+ 'anne@example.com', 'Anne User')
+ address = set_preferred(user)
+ # Create a secondary address.
+ address_2 = self._user_manager.create_address(
+ 'anne2@example.com', 'Anne User 2')
+ address_2.user = user
+ # Subscribe the user.
+ self._mlist.subscribe(user)
+ call_args_list = [
+ dict(list_id=self._mlist.list_id), # Search by list
+ dict(subscriber=user.user_id), # Search by user
+ dict(subscriber='anne@example.com'), # Search by address
+ dict(subscriber='anne*'), # Search by fuzzy address
+ ]
+ for call_args in call_args_list:
+ members = self._service.find_members(**call_args)
+ self.assertEqual(len(list(members)), 1)
+ self.assertEqual(len(members), 1)
+ self.assertEqual(members[0].user, user)