diff options
Diffstat (limited to 'src/mailman/rest/lists.py')
| -rw-r--r-- | src/mailman/rest/lists.py | 29 |
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.""" |
