diff options
| author | Mark Sapiro | 2016-10-25 18:54:42 -0700 |
|---|---|---|
| committer | Mark Sapiro | 2016-10-25 18:54:42 -0700 |
| commit | 5db8a288a469b6e88f919c74ae634ac1120fddda (patch) | |
| tree | 6d37659a9110b92503cf104c5aa819afa6c9e2e7 /src | |
| parent | 047d0235284158568e5fe2ef0e862759dd0397f9 (diff) | |
| parent | 314f6002955b9b3f94ec00774aa230f5dd1f9374 (diff) | |
| download | mailman-5db8a288a469b6e88f919c74ae634ac1120fddda.tar.gz mailman-5db8a288a469b6e88f919c74ae634ac1120fddda.tar.zst mailman-5db8a288a469b6e88f919c74ae634ac1120fddda.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman/docs/NEWS.rst | 1 | ||||
| -rw-r--r-- | src/mailman/interfaces/bans.py | 9 | ||||
| -rw-r--r-- | src/mailman/interfaces/subscriptions.py | 4 | ||||
| -rw-r--r-- | src/mailman/model/bans.py | 10 | ||||
| -rw-r--r-- | src/mailman/model/tests/test_bans.py | 14 | ||||
| -rw-r--r-- | src/mailman/rest/bans.py | 2 |
6 files changed, 32 insertions, 8 deletions
diff --git a/src/mailman/docs/NEWS.rst b/src/mailman/docs/NEWS.rst index d0d125733..bc57591b3 100644 --- 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 ----- diff --git a/src/mailman/interfaces/bans.py b/src/mailman/interfaces/bans.py index 2e320965a..055ad69a3 100644 --- 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`""" diff --git a/src/mailman/interfaces/subscriptions.py b/src/mailman/interfaces/subscriptions.py index e707cf706..284261de5 100644 --- 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): diff --git a/src/mailman/model/bans.py b/src/mailman/model/bans.py index e2b6490eb..c2d6256c2 100644 --- 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 diff --git a/src/mailman/model/tests/test_bans.py b/src/mailman/model/tests/test_bans.py index c4fa57338..c993a2043 100644 --- 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], ['bart@example.com']) + + def test_bans_sequence(self): + # Bans returns a pageable sequence. + self._manager.ban('bee@example.com') + self._manager.ban('ant@example.com') + # The results can be len()'d. + self.assertEqual(len(self._manager.bans), 2) + # The results can be iterated. + self.assertEqual(['ant@example.com', 'bee@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]), + ['ant@example.com', 'bee@example.com']) diff --git a/src/mailman/rest/bans.py b/src/mailman/rest/bans.py index ccd88d9b4..ce575885b 100644 --- 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""" |
