diff options
| author | Aurélien Bompard | 2016-08-24 09:51:38 +0200 |
|---|---|---|
| committer | Barry Warsaw | 2016-10-26 08:39:07 -0400 |
| commit | e75d653f700dcf9a0a31550384d6511c47d024c1 (patch) | |
| tree | 24399f2887435e2d6d905757b78da0921c6dc584 /src | |
| parent | 72197b0ca012c55b290230d846c6a65314c6fe05 (diff) | |
| download | mailman-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.py | 9 | ||||
| -rw-r--r-- | src/mailman/model/listmanager.py | 7 | ||||
| -rw-r--r-- | src/mailman/model/tests/test_listmanager.py | 8 | ||||
| -rw-r--r-- | src/mailman/rest/lists.py | 13 |
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 |
