[Mailman-Users] Mailman Web UI Look and Feel Customization, including SSIs

Kucera, Rich Kucerar at hhmi.org
Thu Mar 16 16:55:14 CET 2006


A worst-case web ui integration with mailman, involving dynamic SSIs,
implemented on v2.1.7.  

 

1)  HTML files in mailman/templates/en were placed in a directory on the www
server to 

be slugged with the ssi template.   Outermost HTML, Head and body tags
removed.

 

1.1)  the archtoc.html,  archtocentry.html,  archliststart.html,
archlistend.html,  

archidxentry.html files were *not* included in the files to be slugged,  as
they are 

already pieces of the archive templating system.

 

1.2)  A file called "empty.html" containing just a comment was placed over
there and 

in the local template/en directory as well,  to receive an empty shell.

 

2)  all of the files are slugged on the web server with the SSI
directives(prior to 

being pulled over HTTP to activate the SSIs).

 

autoslug-part1.bsh

------------------------------------------

 

#!/usr/bin/bash

# usage: pass in name of template directory for processing

 

if [ $1 ]

then

 

echo ""

echo "Using template directory: $1"

echo ""

 

for i in `ls content`

do

cp $1/top-half.html $i

cat content/$i >> $i

cat $1/bottom-half.html >> $i

echo "created $i"

done

 

else

 

echo "usage: pass in name of template directory for processing"

 

fi

 

2.1) The SSI source template has been split in two pieces,  and concated to
the 

exported mailman templates.

 

3) Pull the prepared mailman template slugged with look and feel over HTTP:

 

 

Autoslug-part2.bsh

-----------------------------------

 

 

#!/bin/bash

# usage: run in the mailman template directory

 

for i in `ls *.html`

do

python http-get-file.py http://server.do.main/mailman-template/ $i > $i

echo "http copied $i"

done

 

echo "restoring saved splits"

cp archidxfoot.html-savesplit archidxfoot.html

cp archidxhead.html-savesplit archidxhead.html

 

 

http-get-file.py

----------------------------

 

import urllib

import sys

opener = urllib.FancyURLopener({})

f = opener.open(sys.argv[1]+sys.argv[2])

the_template = f.read()

print(the_template)

 

 

 

3.1)   The result of these scripts are placed in the mailman/template/en
directory and 

these have had all their SSIs completed.

 

3.2)   archidxfoot.html and archidxhead.html need to have their tops and
bottoms cut 

off,  respectively.  These are saved in -savesplit files to avoid having to
redo this 

manually every time a tiny revision is made and autoslug-part2 is re-run.
This is the 

meaning of the "restoring saved splits" lines.

 

3.3)   Empty.html needs to be manually split into empty-top.html and 

empty-bottom.html.  Also an empty-top-no-sidebar.html was created from
empty-top.html 

for the mailman admin pages (they are too wide in places to accommodate a
sidedar).

 

3.4)  The rest of the templates remain as is.

 

 

Minor modifications to htmlformat.py and HTMLFormatter.py are all that
remain.  

Empty-top uses python Template class for the title tag-for example at the top
of 

empty-top.html <TITLE>$list_name Info Page</TITLE>,  the modified Format()
function 

will replace $list_name with the name of the list.  

 

4)  The changes are marked with ##RJKMod 

 

*htmlformat.py*

 

###At the top of file

 

#RJKmod:

from string import Template

 

 

 

###In class Document

 

class Document(Container):

 

    title = None

    language = None

    bgcolor = mm_cfg.WEB_BG_COLOR

    suppress_head = 0

 

    #RJKmod: Use custom top-half and bottom-half files

    use_custom_template = 1

 

    ...

 

###The modified Document.Format() function:

 

 

 

    def Format(self, indent=0, **kws):

        charset = 'us-ascii'

        if self.language:

            charset = Utils.GetCharSet(self.language)

        output = ['Content-Type: text/html; charset=%s\n' % charset]

        if not self.suppress_head:

            if not self.use_custom_template:  #RJKmod

                kws.setdefault('bgcolor', self.bgcolor)

 

                 ...distribution code...

 

                output.append('%s<BODY %s>' % (tab, SPACE.join(quals)))

            else: #RJKmod

                try:

                    f_templ =
file('/usr/local/mailman/templates/en/empty-top.html')

                    if self.title.count( 'Administrati') or self.title.count(
'Edit'):

                        f_templ = 

file('/usr/local/mailman/templates/en/empty-top-no-sidebar.html')

                    templ_content = f_templ.read()

                    t = Template( templ_content )

                    output.append( t.safe_substitute( list_name = self.title
) )

                finally:

                    f_templ.close() 

 

        # Always do this...

        output.append(Container.Format(self, indent))

        if not self.suppress_head:

            if not self.use_custom_template:  #RJKmod

                output.append('%s</BODY>' % tab)

                output.append('%s</HTML>' % tab)

            else: #RJKmod

                try:

                    f_templ = 

file('/usr/local/mailman/templates/en/empty-bottom.html')

                    templ_content = f_templ.read()

                    output.append( templ_content )

                finally:

                    f_templ.close()

        return NL.join(output)

 

###Modified Logo function to remove logo

def MailmanLogo():

    t = Table(border=0, width='100%')

## RJKmod

    return t

 

  *HTMLFormatter.py*

 

### Remove the footer

 

class HTMLFormatter:

    def GetMailmanFooter(self):

##RJKmod

            return Container('')

 

The documented setting of DEFAULT_EMAIL_HOST and

DEFAULT_URL_HOST needs to be made in mm_cfg.

 

HTH,

-Rich

 




More information about the Mailman-Users mailing list