Templates en Mailman
Habiéndoseme ocurrido la idea de modificar los templates para la página de información de las listas de correos del LUGMen me di a la tarea de investigar un poquito como funciona esa sección de Mailman que, para quienes no lo conocen, es “el” software para gestión de listas de correo hecho en python.
Los templates, según idioma, pueden estar ubicados (en debian, por lo menos) en 4 lugares distintos. El orden de búsqueda (la cual se cancela a la primer ocurrencia) es el siguiente:
1) por lista : "/var/lib/mailman/lists/<listname>/<language>"
2) por dominio : "/etc/mailman/<list.host_name>/<language>"
3) global : "/etc/mailman/site/<language>"
4) segun idioma : "/etc/mailman/<language>"
Con esto, tenemos distintos lugares en donde almacenar los templates y distintos niveles de aplicación, lo que nos permite cierta flexibilidad a la hora de modificar el look & feel de las páginas de mailman.
Para generar dinámicamente las páginas, se utilizan tags especiales de la forma <mm-whatever> para que sean reemplazados por html. Estos tags son:
<mm-mailman-footer>
Este tag sirve para colocar el footer predeterminado de mailman. Su contenido consiste en links al administrador de la lista especificada en el URL, interfaz administrativa (requiere autorización) y panorámica de todas las listas disponibles en un servidor dado; seguido del famoso “delivered by mailman v2.x.x”, “powered by python” y el logo de GNU dentro de una tabla (muy fea por cierto)
<mm-list-name>
Nombre de la lista especificada en el URL.
<mm-list-info>
Información de la lista. Esta disponible para su edición en la interfaz de administación de cada lista de correos.
<mm-form-end>
Devuelve </FORM>
<mm-archive></mm-archive>
Este es un tag con cierre que es similar a un tag <a> que devuelve el link a los archivos de la lista espeficada en el URL
<mm-list-subscription-msg>
Mensaje de suscripción a la lista. Esta disponible para su edición en la interfaz de administación de cada lista de correos.
<mm-restricted-list-message>
<mm-num-reg-users>
Numero de miembros sin Digest activado.
<mm-num-digesters>
Numero de miembros con Digest activado (Digest sucks!)
<mm-num-members>
Numero total de miembros de la lista especificada en el URL.
<mm-posting-addr>
Es la dirección de e-mail de la lista a la cual se deben enviar los mensajes.
<mm-owner>
Dirección de e-mail del propietario de la lista en formato plano (no obscuro).
<mm-host>
Nombre del host donde esta instalado mailman. Quizás sea una redundancia, ya que el dominio esta en el URL.
<mm-list-langs>
Devuelve un <select> (dropdown) que incluye los idiomas disponibles.
Después de armar el layout, el css y colocar las cosas en su lugar, me encontré con que algunas cosas estaban hardcodeadas como, por ejemplo, el footer de las páginas.
En el mismo código fuente se hace mención a modificar la función MailmanFooter() en /var/lib/mailman/Mailman/htmlformat.py que es la encargada de generar el html correspondiente al logo (mailman, python y gnu) donde algunas variables estan hardcodeadas y otras, como el directorio donde se encuentran las imágenes para cada “logo” y algunas cosas mas, se obtienen del archivo de configuración principal /etc/mailman/mm_cfg.py.
En otro archivo, /var/lib/mailman/Mailman/HTMLFormatter.py, se encuentran la función encargada de parsear los tags especiales en los templates y de devolver el html correspondiente. Es aquí en donde se encuentran tambien las definiciones de los tags y las funciones que devuelven un html o texto especifico, como esta detallado anteriormente.
No conforme con la no posibilidad de poder obtener variables como la versión de mailman, owner de la lista en formato obscuro, link a interfaz administrativa y demás (cosas que van en el footer) y haciendo honor a la libertad 1, me dediqué a generar nuevos tags y crear unas funciones a tal efecto, aumentando la flexibilidad a la hora de modificar la apariencia de las páginas.
He aquí los tags con sus respectivas funciones (al menos por ahora):
#<mm-mailman-version>
#Devuelve solamente el numero de versión de mailman
def GetMailmanVersion(self):
return mm_cfg.VERSION
#<mm-owner-obscured>
#Devuelve el mail del owner en formato obscuro para evitar que los web spiders se hagan con él
def GetOwnerEmailLinkObscured(self):
ownertext = COMMASPACE.join([Utils.ObscureEmail(a, 1) for a in self.owner])
return (Link('mailto:' + self.GetOwnerEmail(), ownertext)).Format()
#<mm-admin-interface></mm-admin-interface>
#Devuelve un link a la interfaz administrativa de la lista especificada en el URL. Similar a un tag <a>
def FormatAdminInterfaceAnchor(self):
return '<a href="%s">' % self.GetScriptURL('admin')
#<mm-lists-overview></mm-lists-overview>
#Devuelve un link a la pagina que muestra las listas de correo disponibles. Similar a un tag <a>
def FormatListsOverviewAnchor(self):
return '<a href="%s">' % Utils.ScriptURL('listinfo')
Como ven, las modificaciones son sencillísimas. De esta forma, las paginas originales siguen mostrándose igual (para aquellos que usan los templates originales) y se agrega funcionalidad para aquellos que (como yo) les gusta personalizar todo para adaptarlo a sus necesidades.
Como me sugirió un miembro del LUGMen, voy a suscribirme a la lista de desarrollo de mailman y postear mi idea esperando que sea bien recibida y que incluyan la modificación en la versión oficial, a menos que alguien se me adelante, que para el caso es lo mismo: mas capacidad de templating para mailman ;)



