summaryrefslogtreecommitdiff
path: root/Mailman/database/model/roster.py
diff options
context:
space:
mode:
authorBarry Warsaw2007-06-18 10:50:23 -0400
committerBarry Warsaw2007-06-18 10:50:23 -0400
commit511a33778c4195c4abca7c58aa6917e6a77059b6 (patch)
tree5bffc7a5793a8247310294ac86931741e73b1fc5 /Mailman/database/model/roster.py
parentf0e3b3934d5d458cadd814eeae07277b58650180 (diff)
downloadmailman-511a33778c4195c4abca7c58aa6917e6a77059b6.tar.gz
mailman-511a33778c4195c4abca7c58aa6917e6a77059b6.tar.zst
mailman-511a33778c4195c4abca7c58aa6917e6a77059b6.zip
Diffstat (limited to 'Mailman/database/model/roster.py')
-rw-r--r--Mailman/database/model/roster.py96
1 files changed, 46 insertions, 50 deletions
diff --git a/Mailman/database/model/roster.py b/Mailman/database/model/roster.py
index ee50cddf0..0730d2b4b 100644
--- a/Mailman/database/model/roster.py
+++ b/Mailman/database/model/roster.py
@@ -22,11 +22,12 @@ the ones that fit a particular role. These are used as the member, owner,
moderator, and administrator roster filters.
"""
+from sqlalchemy import *
from zope.interface import implements
from Mailman.constants import DeliveryMode, MemberRole
from Mailman.constants import SystemDefaultPreferences
-from Mailman.database.model import Member
+from Mailman.database.model import Address, Member
from Mailman.interfaces import IRoster
@@ -42,12 +43,16 @@ class AbstractRoster(object):
"""
implements(IRoster)
+ role = None
+
def __init__(self, mlist):
self._mlist = mlist
@property
def members(self):
- raise NotImplementedError
+ for member in Member.select_by(mailing_list=self._mlist.fqdn_listname,
+ role=self.role):
+ yield member
@property
def users(self):
@@ -67,21 +72,27 @@ class AbstractRoster(object):
for member in self.members:
yield member.address
+ def get_member(self, address):
+ results = Member.select(
+ and_(Member.c.mailing_list == self._mlist.fqdn_listname,
+ Member.c.role == self.role,
+ Address.c.address == address,
+ Member.c.address_id == Address.c.id))
+ if len(results) == 0:
+ return None
+ elif len(results) == 1:
+ return results[0]
+ else:
+ assert len(results) <= 1, (
+ 'Too many matching member results: %s' % results)
+
class MemberRoster(AbstractRoster):
"""Return all the members of a list."""
name = 'member'
-
- @property
- def members(self):
- # Query for all the Members which have a role of MemberRole.member and
- # are subscribed to this mailing list. XXX we have to use a private
- # data attribute of MailList for now.
- for member in Member.select_by(mailing_list=self._mlist.fqdn_listname,
- role=MemberRole.member):
- yield member
+ role = MemberRole.member
@@ -89,15 +100,7 @@ class OwnerRoster(AbstractRoster):
"""Return all the owners of a list."""
name = 'owner'
-
- @property
- def members(self):
- # Query for all the Members which have a role of MemberRole.member and
- # are subscribed to this mailing list. XXX we have to use a private
- # data attribute of MailList for now.
- for member in Member.select_by(mailing_list=self._mlist.fqdn_listname,
- role=MemberRole.owner):
- yield member
+ role = MemberRole.owner
@@ -105,15 +108,7 @@ class ModeratorRoster(AbstractRoster):
"""Return all the owners of a list."""
name = 'moderator'
-
- @property
- def members(self):
- # Query for all the Members which have a role of MemberRole.member and
- # are subscribed to this mailing list. XXX we have to use a private
- # data attribute of MailList for now.
- for member in Member.select_by(mailing_list=self._mlist.fqdn_listname,
- role=MemberRole.moderator):
- yield member
+ role = MemberRole.moderator
@@ -125,30 +120,31 @@ class AdministratorRoster(AbstractRoster):
@property
def members(self):
# Administrators are defined as the union of the owners and the
- # moderators. Until I figure out a more efficient way of doing this,
- # this will have to do.
- owners = Member.select_by(mailing_list=self._mlist.fqdn_listname,
- role=MemberRole.owner)
- moderators = Member.select_by(mailing_list=self._mlist.fqdn_listname,
- role=MemberRole.moderator)
- members = set(owners)
- members.update(set(moderators))
+ # moderators.
+ members = Member.select(
+ and_(Member.c.mailing_list == self._mlist.fqdn_listname,
+ or_(Member.c.role == MemberRole.owner,
+ Member.c.role == MemberRole.moderator)))
for member in members:
yield member
-
-
-def _delivery_mode(member):
- if member.preferences.delivery_mode is not None:
- return member.preferences.delivery_mode
- if member.address.preferences.delivery_mode is not None:
- return member.address.preferences.delivery_mode
- if (member.address.user and
- member.address.user.preferences.delivery_mode is not None):
- return member.address.user.preferences.delivery_mode
- return SystemDefaultPreferences.delivery_mode
+ def get_member(self, address):
+ results = Member.select(
+ and_(Member.c.mailing_list == self._mlist.fqdn_listname,
+ or_(Member.c.role == MemberRole.moderator,
+ Member.c.role == MemberRole.owner),
+ Address.c.address == address,
+ Member.c.address_id == Address.c.id))
+ if len(results) == 0:
+ return None
+ elif len(results) == 1:
+ return results[0]
+ else:
+ assert len(results) <= 1, (
+ 'Too many matching member results: %s' % results)
+
class RegularMemberRoster(AbstractRoster):
"""Return all the regular delivery members of a list."""
@@ -161,7 +157,7 @@ class RegularMemberRoster(AbstractRoster):
# that have a regular delivery mode.
for member in Member.select_by(mailing_list=self._mlist.fqdn_listname,
role=MemberRole.member):
- if _delivery_mode(member) == DeliveryMode.regular:
+ if member.delivery_mode == DeliveryMode.regular:
yield member
@@ -186,5 +182,5 @@ class DigestMemberRoster(AbstractRoster):
# that have one of the digest delivery modes.
for member in Member.select_by(mailing_list=self._mlist.fqdn_listname,
role=MemberRole.member):
- if _delivery_mode(member) in _digest_modes:
+ if member.delivery_mode in _digest_modes:
yield member