summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/interfaces/usermanager.py3
-rw-r--r--src/mailman/model/docs/usermanager.rst44
-rw-r--r--src/mailman/model/usermanager.py9
3 files changed, 55 insertions, 1 deletions
diff --git a/src/mailman/interfaces/usermanager.py b/src/mailman/interfaces/usermanager.py
index 5f3a324cc..da2f460df 100644
--- a/src/mailman/interfaces/usermanager.py
+++ b/src/mailman/interfaces/usermanager.py
@@ -126,3 +126,6 @@ class IUserManager(Interface):
members = Attribute(
"""An iterator of all the `IMembers` in the database.""")
+
+ server_owners = Attribute(
+ """An iterator over all the `IUsers` who are server owners.""")
diff --git a/src/mailman/model/docs/usermanager.rst b/src/mailman/model/docs/usermanager.rst
index 8e40b621e..a98f88670 100644
--- a/src/mailman/model/docs/usermanager.rst
+++ b/src/mailman/model/docs/usermanager.rst
@@ -201,3 +201,47 @@ The user has a single unverified address object.
>>> for address in cris.addresses:
... print(repr(address))
<Address: Cris Person <cris@example.com> [not verified] at ...>
+
+
+Server owners
+=============
+
+Some users are designated as *server owners*. At first there are no server
+owners.
+
+ >>> len(list(user_manager.server_owners))
+ 0
+
+Dan is made a server owner.
+
+ >>> user_4.is_server_owner = True
+ >>> owners = list(user_manager.server_owners)
+ >>> len(owners)
+ 1
+ >>> owners[0]
+ <User "Dan Person" (...) at ...>
+
+Now Ben and Claire are also made server owners.
+
+ >>> user_2.is_server_owner = True
+ >>> user_3.is_server_owner = True
+ >>> owners = list(user_manager.server_owners)
+ >>> len(owners)
+ 3
+ >>> from operator import attrgetter
+ >>> for user in sorted(owners, key=attrgetter('display_name')):
+ ... print(user)
+ <User "Ben Person" (...) at ...>
+ <User "Claire Person" (...) at ...>
+ <User "Dan Person" (...) at ...>
+
+Clair retires as a server owner.
+
+ >>> user_3.is_server_owner = False
+ >>> owners = list(user_manager.server_owners)
+ >>> len(owners)
+ 2
+ >>> for user in sorted(owners, key=attrgetter('display_name')):
+ ... print(user)
+ <User "Ben Person" (...) at ...>
+ <User "Dan Person" (...) at ...>
diff --git a/src/mailman/model/usermanager.py b/src/mailman/model/usermanager.py
index 3d7777099..5d63a2146 100644
--- a/src/mailman/model/usermanager.py
+++ b/src/mailman/model/usermanager.py
@@ -141,4 +141,11 @@ class UserManager:
def members(self, store):
"""See `IUserManager."""
for member in store.query(Member).all():
- yield member
+ yield member
+
+ @property
+ @dbconnection
+ def server_owners(self, store):
+ """ See `IUserManager."""
+ users = store.query(User).filter_by(is_server_owner=True)
+ yield from users