summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAurélien Bompard2016-08-24 09:51:38 +0200
committerBarry Warsaw2016-10-26 08:39:07 -0400
commite75d653f700dcf9a0a31550384d6511c47d024c1 (patch)
tree24399f2887435e2d6d905757b78da0921c6dc584 /src
parent72197b0ca012c55b290230d846c6a65314c6fe05 (diff)
downloadmailman-e75d653f700dcf9a0a31550384d6511c47d024c1.tar.gz
mailman-e75d653f700dcf9a0a31550384d6511c47d024c1.tar.zst
mailman-e75d653f700dcf9a0a31550384d6511c47d024c1.zip
Add a method to find list using properties filters
This allows the filtering to be done at the database level. It also makes list pagination much more efficient, since the slicing is done at the database level too.
Diffstat (limited to 'src')
-rw-r--r--src/mailman/interfaces/listmanager.py9
-rw-r--r--src/mailman/model/listmanager.py7
-rw-r--r--src/mailman/model/tests/test_listmanager.py8
-rw-r--r--src/mailman/rest/lists.py13
4 files changed, 29 insertions, 8 deletions
diff --git a/src/mailman/interfaces/listmanager.py b/src/mailman/interfaces/listmanager.py
index fddec06c8..771eabd70 100644
--- a/src/mailman/interfaces/listmanager.py
+++ b/src/mailman/interfaces/listmanager.py
@@ -142,3 +142,12 @@ class IListManager(Interface):
name_components = Attribute(
"""An iterator over the 2-tuple of (list_name, mail_host) for all
mailing lists managed by this list manager.""")
+
+ def find(**filters):
+ """Search for mailing lists matching some criteria.
+
+ The filters are mailing list properties that will be filtered upon.
+
+ :return: The list of filtered mailing lists.
+ :rtype: list of `IMailingList`
+ """
diff --git a/src/mailman/model/listmanager.py b/src/mailman/model/listmanager.py
index 681903ffc..c02736aab 100644
--- a/src/mailman/model/listmanager.py
+++ b/src/mailman/model/listmanager.py
@@ -29,6 +29,7 @@ from mailman.model.mailinglist import (
IAcceptableAliasSet, ListArchiver, MailingList)
from mailman.model.mime import ContentFilter
from mailman.utilities.datetime import now
+from mailman.utilities.queries import QuerySequence
from zope.event import notify
from zope.interface import implementer
@@ -121,3 +122,9 @@ class ListManager:
for mail_host, list_name in result_set.values(MailingList.mail_host,
MailingList.list_name):
yield list_name, mail_host
+
+ @dbconnection
+ def find(self, store, **kw):
+ query = store.query(MailingList).filter_by(**kw).order_by(
+ MailingList._list_id)
+ return QuerySequence(query)
diff --git a/src/mailman/model/tests/test_listmanager.py b/src/mailman/model/tests/test_listmanager.py
index ff1bd3026..d69486370 100644
--- a/src/mailman/model/tests/test_listmanager.py
+++ b/src/mailman/model/tests/test_listmanager.py
@@ -103,6 +103,14 @@ class TestListManager(unittest.TestCase):
list_manager.delete(mlist)
self.assertIsNone(list_manager.get('ant@example.com'))
+ def test_find_list(self):
+ ant = create_list('ant@example.com')
+ create_list('bee@example.com')
+ ant.anonymous_list = True
+ result = getUtility(IListManager).find(anonymous_list=True)
+ self.assertEqual(len(result), 1)
+ self.assertEqual(result[0], ant)
+
class TestListLifecycleEvents(unittest.TestCase):
layer = ConfigLayer
diff --git a/src/mailman/rest/lists.py b/src/mailman/rest/lists.py
index 3d2ed072c..dc1d75203 100644
--- a/src/mailman/rest/lists.py
+++ b/src/mailman/rest/lists.py
@@ -107,16 +107,14 @@ class _ListBase(CollectionMixin):
def _get_collection(self, request):
"""See `CollectionMixin`."""
- return self._filter_lists(
- request, list(getUtility(IListManager)))
+ return self._filter_lists(request)
- def _filter_lists(self, request, lists):
+ def _filter_lists(self, request, **kw):
"""Filter a collection using query parameters."""
only_advertised = request.get_param_as_bool('only_advertised')
if only_advertised:
- return [l for l in lists if l.advertised]
- else:
- return lists
+ kw['advertised'] = True
+ return getUtility(IListManager).find(**kw)
@public
@@ -308,8 +306,7 @@ class ListsForDomain(_ListBase):
def _get_collection(self, request):
"""See `CollectionMixin`."""
- return self._filter_lists(
- request, list(self._domain.mailing_lists))
+ return self._filter_lists(request, mail_host=self._domain.mail_host)
@public