summaryrefslogtreecommitdiff
path: root/src/mailman/rest/lists.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/rest/lists.py')
-rw-r--r--src/mailman/rest/lists.py29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/mailman/rest/lists.py b/src/mailman/rest/lists.py
index 2349ac286..5d7ed0c86 100644
--- a/src/mailman/rest/lists.py
+++ b/src/mailman/rest/lists.py
@@ -36,7 +36,7 @@ from mailman.interfaces.listmanager import (
from mailman.interfaces.member import MemberRole
from mailman.rest.helpers import (
CollectionMixin, Validator, etag, path_to, restish_matcher)
-from mailman.rest.members import AMember
+from mailman.rest.members import AMember, MembersOfList
@@ -59,6 +59,27 @@ def member_matcher(request, segments):
return (), dict(role=role, address=segments[1]), ()
+@restish_matcher
+def roster_matcher(request, segments):
+ """A matcher of all members URLs inside mailing lists.
+
+ e.g. /roster/members
+ /roster/owners
+ /roster/moderators
+
+ The URL roles are the plural form of the MemberRole enum, because the
+ former reads better.
+ """
+ if len(segments) != 2 or segments[0] != 'roster':
+ return None
+ role = segments[1][:-1]
+ try:
+ return (), dict(role=MemberRole[role]), ()
+ except ValueError:
+ # Not a valid role.
+ return None
+
+
class _ListBase(resource.Resource, CollectionMixin):
"""Shared base class for mailing list representations."""
@@ -93,8 +114,14 @@ class AList(_ListBase):
@resource.child(member_matcher)
def member(self, request, segments, role, address):
+ """Return a single member representation."""
return AMember(self._mlist, role, address)
+ @resource.child(roster_matcher)
+ def roster(self, request, segments, role):
+ """Return the collection of all a mailing list's members."""
+ return MembersOfList(self._mlist, role)
+
class AllLists(_ListBase):
"""The mailing lists."""