Barry Warsaw pushed to branch master at mailman / Mailman
Commits: 1eec4bf8 by Amit Tripathi at 2016-10-25T20:39:12-04:00 Added QuerySequence as return type of banned address list - - - - - 96f27647 by Amit Tripathi at 2016-10-25T20:39:12-04:00 replaced `find` method with `bans` property - - - - - 07d42384 by Amit Tripathi at 2016-10-25T20:39:12-04:00 added a test to check bans property of IBanManager - - - - - 686e01c7 by Amit Tripathi at 2016-10-25T20:39:12-04:00 rewritten bans test with more thorough tests - - - - - 314f6002 by Barry Warsaw at 2016-10-25T21:18:44-04:00 Manual merge. * Rebased, cleaned up, and test improvement. - - - - - 6 changed files: - src/mailman/docs/NEWS.rst - src/mailman/interfaces/bans.py - src/mailman/interfaces/subscriptions.py - src/mailman/model/bans.py - src/mailman/model/tests/test_bans.py - src/mailman/rest/bans.py Changes: ===================================== src/mailman/docs/NEWS.rst ===================================== --- a/src/mailman/docs/NEWS.rst +++ b/src/mailman/docs/NEWS.rst @@ -227,6 +227,7 @@ REST string in the REST API. Given by Aurélien Bompard. * A list's ``moderator_password`` can be set via the REST API. Given by Andrew Breksa. (Closes #207) + * Banned addresses can now be paginated. Given by Amit. (Closes #284) Other ----- ===================================== src/mailman/interfaces/bans.py ===================================== --- a/src/mailman/interfaces/bans.py +++ b/src/mailman/interfaces/bans.py @@ -46,6 +46,9 @@ class IBanManager(Interface): to an `IBanManager`. To manage global bans, adapt ``None``. """ + bans = Attribute( + """A `QuerySequence` over all the banned emails.""") + def ban(email): """Ban an email address from subscribing to a mailing list. @@ -94,8 +97,6 @@ class IBanManager(Interface): """ def __iter__(): - """Iterate over all banned addresses. + """An iterator over all the banned email addresses. - :return: The list of all banned addresses. - :rtype: list of `IBan` - """ + :return: iterator over `IBan`""" ===================================== src/mailman/interfaces/subscriptions.py ===================================== --- a/src/mailman/interfaces/subscriptions.py +++ b/src/mailman/interfaces/subscriptions.py @@ -148,8 +148,8 @@ class ISubscriptionService(Interface): :type list_id: string :param role: The member role. :type role: `MemberRole` - :return: The list of all memberships, which may be empty. - :rtype: list of `IMember` + :return: A sequence of all memberships, which may be empty. + :rtype: A `QuerySequence` of `IMember` """ def find_member(subscriber=None, list_id=None, role=None): ===================================== src/mailman/model/bans.py ===================================== --- a/src/mailman/model/bans.py +++ b/src/mailman/model/bans.py @@ -24,6 +24,7 @@ from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.database.types import SAUnicode from mailman.interfaces.bans import IBan, IBanManager +from mailman.utilities.queries import QuerySequence from sqlalchemy import Column, Integer from zope.interface import implementer @@ -109,7 +110,14 @@ class BanManager: return True return False + @property + @dbconnection + def bans(self, store): + """See `IBanManager`.""" + query = store.query(Ban).filter_by(list_id=self._list_id) + return QuerySequence(query) + @dbconnection def __iter__(self, store): """See `IBanManager`.""" - yield from store.query(Ban).filter_by(list_id=self._list_id) + yield from self.bans ===================================== src/mailman/model/tests/test_bans.py ===================================== --- a/src/mailman/model/tests/test_bans.py +++ b/src/mailman/model/tests/test_bans.py @@ -46,3 +46,17 @@ class TestMailingListBans(unittest.TestCase): getUtility(IListManager).delete(self._mlist) self.assertEqual([ban.email for ban in global_ban_manager], ['b...@example.com']) + + def test_bans_sequence(self): + # Bans returns a pageable sequence. + self._manager.ban('b...@example.com') + self._manager.ban('a...@example.com') + # The results can be len()'d. + self.assertEqual(len(self._manager.bans), 2) + # The results can be iterated. + self.assertEqual(['a...@example.com', 'b...@example.com'], + sorted(ban.email for ban in self._manager.bans)) + # The results can be indexed. + self.assertEqual( + sorted([self._manager.bans[0].email, self._manager.bans[1].email]), + ['a...@example.com', 'b...@example.com']) ===================================== src/mailman/rest/bans.py ===================================== --- a/src/mailman/rest/bans.py +++ b/src/mailman/rest/bans.py @@ -86,7 +86,7 @@ class BannedEmails(_BannedBase, CollectionMixin): def _get_collection(self, request): """See `CollectionMixin`.""" - return list(self.ban_manager) + return self.ban_manager.bans def on_get(self, request, response): """/bans""" View it on GitLab: https://gitlab.com/mailman/mailman/compare/66eaf22e4af9877a83c32ca96fa4756827a62b80...314f6002955b9b3f94ec00774aa230f5dd1f9374
_______________________________________________ Mailman-checkins mailing list Mailman-checkins@python.org Unsubscribe: https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org