Fantomas’side

Weblog open-source

Le temps des releases : django-blog-zinnia

Incroyable, après presque 2 ans d'attente, Zinnia l'application Django propulsant ce blog est enfin publiée sur un dépôt public. 

Le premier article faisant référence à Zinnia date en effet du 16 Novembre 2008.

Beaucoup d'évolutions ont été apportées entre cette première version réalisée à titre personnel et celle qui gère le site actuellement. Ceci explique en partie mon manque d'activité sur le site.

Au final, j'en ai profité pour mettre à jour le code du site en utilisant la version de développement et refondre le skin du site, un peu trop sombre et vieillissant à mon goût.

Maintenant, concentrons nous sur notre sujet. Tout d'abord le code source de Zinnia est disponible sur GitHub, ce qui facilite le travail communautaire, donc si vous voulez participer, forker ou télécharger, aucun problème, vous y êtes même encouragé.

Lors de la publication du code source, je me suis efforcé de documenter un maximum les fonctionnalités ainsi que l'installation, donc pour présenter le projet je vais me baser sur ces documents.

Tout d'abord, qu'est-ce-que Zinnia ou django-blog-zinnia exactement ?

Zinnia est une application générique pour gérer un blog à travers un site en Django. Elle a été conçue pour publier des articles et le faire efficacement ! De manière générale toutes les fonctionnalités qui peuvent être fournies par une autre application réutilisable écrite en Django ont été mises de coté. Pourquoi réécrire ce qui a déjà été testé et approuvé par les autres ?

Mais plutôt qu ...

Continue reading

Le temps des releases : easy_extract

Imaginons que j'ai sur un serveur de donnée une grosse quantité d'archives sous différents formats, tel que RAR, ZIP, XTM...

Si je souhaite extraire toutes ces archives, je devrais aller trouver chaque archives dans son répertoire, taper la bonne commande pour pouvoir les extraire, les réparer au besoin et ainsi de suite... Plutôt fastidieux non ? :(

Sur ce constat m'est venu l'idée de easy_extract, un script écrit en Python qui va analyser récursivement les répertoires à la recherche d'archives ou de collections d'archives pour les extraire et les réparer automatiquement si elles sont corrompues.

Pour cela, il suffit de lancer le script de la manière suivante par exemple :

$ easy_extract -r mes_archives/

Pratique et le gain de temps est évident, car une fois le script lancé, vous n'avez plus à vérifier que l'extraction s'est bien déroulée pour ensuite passer à la suivante, donc a scotcher devant votre terminal. Victoire une tâche fastidieuse de plus automatisée. :D

Pour l'installation, il est nécessaire d'installer les paquets suivant avant :

  • par2
  • unrar-free
  • 7zip-full

Ensuite l'installation du script se fait grâce à easy_install :

$ easy_install easy_extract

Bien sûr le code est open-source, donc si vous voulez contribuer, forker ou juste critiquer, le code se trouve à l'adresse suivante : http://github.com/Fantomas42/easy-extract

Bonne décompression et bon leech.

Le temps des releases : Vélib'erator

Suite à mon abonnement à Vélib', habitant près d'une station récemment construite, j'ai vite remarqué que de trouver un vélo en bon état ou une place de parking à proximité avant les 30 minutes fatidiques et payantes pouvait vite devenir un calvaire.

Sur ce, après quelques recherches,  j'ai pu constater que les informations sur l'état des stations du réseau Vélib' étaient librement accessibles. D'où l'idée de créer un paquet python nommé Veliberator, me permettant depuis mon shell de consulter l'état de mes stations favorites.

Pour les fans de la ligne de commande, essayez ceci :

$ sudo easy_install veliberator
$ sudo synchronize.py
$ find_place.py 42008

Partant de là, je me dis qu'il serait dommage de m'arrêter à ce stade du développement, d'autant plus que mon problème pour trouver une place libre rapidement ne se résous que depuis mon ordinateur, il faudrait donc que ce service soit accessible partout et pour tout le monde.

Un site web semble être la solution idéale, d'autant plus si on est capable d'optimiser l'affichage des pages au type de support, par exemple un mobile.

Equipé de mon module python et de Django, j'ai donc réalisé le site http://veliberator.com.

Au programme du site :

Continue reading

Le temps des releases : Django-sekh

Vous avez certainement déjà vu dans Google quand vous consultez une page depuis son cache, les termes de la recherche sont coloriés dans le contenu de la page pour permettre de les discerner rapidement.

De ce principe certains sites ont adapté la même technique en coloriant certains mots de la page correspondant à la recherche de l'utilisateur si il provient d'un moteur de recherche. 

C'est ce que django-Search Engine Keywords Highlighter fait !

Une fois installé avec BeautifulSoup, il suffit juste d'ajouter ce middleware à la fin de la liste dans votre fichier settings.

MIDDLEWARE_CLASSES = (
  ...
  'sekh.middleware.KeywordsHighlightingMiddleware',
)

Moi quand c'est facile à installer, j'aime ! :D

Ce middleware va rajouter une balise span autour des mots de la recherche, le tout avec des classes qui vont bien permettant la décoration en CSS.

L'inconvénient est que si votre HTML est mal formatté, le middleware risque de faire planter la page.

Pour voir un exemple cliquez ici.

Pour plus d'informations et pour télécharger le code :

http://github.com/Fantomas42/django-sekh/tree/master

Le temps des releases : Django-smileys

Parfois il est temps de se sortir les doigts du code, et d'en parler !
Mais pour en parler, il faut documenter, ce qui prend un peu de temps, mais j'y travaille.

Pour commencer je vais vous présenter une de mes applications favorites, par sa simplicité et son utilité incroyable. :D

Django-smileys est une application Django comme son nom l'indique, permettant d'inclure facilement dans ses templates des smileys, de ce genre :):p.

Pour cela, une fois l'application téléchargée et installée dans votre projet django, il vous suffit dans vos templates d'utiliser le filtre qui va convertir tout les code smileys définis dans SMILEYS_LIST.

{% load smiley_tags %}

{{ object.content|smileys }}

Plutôt facile non ? Surtout que l'on peut maintenant convertir tout type de contenu texte.

La liste des smileys est configurable, ainsi que l'url de dépot et la classe d'habillage CSS.

Pour télécharger ce projet hallucinant : http://github.com/Fantomas42/django-smileys/tree/master

Bientôt d'autres releases.

Paye ta Fabric !

Le déploiement d'applications, c'est pas toujours facile et rébarbatif surtout quand on travaille sur un parc de machines.

Imaginons que j'utilise un serveur de version, du genre Subversion ou Mercurial et que j'utilise un ou deux serveurs (test, production 1, production 2, ...) pour héberger mon ou mes applications.

Le déroulement est le suivant :

  • Développement en local.
  • Propagation des modifications.
  • Connection SSH sur les serveurs.
  • Rapatriement les dernières modifications
  • On redémarre le soft.

Vous me direz que cela n'est pas forcément très long, mais quand vous devez le faire souvent et plusieurs fois par jour, on en a vite pleins le dos et cela est source d'erreur.

Heureusement l'informatique étant un sport où celui qui est le plus fainéant gagne, il existe un solution pour se simplifier ces tâches de déploiements à distance.

Son nom ? Fabric

En quelques lignes de Python, définissant des règles, un peu à la manière d'un Makefile, il est possible d'automatiser ce genre d'opération.

Voici un exemple basique pour le déployement d'un projet Django avec Mercurial :

"""Fabric Rules for MyProject"""

config.production = ['server.domain.com']
config.app_dir = '/home/dev/djangos/myproject'

def publish():
    """Publish the content by pushing it"""
    local('hg push')

def apache_reload():
    """Reload the apache process"""
    sudo('/etc/init.d/apache2 reload')

@roles('production')
def update():
    """Update the code source"""
    run('cd $(app_dir); hg pull; hg update')
    run('cd $(app_dir); python manage.py syncdb')
    run('cd ...

Continue reading

Stop aux spams sur django.contrib.comments

Depuis quelques jours, les formulaires de commentaires fournis par l'application django.contrib.comments dans la distribution de Django, sont devenus vulnérables aux spams.

L'application comments contient par défauts plusieurs sécurités pour éviter le spamming, comme un honeypot et la vérification du temps de saisie du commentaires.

Malgré cela les équipes de spammer sont très réactives, et coder un bot spécifique pour les sites django utilisant ce système de commentaires, rend tous ces sites vulnérables.

En parallèle de cela, dans la version 1.1b de Django, l'application comments acquiert une nouvelle fonctionnalité, qu'est la modération automatique. L'envois de mails en cas de commentaires, et aussi prise en charge.

J'en ai donc profité pour développer une protection contre le spam plus efficace basée sur Akismet à partir de cette nouvelle fonctionnalité.

"""Moderator of Entry comments
   Based on Akismet for checking spams
   Need to override the default Moderator,
   for getting request in parameters."""
from django.conf import settings
from django.utils.encoding import smart_str
from django.contrib.sites.models import Site
from django.db.models import signals
from django.contrib import comments
from django.contrib.comments.signals import comment_will_be_posted
from django.contrib.comments.moderation import Moderator
from django.contrib.comments.moderation import CommentModerator

from django.conf.settings import MAIL_COMMENT
from django.conf.settings import AKISMET_COMMENT

AKISMET_API_KEY = getattr(settings, 'AKISMET_API_KEY', '')

class EntryCommentModerator(CommentModerator):
    """Moderate the comment of Entry"""
    email_notification = MAIL_COMMENT
    enable_field = 'comment_enabled'

    def email(self, comment, content_object):
        if comment.is_public ...

Continue reading

Un CMS en Django ? la suite

Ces derniers temps occupé par certains projets personnels, j'ai pu tester de nouveaux outils de développement. L'idée est d'en faire un retour et je vais commencer par la suite de mon dernier article.

La dernière fois je vois ai parlé d'une des premières applications disponible en Django permettant d'intégrer un CMS dans son site, nommé Django-cms. Mais mon retour sur cette application m'avait laissé un petit goût de frustration, me laissant penser que ce n'étais pas encore au point. Mais cela va mieux avec Django-page-cms. :)

Ce dernier en plus des fonctionnalités essentielles, comme la gestion de l'arborescence dans le module d'administration et la prise en charge de différents langages, possède certains atouts qui en font mon favoris.

Voici les petits plus qui m'ont séduit :

  • Définition de plusieures zones de contenus dans un template. (trop fort !)
  • Surcharge des urls existante dans le CMS. (enfin !)
  • Possibilité d'édition du contenu directement depuis le Front. (la classe !)
  • Les contenus du CMS peuvent être interprétés en temps que code. (super !)
  • Pas de besoin de définir une "RootPage" comme dans Django-cms.
  • Gestion des révisions.
  • Code propre.

De plus j'ai pu tester la rapidité de l'équipe du projet qui a intégré en moins de 12h ma contribution pour fixer un bug mineur.

Un projet qui mérite donc d'être suivis.

Le site de web de Django-pages-cms.

Edit du 7 avril 2009 : une traduction en français est désormais disponible, ou ici.

Un CMS en Django ?

Depuis la sortie 1.0 de Django, nombre d'applications plus ou moins complètes ont vu le jour. Mais il manquait encore une application de type CMS qui soit vraiment complète et professionnelle.

Les fonctionnalités principales d'un CMS seraient de pouvoir créer facilement une arborescence, l'intégration des principaux DublinCore et surtout d'avoir un support pour l'internationalisation notamment au niveau des urls.

Après plusieurs recherches et tests des différentes applications destinées à ce but, un projet sort du lot. Son nom, Django-CMS, dont la page du projet se situe ici.

Django-CMS avec son interface en Javascript pour organiser les pages en Drag and drop et l'implémentation de toutes les fonctionnalités précèdemment citées font de lui un sérieux concurrent dans le monde des CMS en Django. Je décide donc de le tester et d'en faire ces quelques retours.

Points Positifs

Gestion la localisation des URL/IRI, en effet il est possible d'attribuer une IRI sur une page. Très pratique pour pouvoir gérer du contenu dans plusieurs langues.

Intégration avec TInyMCE basé sur le projet Django-TinyMCE ce qui vous permettra d'ajouter facilement un WYSIWYG à l'édition de vos pages.

Intégration avec Django-FileBrowser. FileBrowser est une application Django qui permet d'envoyer et d'administrer des fichiers depuis l'interface d'administration. Une application très pratique, surtout qu'elle fournit un binding pour l'envoi de fichier avec TinyMCE.

L'administration du CMS est classe et parfaitement bien intégrée dans le module d'administration de ...

Continue reading

Changer son thème d'administration Django

Je sais pas pour vous, mais l'administration de Django, je peux plus la voir. :) 

Même si elle reste très jolie est bien pensée, ses teintes bleues me sortent par les yeux, et je voulais en changer.

Je me suis penché sur la question en me disant qu'il était largement possible d'effectuer un changement, au minimum des teintes. Mais n'étant pas graphiste et estimant la charge de travail à fournir, j'ai abandonné cette idée.

Mais je suis récemment tombé sur un projet intéressant appelé django-grappelli. Le but étant de fournir une alternative aux templates et au style appliqué dans le module d'administration de Django, exactement ce que je recherchais.

De plus le graphisme m'a tout de suite semblé très clair et soigné, je me suis laissé donc conquérir par ce thème. Quelques screenshots ici. Le petit plus de ce projet, c'est le fait de pouvoir facilement insérer ses propres liens en raccourcis dans l'administration. Un must.

Par contre il existe un gros bémol avec ce thème, son installation.
D'après les explications de la documentation, les templates et les médias doivent se substituer à ceux originalement fournis dans la distribution de Django.

Donc en plus de vous conseiller d'installer ce module, je vais vous détailler comment l'installer de manière moins intrusive et donc plus propre. :)

Le projet étant composé de 2 dossiers, templates et media, il faut s'arranger pour que Django utilise ces 2 dossiers pour effectuer le ...

Continue reading