summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStephen A. Goss2011-08-19 17:08:28 -0700
committerStephen A. Goss2011-08-19 17:08:28 -0700
commit5ab205f5158fab7cc8daaf68e46aba4c281725b5 (patch)
tree22c822b4ad4c9c15d11f6566339353a219e71566 /src
parent545735d6dc0efb76b88f3f0634966f97d833dc41 (diff)
downloadmailman-5ab205f5158fab7cc8daaf68e46aba4c281725b5.tar.gz
mailman-5ab205f5158fab7cc8daaf68e46aba4c281725b5.tar.zst
mailman-5ab205f5158fab7cc8daaf68e46aba4c281725b5.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/interfaces/listmanager.py7
-rw-r--r--src/mailman/model/listmanager.py5
-rw-r--r--src/mailman/rest/docs/lists.rst18
-rw-r--r--src/mailman/rest/domains.py9
-rw-r--r--src/mailman/rest/lists.py20
-rw-r--r--src/mailman/rest/root.py5
6 files changed, 61 insertions, 3 deletions
diff --git a/src/mailman/interfaces/listmanager.py b/src/mailman/interfaces/listmanager.py
index c1b7721a9..88060ce83 100644
--- a/src/mailman/interfaces/listmanager.py
+++ b/src/mailman/interfaces/listmanager.py
@@ -140,3 +140,10 @@ class IListManager(Interface):
:return: The list of all known mailing lists.
:rtype: list of `IMailingList`
"""
+
+ def get_lists_for_domain():
+ """The list of all mailing lists for a particular domain.
+
+ :return: The mailing lists for a particular domain.
+ :rtype: list of `IMailingList`
+ """
diff --git a/src/mailman/model/listmanager.py b/src/mailman/model/listmanager.py
index 16185e670..67b204b2a 100644
--- a/src/mailman/model/listmanager.py
+++ b/src/mailman/model/listmanager.py
@@ -102,3 +102,8 @@ class ListManager:
"""See `IListManager`."""
# lazr.restful will not allow this to be a generator.
return list(self.mailing_lists)
+
+ def get_lists_for_domain(self, domain):
+ """See `IListManager`."""
+ return list(config.db.store.find(MailingList, MailingList.mail_host == domain))
+
diff --git a/src/mailman/rest/docs/lists.rst b/src/mailman/rest/docs/lists.rst
index fd96507c3..a8b100a1b 100644
--- a/src/mailman/rest/docs/lists.rst
+++ b/src/mailman/rest/docs/lists.rst
@@ -30,6 +30,24 @@ Create a mailing list in a domain and it's accessible via the API.
start: 0
total_size: 1
+You can also query for lists from a particular domain.
+
+ >>> dump_json('http://localhost:9001/3.0/domains/example.com/lists')
+ entry 0:
+ fqdn_listname: test-one@example.com
+ http_etag: "..."
+ list_name: test-one
+ mail_host: example.com
+ real_name: Test-one
+ self_link: http://localhost:9001/3.0/lists/test-one@example.com
+ http_etag: "..."
+ start: 0
+ total_size: 1
+
+ >>> dump_json('http://localhost:9001/3.0/domains/other.com/lists')
+ http_etag: "..."
+ start: 0
+ total_size: 0
Creating lists via the API
==========================
diff --git a/src/mailman/rest/domains.py b/src/mailman/rest/domains.py
index 780380270..1f4077e0c 100644
--- a/src/mailman/rest/domains.py
+++ b/src/mailman/rest/domains.py
@@ -33,6 +33,7 @@ from mailman.interfaces.domain import (
BadDomainSpecificationError, IDomainManager)
from mailman.rest.helpers import CollectionMixin, etag, no_content, path_to
from mailman.rest.validator import Validator
+from mailman.rest.lists import ListsForDomain
@@ -79,6 +80,14 @@ class ADomain(_DomainBase):
return http.not_found()
return no_content()
+ @resource.child()
+ def lists(self, request, segments):
+ """/<api>/domains/<domain>/lists"""
+ if len(segments) == 0:
+ return ListsForDomain(self._domain)
+ else:
+ return http.bad_request()
+
class AllDomains(_DomainBase):
"""The domains."""
diff --git a/src/mailman/rest/lists.py b/src/mailman/rest/lists.py
index 2c2f58da1..8e8242ee8 100644
--- a/src/mailman/rest/lists.py
+++ b/src/mailman/rest/lists.py
@@ -24,6 +24,7 @@ __all__ = [
'AList',
'AllLists',
'ListConfiguration',
+ 'ListsForDomain',
]
@@ -207,4 +208,21 @@ class MembersOfList(MemberCollection):
roster = self._mlist.get_roster(self._role)
address_of_member = attrgetter('address.email')
return list(sorted(roster.members, key=address_of_member))
-
+
+
+class ListsForDomain(_ListBase):
+ """The mailing lists for a particular domain."""
+
+ def __init__(self, domain):
+ self._domain = domain
+
+ @resource.GET()
+ def collection(self, request):
+ """/<api>/domains/<domain>/lists"""
+ resource = self._make_collection(request)
+ return http.ok([], etag(resource))
+
+ def _get_collection(self, request):
+ """See `CollectionMixin`."""
+ return getUtility(IListManager).get_lists_for_domain(self._domain)
+
diff --git a/src/mailman/rest/root.py b/src/mailman/rest/root.py
index cd4c8ceef..e4e1433f2 100644
--- a/src/mailman/rest/root.py
+++ b/src/mailman/rest/root.py
@@ -98,8 +98,9 @@ class TopLevel(resource.Resource):
"""
if len(segments) == 0:
return AllDomains()
- elif len(segments) == 1:
- return ADomain(segments[0]), []
+ elif len(segments) >= 1:
+ domain = segments.pop(0)
+ return ADomain(domain), segments
else:
return http.bad_request()