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

Reply via email to