summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mailman/app/docs/subscriptions.rst2
-rw-r--r--src/mailman/app/subscriptions.py2
-rw-r--r--src/mailman/app/tests/test_subscriptions.py16
-rw-r--r--src/mailman/commands/eml_membership.py2
-rw-r--r--src/mailman/rest/lists.py20
-rw-r--r--src/mailman/rest/members.py6
-rw-r--r--src/mailman/runners/tests/test_join.py2
7 files changed, 26 insertions, 24 deletions
diff --git a/src/mailman/app/docs/subscriptions.rst b/src/mailman/app/docs/subscriptions.rst
index 2fc59d9a7..fa5d0edfe 100644
--- a/src/mailman/app/docs/subscriptions.rst
+++ b/src/mailman/app/docs/subscriptions.rst
@@ -102,7 +102,7 @@ a member of with her ``aperson@example.com`` address.
There may be no matching memberships.
- >>> service.find_members('dave@example.com')
+ >>> list(service.find_members('dave@example.com'))
[]
Memberships can also be searched for by user id.
diff --git a/src/mailman/app/subscriptions.py b/src/mailman/app/subscriptions.py
index 8f6dd7cdc..861a12ec0 100644
--- a/src/mailman/app/subscriptions.py
+++ b/src/mailman/app/subscriptions.py
@@ -408,7 +408,7 @@ class SubscriptionService:
q_user = q_user.filter(Member.role == role)
# Do a UNION of the two queries, sort the result and generate Members.
query = q_address.union(q_user).order_by(*order).from_self(Member)
- return query.all()
+ return query
def __iter__(self):
for member in self.get_members():
diff --git a/src/mailman/app/tests/test_subscriptions.py b/src/mailman/app/tests/test_subscriptions.py
index 229c85aa8..0eefbd62c 100644
--- a/src/mailman/app/tests/test_subscriptions.py
+++ b/src/mailman/app/tests/test_subscriptions.py
@@ -658,7 +658,7 @@ class TestSubscriptionService(unittest.TestCase):
address = self._user_manager.create_address(
'anne@example.com', 'Anne Address')
self._mlist.subscribe(address)
- members = self._service.find_members('anne@example.com')
+ members = list(self._service.find_members('anne@example.com'))
self.assertEqual(len(members), 1)
self.assertEqual(members[0].address, address)
@@ -671,7 +671,7 @@ class TestSubscriptionService(unittest.TestCase):
user.preferred_address = address
# Subscribe the address.
self._mlist.subscribe(address)
- members = self._service.find_members('anne@example.com')
+ members = list(self._service.find_members('anne@example.com'))
self.assertEqual(len(members), 1)
self.assertEqual(members[0].user, user)
@@ -684,7 +684,7 @@ class TestSubscriptionService(unittest.TestCase):
user.preferred_address = address
# Subscribe the user.
self._mlist.subscribe(user)
- members = self._service.find_members('anne@example.com')
+ members = list(self._service.find_members('anne@example.com'))
self.assertEqual(len(members), 1)
self.assertEqual(members[0].user, user)
@@ -702,7 +702,7 @@ class TestSubscriptionService(unittest.TestCase):
# Subscribe the user.
self._mlist.subscribe(user)
# Search for the secondary address.
- members = self._service.find_members('anne2@example.com')
+ members = list(self._service.find_members('anne2@example.com'))
self.assertEqual(len(members), 1)
self.assertEqual(members[0].user, user)
@@ -723,7 +723,7 @@ class TestSubscriptionService(unittest.TestCase):
# Subscribe the secondary address.
self._mlist.subscribe(address_2)
# Search for the primary address.
- members = self._service.find_members('anne@example.com')
+ members = list(self._service.find_members('anne@example.com'))
self.assertEqual(len(members), 0)
def test_find_member_user_id(self):
@@ -735,7 +735,7 @@ class TestSubscriptionService(unittest.TestCase):
user.preferred_address = address
# Subscribe the user.
self._mlist.subscribe(user)
- members = self._service.find_members(user.user_id)
+ members = list(self._service.find_members(user.user_id))
self.assertEqual(len(members), 1)
self.assertEqual(members[0].user, user)
@@ -759,7 +759,7 @@ class TestSubscriptionService(unittest.TestCase):
address_3.user = user
# Subscribe the secondary address only.
self._mlist.subscribe(address_2)
- members = self._service.find_members(user.user_id)
+ members = list(self._service.find_members(user.user_id))
self.assertEqual(len(members), 1)
self.assertEqual(members[0].address, address_2)
@@ -812,7 +812,7 @@ class TestSubscriptionService(unittest.TestCase):
mlist1.subscribe(address_3, MemberRole.owner)
# The results should be sorted first by list id, then by address, then
# by member role.
- members = self._service.find_members(user.user_id)
+ members = list(self._service.find_members(user.user_id))
self.assertEqual(len(members), 21)
self.assertListEqual(
[(m.list_id.partition('.')[0],
diff --git a/src/mailman/commands/eml_membership.py b/src/mailman/commands/eml_membership.py
index 49af269e4..a9dfe56e2 100644
--- a/src/mailman/commands/eml_membership.py
+++ b/src/mailman/commands/eml_membership.py
@@ -105,7 +105,7 @@ used.
# matching memberships.
members = getUtility(ISubscriptionService).find_members(
email, mlist.list_id, MemberRole.member)
- if len(members) > 0:
+ if members.count() > 0:
print(_('$person is already a member'), file=results)
return ContinueProcessing.yes
subscriber = match_subscriber(email, display_name)
diff --git a/src/mailman/rest/lists.py b/src/mailman/rest/lists.py
index 10df71330..70f100f25 100644
--- a/src/mailman/rest/lists.py
+++ b/src/mailman/rest/lists.py
@@ -47,7 +47,7 @@ from mailman.rest.members import AMember, MemberCollection
from mailman.rest.post_moderation import HeldMessages
from mailman.rest.sub_moderation import SubscriptionRequests
from mailman.rest.validator import Validator
-from operator import attrgetter
+from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
from zope.component import getUtility
@@ -152,12 +152,14 @@ class AList(_ListBase):
"""Return a single member representation."""
if self._mlist is None:
return NotFound(), []
- members = getUtility(ISubscriptionService).find_members(
- email, self._mlist.list_id, role)
- if len(members) == 0:
+ try:
+ the_member = getUtility(ISubscriptionService).find_members(
+ email, self._mlist.list_id, role).one()
+ except NoResultFound:
return NotFound(), []
- assert len(members) == 1, 'Too many matches'
- return AMember(request.context['api_version'], members[0].member_id)
+ except MultipleResultsFound:
+ raise AssertionError('Too many matches')
+ return AMember(request.context['api_version'], the_member.member_id)
@child(roster_matcher)
def roster(self, request, segments, role):
@@ -240,9 +242,9 @@ class MembersOfList(MemberCollection):
"""See `CollectionMixin`."""
# Overrides _MemberBase._get_collection() because we only want to
# return the members from the requested roster.
- roster = self._mlist.get_roster(self._role)
- address_of_member = attrgetter('address.email')
- return list(sorted(roster.members, key=address_of_member))
+ return getUtility(ISubscriptionService).find_members(
+ list_id=self._mlist.list_id,
+ role=self._role)
class ListsForDomain(_ListBase):
diff --git a/src/mailman/rest/members.py b/src/mailman/rest/members.py
index 3b69042da..b41afe18a 100644
--- a/src/mailman/rest/members.py
+++ b/src/mailman/rest/members.py
@@ -363,8 +363,7 @@ class _FoundMembers(MemberCollection):
def _get_collection(self, request):
"""See `CollectionMixin`."""
- address_of_member = attrgetter('address.email')
- return list(sorted(self._members, key=address_of_member))
+ return self._members
class FindMembers(_MemberBase):
@@ -379,9 +378,10 @@ class FindMembers(_MemberBase):
role=enum_validator(MemberRole),
_optional=('list_id', 'subscriber', 'role'))
try:
- members = service.find_members(**validator(request))
+ data = validator(request)
except ValueError as error:
bad_request(response, str(error))
else:
+ members = service.find_members(**data)
resource = _FoundMembers(members, self.api_version)
okay(response, etag(resource._make_collection(request)))
diff --git a/src/mailman/runners/tests/test_join.py b/src/mailman/runners/tests/test_join.py
index 239d8e2ef..72bf97b23 100644
--- a/src/mailman/runners/tests/test_join.py
+++ b/src/mailman/runners/tests/test_join.py
@@ -167,7 +167,7 @@ class TestJoinWithDigests(unittest.TestCase):
# digest deliveries.
members = getUtility(ISubscriptionService).find_members(
'anne@example.org')
- self.assertEqual(len(members), 1)
+ self.assertEqual(members.count(), 1)
self.assertEqual(rmember, members[0])
return rmember