summaryrefslogtreecommitdiff
path: root/src/mailman/rest
diff options
context:
space:
mode:
authorBarry Warsaw2016-01-06 22:43:04 -0500
committerBarry Warsaw2016-01-06 22:43:04 -0500
commita4bbc7c4fcea5596ab9f5a3d82983ddcf6d25909 (patch)
tree7604553e6005ab869dfb1fc0fb182069ae36c176 /src/mailman/rest
parente4167544b41f065b29a27ef5f9e27283557185f2 (diff)
downloadmailman-a4bbc7c4fcea5596ab9f5a3d82983ddcf6d25909.tar.gz
mailman-a4bbc7c4fcea5596ab9f5a3d82983ddcf6d25909.tar.zst
mailman-a4bbc7c4fcea5596ab9f5a3d82983ddcf6d25909.zip
Additional refactoring to use the QuerySequence wrapper, so that we can still
use len() and slicing on SQLAlchemy query results. We also don't need to list()-ify the results in the tests. This isn't perfect, but at least it doesn't introduce yet another layer violation.
Diffstat (limited to 'src/mailman/rest')
-rw-r--r--src/mailman/rest/helpers.py17
-rw-r--r--src/mailman/rest/lists.py13
-rw-r--r--src/mailman/rest/members.py2
-rw-r--r--src/mailman/rest/post_moderation.py3
4 files changed, 14 insertions, 21 deletions
diff --git a/src/mailman/rest/helpers.py b/src/mailman/rest/helpers.py
index a7bbc2bae..6a1408988 100644
--- a/src/mailman/rest/helpers.py
+++ b/src/mailman/rest/helpers.py
@@ -139,16 +139,14 @@ class CollectionMixin:
return etag(resource)
def _get_collection(self, request):
- """Return the collection as a list-like object.
+ """Return the collection as a sequence.
- The returned value must support iteration and slicing. It can for
- example be a concrete list or an SQLAlchemy request.
-
- This method must be implemented by subclasses.
+ The returned value must support the collections.abc.Sequence
+ API. This method must be implemented by subclasses.
:param request: An http request.
:return: The collection
- :rtype: list
+ :rtype: collections.abc.Sequence
"""
raise NotImplementedError
@@ -165,12 +163,9 @@ class CollectionMixin:
# get turned into HTTP 400 errors.
count = request.get_param_as_int('count', min=0)
page = request.get_param_as_int('page', min=1)
- try:
- total_size = collection.count()
- except TypeError:
- total_size = len(collection)
+ total_size = len(collection)
if count is None and page is None:
- return 0, total_size, list(collection)
+ return 0, total_size, collection
list_start = (page - 1) * count
list_end = page * count
return list_start, total_size, collection[list_start:list_end]
diff --git a/src/mailman/rest/lists.py b/src/mailman/rest/lists.py
index 70f100f25..a4d2da56a 100644
--- a/src/mailman/rest/lists.py
+++ b/src/mailman/rest/lists.py
@@ -47,7 +47,6 @@ 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 sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
from zope.component import getUtility
@@ -152,14 +151,12 @@ class AList(_ListBase):
"""Return a single member representation."""
if self._mlist is None:
return NotFound(), []
- try:
- the_member = getUtility(ISubscriptionService).find_members(
- email, self._mlist.list_id, role).one()
- except NoResultFound:
+ members = getUtility(ISubscriptionService).find_members(
+ email, self._mlist.list_id, role)
+ if len(members) == 0:
return NotFound(), []
- except MultipleResultsFound:
- raise AssertionError('Too many matches')
- return AMember(request.context['api_version'], the_member.member_id)
+ assert len(members) == 1, 'Too many matches'
+ return AMember(request.context['api_version'], members[0].member_id)
@child(roster_matcher)
def roster(self, request, segments, role):
diff --git a/src/mailman/rest/members.py b/src/mailman/rest/members.py
index b41afe18a..12a413f42 100644
--- a/src/mailman/rest/members.py
+++ b/src/mailman/rest/members.py
@@ -31,7 +31,7 @@ from mailman.interfaces.address import IAddress, InvalidEmailAddressError
from mailman.interfaces.listmanager import IListManager
from mailman.interfaces.member import (
AlreadySubscribedError, DeliveryMode, MemberRole, MembershipError,
- MembershipIsBannedError, MissingPreferredAddressError, NotAMemberError)
+ MembershipIsBannedError, MissingPreferredAddressError)
from mailman.interfaces.registrar import IRegistrar
from mailman.interfaces.subscriptions import (
ISubscriptionService, RequestRecord, TokenOwner)
diff --git a/src/mailman/rest/post_moderation.py b/src/mailman/rest/post_moderation.py
index ca3e228ba..746503ba9 100644
--- a/src/mailman/rest/post_moderation.py
+++ b/src/mailman/rest/post_moderation.py
@@ -31,6 +31,7 @@ from mailman.rest.helpers import (
CollectionMixin, bad_request, child, etag, no_content, not_found, okay,
path_to)
from mailman.rest.validator import Validator, enum_validator
+from mailman.utilities.queries import QuerySequence
from zope.component import getUtility
@@ -148,7 +149,7 @@ class HeldMessages(_HeldMessageBase, CollectionMixin):
def _get_collection(self, request):
requests = IListRequests(self._mlist)
- return requests.of_type(RequestType.held_message)
+ return QuerySequence(requests.of_type(RequestType.held_message))
def on_get(self, request, response):
"""/lists/listname/held"""