[Mailman-Developers] More extend.py questions

Barry A. Warsaw barry@python.org
Mon Nov 4 21:50:10 2002


>>>>> "MW" == Martin Whinnery <martin.whinnery@sbc.ac.uk> writes:

    MW> Please indulge a python virgin. Barry has advised someone to
    MW> 'overload the Load & Save function' in extend.py . Would
    MW> someone help me with a little sample? It doesn't need to do
    MW> anything useful, just replace the original function.

Understand that this stuff is a kludge that should make /some/ radical
customization of Mailman easier.  The specific use case I had in mind
was the ability to create different MemberAdaptor implementations,
which I think is pretty close to what you're trying to do.

Note that you may or may not need to overload MailList.Load() and
MailList.Save() unless you also want to customize how list attributes
are stored.  If all you care about is getting member information out
of LDAP, you might only need to set the MailList object's
_memberadaptor attribute to something other than an
OldStyleMemberships instance.

    --------- My efforts so far -------------
    # /usr/local/mailman/lists/ldaplist/extend.py

    def extend(mlist):
	    mlist.OldSave = mlist.Save
	    def MySave(self):
		    print "WOOKIE" # So I can see it in withlist
		    mlist.__class__.Save(self)
	    mlist.Save = MySave


    -------- snip snip ----------------------

I think this is pretty close to what I had in mind, although I'm not
sure why you want to call the original Save function in MySave(), and
why you wouldn't just call mlist.OldSave() if you really wanted to do
that.

    But when I try m.Save(m) from within "withlist ldaplist", I get a
    'NotLocked' error:

    NotLockedError: <LockFile
    137391332: /usr/local/mailman/locks/ldaplist.lock [unlocked: 18000sec]
    pid=9172>: None

Did you use the -l option to withlist?  Or did you explicit call
m.Lock()?  If not, getting this exception probably has little to do
with extend.py (the list has to be locked in order to Save it).

But as I said, I'm not sure you'll need to override Load() and
Save() -- unless you're going to allow the writeable methods in the
MemberAdaptor interface to be called through Mailman.

You'll definitely want to write an implementation of MemberAdaptor
that gets its data through LDAP, and then in your extend.py file, do
something like

-------------------- snip snip --------------------
# extend.py

def extend(mlist):
    # You might want to key off of something other than the list's
    # internal name.
    listid = mlist.internal_name()
    # Get all member info from LDAP
    mlist._memberadaptor = LDAPMemberAdaptor(listid)
-------------------- snip snip --------------------

HTH,
-Barry