Mezzanine, le CMS Django qu'il vous faut
Bien que Django constitue un outil de travail de fort bonne facture, je tombe de plus en plus souvent sur des projets avec des besoins de CMS. Or, je veux bien être pragmatique, mais ça me fait un peu mal quand je me retrouve à conseiller à un client l'installation d'un Wordpress ou d'un Drupal, même si c'est l'outil le plus approprié sur le moment.
J'ai fini par fouiner pour voir s'il n'existait pas de bons CMS en Python. Les principaux proposés par la communauté sont Django-cms, FeinCMS et Mezzanine. Résolu à tester les trois, j'entrepris de les installer rapidement pour jouer un peu avec. Las, la documentation des deux premiers semble lacunaires, car dés les premières commandes, je fut confronté à des erreurs non référencées, et après plus d'une demi-heure passée sur Stackoverflow, je laissais tomber pour ne pas perdre trop de temps.
Finalement, j'ai fini par installer Mezzanine, sur recommandation de @n1k0, et il a bien voulu fonctionner docilement sans mettre ma patience à l'épreuve (Mezzanine, pas @n1k0). C'est donc ce projet que j'ai testé plus en profondeur.
Installation et premières impressions
L'installation se fait en quelques commandes directement listées sur la page d'accueil du projet. Mezzanine initialise un projet Django et fournit, si besoin, quelques données de démo qui permettent d'obtenir un prototype de site éditorial immédiatement. L'installation embarque Bootstrap d'entrée de jeu, et dés les premières secondes, on a vraiment l'impression de travailler sur un site qui ressemble à quelque chose. Ô joie !
Les fichiers créés sont fort bien documentés, et la configuration minimum supplémentaire s'effectuera en quelques minutes. Bien ! maintenant que la bête est installée, commençons à jouer avec.
Fonctionnalités attendues d'un CMS
À mon avis, il existe deux types de softwares. Les softs pour développer, et les softs pour vendre. Les premiers sont simples, modulaires, vont à l'essentiel, et restent extensibles. Les seconds sont des usines à gaz monolithiques, pénibles à utiliser, difficiles à maintenir, coûteux à héberger, mais affichent sur le papier une liste impressionnante de fonctionalités idéale pour obtenir une bonne note au critère « pertinence technique » lors d'une réponse à un appel d'offre.
Et pour cause, même si en pratique certaines fonctionnalités réclamées seront sous-employées (voire jamais développées si l'on décide d'être agile), ce sont toujours les mêmes requêtes qui reviennent dans les demandes institutionnelles.
- Éditeur de texte riche
- Gestion d'une arborescence de contenus
- Worflows de publication
- Versions de contenus
- Programmation de publication
- Multilinguisme
- Galeries d'images avec diaporama
- Espace privé (presse, élus, etc.)
- Espace téléchargement de fichiers
- Module de news
- Possibilité de remonter des contenus en page d'accueil
- Newsletter
- Module e-boutique
- Module cartographique
- Moteur de recherche
- Formulaire de contacts
- Module calendrier
- Méta données et SEO
Ne pouvant y couper, ce sont ces fonctionnalités que j'ai considéré ici.
Éditeur de texte riche
Mezzanine permet d'intégrer directement TinyMCE configuré de manière correcte, et embarque un module d'upload / navigation de fichiers.
Gestion d'une arborescence de contenus
Une interface intuitive permet de trier, d'ordonner et réordonner les contenus créés via drag'n'drop en arborescence. Trés agréable et relativement simple à l'utilisation, j'aimerais tout de même voir ça en action sur des sites qui représentent des centaines de pages.
Worflows de publication
À part un mode « brouillon / publié », Mezzanine n'offre pas de worflows de publication (distinction entre le rédacteur et l'éditeur, différents niveaux de relecteurs, programmation de la publication d'une nouvelle version d'un article, etc.)
Versions de contenus
Même si j'ai vu passer plusieurs discussions sur le sujet, à ma connaissance, Mezzanine ne fournit pas de système de versionnage du contenu.
Programmation de publication
Mezzanine permet trés simplement d'indiquer des intervalles de dates en dehors desquelles une page donnée ne sera plus publiée.
Multilinguisme
Mezzanine ne gère pas le multilinguisme. Toutefois, la gestion d'un site multilingue reste toujours un tel casse-tête qu'il vaut mieux gérer deux arborescences indépendantes, ce qu'il est possible de faire en utilisant les fonctionnalités natives de Django.
Galeries d'images avec diaporama
Mezzanine dispose d'un module de gestion de galerie d'images, avec un beau rendu côté frontend. C'est le genre de fonctionnalité qui sert rarement mais qui fait bien.
Espace téléchargement de fichiers
La galerie d'image de Mezzanine ne gère que… les images, il est impossible d'y uploader d'autres types de fichiers. D'entrée de jeu, Mezzanine ne permet pas de créer des collections de fichiers arbitraires, mais je me suis amusé à en créer un, ce qui a été redoutablement facile. Plus là dessus un peu plus tard.
Espace privé (presse, élus, etc.)
Mezzanine permet de rendre inaccessible une page à un utilisateur anonyme, mais c'est tout. Le projet ne propose pas de gestion fine des droits d'accès. Cela dit, un projet Mezzanine reste avant tout un projet Django, et il est relativement simple de trouver des solutions au cas par cas.
Module de news
Mezzanine embarque un module de blog basique, mais de bonne facture. Suffisant pour les besoins élémentaires ou pour gérer une section « news ».
Possibilité de remonter des contenus en page d'accueil
Mezzanine offre deux possibilités : soit la page d'accueil correspond à une page créée via le CMS, soit à un template rendu directement. Tout layout plus complexe de la page d'accueil devra être réalisé manuellement, mais ça ne présentera pas grande difficulté.
Newsletter
Rhâââ ! Embarquer une newsletter dans un CMS, quelle idée douteuse ! Gérer une newsletter est une tâche complexe, qu'on ferait mieux de déléguer à des professionnels comme MailChimp ou Aweber. Cela dit, il ne sera pas difficile de trouver des apps de newsletter pour Django, même si je les déconseillerai toujours pour un usage professionnel.
Module e-boutique
Même remarque que précédemment. Monter un site de e-commerce est un projet à part entière, et l'embarquer dans son CMS est à mon avis une décision stratégique douteuse. Cela dit, Mezzanine propose un panier prêt à l'emploi, que je n'ai même pas pris la peine de tester.
Module cartographique
Par défaut, rien dans Mezzanine ne concerne les cartes.
Moteur de recherche
Mezzanine propose un moteur de recherche basique, mais la mise en œuvre d'un moteur digne de ce nom nécessitera sûrement son remplacement par quelque chose d'un peu plus costaud.
Formulaire de contacts
Mezzanine propose d'emblée un formulaire de contact, ainsi qu'un mini-framework permettant de définir des formulaires « à la souris ». Pas forcément trés utile, mais vendeur.
Module calendrier
Il existe une appli tierce qui permet de créer des événements datés et localisables sur une carte, mais à ma connaissance, pas de gestion d'un calendrier digne de ce nom.
Méta données et SEO
Pour chaque page, il est possible de surcharger les champs méta title, description, et même keywords, pour les plus motivés.
Autres features pour les développeurs
Au delà de ces sympathiques fonctionnalités, les développeurs apprécieront également d'autres petits bonus, tels que l'intégration à Disqus, Gravatar, Twitter, etc. L'import depuis des moteurs de blogs bien connus permettra de convaincre les réticents à la migration. Et le déploiement sera facilité par les scripts et templates de fichiers de configurations fournis.
Documentation
Point crucial s'il en est. Pas grand chose à redire de ce côté là. Elle m'a semblé cohérente, complète, détaillée et à jour. Un bon point.
Extensivité
Nous arrivons maintenant aux points amusants. Fournir des fonctionnalités de base, c'est bien beau, mais encore faut-il laisser le champ libres aux développeurs qui souhaitent adapter l'outil à leur besoin.
Après avoir joué avec pendant deux jours, Mezzanine m'a paru trés flexible. Le projet propose différents types de contenus, qu'on peut faire correspondre à des templates. Côté frontend, il est trés facile d'étendre ou de redéfinir des templates en fonction du type de contenu, de la section dans l'arborescence, ou même page à page.
Côté backend, créer un nouveau type de contenu ou adapter un type existant est trés simple et extensivement documenté. L'architecteur est bien pensée, et permet de profiter des fonctionnalités de base (meta données, urls, indexation, etc.) tout en bénéficiant du maximum de souplesse. Et le plus important, on atteindra cet objectif en restant propre, sans avoir besoin d'insérer de vilains hacks qui nous empêcheraient de dormir la nuit.
Un projet Mezzanine reste un projet Django, et intégrer ses propres applications ne nécessitera pas de prise de tête particulière. À titre d'exemple, quand j'ai eu besoin d'un type de contenus pour lister des collections de fichiers à télécharger, il ne m'a fallu qu'une heure ou deux pour l'implémenter moi même (c'est en fait le packaging qui a pris le plus de temps).
Qu'en penser ?
Même s'il reste assez jeune, Mezzanine est un trés beau projet, pratique à utiliser, complet mais qui sait rester flexible. Sans bénéficier de la belle interface d'un Wordpress ou de la couverture fonctionnelle théorique d'un eZ Publish, Mezzanine fournira 85% des besoins en matière de CMS, et offrira un cadre souple aux développeurs pour intégrer eux mêmes le spécifique qui leur manque. Un bon compromis entre puissance et complexité à mon avis.
Hop ! dans la trousse à outils.