diff options
| author | bwarsaw | 2001-12-19 06:19:39 +0000 |
|---|---|---|
| committer | bwarsaw | 2001-12-19 06:19:39 +0000 |
| commit | da999b90a2bf3fe2b2f3693b4b1f9cce4735218f (patch) | |
| tree | bc56acee01c457023165e2cbef86a8e0607a3268 | |
| parent | 9d01a94a431631e3e712ecb3dbe4fd49b620e8d2 (diff) | |
| download | mailman-da999b90a2bf3fe2b2f3693b4b1f9cce4735218f.tar.gz mailman-da999b90a2bf3fe2b2f3693b4b1f9cce4735218f.tar.zst mailman-da999b90a2bf3fe2b2f3693b4b1f9cce4735218f.zip | |
First step on the bounce processer sanity road. These changes fix
Mailman to keep track of why (and when) delivery is disabled. New
list attribute delivery_status and new MemberAdaptor interface methods
are added. Delivery status has the following states: ENABLED, BYUSER
(disabled by user selection), BYADMIN (disabled by admin selection),
BYBOUNCE (disabled by excessive bouncing), UNKNOWN (legacy disable).
We no longer use the DisableDelivery user option. Also, for status
changes from <anything> -> <anything-but-ENABLED>, we record the
time.time(). This information gets thrown away when the delivery is
re-enabled.
Specific changes here:
getDeliveryStatus(), getDeliveryStatusChangeTime(), getBounceInfo(),
setDeliveryStatus(), setBounceInfo(): New implementations matching the
interface changes.
| -rw-r--r-- | Mailman/OldStyleMemberships.py | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/Mailman/OldStyleMemberships.py b/Mailman/OldStyleMemberships.py index 2a0cde5e3..cd8fc5742 100644 --- a/Mailman/OldStyleMemberships.py +++ b/Mailman/OldStyleMemberships.py @@ -23,12 +23,13 @@ i.e. KEY is LCE. This is the adaptor used by default in Mailman 2.1. """ +import time from types import StringType from Mailman import mm_cfg from Mailman import Utils from Mailman import Errors -from Mailman.MemberAdaptor import MemberAdaptor +from Mailman import MemberAdaptor ISREGULAR = 1 ISDIGEST = 2 @@ -41,7 +42,7 @@ ISDIGEST = 2 -class OldStyleMemberships(MemberAdaptor): +class OldStyleMemberships(MemberAdaptor.MemberAdaptor): def __init__(self, mlist): self.__mlist = mlist @@ -131,6 +132,26 @@ class OldStyleMemberships(MemberAdaptor): self.__assertIsMember(member) return self.__mlist.topics_userinterest.get(member.lower(), []) + def getDeliveryStatus(self, member): + self.__assertIsMember(member) + return self.__mlist.delivery_status.get( + member.lower(), + # Values are tuples, so the default should also be a tuple. The + # second item will be ignored. + (MemberAdaptor.ENABLED, 0))[0] + + def getDeliveryStatusChangeTime(self, member): + self.__assertIsMember(member) + return self.__mlist.delivery_status.get( + member.lower(), + # Values are tuples, so the default should also be a tuple. The + # second item will be ignored. + (MemberAdaptor.ENABLED, 0))[1] + + def getBounceInfo(self, member): + self.__assertIsMember(member) + return self.__mlist.bounce_info.get(member.lower()) + # # Write interface # @@ -293,3 +314,27 @@ class OldStyleMemberships(MemberAdaptor): # if topics is empty, then delete the entry in this dictionary elif self.__mlist.topics_userinterest.has_key(memberkey): del self.__mlist.topics_userinterest[memberkey] + + def setDeliveryStatus(self, member, status): + assert status in (MemberAdaptor.ENABLED, MemberAdaptor.UNKNOWN, + MemberAdaptor.BYUSER, MemberAdaptor.BYADMIN, + MemberAdaptor.BYBOUNCE) + assert self.__mlist.Locked() + self.__assertIsMember(member) + member = member.lower() + if status == MemberAdaptor.ENABLED: + if self.__mlist.delivery_status.has_key(member): + del self.__mlist.delivery_status[member] + # Otherwise, nothing to do + else: + self.__mlist.delivery_status[member] = (status, time.time()) + + def setBounceInfo(self, member, info): + assert self.__mlist.Locked() + self.__assertIsMember(member) + if status is None: + if self.__mlist.bounce_info.has_key(member): + del self.__mlist.bounce_info[member] + # Otherwise, nothing to do + else: + self.__mlist.bounce_info[member] = info |
