[Mailman-Developers] Re: Released: New option for mailman-cvs: reply-to munging per user

Marc MERLIN marc_news@vasoftware.com
Tue, 12 Mar 2002 09:54:57 -0800


--veXX9dWIonWZEC6h
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Mar 12, 2002 at 02:04:35AM -0800, Marc MERLIN wrote:
> > Since this adds some processing, I added an optimization to bypass this code
> > if no one on the list requests munging.
> 
> This was the missing piece in my patch yesterday, and implementing it right,
> and in an efficient way was tricky, but I'm pretty sure I nailed it now, and
> did it in a way that minimizes scans of the list membership.

Well,  actually I  found a  bug  under my  pillow  last night  (bad bug,  no
cookie): I did forget  about other functions that can  change member options
or the balance between munged and  non munged users (add, delete, and rename
users)
This small patch applies on top of the other one and takes care of that.

You can also find the full patch here:
http://marc.merlins.org/tmp/replyto.diff.cvs

Marc
-- 
Microsoft is to operating systems & security ....
                                      .... what McDonalds is to gourmet cooking
  
Home page: http://marc.merlins.org/   |   Finger marc_f@merlins.org for PGP key

--veXX9dWIonWZEC6h
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="replyto.diff.cvs2"

diff -urN mailman-cvs.replyto/Mailman/OldStyleMemberships.py mailman-cvs.replyto.newusers/Mailman/OldStyleMemberships.py
--- mailman-cvs.replyto/Mailman/OldStyleMemberships.py	Tue Mar 12 01:50:07 2002
+++ mailman-cvs.replyto.newusers/Mailman/OldStyleMemberships.py	Tue Mar 12 09:41:29 2002
@@ -45,6 +45,31 @@
 class OldStyleMemberships(MemberAdaptor.MemberAdaptor):
     def __init__(self, mlist):
         self.__mlist = mlist
+	
+    # We need  to call this  (I think  only internally) when  the membership
+    # list is changed in a way that  can cause the first or last munged user
+    # to appear or go away.
+    # In other words, anything that writes user_options or adds/removes a
+    # user -- Marc
+    def __regenmungedflags(self):
+	nomunge=0
+	munge=0
+	self.__mlist.mixed_reply_to_munged_users=0
+	self.__mlist.all_reply_to_munged_users=0
+	for member in self.__mlist.members.keys():
+	    if (self.__mlist.user_options.has_key(member) and
+	        self.__mlist.user_options[member] & mm_cfg.AddListReplyTo):
+		munge=1
+	    else:
+		nomunge=1
+	    if munge and nomunge:
+		self.__mlist.mixed_reply_to_munged_users=1
+		break
+
+	if (nomunge == 0) and (munge == 1):
+	    self.__mlist.all_reply_to_munged_users=1
+		
+	    
 
     #
     # Read interface
@@ -211,6 +236,7 @@
         # Set the member's default set of options
         if self.__mlist.new_member_options:
             self.__mlist.user_options[member] = self.__mlist.new_member_options
+	self.__regenmungedflags()
     
     def removeMember(self, member):
         assert self.__mlist.Locked()
@@ -226,6 +252,7 @@
             dict = getattr(self.__mlist, attr)
             if dict.has_key(memberkey):
                 del dict[memberkey]
+	    self.__regenmungedflags()
 
     def changeMemberAddress(self, member, newaddress, nodelete=0):
         assert self.__mlist.Locked()
@@ -249,6 +276,7 @@
         # Delete the old memberkey
         if not nodelete:
             self.removeMember(memberkey)
+	self.__regenmungedflags()
 
     def setMemberPassword(self, memberkey, password):
         assert self.__mlist.Locked()
@@ -330,25 +358,10 @@
 	# Let's only do a rescan if the replyto or digest status changed -- Marc
 	if ( isregular != self.__mlist.members.has_key(memberkey) or 
 	     isdigest != self.__mlist.digest_members.has_key(memberkey) or
-	    isreplyto != ( self.__mlist.user_options[memberkey] & 
+	     isreplyto != ( self.__mlist.user_options[memberkey] & 
 			    mm_cfg.AddListReplyTo ) ) :
-	    nomunge=0
-	    munge=0
-	    self.__mlist.mixed_reply_to_munged_users=0
-	    self.__mlist.all_reply_to_munged_users=0
-	    for member in self.__mlist.members.keys():
-		if self.__mlist.user_options[member] & mm_cfg.AddListReplyTo:
-		    munge=1
-		else:
-		    nomunge=1
-		if munge and nomunge:
-		    self.__mlist.mixed_reply_to_munged_users=1
-		    break
+	    self.__regenmungedflags()
 
-	    if (nomunge == 0) and (munge == 1):
-		self.__mlist.all_reply_to_munged_users=1
-		
-	    
     def setMemberName(self, member, realname):
         assert self.__mlist.Locked()
         self.__assertIsMember(member)

--veXX9dWIonWZEC6h--