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
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