summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Mailman/MemberAdaptor.py16
-rw-r--r--Mailman/OldStyleMemberships.py20
2 files changed, 27 insertions, 9 deletions
diff --git a/Mailman/MemberAdaptor.py b/Mailman/MemberAdaptor.py
index af38b10c3..b2778f635 100644
--- a/Mailman/MemberAdaptor.py
+++ b/Mailman/MemberAdaptor.py
@@ -168,7 +168,8 @@ class MemberAdaptor:
primary reason for this to happen is that we've copied
their delivery status from a legacy version which didn't
keep track of disable reasons
- BYCHOICE - The user explicitly disable deliveries
+ BYUSER - The user explicitly disable deliveries
+ BYADMIN - The list administrator explicitly disabled deliveries
BYBOUNCE - The system disabled deliveries due to bouncing
If member is not a member of the list, raise NotAMemberError.
@@ -184,6 +185,16 @@ class MemberAdaptor:
"""
raise NotImplemented
+ def getDeliveryStatusMembers(self,
+ status=(UNKNOWN, BYUSER, BYADMIN, BYBOUNCE)):
+ """Return the list of members with a matching delivery status.
+
+ Optional `status' if given, must be a sequence containing one or more
+ of ENABLED, UNKNOWN, BYCHOICE, or BYBOUNCE. The members whose
+ delivery status is in this sequence are returned.
+ """
+ raise NotImplemented
+
def getBounceInfo(self, member):
"""Return the member's bounce information.
@@ -304,7 +315,8 @@ class MemberAdaptor:
primary reason for this to happen is that we've copied
their delivery status from a legacy version which didn't
keep track of disable reasons
- BYCHOICE - The user explicitly disable deliveries
+ BYUSER - The user explicitly disable deliveries
+ BYADMIN - The list administrator explicitly disabled deliveries
BYBOUNCE - The system disabled deliveries due to bouncing
This method also records the time (in seconds since epoch) at which
diff --git a/Mailman/OldStyleMemberships.py b/Mailman/OldStyleMemberships.py
index cd8fc5742..d396781ec 100644
--- a/Mailman/OldStyleMemberships.py
+++ b/Mailman/OldStyleMemberships.py
@@ -148,6 +148,13 @@ class OldStyleMemberships(MemberAdaptor.MemberAdaptor):
# second item will be ignored.
(MemberAdaptor.ENABLED, 0))[1]
+ def getDeliveryStatusMembers(self, status=(MemberAdaptor.UNKNOWN,
+ MemberAdaptor.BYUSER,
+ MemberAdaptor.BYADMIN,
+ MemberAdaptor.BYBOUNCE)):
+ return [member for member in self.getMembers()
+ if self.getDeliveryStatus(member) in status]
+
def getBounceInfo(self, member):
self.__assertIsMember(member)
return self.__mlist.bounce_info.get(member.lower())
@@ -211,9 +218,8 @@ class OldStyleMemberships(MemberAdaptor.MemberAdaptor):
dict = getattr(self.__mlist, attr)
if dict.has_key(memberkey):
del dict[memberkey]
- # A few other structures held elsewhere. BAW: these should be
- # integrated with membership management
- self.__mlist.ClearBounceInfo(memberkey)
+ # Clear any bounce information associated with this member
+ self.__mlist.setBounceInfo(memberkey, None)
def changeMemberAddress(self, member, newaddress, nodelete=0):
assert self.__mlist.Locked()
@@ -323,8 +329,7 @@ class OldStyleMemberships(MemberAdaptor.MemberAdaptor):
self.__assertIsMember(member)
member = member.lower()
if status == MemberAdaptor.ENABLED:
- if self.__mlist.delivery_status.has_key(member):
- del self.__mlist.delivery_status[member]
+ self.setBounceInfo(member, None)
# Otherwise, nothing to do
else:
self.__mlist.delivery_status[member] = (status, time.time())
@@ -332,9 +337,10 @@ class OldStyleMemberships(MemberAdaptor.MemberAdaptor):
def setBounceInfo(self, member, info):
assert self.__mlist.Locked()
self.__assertIsMember(member)
- if status is None:
+ if info is None:
if self.__mlist.bounce_info.has_key(member):
del self.__mlist.bounce_info[member]
- # Otherwise, nothing to do
+ if self.__mlist.delivery_status.has_key(member):
+ del self.__mlist.delivery_status[member]
else:
self.__mlist.bounce_info[member] = info