summaryrefslogtreecommitdiff
path: root/mailman/database/roster.py
diff options
context:
space:
mode:
authorBarry Warsaw2008-03-24 13:45:32 -0400
committerBarry Warsaw2008-03-24 13:45:32 -0400
commit0e72ca67751485230ba9d831987d6162ef5aa280 (patch)
tree225f689a32e73efaff6aa2850947499bf05798ed /mailman/database/roster.py
parent16d7c64da2a3f674e2dcd2e0c5d38d2abf63cd83 (diff)
downloadmailman-0e72ca67751485230ba9d831987d6162ef5aa280.tar.gz
mailman-0e72ca67751485230ba9d831987d6162ef5aa280.tar.zst
mailman-0e72ca67751485230ba9d831987d6162ef5aa280.zip
Diffstat (limited to 'mailman/database/roster.py')
-rw-r--r--mailman/database/roster.py59
1 files changed, 58 insertions, 1 deletions
diff --git a/mailman/database/roster.py b/mailman/database/roster.py
index 2b237df97..e811ee56e 100644
--- a/mailman/database/roster.py
+++ b/mailman/database/roster.py
@@ -22,6 +22,19 @@ the ones that fit a particular role. These are used as the member, owner,
moderator, and administrator roster filters.
"""
+__metaclass__ = type
+__all__ = [
+ 'AdministratorRoster',
+ 'DigestMemberRoster',
+ 'MemberRoster',
+ 'Memberships',
+ 'ModeratorRoster',
+ 'OwnerRoster',
+ 'RegularMemberRoster',
+ 'Subscribers',
+ ]
+
+
from storm.locals import *
from zope.interface import implements
@@ -33,7 +46,7 @@ from mailman.interfaces import DeliveryMode, IRoster, MemberRole
-class AbstractRoster(object):
+class AbstractRoster:
"""An abstract IRoster class.
This class takes the simple approach of implemented the 'users' and
@@ -208,3 +221,47 @@ class Subscribers(AbstractRoster):
Member,
mailing_list=self._mlist.fqdn_listname):
yield member
+
+
+
+class Memberships:
+ """A roster of a single user's memberships."""
+
+ implements(IRoster)
+
+ name = 'memberships'
+
+ def __init__(self, user):
+ self._user = user
+
+ @property
+ def members(self):
+ results = config.db.store.find(
+ Member,
+ Member.address_id.is_in(
+ Select(Address,
+ Address.user_id == self._user.id)))
+ for member in results:
+ yield member
+
+ @property
+ def users(self):
+ yield self._user
+
+ @property
+ def addresses(self):
+ for address in self._user.addresses:
+ yield address
+
+ def get_member(self, address):
+ results = config.db.store.find(
+ Member,
+ Member.address_id == Address.id,
+ Address.user_id == self._user.id)
+ if results.count() == 0:
+ return None
+ elif results.count() == 1:
+ return results[0]
+ else:
+ raise AssertionError('Too many matching member results: %s' %
+ results.count())