Approche théorique

ATbookmark , disponible à cette adresse , est une produit zope/plone, qui permet, entre autres, de centraliser et gérer ses favoris (eq. bookmarks). Vous pouvez obtenir plus de renseignements à cette adresse : http://nan.objectis.net/products/atbookmarks/

Une des fonctionalité proposé dans la version 1.5 de ce produit, mais qui apparement est toujours en développement ( le 14 juin 2005), rend possible l'import de fichier xbel.xml, afin de peupler ( mettre à jour ? ) le(s) répertoire(s) de favoris, crée(s) sous zope.

En effet, dans la ZMI :

  • répertoire : portal_types -> type de contenu : ATBookmarks -> onglet : actions

on a la possibilité de rendre visible, la fonction upload ( par défaut dans la ver 1.5, non visible ). On peut donc, au travers de l'interface publique de plone, accéder au formulaire d'upload. Malheureusement , lorsque l'on valide notre envoi, au final, aucuns liens n'est ajouté, aucuns messages d'erreurs ou de notification ne sont affichés.

On a à sa disposition le produit ATBookmarks ou bien on le télécharge à cette adresse : http://nan.objectis.net/products/atbookmarks/releases/ATBookmarks-1.5.tgz

fonction "upload" en développement

On va donc présenter une des méthodes employées afin d'activer le support de l'import de fichier xbel au sein du produit ATBookmarks :

  • En supprimant, lors de tests, quelques structures de contrôle d'erreurs du fichier source ATBookmarks.py, définis dans la methode "convertFolder()", on s'apperçoit, via les messages d'erreurs retournés sous plone, que le problème d'importation vient principalement de l'encodage des caractères.

  • Le fichier "xbelplone.py" , qui contient la feuille de style pour le parse, dispose d'une methode "correctCharset" ( appartenant à la classe "ImportHandler" ).

    Cette méthode, a pour but d'encoder les caractères unicodes ( u'str' -> str ) , afin que python, qui emploie, par défaut ( ver 2.3 ) l'encodage "ascii", puisse les traîter.

  • Autre point qui rend inutilisable la fonctionalité d'import : la création de types de document, sous zope, nécessite la définition d'un "id". La méthode "convertFolder()" pour sa création d'id, se sert de l'id définit dans le fichier xbel.xml, et dont les caractères ne sont pas admis dans une url ( ex d'id xbel : id="rdf%3A#$gL7AQ3" ).

  • Dans le but déviter les doublons, je préfère employer comme id, le résultat du hashé d'un url. Le hashage renvoyant, très souvent des valeurs signées, on ajoute à ce hash un prefix ( 'lnk-' pour les liens et 'fld-' pour les répertoires de favoris ).

Mise en pratique

Les objectifs étant définis, voyons quelles modifications, on doit apporter au produit:

  1. on va éditer le fichier "ATBookmarks.py". On remplace donc le contenu de la méthode "convertFolder()", par ce code :

        def convertFolder(self, ploneFolder, xbelFolder):
    """ Add links and BookmarkFolders to current folder """
    xbelFolder.bookmarks.sort()
    #xbelFolder.bookmarks.reverse()
    description = ""
    for b in xbelFolder.bookmarks:
    id1 = b.url
    id = 'lnk-' + str(hash(id1.encode('ascii','replace')))
    title1 = b.name
    title = title1.encode('iso8859-1','replace')
    url=b.url
    description1 = b.desc
    description = description1.encode('iso8859-1','replace')
    print url
    try:
    ploneFolder.invokeFactory('Link', id=id, title=title, remote_url=url, description=description)
    except:
    print "Link not created"
    pass

    for f in xbelFolder.subfolders:
    idf = f.name
    id = 'fld-' + str(hash(idf.encode('ascii','replace')))
    titlef = f.name
    title = titlef.encode('iso8859-1','replace')
    descriptionf = f.desc
    desc = descriptionf.encode('iso8859-1','replace')
    try:
    ploneFolder.invokeFactory('BookmarkFolder', id=id, title=title, description=desc)
    except:
    print "Subfolder not created"
    pass
    try:
    folder = getattr(ploneFolder, id)
    print "id de folder pour conversion"
    print folder
    self.convertFolder(folder, f)
    except:
    print "no conversions"
    pass

    Il ne faut pas oublier de remplacer 'iso8859-1' par votre encodage par défaut.

  2. On en profite pour modifier l'état par défaut de l'onglet "upload". On supprime l'attribut "visible" et la virgule qui précède cet attribut. On doit obtenir ceci :

        actions = ({
    'id': 'view',
    'name': 'View',
    'action': 'string:${object_url}/bookmark_view',
    'permissions': (CMFCorePermissions.View,)
    },
    {'id' : 'upload',
    'name' : 'Upload',
    'action' : 'string:${object_url}/upload_xbel_form',
    'permissions' : (CMFCorePermissions.ModifyPortalContent, )
    },
    {'id': 'references',
    'name': 'References',
    'action': 'string:${object_url}/reference_edit',
    'permissions': (CMFCorePermissions.ModifyPortalContent,),
    'visible':0},
    {'id': 'metadata',
    'name': 'Properties',
    'action': 'string:${object_url}/base_metadata',
    'permissions': (CMFCorePermissions.ModifyPortalContent,),
    'visible':0})

On peut sauvegarder le fichier "ATBookmarks.py", nos modifications du produit ATBookmarks sont terminées.

Maintenant, il va s'agir de configurer l'environnement de python afin qu'il emploie par défaut une table d'encodage des caractères définit par nos soins ( de préférence la même que celle employée par notre environnement d'exploitation et plone ).

Il faut avant tout déterminer la version de python employée ( 2.3., 2.2,..) et trouver le répertoire "site-packages":

$ sudo find / -name site-packages

/usr/lib/python2.3/site-packages
/usr/lib/python2.2/site-packages
/usr/local/lib/python2.3/site-packages
/usr/local/lib/python2.2/site-packages

Au sein de chacun de ces repertoires, on va créer le fichier "sitecustomize.py" :

$ sudo vi /usr/lib/python2.3/site-packages/sitecustomize.py

qui contiendra le code suivant :

import sys
sys.setdefaultencoding('iso-8859-1')

Il ne nous reste plus qu'à créer des liens symboliques :

$ sudo ln -s /usr/lib/python2.3/site-packages/sitecustomize.py /usr/local/lib/python2.3/site-packages/sitecustomize.py ;
sudo ln -s /usr/lib/python2.3/site-packages/sitecustomize.py /usr/local/lib/python2.2/site-packages/sitecustomize.py ;
sudo ln -s /usr/lib/python2.3/site-packages/sitecustomize.py /usr/lib/python2.2/site-packages/sitecustomize.py

Il ne nous reste plus qu'à relancer zope, afin de prendre en compte les modifications.

Une fois l'initialisation de zope effectuée, si ce n'est pas déjà fait, on installe le produit ATBookmarks et on crée un type de contenu "bookmark folder".

L'onglet "upload" est désormais affiché.

On clique dessus pour arriver à un formulaire :

Il ne nous reste plus qu'à uploader le fichier xbel.xml et vérifier la création des liens.

Si vous tentez de réimporter le même fichier xbel.xml, aucuns liens ne devrait être ajouté ; l'id étant unique, il ne peut y avoir 2 url de même valeurs, ceci afin d'éviter les doublons.

J'ai importé plusieurs fichiers dont certain font plus de 1 Mo et ça fonctionne (à merveille ? ;).