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],
['[email protected]'])
+
+ def test_bans_sequence(self):
+ # Bans returns a pageable sequence.
+ self._manager.ban('[email protected]')
+ self._manager.ban('[email protected]')
+ # The results can be len()'d.
+ self.assertEqual(len(self._manager.bans), 2)
+ # The results can be iterated.
+ self.assertEqual(['[email protected]', '[email protected]'],
+ 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]),
+ ['[email protected]', '[email protected]'])
=====================================
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
[email protected]
Unsubscribe:
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org