diff options
| -rw-r--r-- | src/mailman/model/subscriptions.py | 16 | ||||
| -rw-r--r-- | src/mailman/model/tests/test_subscriptions.py | 31 |
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) |
