summaryrefslogtreecommitdiff
path: root/src/mailman/model/roster.py
diff options
context:
space:
mode:
authorAbhilash Raj2015-04-15 22:49:58 -0400
committerAbhilash Raj2015-04-15 22:49:58 -0400
commit342b878edae5f19c8db195abce684d8a20ef2c37 (patch)
tree91361d6f68317cc8b4e2a47ae07cbca904764a9a /src/mailman/model/roster.py
parentbc515c8ce1dd7e0f2221f5ae5f572d2e42d9fe18 (diff)
parent2f2e4aa6684a0930395d56a77078aa39ee7786a5 (diff)
downloadmailman-342b878edae5f19c8db195abce684d8a20ef2c37.tar.gz
mailman-342b878edae5f19c8db195abce684d8a20ef2c37.tar.zst
mailman-342b878edae5f19c8db195abce684d8a20ef2c37.zip
Diffstat (limited to 'src/mailman/model/roster.py')
-rw-r--r--src/mailman/model/roster.py64
1 files changed, 50 insertions, 14 deletions
diff --git a/src/mailman/model/roster.py b/src/mailman/model/roster.py
index 91211c665..da2ed4582 100644
--- a/src/mailman/model/roster.py
+++ b/src/mailman/model/roster.py
@@ -97,21 +97,48 @@ class AbstractRoster:
yield member.address
@dbconnection
- def get_member(self, store, address):
- """See `IRoster`."""
- results = store.query(Member).filter(
+ def _get_all_memberships(self, store, email):
+ # Avoid circular imports.
+ from mailman.model.user import User
+ # Here's a query that finds all members subscribed with an explicit
+ # email address.
+ members_a = store.query(Member).filter(
Member.list_id == self._mlist.list_id,
Member.role == self.role,
- Address.email == address,
+ Address.email == email,
Member.address_id == Address.id)
- if results.count() == 0:
+ # Here's a query that finds all members subscribed with their
+ # preferred address.
+ members_u = store.query(Member).filter(
+ Member.list_id == self._mlist.list_id,
+ Member.role == self.role,
+ Address.email==email,
+ Member.user_id == User.id)
+ return members_a.union(members_u).all()
+
+ def get_member(self, email):
+ """See ``IRoster``."""
+ memberships = self._get_all_memberships(email)
+ count = len(memberships)
+ if count == 0:
return None
- elif results.count() == 1:
- return results[0]
- else:
- raise AssertionError(
- 'Too many matching member results: {0}'.format(
- results.count()))
+ elif count == 1:
+ return memberships[0]
+ assert count == 2, 'Unexpected membership count: {}'.format(count)
+ # This is the case where the email address is subscribed both
+ # explicitly and indirectly through the preferred address. By
+ # definition, we return the explicit address membership only.
+ return (memberships[0]
+ if memberships[0]._address is not None
+ else memberships[1])
+
+ def get_memberships(self, email):
+ """See ``IRoster``."""
+ memberships = self._get_all_memberships(email)
+ count = len(memberships)
+ assert 0 <= count <= 2, 'Unexpected membership count: {}'.format(
+ count)
+ return memberships
@@ -160,13 +187,13 @@ class AdministratorRoster(AbstractRoster):
Member.role == MemberRole.moderator))
@dbconnection
- def get_member(self, store, address):
+ def get_member(self, store, email):
"""See `IRoster`."""
results = store.query(Member).filter(
Member.list_id == self._mlist.list_id,
or_(Member.role == MemberRole.moderator,
Member.role == MemberRole.owner),
- Address.email == address,
+ Address.email == email,
Member.address_id == Address.id)
if results.count() == 0:
return None
@@ -181,6 +208,8 @@ class AdministratorRoster(AbstractRoster):
class DeliveryMemberRoster(AbstractRoster):
"""Return all the members having a particular kind of delivery."""
+ role = MemberRole.member
+
@property
def member_count(self):
"""See `IRoster`."""
@@ -285,7 +314,7 @@ class Memberships:
yield address
@dbconnection
- def get_member(self, store, address):
+ def get_member(self, store, email):
"""See `IRoster`."""
results = store.query(Member).filter(
Member.address_id == Address.id,
@@ -298,3 +327,10 @@ class Memberships:
raise AssertionError(
'Too many matching member results: {0}'.format(
results.count()))
+
+ @dbconnection
+ def get_memberships(self, store, address):
+ """See `IRoster`."""
+ # 2015-04-14 BAW: See LP: #1444055 -- this currently exists just to
+ # pass a test.
+ raise NotImplementedError