<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le Mad Blog &#187; La Django-app du mois</title>
	<atom:link href="http://j-mad.com/blog/category/developpement/python/django/la-django-app-du-mois/feed/" rel="self" type="application/rss+xml" />
	<link>http://j-mad.com/blog</link>
	<description>juste un blog</description>
	<lastBuildDate>Sun, 11 Jul 2010 20:34:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Django-improved-inlines, enrichissez facilement vos contenus et ça, sans payer l&#8217;ISF</title>
		<link>http://j-mad.com/blog/2010/06/20/django-improved-inlines-enrichissez-facilement-vos-contenus-et-ca-sans-payer-lisf/</link>
		<comments>http://j-mad.com/blog/2010/06/20/django-improved-inlines-enrichissez-facilement-vos-contenus-et-ca-sans-payer-lisf/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 14:15:26 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=675</guid>
		<description><![CDATA[
			
				
			
		
La pluie ayant décidé d&#8217;être l&#8217;invité surprise du week-end, j&#8217;ai donc une bonne excuse pour ne pas aller prendre des coups de soleil à la plage mais rester bien tranquillement sur mon clavier. Autant donc en profiter pour vous parler de l&#8217;application django du mois, j&#8217;ai nommé django-improved-inlines. Oui, je sais, elle a un nom [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F06%2F20%2Fdjango-improved-inlines-enrichissez-facilement-vos-contenus-et-ca-sans-payer-lisf%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F06%2F20%2Fdjango-improved-inlines-enrichissez-facilement-vos-contenus-et-ca-sans-payer-lisf%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>La pluie ayant décidé d&#8217;être l&#8217;invité surprise du week-end, j&#8217;ai donc une bonne excuse pour ne pas aller prendre des coups de soleil à la plage mais rester bien tranquillement sur mon clavier. Autant donc en profiter pour vous parler de l&#8217;application django du mois, j&#8217;ai nommé django-improved-inlines. Oui, je sais, elle a un nom à rallonge. Django-improved-inlines est en fait une version légèrement dopé de django-inlines (d&#8217;où le improved) qui fait elle même parti du package <a href="http://github.com/nathanborror/django-basic-apps">django-basic-apps</a>. Oui je sais, ça commence à faire un arbre généalogique digne d&#8217;une série américaine (ou du trône de fer).</p>
<h1>1- Où on le trouve, comment on l’installe, tout ça quoi (et la doc) ?</h1>
<p>Vous le trouverez sur sa page <a href="http://github.com/issackelly/django-improved-inlines">github</a>. C&#8217;est d&#8217;ailleurs là que vous pourrez apprendre que cette sympathique petite app est une version modifiée de l&#8217;app inlines de django-basic-apps.</p>
<p>Pour l&#8217;installation deux méthodes :<br />
directement en clonant le repository git de github<br />
avec un petit easy_install bien de chez nous.</p>
<p>Attention, l&#8217;application pour fonctionner à besoin de <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a> mais l&#8217;installation par easy_install ne vous l&#8217;installera pas automatiquement. Un petit easy_install beautifulsoup sera donc de rigueur. Et oui.</p>
<p>Quand à la doc, elle tient dans un mouchoir de poche, à savoir le fichier readme mais au vu de la simplicité de l&#8217;app, ce n&#8217;est pas vraiment dérangeant.</p>
<h1>2- Mais au fait, à quoi ça sert ?</h1>
<p>En fait c&#8217;est tout simple. Cela vous permet, lorsque vous rédigez des contenus, d&#8217;insérer à l&#8217;intérieur d&#8217;autre contenu gérer par votre django. Et en les mettant en forme avec des templates spécifiques.</p>
<p>Imaginons par exemple que vous voulez insérez des images d&#8217;une manière simple dans un billet de blog, ou des blocks de texte ou ce que vous voulez en fait. Et cela, sans modifier le template de votre contenu principal. Et oui. Mais non, ce n&#8217;est pas de la magie.</p>
<h1>3- Comment ça marche ?</h1>
<p>En fait, cela marche en deux temps. Tout d&#8217;abord dans le template d&#8217;affichage de votre contenu principal, il faut déclarer et utiliser le template de django-improved-inlines, comme ceci :</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: black;">&#123;</span><span style="color: #66cc66;">%</span> load inlines <span style="color: #66cc66;">%</span><span style="color: black;">&#125;</span><br />
…....<br />
<span style="color: black;">&#123;</span><span style="color: black;">&#123;</span> post.<span style="color: black;">body</span>|render_inlines <span style="color: black;">&#125;</span><span style="color: black;">&#125;</span></div></div>
<p>Ensuite, tout va se jouer dans votre contenu, ici le body de votre post. Vous allez parsemer celui si de bouts d&#8217;xml qui seront process par BeautifulSoup et Improved-Inlines et qui seront transformés en html (grâce à un template).</p>
<p>L&#8217;exemple le plus simple est :</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;inline</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;media.photo&quot;</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>qui affichera l&#8217;objet de pk 1 qui est modélisé par la classe photo contenu dans l&#8217;app media.</p>
<p>Mais vous pourrez également utiliser les attributs xml suivant :<br />
ids pour afficher plusieurs id, séparées par des virgules.<br />
filter pour passer un filtre django<br />
template pour choisir le template django qui sera utilisé (par défault l&#8217;app utilise inlines/app_model.html)<br />
class qui permet de passer une class au template</p>
<p>ce qui donnerait :</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;inline</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;calendar.event&quot;</span> <span style="color: #000066;">filter</span>=<span style="color: #ff0000;">&quot;date__gte=datetime.date.today()&quot;</span> <span style="color: #000066;">template</span>=<span style="color: #ff0000;">&quot;calendar/event_inline.html&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></div></div>
<p>ou encore :</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;inline</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;app.model&quot;</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;&lt;some pk&gt;</span></span>&quot;/&gt; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;inline</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;app.model&quot;</span> <span style="color: #000066;">ids</span>=<span style="color: #ff0000;">&quot;&lt;some pk&gt;</span></span>,<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;some</span> other pk<span style="color: #000000; font-weight: bold;">&gt;</span></span>&quot; /&gt;</div></div>
<h1>4-Conclusion</h1>
<p>Je n&#8217;ai pas encore eu l&#8217;occasion de m&#8217;amuser, &#8216;pour de vrai&#8217; avec cette appli toute simple, ce n&#8217;est pas l&#8217;envie qui m&#8217;en manque parce que je pense lui trouver une foule d&#8217;application qui me faciliteront grandement la vie.<br />
J&#8217;ai une seule petite appréhension que le process par BeautifulSoup ne ralentisse pas quelque peu le rendering des pages. Ca serait d&#8217;ailleurs un ralentissement à évaluer. En tout cas, amusez vous bien avec cette appli aussi simple, qu&#8217;utile.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2010/06/20/django-improved-inlines-enrichissez-facilement-vos-contenus-et-ca-sans-payer-lisf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django-samaritan, parce que tout le monde a le droit d&#8217;aimer Bruce Willis</title>
		<link>http://j-mad.com/blog/2010/05/23/django-samaritan-parce-que-tout-le-monde-a-le-droit-daimer-bruce-willis/</link>
		<comments>http://j-mad.com/blog/2010/05/23/django-samaritan-parce-que-tout-le-monde-a-le-droit-daimer-bruce-willis/#comments</comments>
		<pubDate>Sun, 23 May 2010 17:52:58 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=604</guid>
		<description><![CDATA[
			
				
			
		
Le mois de mai est toujours un mois compliqué. Normalement c&#8217;est à cause de tout ces jours fériés qui sont autant d&#8217;obstacle au travail et qui nous oblige à être tout le temps en retard en mai. Pourtant, cette année, malgré que deux des jours fériés de mai tombent un samedi et que le dernier [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F05%2F23%2Fdjango-samaritan-parce-que-tout-le-monde-a-le-droit-daimer-bruce-willis%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F05%2F23%2Fdjango-samaritan-parce-que-tout-le-monde-a-le-droit-daimer-bruce-willis%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p style="padding-left: 30px;"><a href="http://j-mad.com/blog/wp-content/uploads/2010/05/le.dernier.samaritain.jpg" rel="thumbnail"><img class="alignleft size-medium wp-image-603" style="border: 1px solid black; margin-left: 10px; margin-right: 10px;" title="Le Dernier Samaritain" src="http://j-mad.com/blog/wp-content/uploads/2010/05/le.dernier.samaritain-214x300.jpg" alt="" width="151" height="212" /></a>Le mois de mai est toujours un mois compliqué. Normalement c&#8217;est à cause de tout ces jours fériés qui sont autant d&#8217;obstacle au travail et qui nous oblige à être tout le temps en retard en mai. Pourtant, cette année, malgré que deux des jours fériés de mai tombent un samedi et que le dernier (demain) soit un jour travaillé pour moi, la malédiction du mois de mai a encore frappé et je n&#8217;ai de temps pour rien&#8230; A croire que c&#8217;est le mois de mai lui-même qui a pour conséquence que l&#8217;on soit en retard. La malédiction sanglante du mois de mai … (tiens on pourrait faire un bon film de série B avec ça). Enfin, tout ça pour expliquer le fait que l&#8217;application du mois que j&#8217;ai choisi est une toute petite application, que je n&#8217;ai en fait pas eu l&#8217;occasion d&#8217;essayer &#8216;en vrai&#8217;.  (et puis bon, je n&#8217;allais pas cracher sur la possibilité de faire un jeu de mot coolos en parlant d&#8217;un film que j&#8217;adore …)</p>
<p style="padding-left: 30px;">
<p style="padding-left: 30px;">
<p style="padding-left: 30px;">
<p style="padding-left: 30px;">
<h1>1- Où on le trouve, comment on l’installe, tout ça quoi (et la doc) ?</h1>
<p>On le trouve sur la page <a href="http://github.com/benslavin/django-samaritan">github</a> qui va bien et c&#8217;est tout. Quand à la doc, elle est, elle aussi uniquement sur le github</p>
<p>La doc se découpe d&#8217;ailleurs entre :</p>
<ul>
<li> le Readme</li>
<li> le Install</li>
<li> les commentaires dans le code.</li>
</ul>
<p>C&#8217;est peu vous aller me dire, mais vu que l&#8217;app fait, en tout et pour tout, moins de 200 lignes, c&#8217;est suffisant.</p>
<h1>2- A quoi ca sert ?</h1>
<p>A remplacer le model django.contrib.auth.models.User par un des siens, d&#8217;une façon propre. Pour aider encore plus, des models spéciaux de M2M, de OnetoOne et de FK sont fournis pour quand on voudra créer des références vers nos nouveaux users.</p>
<h1>3- Comment ça marche ?</h1>
<p>Il y a deux façons possibles de le faire marcher.</p>
<p>En l&#8217;installant puis en l&#8217;utilisant. Tout simplement.. On créé son model, on utilise la fonction get_user_model() qui est fournit avec django-samaritain (ou en utilisant directement notre model d&#8217;ailleurs). Et on utilise les spécialisations des FK,OtO et M2M.</p>
<p>En utilisant la méthode de Monkey Patching pour injecter à la volée le comportement de django-samaritan dans un projet existant. Cette deuxième méthode est déconseillée pour une utilisation à long terme,dixit l&#8217;auteur de l&#8217;app lui même.</p>
<h1>3- Retour ?</h1>
<p>Et oui, je sais, c&#8217;est un comble. Mais bon, c&#8217;est mes billets, alors je fais ce que je veux. Donc, si l&#8217;un de vous a des retours sur l&#8217;utilisation de cette app, je suis bien entendu preneur, ne vous gênez surtout pas.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2010/05/23/django-samaritan-parce-que-tout-le-monde-a-le-droit-daimer-bruce-willis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django-request , ne partez plus en quest de vos stats</title>
		<link>http://j-mad.com/blog/2010/04/10/django-request-ne-partez-plus-en-quest-de-vos-stats/</link>
		<comments>http://j-mad.com/blog/2010/04/10/django-request-ne-partez-plus-en-quest-de-vos-stats/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 16:44:54 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=559</guid>
		<description><![CDATA[
			
				
			
		
Et non, vous ne rêvez pas, on est même pas le 15 avril et déjà, déjà, le billet de l&#8217;app django du mois est là. Mais bon, les rencontres django ayant lieu dans maintenant 14 jours et n&#8217;ayant pas encore commencer à préparer ma conf, même pas le premier mot (enfin si, bonjour), ce qui [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F04%2F10%2Fdjango-request-ne-partez-plus-en-quest-de-vos-stats%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F04%2F10%2Fdjango-request-ne-partez-plus-en-quest-de-vos-stats%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Et non, vous ne rêvez pas, on est même pas le 15 avril et déjà, déjà, le billet de l&#8217;app django du mois est là. Mais bon, les <a title="DjangoCong" href="http://rencontres.django-fr.org/">rencontres django</a> ayant lieu dans maintenant 14 jours et n&#8217;ayant pas encore commencer à préparer ma conf, même pas le premier mot (enfin si, bonjour), ce qui fait que je suis &#8216;dans la banade&#8217;, comme l&#8217;a fait si justement remarquer il y a peu <a href="http://twitter.com/daks_">@daks_</a></p>
<p>Donc, je préfère me &#8216;débarrasser&#8217; tout de suite de l&#8217;app du mois, comme ça, ça sera au moins une chose de faite.</p>
<p>Ce mois-ci, je vais donc vous présenter django-request, une app pour faire des stats sur la fréquentation de votre django. Oui je sais il y a google analytics pour ça. Mais bon, on sait jamais, ça peut être utile quand même.</p>
<h1>1- Où on le trouve, comment on l’installe, tout ça quoi (et la doc) ?</h1>
<p>On le trouve à deux endroits :</p>
<ul>
<li>sur le <a href="http://github.com/kylef/django-request">github</a> qui va bien</li>
<li>sur les <a href="http://kylefuller.co.uk/projects/django-request/">pages dédiées sur le site de son auteur</a>.</li>
</ul>
<p>A noter que quasiment toute la doc se trouve être sur la partie dédiée à django-request sur le site de son auteur.</p>
<p>Pour l&#8217;installation, facile, un git clone, un téléchargement de source ou alors pip et easy_install.</p>
<p>Quand à la doc, elle est vraiment très fournie et complète, permettant d&#8217;installer, de configurer, d&#8217;utiliser, la totale quoi.</p>
<h1>2- A quoi ca sert ?</h1>
<p>Ben à faire des stats, je l&#8217;ai déjà dit. Qui ne seront visibles que dans la partie admin.</p>
<p>On peut avoir de jolis graphiques concernant :</p>
<ul>
<li>les visiteurs uniques</li>
<li>les visites basées sur des referrer différents</li>
<li>les requêtes reçues par le serveur</li>
<li>les requêtes venant des moteur de recherches</li>
<li>les requêtes provenant du javascript</li>
<li>les requêtes en SSL</li>
<li>les requêtes faites par un utilisateur</li>
<li>le nombre d&#8217;erreur 404</li>
<li>le nombre d&#8217;erreur, toutes erreurs comprises</li>
<li>le nombre d&#8217;utilisateur enregistré sur le site qui ont fait des requêtes</li>
</ul>
<p>Par défaut les calculs seront fait pour les visiteurs uniques, les visites en fonctions des referrers et le nombre global de requêtes.</p>
<p>On obtient ensuite un joli petit graphique qui nous donne tout plein d&#8217;infos. Et plein de petits tableaux pour en avoir encore plus.</p>
<p><a href="http://j-mad.com/blog/wp-content/uploads/2010/04/graph_django_requests.png" rel="thumbnail"><img class="aligncenter size-full wp-image-560" title="graph_django_requests" src="http://j-mad.com/blog/wp-content/uploads/2010/04/graph_django_requests.png" alt="" width="480" height="272" /></a></p>
<p>Et on peut même avoir, des petits templates tags pour voir les users actifs sur le site</p>
<h1>3- Comment ça marche ?</h1>
<p>Il suffit d&#8217;ajouter &#8216;request&#8217; dans ses installed_apps et d&#8217;ajouter le middleware qui va bien. (Attention suivant les middlewares déjà installés, la position du middleware de django-request, dans le tuple des middleware est importantt, mais c&#8217;est bien expliqué dans la doc).</p>
<p>Ensuite, tout ce passe dans l&#8217;interface d&#8217;admin</p>
<h1>4- Tips de chez Jmad.</h1>
<p>Quand j&#8217;ai installé le tout avec easy_install, j&#8217;ai oublié de rajouter les chemins pour avoir les templates admins de l&#8217;app. Résultat je n&#8217;avais rien dans l&#8217;admin. Faites y attention ou alors installez request directement dans votre projet django, comme une de vos apps.</p>
<p>Le model Request présente un champ language qui est modélisé en bd par un varchar de 25. Avec mes tests, cette longueur était bien trop petite pour mon firefox. Du coup boum une erreur BD a base de &#8216;machin qui a été truncated&#8217;. J&#8217;ai passé la taille du champ à 200 pour être tranquille.</p>
<p>Les différents fichiers js qui sont utilisés sont bien entendu fournis. Pourtant par défaut, les templates vont utilisés ceux hostés ailleurs (sur le site web de l&#8217;auteur par exemple). N&#8217;oubliez pas de changer cette option si cela vous dérange.</p>
<p>C&#8217;est expliqué dans la doc, mais je le redis ici. Une fois que tout est bien configuré, pour aller voir ces stats, vous allez dans l&#8217;admin, vous cliquez sur la ligne Request de l&#8217;app Request. Là vous avez la liste de toutes les requêtes. (pas très utile là comme ça, vous me direz). Levez les yeux, en haut à droie, à coté du bouton Add Request, vous avez un bouton Overview. Et voilà, cliquez, vous avez vos stats.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2010/04/10/django-request-ne-partez-plus-en-quest-de-vos-stats/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Django-rosetta, parce que pierre qui roule n&#8217;amasse pas mousse</title>
		<link>http://j-mad.com/blog/2010/03/28/django-rosetta-parce-que-pierre-qui-roule-namasse-pas-mousse/</link>
		<comments>http://j-mad.com/blog/2010/03/28/django-rosetta-parce-que-pierre-qui-roule-namasse-pas-mousse/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 21:52:44 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=502</guid>
		<description><![CDATA[
			
				
			
		
Vous aimez mon titre ? Parce que moi, j&#8217;en suis super fier en fait. Et oui, il m&#8217;en faut peu. Bon donc pour la django-app du mois de février, j&#8217;avais choisi django-transmeta qui permettait de traduire facilement son contenu. Mais un site n&#8217;est pas fait que de contenu, il est aussi fait de label, de [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F03%2F28%2Fdjango-rosetta-parce-que-pierre-qui-roule-namasse-pas-mousse%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F03%2F28%2Fdjango-rosetta-parce-que-pierre-qui-roule-namasse-pas-mousse%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Vous aimez mon titre ? Parce que moi, j&#8217;en suis super fier en fait. Et oui, il m&#8217;en faut peu. Bon donc pour la django-app du mois de février, j&#8217;avais choisi django-transmeta qui permettait de traduire facilement son contenu. Mais un site n&#8217;est pas fait que de contenu, il est aussi fait de label, de menu, de tout plein de truc qu&#8217;il faut internationaliser à coup de .po et de .mo. Ce qui est, il faut bien le dire, un poil chiant. Limite je pourrais dire, qu&#8217;à vouloir traduire tout ces mots, on pourrait bien finir par y laisser notre peau.</p>
<p>C&#8217;est là que django-rosetta intervient.</p>
<h1>1- Où on le trouve, comment on l’installe, tout ça quoi (et la doc) ?</h1>
<p>Comme bien souvent, sur la <a href="http://code.google.com/p/django-rosetta/">page qui lui est destiné, qui est, un google code</a>. Pour l&#8217;installation, rosetta fait dans le rustique : tar.gz ou svn checkout. Brut mais efficace.</p>
<p>Ensuite il suffira de rajouter django-rosetta dans les INSTALLED_APPS  et de rajouter ses urls dans l&#8217;urlpattern qui va bien. Et c&#8217;est tout, après roule ma poule (ou ma pierre, de rosette HA HA).</p>
<p>Pour la doc, la encore, il n&#8217;y a que la page home du google code. Mais l&#8217;app est suffisament bien faite, pour que la doc présente soit amplement suffisante.</p>
<h1>2- Comment ça marche ?</h1>
<p>Django-rosetta vous permet de rendre la rédaction des .po moins chiante que dans un simple gedit. Mais du coup, cela veut dire que l&#8217;application a besoin d&#8217;avoir les permissions d&#8217;écritures sur certains des fichiers de votre arborescence.</p>
<p>Du coup, elle n&#8217;est utilisable que de l&#8217;admin django. C&#8217;est un choix qui me semble, en fait, très logique. Et puis est ce que cela existe des gens qui n&#8217;utilisent pas du tout la partie admin de django ?</p>
<p>Ensuite, c&#8217;est tout simple, on a une liste des fichiers po, avec les pourcentages de traduction effectuées. On en choisit un et on se met au boulot. On peut même choisir si l&#8217;on veut afficher toute s les chaines ou que celle que l&#8217;on n&#8217;a pas encore traduite.</p>
<p>Allez op, deux petites images pour vous montrer le truc, parce que je suis gentil. (Et puis que je ne me suis pas trop fatigué, je reprend honteusement celles du google code officiel).</p>
<p><a href="http://j-mad.com/blog/wp-content/uploads/2010/03/rosetta-1.png" rel="thumbnail"><img class="alignleft size-medium wp-image-504" title="rosetta-1" src="http://j-mad.com/blog/wp-content/uploads/2010/03/rosetta-1-300x146.png" alt="" width="300" height="146" /></a> <a href="http://j-mad.com/blog/wp-content/uploads/2010/03/rosetta-2.1.png" rel="thumbnail"><img class="alignright size-medium wp-image-505" title="rosetta-2.1" src="http://j-mad.com/blog/wp-content/uploads/2010/03/rosetta-2.1-300x228.png" alt="" width="300" height="228" /></a></p>
<p>Voilà, avec cette deuxième app, j&#8217;en ai fini de parler, en tout cas pour un temps, d&#8217;internationalisation. A bientôt (dans un mois) pour de nouvelles découvertes dans le merveilleux pays des app django.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2010/03/28/django-rosetta-parce-que-pierre-qui-roule-namasse-pas-mousse/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django-transmeta ou comment traduire son contenu sans se faire suer</title>
		<link>http://j-mad.com/blog/2010/02/27/django-transmeta-ou-comment-traduire-son-contenu-sans-se-faire-suer/</link>
		<comments>http://j-mad.com/blog/2010/02/27/django-transmeta-ou-comment-traduire-son-contenu-sans-se-faire-suer/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 17:04:09 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=468</guid>
		<description><![CDATA[
			
				
			
		
Et oui, vous ne rêvez pas, malgré le fait que le mois de février soit ridiculement court, je trouve tout de même le temps d&#8217;écrire mon billet de l&#8217;app django du mois. Comme quoi, tout arrive.
Bon il faut dire, que j&#8217;ai du coup sélectionné une app assez petite, que j&#8217;ai découvert grâce à #django-fr (merci [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F02%2F27%2Fdjango-transmeta-ou-comment-traduire-son-contenu-sans-se-faire-suer%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F02%2F27%2Fdjango-transmeta-ou-comment-traduire-son-contenu-sans-se-faire-suer%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Et oui, vous ne rêvez pas, malgré le fait que le mois de février soit ridiculement court, je trouve tout de même le temps d&#8217;écrire mon billet de l&#8217;app django du mois. Comme quoi, tout arrive.</p>
<p>Bon il faut dire, que j&#8217;ai du coup sélectionné une app assez petite, que j&#8217;ai découvert grâce à #django-fr (merci les gars) et avec une doc très bien conçu que je vais donc pouvoir honteusement recopier en parti pour vous expliquer comment cela fonctionne.</p>
<h1>1- Où on le trouve, comment on l’installe, tout ça quoi (et la doc) ?</h1>
<p>Sur la page qui lui est dédiée sur google code. Et pour l&#8217;installer, point de tar.gz, de easy_install ou de pip. Le seul moyen de l&#8217;installer consistera à faire un bon vieux svn checkout des familles.</p>
<p>Au niveau de la doc, il n&#8217;y a que la page du project home du google code. Mais par contre, elle est super bien foutue.</p>
<p>Rendre heureux aussi, ceux qui ne parlent pas français (personne n&#8217;est parfait <img src='http://j-mad.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>Django-transmeta tente de répondre à un besoin tout con, comment traduire efficacement son contenu, lorsqu&#8217;on a un site multi langue. Parmi tout les moyens imaginables pour faire cela (j&#8217;en reparlerais en fin de billet), transmeta a choisi de modifier directement les tables des modeles à contenu traduisible.</p>
<h1>2- Comment ça marche ?</h1>
<p>Je vais reprendre, texto, les exemples donnés par la page web de transmeta, parce qu&#8217;ils très clairs. Prenons l&#8217;exemple d&#8217;un model qui décrit un bouquin.</p>
<p>Tel que :</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">class</span> Book<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
title = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span><br />
description = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
body = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span>default=<span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span><br />
price = models.<span style="color: black;">FloatField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Là, rien n&#8217;est traduisible. Imaginons que l&#8217;on veuille traduire la description et le body. Rien de plus simple, le code du model devient alors :</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">class</span> Book<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #0000cd;">__metaclass__</span> = TransMeta<br />
<br />
title = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span><br />
description = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
body = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span>default=<span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span><br />
price = models.<span style="color: black;">FloatField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Meta:<br />
translate = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'description'</span>, <span style="color: #483d8b;">'body'</span>, <span style="color: black;">&#41;</span></div></div>
<p>On rajoute une metaclass et on défini dans la classe méta, les champs que l&#8217;on veut traduire.</p>
<p>Il faut ensuite, dans le settings.py, définir les langues que l&#8217;on veut gérer, par exemple :</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">LANGUAGES = <span style="color: black;">&#40;</span><br />
<span style="color: black;">&#40;</span><span style="color: #483d8b;">'es'</span>, ugettext<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Español'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,<br />
<span style="color: black;">&#40;</span><span style="color: #483d8b;">'en'</span>, ugettext<span style="color: black;">&#40;</span><span style="color: #483d8b;">'English'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,<br />
<span style="color: black;">&#41;</span></div></div>
<p>Et qu&#8217;est ce que cela fait ?<br />
Un petit manage.py sqlall va vous le dire :</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE <span style="color: #483d8b;">&quot;fooapp_book&quot;</span> <span style="color: black;">&#40;</span><br />
<span style="color: #483d8b;">&quot;id&quot;</span> serial NOT NULL PRIMARY KEY,<br />
<span style="color: #483d8b;">&quot;title&quot;</span> varchar<span style="color: black;">&#40;</span><span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span> NOT NULL,<br />
<span style="color: #483d8b;">&quot;description_en&quot;</span> text,<br />
<span style="color: #483d8b;">&quot;description_es&quot;</span> text NOT NULL,<br />
<span style="color: #483d8b;">&quot;body_es&quot;</span> text NOT NULL,<br />
<span style="color: #483d8b;">&quot;body_en&quot;</span> text NOT NULL,<br />
<span style="color: #483d8b;">&quot;price&quot;</span> double precision NOT NULL<br />
<span style="color: black;">&#41;</span><br />
<span style="color: #66cc66;">;</span></div></div>
<p>apparaît ici la solution utilisé pour transmeta. Chaque champ qui est défini comme traduisible donne lieu à n champs en bd, pour n langues.</p>
<p>Là vous allez me dire : &#8216;Ok, bien cool, mais comment on fait quand on rajouter une langue ou que l&#8217;on veut faire en sorte qu&#8217;un champ existant qui n&#8217;était pas traduisible le soit ?&#8217;<br />
Forcément, c&#8217;est prévu. Sinon, je n&#8217;aurais pas osé faire de billet. Donc il y des commandes manage.py spécial pour altérer les tables déjà existantes et permettre de rajouter soit des langues, soit des champs traduisibles.<br />
Dernière chose, il y a tout ce qu&#8217;il faut de prévu pour pouvoir gérer ses champs dans l&#8217;admin.</p>
<h4>3- Retour sur la méthode</h4>
<p>Le principe de fonctionnement de transmeta implique de devoir utiliser des alter table à chaque fois que l&#8217;on veut rajouter une langue ou un champ. J&#8217;avoue que je n&#8217;ai jamais aimé les alter table sur du sql. Est ce un tort que j&#8217;ai ? Je ne sais pas.<br />
Vous me direz que si l&#8217;on utilise pas d&#8217;alter table, on se retrouve presque les mains liées et qu&#8217;il ne reste que peu de solution, à part des grosses tables sous la forme &#8216;langue code&#8217;, &#8216;field name&#8217;, &#8216;trad&#8217;. Il est vrai. Mais bon, j&#8217;aime pas les alter table.</p>
<h6>4- Retour sur le titre du billet :</h6>
<p>Tout le monde aura compris, bien entendu, le jeux de mot. C&#8217;est une référence directe à transmeta, l&#8217;entreprise américaine qui faisait des processeurs ni ne chauffaient que très peu et qui donc n&#8217;avait pas besoin de ventilo. D&#8217;où le sans suer. C&#8217;est nul, je sais.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2010/02/27/django-transmeta-ou-comment-traduire-son-contenu-sans-se-faire-suer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tagcon, où comment écrire simplement les templatetags, cong !!</title>
		<link>http://j-mad.com/blog/2010/01/31/tagcon-ou-comment-ecrire-simplement-les-templatetags-cong/</link>
		<comments>http://j-mad.com/blog/2010/01/31/tagcon-ou-comment-ecrire-simplement-les-templatetags-cong/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 17:23:09 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=413</guid>
		<description><![CDATA[
			
				
			
		
Oui, je sais, je devrais renouveler un peu mon stock de blagues. Parce que mettre des cong à la fin de tout et n&#8217;importe quoi, pour singer l&#8217;accent marseillais, ça commence à &#8230;. Je sais. (j&#8217;en profite pour vous rappeler que le 24 et 25 avril, il va y avoir la DjangoCong à Marseille, une [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F01%2F31%2Ftagcon-ou-comment-ecrire-simplement-les-templatetags-cong%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F01%2F31%2Ftagcon-ou-comment-ecrire-simplement-les-templatetags-cong%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Oui, je sais, je devrais renouveler un peu mon stock de blagues. Parce que mettre des cong à la fin de tout et n&#8217;importe quoi, pour singer l&#8217;accent marseillais, ça commence à &#8230;. Je sais. (j&#8217;en profite pour vous rappeler que le 24 et 25 avril, il va y avoir la <a title="Rencontre Django Fr" href="http://rencontres.django-fr.org/">DjangoCong</a> à Marseille, une super convention fr où ça va parler django, encore et encore).</p>
<p>Et, oui, la django-app du mois de janvier arrive vraiment sur le fil, à quelques heures du dépassement de délai. Mais faudra dire ça au crétin qui a décidé qu&#8217;une journée ça ne serait que 24h et qu&#8217;il fallait obligatoirement dormir chaque nuit, ou presque … (bordeille comment je vais faire en février moi..)</p>
<p>Enfin, je reste dans les délais, c&#8217;est le principal. Et pour le deuxième mois consécutif, je fais une petit entorse au principe de cette catégorie, vue que ce mois-ci, encore une fois, ce n&#8217;est pas une vrai django-app que je présente, mais un &#8217;simple&#8217; module python.</p>
<h1>0- Et ça sert à quoi  ?</h1>
<p>En fait tagcon est &#8216;inutile&#8217; (donc indispensable vous allez me dire&#8230; ne niez pas, je vous ai tous entendu le dire&#8230;). Il sert simplement à faciliter l&#8217;écriture des templatetags (et surtout des templates tags à argument). On pourrait se dire que c&#8217;est assez inutile. Mais en fait, ça permet de gagner un peu de temps et de réduire d&#8217;une façon assez intéressante la taille de son code. Donc..</p>
<p>Un petit exemple, tiré de la doc, parce que comme me l&#8217;a fait remarquer daks (dont je conseille le <a href="http://blog.sietch-tabr.com/">blog</a>, qui vient d&#8217;arriver dans mes RSS) , ça manque :</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> User<br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span> <span style="color: #ff7700;font-weight:bold;">import</span> Library<br />
<span style="color: #ff7700;font-weight:bold;">import</span> tagcon<br />
<br />
register = Library<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> UserListTag<span style="color: black;">&#40;</span>tagcon.<span style="color: black;">TemplateTag</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; limit = tagcon.<span style="color: black;">IntegerArg</span><span style="color: black;">&#40;</span>default=<span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> render<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, context<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">resolve</span><span style="color: black;">&#40;</span>context<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #483d8b;">&quot;&lt;ul&gt;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #dc143c;">user</span> <span style="color: #ff7700;font-weight:bold;">in</span> User.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>:<span style="color: #008000;">self</span>.<span style="color: black;">args</span>.<span style="color: black;">limit</span><span style="color: black;">&#93;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #483d8b;">&quot;&lt;li&gt;%s&lt;/li&gt;&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span>.<span style="color: black;">username</span>,<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #483d8b;">&quot;&lt;/ul&gt;&quot;</span></div></div>
<h1>1- Où on le trouve, comment on l’installe, tout ça quoi ?</h1>
<p>Alors alors, sur le <a title="github de tagcon" href="http://github.com/korpios/django-tagcon">github qui va bien</a>. (une petite remarque qui a rien à voir, je préfère de loin bitbucket à github … et pas juste parce que mercurial c&#8217;est mieux que git).</p>
<p>Une fois qu&#8217;on a récupérer le package (par fork si on a un compte github ou avec un petit tar.gz), il y a deux façon de l&#8217;installer:</p>
<ul>
<li>un petit python setup.py install</li>
<li>en copiant directement le fichier base.py qui se trouve dans tagcon.tagcon (dans ce cas là on pourra renommer base.py en tagcon.py).</li>
</ul>
<h1>2- La documentation.</h1>
<p>Alors là&#8230; Il n&#8217;y a pas grand chose. Un fichier readme qui donne un petit exemple et c&#8217;est tout. Après, il vous faudra lire les tests et le fichier source directement. Ce n&#8217;est pas donc super fourni, mais d&#8217;un autre coté, vous me direz que le module est tellement simple que ça suffit. Et vous ne seriez pas loin d&#8217;avoir raison. Mais bon.</p>
<h1>3- En conclusion</h1>
<p>Au départ, quand j&#8217;ai découvert ce petit module (je crois que je dois, encore une fois, remercier <a title="benoitc on twitter" href="http://twitter.com/benoitc">benoitc</a> pour cela), je n&#8217;étais vraiment pas convaincu de son utilité. Il me semblait presque inutile et puis un peu restrictif en obligeant à utiliser la fonction render (alors que j&#8217;ai plus l&#8217;habitude d&#8217;enregistrer les fichier template html avec le décorateur inclustion_tag). Mais au final, on se ren compte que ça simplifie pas mal les choses et on y prend rapidement goût.</p>
<h1>4- dernier paragraphe complètement HS.</h1>
<p>Ma liste de django-app à tester est loin d&#8217;être vide (avec entre autre piston, haystack,..) et ça ne risque pas de changer, vu que chaque semaine, je découvre une nouvelle app. Toutefois, j&#8217;écris ces billets avant tout pour qu&#8217;ils soient utile . Donc, si vous connaissez des app que vous adorez et que vous aimerez faire découvrir à tous. Laissez moi leur nom en commentaire et je m&#8217;efforcerais de les tester.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2010/01/31/tagcon-ou-comment-ecrire-simplement-les-templatetags-cong/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Où les middleware envahissent la django-application du mois</title>
		<link>http://j-mad.com/blog/2010/01/09/ou-les-middleware-envahissent-la-django-application-du-mois/</link>
		<comments>http://j-mad.com/blog/2010/01/09/ou-les-middleware-envahissent-la-django-application-du-mois/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 16:34:58 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=382</guid>
		<description><![CDATA[
			
				
			
		
Je sais, je suis impardonnable, je n&#8217;ai pas fait de billet sur la django-application de décembre. Vous pourriez même rajouter que je le suis encore plus parce que décembre c&#8217;est le mois des vacances de Noël et que qui dit vacances dit temps pour écrire un billet.
Oui, mais non. Parce que faut pas croire, ça [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F01%2F09%2Fou-les-middleware-envahissent-la-django-application-du-mois%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2010%2F01%2F09%2Fou-les-middleware-envahissent-la-django-application-du-mois%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Je sais, je suis impardonnable, je n&#8217;ai pas fait de billet sur la django-application de décembre. Vous pourriez même rajouter que je le suis encore plus parce que décembre c&#8217;est le mois des vacances de Noël et que qui dit vacances dit temps pour écrire un billet.</p>
<p>Oui, mais non. Parce que faut pas croire, ça prend du temps tout ces repas de fêtes. Plein de temps. Sans compter le temps que l&#8217;on passe à arpenter les magasins (IRL ou sur le net d&#8217;ailleurs) pour trouver des cadeaux. Et sans parler du fait que comme décembre est un mois de vacances, pendant les jours de non-vacances, faut bosser encore plus pour essayer de faire autant que pendant un mois normal, mais en moins de jours.</p>
<p>Autant dire que non, je n&#8217;ai pas eu le temps pour la django-app du mois.</p>
<p>Et que vu mon emploi du temps en janvier, ça va être tendu pour le billet de celle de janvier. Mais, mais, dans ma grande mansuétude, j&#8217;ai décidé de faire un billet de django app du mois de décembre, en retard.</p>
<p>Et pour une fois, je ne parlerais pas de django-app, mais de middleware. Mais oui, les middleware django, vous savez, ce mécanisme génial qui permet de pluger de petit bout de code à différents niveaux de traitement des requêtes. Ce qui permet de modifier plus ou moins profondément le comportement de django au niveau de la gestion de ses entrées / sorties.</p>
<p>Ca permet de faire plein de trucs, et plus encore.</p>
<p>Aujourd&#8217;hui je parlerais de deux d&#8217;entre eux, un que j&#8217;utilise très souvent et un autre que je vais utiliser sous peu..</p>
<h1>1- Loguer les requêtes SQL que fait django</h1>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> connection<br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span> <span style="color: #ff7700;font-weight:bold;">import</span> Template, Context<br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span> <span style="color: #ff7700;font-weight:bold;">import</span> settings<br />
<br />
<span style="color: #808080; font-style: italic;">#</span><br />
<span style="color: #808080; font-style: italic;"># Log all SQL statements direct to the console (when running in DEBUG)</span><br />
<span style="color: #808080; font-style: italic;"># Intended for use with the django development server.</span><br />
<span style="color: #808080; font-style: italic;">#</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> SQLLogToConsoleMiddleware:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> process_response<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, request, response<span style="color: black;">&#41;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> settings.<span style="color: black;">DEBUG</span> <span style="color: #ff7700;font-weight:bold;">and</span> connection.<span style="color: black;">queries</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">time</span> = <span style="color: #008000;">sum</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #008000;">float</span><span style="color: black;">&#40;</span>q<span style="color: black;">&#91;</span><span style="color: #483d8b;">'time'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> q <span style="color: #ff7700;font-weight:bold;">in</span> connection.<span style="color: black;">queries</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t = Template<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;{{count}} quer{{count|pluralize:<span style="color: #000099; font-weight: bold;">\&quot;</span>y,ies<span style="color: #000099; font-weight: bold;">\&quot;</span>}} in {{time}} seconds:<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>{% for sql in sqllog %}[{{forloop.counter}}] {{sql.time}}s: {{sql.sql|safe}}{% if not forloop.last %}<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>{% endif %}{% endfor %}&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> t.<span style="color: black;">render</span><span style="color: black;">&#40;</span>Context<span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'sqllog'</span>:connection.<span style="color: black;">queries</span>,<span style="color: #483d8b;">'count'</span>:<span style="color: #008000;">len</span><span style="color: black;">&#40;</span>connection.<span style="color: black;">queries</span><span style="color: black;">&#41;</span>,<span style="color: #483d8b;">'time'</span>:<span style="color: #dc143c;">time</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> response</div></div>
<p>J&#8217;ai trouvé ce tout petit middleware sur <a title="djangosnippets pour loguer les requêtes SQL" href="http://www.djangosnippets.org/snippets/1672/">djangosnippets</a>. Il se contente d&#8217;afficher la liste de toutes les requêtes SQL faites par django, en donnant le temps pris par leur execution.</p>
<p>C&#8217;est bien utile pour vérifier que ces vues ne font pas de la merde et pour tenter d&#8217;optimiser en factorisant des choses.</p>
<h1>2- <a title="django-maintenancemode" href="http://code.google.com/p/django-maintenancemode/">Django-maintenancemode</a></h1>
<p>Celui-là, je l&#8217;ai découvert au détour d&#8217;une conversation sur #django-fr. Carrément plus pratique que la bête page html qui dit &#8216;en maintenance&#8217;, utile à connaître et à avoir dans sa django-boîte à outil.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2010/01/09/ou-les-middleware-envahissent-la-django-application-du-mois/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Django-ROA ou&#8230; Mince je trouve pas de jeux de mots là</title>
		<link>http://j-mad.com/blog/2009/11/29/django-roa-ou-mince-je-trouve-pas-de-jeux-de-mots-la/</link>
		<comments>http://j-mad.com/blog/2009/11/29/django-roa-ou-mince-je-trouve-pas-de-jeux-de-mots-la/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 20:09:38 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=242</guid>
		<description><![CDATA[
			
				
			
		
Ça sera bien la première fois que je ne fais pas de jeux de mots dans le titre d&#8217;un billet la Django-app du mois. Mais là, je n&#8217;ai vraiment pas d&#8217;inspiration et comme je suis sur un timing plutôt serré (le billet devant être publié d&#8217;ici au plus tard 4h20 pour pouvoir prétendre à être [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2009%2F11%2F29%2Fdjango-roa-ou-mince-je-trouve-pas-de-jeux-de-mots-la%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2009%2F11%2F29%2Fdjango-roa-ou-mince-je-trouve-pas-de-jeux-de-mots-la%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Ça sera bien la première fois que je ne fais pas de jeux de mots dans le titre d&#8217;un billet la Django-app du mois. Mais là, je n&#8217;ai vraiment pas d&#8217;inspiration et comme je suis sur un timing plutôt serré (le billet devant être publié d&#8217;ici au plus tard 4h20 pour pouvoir prétendre à être un billet de novembre), je ne vais pas trop attendre qu&#8217;elle n&#8217;arrive. Je me rattraperai le mois prochain (je pense parler de piston le mois prochain, tout un poème&#8230;).</p>
<p><a href="http://code.welldev.org/django-roa/">Django-ROA</a> donc, cette jolie app est développée par <a href="http://www.biologeek.com/">David Larlet</a> que j&#8217;ai déjà cité dans mes précédents billets. Il permet de gérer des ressources distantes normalement accessibles en REST, en passant à travers l&#8217;ORM de django (et donc les modèles Django).</p>
<p>Et oui, ça permet, d&#8217;une façon plus que facile de faire comme si des modèles distants étaient des modèles locaux.</p>
<p>Le petit schéma suivant (que j&#8217;ai très vilainement récupéré du site de David, sur le <a href="http://www.biologeek.com/django,python,web-semantique/django-roa-pour-une-architecture-orientee-ressources/">billet parlant de Django-ROA</a>) explique tout, bien mieux que ne le ferraient mille de mes mots.</p>
<p><img class="alignnone size-full wp-image-243" title="django-roa-diagram-petit" src="http://j-mad.com/blog/wp-content/uploads/2009/11/django-roa-diagram-petit.png" alt="django-roa-diagram-petit" width="596" height="328" /></p>
<p>Bien entendu, on est pas obligé de se limiter à faire communiquer notre Django à un autre Django distant. On peut se connecter à tout ce qui a une interface HTTP. Op timeline de Twitter, Op n&#8217;importe quelle BD discutant le HTTP…</p>
<p>Je vois à vos sourires béats que vous êtes en train de comprendre combien Django-ROA peut être utile. Et vous avez raison.</p>
<h1>1- Où on le trouve, comment on l’installe, tout ça quoi ?</h1>
<p>Alors on le trouve sur la page bitbucket qui lui est consacré. Pour l&#8217;installation, il y a deux possibilités :</p>
<ul>
<li>soit avec hg et op on récupère la dernière version des sources</li>
<li>soit avec easy_install</li>
</ul>
<p>Attention toutefois, le package easy_install contient une version du trunk Django 1.2. Si vous ne voulez pas l&#8217;utiliser, il faudra penser à supprimer le répertoire en question.</p>
<p>Dans les deux cas Django-roa vient avec une version de restkit et une version de Django-piston. Si vous avez déjà ces deux librairies là, là aussi il faudra penser à faire le nettoyage.</p>
<p>Enfin, c&#8217;est important, si vous êtes en Django &lt; trunk, il vous faudra patcher votre Django pour pouvoir utiliser les many to many en distant. Si vous êtes en Django SVN, il vous faudra attendre que David ait rendu Django-ROA compatible Django 1.2 (c&#8217;est peut-être déjà le cas d&#8217;ailleurs).</p>
<h1>2- Niveau documentation</h1>
<p>Il y a le <a href="http://code.welldev.org/django-roa/wiki/Home">wiki</a> du bitbucket ainsi que l&#8217;article du blog de David dont j&#8217;ai déjà donné le lien (mais je le <a href="http://www.biologeek.com/django,python,web-semantique/django-roa-pour-une-architecture-orientee-ressources/">redonne</a> pour les étourdis). Il y a également le code source des tests, qui permet de bien comprendre comment tout fonctionne. Et je vous recommande vraiment de lire le code des tests si vous voulez comprendre.</p>
<h1>3- Qu&#8217;est-ce qu&#8217;on fait et comment on le fait ?</h1>
<p>Qu&#8217;est-ce qu&#8217;on fait, je vous l&#8217;ai déjà dit. Faut suivre un peu. On connecte notre Django à notre Django (ou d&#8217;autre base distante, voir l&#8217;exemple avec Twitter). Mais ce qu&#8217;il faut savoir c&#8217;est que Django-ROA permet de gérer la partie serveur et la partie client, dans le cas où vous développez vous même la partie &#8216;Django distante&#8217;.</p>
<p>Maintenant Django-ROA est encore en dev, et il peut être utile de connaître quelques petits tuyaux, que bien entendu, je vais vous donner.</p>
<h1>4- Les tuyaux de Jmad&#8230;</h1>
<h2>4.1- Erreur 500 côté serveur</h2>
<p>Sur la partie serveur, il se peut que vous vous trouviez avec des erreurs 500 assez silencieuses. C&#8217;est moi ce que j&#8217;ai eu. Il se trouve que c&#8217;est dû au logging.debug et à un problème (allez savoir pourquoi) d&#8217;encodage UTF-8. Enlevez les logging et tout roule. Je n&#8217;ai pas eu le temps de chercher et faire remonter à David le pourquoi du comment de ce problème, mais comme je me suis creusé la tête quelques temps avant de trouver le problème, je préfère vous informer.</p>
<h2>4.2- Sérialisation&#8230;</h2>
<p>Par défaut, on peut sérialiser les objets de trois façons :</p>
<ul>
<li>en JSON,</li>
<li>en XML,</li>
<li>en utilisant le sérialiseur fait par David pour les tests qui est un sérialiseur XML un peu modifié.</li>
</ul>
<p>Allez savoir pourquoi, mais pour moi, seul le troisième daignait fonctionner.</p>
<h2>4.3- Authentification</h2>
<p>Pour l&#8217;instant l&#8217;authentification sur les services distants n&#8217;est pas gérée. Si vous en avez absolument besoin, n&#8217;hésitez pas à envoyer un mail à David.</p>
<h1>5- Conclusion</h1>
<p>Django-ROA est encore un module en dev, il manque quelques fonctionnalités qui pourraient le faire passer du statut d&#8217;app intéressante et utile à celui d&#8217;app complétement indispensable. Mais il est d&#8217;ors est déjà bien utile, quand des problématiques de communication entre bases distantes se mettent à apparaître.</p>
<p>Il me semble juste que l&#8217;on devrait changer son nom, pour par exemple Django-CROA. Ça m&#8217;aurait permis d&#8217;avoir un bien meilleur titre du genre Django-CROA et le crapaud est en toi, ou alors Django-CROA , l&#8217;app qui voulait devenir aussi grosse qu&#8217;un bœuf&#8230;) enfin, tant pis.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2009/11/29/django-roa-ou-mince-je-trouve-pas-de-jeux-de-mots-la/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django-tagging, et le tag est en toi</title>
		<link>http://j-mad.com/blog/2009/10/30/django-tagging-et-le-tag-est-en-toi/</link>
		<comments>http://j-mad.com/blog/2009/10/30/django-tagging-et-le-tag-est-en-toi/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 22:48:16 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=218</guid>
		<description><![CDATA[
			
				
			
		
Me revoilà donc pour le désormais presque célèbre billet mensuel de la django-app du mois. Comme d&#8217;habitude, je le fais sur le fils, limite à être en retard. Mais c&#8217;est bien normal, après tout il me faut bien un mois complet pour choisir, tester à fond et rédiger un magnifique billet concernant l&#8217;app du mois.
L&#8217;app [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2009%2F10%2F30%2Fdjango-tagging-et-le-tag-est-en-toi%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2009%2F10%2F30%2Fdjango-tagging-et-le-tag-est-en-toi%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Me revoilà donc pour le désormais presque célèbre billet mensuel de la django-app du mois. Comme d&#8217;habitude, je le fais sur le fils, limite à être en retard. Mais c&#8217;est bien normal, après tout il me faut bien un mois complet pour choisir, tester à fond et rédiger un magnifique billet concernant l&#8217;app du mois.</p>
<p>L&#8217;app d&#8217;octobre est donc <a href="http://code.google.com/p/django-tagging/">django-tagging</a>. Qui comme son nom l&#8217;indique sert à taguer des models.</p>
<h1>Où on le trouve, comment on l&#8217;installe, tout ça quoi ?</h1>
<p>On le trouve, très simplement sur google-code, sur sa <a href="http://code.google.com/p/django-tagging/">page projet</a>.  Pour l&#8217;installation, là aussi c&#8217;est du très classique :</p>
<ul>
<li>pip</li>
<li>easy_install</li>
<li>télécharger un tar.gz</li>
<li>utiliser le svn de google-code</li>
</ul>
<p>moi j&#8217;ai choisi, une fois n&#8217;est pas coutume d&#8217;utiliser easy_install.</p>
<h1>Niveau documentation ?</h1>
<p>Un fichier en ReStructuredText, accessible directement sur le site et présent dans les sources donne la doc et des exemples d&#8217;utilisation. Il n&#8217;est d&#8217;ailleurs par forcément à jour. Certaines fonctionnalités décrites comme étant dans la version de dev sont en fait dans la 0.3</p>
<p>En plus, trois petites pages sont présentes sur le wiki :</p>
<ul>
<li>une pour parler d&#8217;un tips d&#8217;utilisation (avec des properties)</li>
<li>une pour les incompatibilité entre versions</li>
<li>une pour les idées et le planning</li>
</ul>
<h1>Ils sont où les murs alors ? ( ou qu&#8217;est ce qu&#8217;on peut faire avec django-tagging)</h1>
<p>Ok, ce titre de chapitre est surement le plus pourris de ma carrière de créateur de titre de chapitre, mais tant pis j&#8217;assume.</p>
<h2>Le configurer</h2>
<p>Il y a quelques possibilité de configuration, en setant des variables dans le settings.py du projet. On peut par exemple forcer à ce que les tags soient en minuscule ou donner la longueur maxi d&#8217;un tag.</p>
<h2>L&#8217;utiliser</h2>
<p>On peut donc taguer des instances de model. Mais bon en disant cela, j&#8217;ai rien dit. En fait on peut register des models pour pouvoir ensuite simplement rajouter des tags (ou les lister) aux instances de ces models.</p>
<p>On peut également passer directement par les managers de Tags, fournit par l&#8217;app, pour taguer des instances.</p>
<h2>L&#8217;utiliser encore plus</h2>
<p>il y a quelques fonctions utilitaires fournis avec l&#8217;app.</p>
<p>On pourra par exemple ( avec la fonction get_intersection_by_model) récupéré le sous-ensemble des instances contenu dans le queryset passé en paramêtre 1 qui sont tagués avec tout les tags d&#8217;une liste passé en paramêtre 2</p>
<p>De même avoir toutes les instances d&#8217;un models tagués par un ou plusieurs tags est possible avec la fonction get_by_model, mais aussi les unions d&#8217;instance ou les groupe d&#8217;instance ayant les même tag qu&#8217;un autre objet …</p>
<p>Et aussi (et presque surtout aurais-je envie de dire) la fonction calculate_cloud qui permet de calculer le nuage de tag en calculant une taille de font pour chacun des tags passé en paramètre. (l&#8217;algorithme utilisé pour le calcul est configurable, en plus)</p>
<h2>afficher les tags</h2>
<p>Avec 4 templatestags différent pour afficher le nuage de tag, tout les tags d&#8217;un objet, tout les objets (d&#8217;un model précis) tagués avec un tag précis, ou tout les tags qui sont reliés à un model (enfin à ses instances, vous m&#8217;avez compris)</p>
<h1>Conclusion.</h1>
<p>Même si la façon d&#8217;ajouter un tag peu sembler un peu alambiqué (pour pouvoir avoir des tags avec des espaces, ou avec des espaces plus des guillemets, etc .. ) , c&#8217;est vraiment une bonne app, qui ne fait qu&#8217;une chose, mais qui le fait très bien. Donc, je ne peux que conseiller son utilisation.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2009/10/30/django-tagging-et-le-tag-est-en-toi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django registration, et avoir des users devient facile.</title>
		<link>http://j-mad.com/blog/2009/10/01/django-registration-et-avoir-des-users-devient-facile/</link>
		<comments>http://j-mad.com/blog/2009/10/01/django-registration-et-avoir-des-users-devient-facile/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 20:09:41 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[La Django-app du mois]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=159</guid>
		<description><![CDATA[
			
				
			
		
Tout d&#8217;abord, mes plus plates excuses à vous tous, fidèles lecteurs de mon petit espace qui attendiez avec d&#8217;abord joie, puis impatience, puis tristesse et désespoir, le billet de la django app du mois de septembre.
Alors oui, nous sommes le premier octobre et le billet de la django app de septembre n&#8217;a pas encore été [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2009%2F10%2F01%2Fdjango-registration-et-avoir-des-users-devient-facile%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fj-mad.com%2Fblog%2F2009%2F10%2F01%2Fdjango-registration-et-avoir-des-users-devient-facile%2F&amp;source=mrjmad&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Tout d&#8217;abord, mes plus plates excuses à vous tous, fidèles lecteurs de mon petit espace qui attendiez avec d&#8217;abord joie, puis impatience, puis tristesse et désespoir, le billet de la django app du mois de septembre.</p>
<p>Alors oui, nous sommes le premier octobre et le billet de la django app de septembre n&#8217;a pas encore été posté. Oui, c&#8217;est une honte de lancer ainsi une si bonne idée et de ne pas suivre le principe même de la bonne idée de le deuxième mois. Oui, je reconnais tout cela. Mais votre honneur, je plaide coupa.. pardon innocent.</p>
<p>Ce n&#8217;est pas de ma faute si je n&#8217;ai pas écrit ce billet. Mon chien (comment ça je n&#8217;ai pas de chien?) a mangé mes devoi.. pardon mon cable réseau. Et puis c&#8217;est sans parler du débarquement des ET, qui a eu lieu dans mon jardin (comment ça y a pas de jardin dans mon appart?) et qui a ruiné ma pelouse.</p>
<p>Bon, trêve de bêtises. En fait il y a deux raisons à ce retard sur le deuxième billet djangoapp du mois (et aussi sur mon relatif silence sur ce blog). Deux raisons très simples :</p>
<ul>
<li>Une grosse période bien chaude au boulot, avec suffisamment de boulot pour y bosser soir et week-end.</li>
</ul>
<ul>
<li> Le fait que  la troisième occurrence du  SPLLOS (le salon professionnel des logiciels libres qui aura lieu à marseille, le 13 octobre) se rapproche à grand pas (ben oui le 13 octobre) et qu&#8217;en temps que président de l&#8217;association qui l&#8217;organise (Libertis, l&#8217;association des boites qui font du libre en PACA), j&#8217;ai pas mal de truc à gérer (d&#8217;ailleurs je profite de ce billet, même si ils ne le liront jamais, pour remercier plus qu&#8217;un peu les membres de l&#8217;asso qui bossent aussi sur ce sujet, heureusement qu&#8217;on est à plusieurs sur le truc, sinon … )</li>
</ul>
<p>Et, comme les deux points que je cite au dessus sont toujours d&#8217;actualité, le billet du mois de septembre (mais oui on est encore, presque, en septembre) sera un billet court, sur une app que beaucoup doivent connaître mais qui à l&#8217;avantage d&#8217;être suffisament petite pour être tester avec peu de temps  : J&#8217;ai nommé django-registration. Qui sert à la registration des users (désolé ça fait depuis le début du billet que je voulais le faire cet anglicisme).</p>
<h1>1- A quoi ça sert , où on le trouve, comment on l&#8217;installe ?</h1>
<h2>1.1 Le pourquoi du comment</h2>
<p>Utiliser django-registration c&#8217;est bien parce que cela permet de ne pas réinventer la roue et donc de ne pas perdre du temps à développer un système d&#8217;enregistrement/activation/ utilisateurs.</p>
<h2>1.2 Où on la trouve ?</h2>
<p>Sur bitbucket, il y a un repo avec un wiki bien sympa , ici : <a href="http://bitbucket.org/ubernostrum/django-registration/ ">http://bitbucket.org/ubernostrum/django-registration/ </a></p>
<h2>1.3 Comment on l&#8217;installe ?</h2>
<p>Il y a trois manière pour l&#8217;installer, par easy_install , par pypi ou avec les bonnes vieilles sources (hg cloneeeee) et un python manage setup.py.<br />
Personnellement j&#8217;ai une préférence pour la troisième méthode, la doc étant incluses dans les sources, je trouve ça plus facile d&#8217;avoir les sources du truc que je met à jour de temps en temps.</p>
<h1>2- Mais ça fait quoi django-registration, pour de vrai ?</h1>
<p>Django registration met un place un système complet d&#8217;enregistrement des users.</p>
<p>A savoir, vous avez la vue qui gère le fait qu&#8217;un user veut s&#8217;inscrire et va remplir un joli petit formulaire.</p>
<p>Une fois le  formulaire submit, django va créer un compte user inactif et envoyer un mail qui contiendra une clé d&#8217;activation. L&#8217;utilisateur qui vient de submit sa demande d&#8217;enregistrement verra alors ensuite apparaître une jolie page lui disant d&#8217;aller vérifier ses mails et d&#8217;activer son compte.</p>
<p>Truc sympa, l&#8217;app gére le fait d&#8217;interdire certains provider d&#8217;emails jetable ou l&#8217;interdiction de créer un compte avec un email déjà utilisé.</p>
<p>Cerise sur le gâteau, il y a même un petit script (qui utilise les commandes django) qui permettra de supprimer les comptes  qui n&#8217;ont pas été activés et qui sont considérés comme expirés.</p>
<h2>2.1 Et la localisation ?</h2>
<p>Elle y est, dans tout plein de langues (y compris le français, bien entendu)</p>
<h1>3- La doc ?</h1>
<p>Bien fournie, très précise et claire, il n&#8217;y a vraiment rien à redire.</p>
<p>Une fois qu&#8217;on a installé l&#8217;app, on a plus rien à faire alors ?</p>
<p>Ben en fait si, parce qu&#8217;il n&#8217;y a aucun template de fournis, même pas à titre d&#8217;exemple. Il faut donc &#8216;tous&#8217; les faire, mais c&#8217;est assez rapide. Et puis là aussi, la doc est vraiment bien faite et détaille précisément chaque variable du contexte de chaque view. Faire les templates n&#8217;est donc pas vraiment difficile.</p>
<h1>4- En conclusion</h1>
<p>Installez la et utilisez la.</p>
]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2009/10/01/django-registration-et-avoir-des-users-devient-facile/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
