diff options
| author | Barry Warsaw | 2016-01-06 22:43:04 -0500 |
|---|---|---|
| committer | Barry Warsaw | 2016-01-06 22:43:04 -0500 |
| commit | a4bbc7c4fcea5596ab9f5a3d82983ddcf6d25909 (patch) | |
| tree | 7604553e6005ab869dfb1fc0fb182069ae36c176 /src/mailman/rest | |
| parent | e4167544b41f065b29a27ef5f9e27283557185f2 (diff) | |
| download | mailman-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.py | 17 | ||||
| -rw-r--r-- | src/mailman/rest/lists.py | 13 | ||||
| -rw-r--r-- | src/mailman/rest/members.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/post_moderation.py | 3 |
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""" |
