diff options
| -rw-r--r-- | Mailman/MemberAdaptor.py | 16 | ||||
| -rw-r--r-- | Mailman/OldStyleMemberships.py | 20 |
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 |
