summaryrefslogtreecommitdiff
path: root/src/mailman/rest
diff options
context:
space:
mode:
authorAurélien Bompard2015-11-23 17:46:55 +0100
committerBarry Warsaw2016-01-06 18:55:56 -0500
commite4167544b41f065b29a27ef5f9e27283557185f2 (patch)
tree667f5d8c3f4d00dd7a6874578baf9d8fa9c8cf68 /src/mailman/rest
parent40cbfaa6443887e215fff6d3b7854e2f9ee03ce4 (diff)
downloadmailman-e4167544b41f065b29a27ef5f9e27283557185f2.tar.gz
mailman-e4167544b41f065b29a27ef5f9e27283557185f2.tar.zst
mailman-e4167544b41f065b29a27ef5f9e27283557185f2.zip
Make the members request pageable
Diffstat (limited to 'src/mailman/rest')
-rw-r--r--src/mailman/rest/lists.py20
-rw-r--r--src/mailman/rest/members.py6
2 files changed, 14 insertions, 12 deletions
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)))