P
'
t
i
t
e
C
h
a
t
t
e
 
spacer~ ALCOHOL & CALCULUS DON'T MIX. NEVER DRINK & DERIVE Articles | Connexion
 
~Création de thumbnails

Précédent  
  Zope  
  Suivant
 Présentation

Outre sa grande accessibilité, le serveur d'applications Zope offre l'opportunité d'ajouter simplement de nombreuses extensions. Le mois dernier avait marqué la réalisation d'une petite extension Python. Nous allons étudier ces mois-ci les extensions serveur.
 Sommaire


 Introduction

Une extension serveur revêt deux formes. La première consiste en l'ajout de librairies Python. Ces dernières se verront alors accessibles depuis les scripts Python invoqués au sein des différents objets DTML de l'application. La seconde forme d'extension correspond à la modification pure et simple des objets internes du serveur. De telles extensions se voient souvent désignée sous le nom de "Hotfix".


 Installation d'extensions

Quelle que soit la forme prise par l'extension, la procédure d'installation reste semblable. Vous trouverez dans le répertoire de Zope un sous-répertoire intitulé lib/python/Products. Ce répertoire se destine à accueillir l'ensemble des extensions que vous souhaiteriez ajouter au serveur. L'ajout d'une extension se révèle rapide. La première étape consiste à créer un nouveau sous-répertoire dont le nom importe peu. Vous devrez ensuite placer dans ce répertoire le contenu de l'extension. Enfin, il vous incombera de redémarrer le serveur. Néanmoins, les extensions agissant comme de simples librairies doivent s'installer dans le répertoire lib/python et non lib/python/Products.

Toutes les extensions ont un point commun : un fichier nommé __init__.py. Ce module Python contient le code d'initialisation de l'extension. Dans le cas d'une extension faisant office de simple librairie, le module __init__.py ne contiendra normalement pas de code d'itinialisation. A l'inverse, les Hotfix usent et abusent de ce module. Afin de mieux comprendre le fonctionnement d'un module __init__, nous allons en réaliser un par nous-mêmes.

Observons le code source proposé dans le listing numéro un. Le module OFS de Zope accueille les objets accessibles depuis l'interface d'administrations : méthodes DTML, images. L'extension proposée ici a pour but d'ajouter un onglet d'administration à l'interface des objets "DTML Method". Cet onglet affichera la taille en octets occupée par la méthode DTML. L'apport de nouvelles fonctionnalités aux objets Zope existant repose sur l'assignement de fonctions. Ansi la ligne suivante ajoute une méthode à la class Python nommé DTMLMethod :

DTMLMethod.manage_showSize = manage_showSize
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
from OFS.DTMLMethod import DTMLMethod

def manage_showSize(self):
  """Affiche la taille"""
  return "<p>La méthode occupe %d octets</p>" % self.get_size()

DTMLMethod.manage_showSize = manage_showSize
DTMLMethod.manage_options = DTMLMethod.manage_options + \
 ({"label": "Taille", "action": "manage_showSize"},)
       
      
JextCopier dans Jext
La liste des onglets d'un objet Zope se conserve en tant qu'une liste de dictionnaires. La clé "label" désigne le titre de l'onglet et la clé "action" désigne la méthode à appeler lors de l'affichage de l'onglet. Le contenu de la méthode manage_showSize() se révèle trivial et ne devrait pas vous préoccuper bien longtemps.

Notre nouvelle extension se trouvant dorénavant enregistrée dans un fichier __init__.py, nous pouvons procéder à son installation. Le listing suivant montre l'installation de notre extension.

$pwd
/usr/local/Zope
$cd lib/python/Products
$mkdir DTMLMethodSize
$cd DTMLMethodSize
$cp ~/articles/200201/Zope/__init__.py
       
      
JextCopier dans Jext
Nous pouvons dorénavant relancer Zope puis cliquer sur une méthode DTML pour découvrir le fonctionnement de notre extension.


 Images en vignettes

Lors d'une étape précédente de notre découverte de Zope, nous avions réalisé un album photo. Le problème principal de cet album résidait dans l'affichage des images en taille réelle. Si cela ne pose que peu de problèmes au début, cet état de fait devient handicapant dès que l'album croît. Nous allons donc, par l'intermédiaire des extensions serveur, afficher des vignettes en lieu et place des images. Une vignette désigne un modèle réduit de l'image originale. En cliquant sur une vignette nous pourrons visionner l'image en taille réelle. Zope dévoile à nouveau son formidable potentiel. En effet, ces vignettes seront générées dynamiquement, l'auteur du site n'aura pas à se soucier de leur création et de leur gestion. Ainsi, l'ajout d'une image donnera accès automatiquement à sa vignette.

Pour nous manipuler des images, nous devons faire appel à une librairie supplémentaire. La librairie retenue dans notre situation s'intitule PIL (Python Imaging Library). Relativement légère, rapide et suffisament pourvue en fonctionnalités, cette librairie trouvera sa place dans Zope en tant qu'extension (de première forme). Une fois décompressée, vous obtiendrez un répertoire PIL/, un fichier PIL.pth et deux librairies .so. Déplacez le répertoire PIL/ directement au sein du répertoire lib/python. Placez ensuite les librairies .so dans ce nouveau répertoire.

Le listing numéro deux présente un morceau de code Python réalisant une vignette d'une image. La vignette créée possède une résolution de 120 pixels par 90 et se voit enregistrée au format JPEG.

img = Image.open("image.gif")
img.thumbnail((120, 90))
fp = open("image_t.jpg", "wb")
img.save(fp, "JPEG")
fp.close()
       
      
JextCopier dans Jext | Jext | Plugin Codegeek

 L'extension ImageTag_Hotfix

L'extension ImageTag_Hotfix présente sur le CD-Rom emploi la librairie PIL pour créer des vignettes si nécessaire. Cette extension modifie la méthode tag() de l'objet Image. Les objets Zope possédant une méthode tag() se voient aptes à l'affichage HTML. Lorsque les paramètres nommés width et height de la méthode tag() sont précisés, l'extension produit le calcul d'une vignette. Notre album photos employait jusqu'à présent la ligne DTML suivante pour afficher ses éléments :

<img border="0" src="<dtml-var absolute_url>" />
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
Nous remplaçons à présent cette ligne par la suivante :

<dtml-var expr="tag(width=120,height=90)">
       
      
JextCopier dans Jext
Le changement introduit ordonne l'affichage d'une vignette de 120 pixels par 90 au lieu de l'image complète. Après installation du Hotfix et redémarrage de Zope, l'utilisateur peut constater l'intérêt de l'opération. L'implantation d'une Hotfix sur le serveur Zope concède une simplicité d'utilisation accrue en comparaison d'une méthode externe.

Le code source du fichier __init__.py du Hotfix ne contient que peu de code intéressant. L'essentiel de son contenu correspond à une modification légère de la méthode tag() du fichier Image.py. Ce dernier prend place dans le répertoire lib/python/OFS. La comparaison entre les deux codes révélera de nombreuses similitudes. Toutefois, le module étudié charge et enregistre les images non pas depuis des fichiers, mais depuis des chaînes de caractères. L'opération se réalise par le biais de la classe StringIO. Ainsi pour charge une image sans lire son fichier le module exécute l'instruction :

image = PIL.Image.open(StringIO(str(self.data)))
       
      
JextCopier dans Jext
Dans cette instruction self.data désigne l'attribut data de la classe Image. De la même manière, le module enregistre la vignette sans passer par un fichier :

thumbnail_file=StringIO()
image.save(thumbnail_file, "JPEG")
       
      
JextCopier dans Jext
Pour terminer, le module d'initialisation remplace la méthode tag() de la classe Image par la sienne :

OFS.Image.Image.tag = tag
OFS.Image.Image.thumb = thumb
       
      
JextCopier dans Jext
Nous constatons que le module ajoute également la méthode thumb() à la classe Image du module Image appartenant au module OFS.



par Romain Guy
romain.guy@jext.org
http://www.jext.org
Dernière mise à jour : 14/10/2006


Précédent  
  Zope  
  Suivant

 
#ProgX©2005 Mathieu GINOD - Romain GUY - Erik LOUISE