summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbwarsaw2001-12-19 06:19:39 +0000
committerbwarsaw2001-12-19 06:19:39 +0000
commitda999b90a2bf3fe2b2f3693b4b1f9cce4735218f (patch)
treebc56acee01c457023165e2cbef86a8e0607a3268
parent9d01a94a431631e3e712ecb3dbe4fd49b620e8d2 (diff)
downloadmailman-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.py49
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