summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMark Sapiro2016-10-25 18:54:42 -0700
committerMark Sapiro2016-10-25 18:54:42 -0700
commit5db8a288a469b6e88f919c74ae634ac1120fddda (patch)
tree6d37659a9110b92503cf104c5aa819afa6c9e2e7 /src
parent047d0235284158568e5fe2ef0e862759dd0397f9 (diff)
parent314f6002955b9b3f94ec00774aa230f5dd1f9374 (diff)
downloadmailman-5db8a288a469b6e88f919c74ae634ac1120fddda.tar.gz
mailman-5db8a288a469b6e88f919c74ae634ac1120fddda.tar.zst
mailman-5db8a288a469b6e88f919c74ae634ac1120fddda.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/docs/NEWS.rst1
-rw-r--r--src/mailman/interfaces/bans.py9
-rw-r--r--src/mailman/interfaces/subscriptions.py4
-rw-r--r--src/mailman/model/bans.py10
-rw-r--r--src/mailman/model/tests/test_bans.py14
-rw-r--r--src/mailman/rest/bans.py2
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"""