<?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; Django</title>
	<atom:link href="http://j-mad.com/blog/category/developpement/python/django/feed/" rel="self" type="application/rss+xml" />
	<link>http://j-mad.com/blog</link>
	<description>juste un blog</description>
	<lastBuildDate>Fri, 18 May 2012 21:58:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pony rider in the skyyyy&#8230; c&#8217;est le retour des djangocong YeeHaÂ !!</title>
		<link>http://j-mad.com/blog/2011/11/15/pony-rider-in-the-skyyyy-cest-le-retour-des-djangocong-yeeha%c2%a0/</link>
		<comments>http://j-mad.com/blog/2011/11/15/pony-rider-in-the-skyyyy-cest-le-retour-des-djangocong-yeeha%c2%a0/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 22:54:51 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1795</guid>
		<description><![CDATA[Je vous prÃ©viens, tout de suite, j&#8217;aurais pu cÃ©der Ã  la facilitÃ© et parsemer mon billet d&#8217;annonce d&#8217;image de petit poney rose, pour coller aux thÃ¨mes du poney, de django, de l&#8217;amour platonique qui anime tout ceux qui font du django ( #sharethelove nanÂ ?? ha non pardon c&#8217;est pas la bonne confÃ©rence). Mais non, je <a href='http://j-mad.com/blog/2011/11/15/pony-rider-in-the-skyyyy-cest-le-retour-des-djangocong-yeeha%c2%a0/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://j-mad.com/blog/wp-content/uploads/2011/11/harlequin.jpg" rel="thumbnail" rel="lightbox[1795]"><img class="alignleft size-full wp-image-1801" style="margin: 15px;" title="harlequin" src="http://j-mad.com/blog/wp-content/uploads/2011/11/harlequin.jpg" alt="" width="240" height="204" /></a><a href="../wp-content/uploads/2011/11/leya.jpg" rel="thumbnail" rel="lightbox[1795]"><img class="size-full wp-image-1796 alignright" style="margin-top: 15px; margin-bottom: 15px;" title="leya" src="http://j-mad.com/blog/wp-content/uploads/2011/11/leya.jpg" alt="" width="259" height="210" /></a>Je vous prÃ©viens, tout de suite, j&#8217;aurais pu cÃ©der Ã  la facilitÃ© et parsemer mon billet d&#8217;annonce d&#8217;image de petit poney rose, pour coller aux thÃ¨mes du poney, de django, de l&#8217;amour platonique qui anime tout ceux qui font du django ( #sharethelove nanÂ ?? ha non pardon c&#8217;est pas la bonne confÃ©rence). Mais non, je ne vais pas me laisser aller Ã  cela. C&#8217;est dit.</p>
<p style="text-align: left;">Donc, pour la troisiÃ¨me annÃ©e les <a href="http://rencontres.django-fr.org/2012/" target="_blank">Djangocongs</a> ont lieu, Ã  nouveau dans le sud. Mais cette annÃ©e ce ne sera pas Ã  Marseille (aprÃ¨s tout il faut bien vous faire dÃ©couvrir de nouvelles villes) mais Ã  Montpellier pendant le week end du 14-15 avril.</p>
<p><a href="http://j-mad.com/blog/wp-content/uploads/2011/11/superman.jpg" rel="thumbnail" rel="lightbox[1795]"><img class="alignleft size-full wp-image-1797" style="margin: 15px;" title="superman" src="http://j-mad.com/blog/wp-content/uploads/2011/11/superman.jpg" alt="" width="240" height="180" /></a></p>
<p>&nbsp;</p>
<p>Du coup, le staff s&#8217;Ã©largit et accueilleÂ :</p>
<ul>
<li>des locaux (<a href="https://twitter.com/#!/n1k0/" target="_blank">nico</a> et <a href="https://twitter.com/#!/langlois_s/" target="_blank">stÃ©phane</a> pour ne pas les nommer), vÃ©ritables supermens de l&#8217;organisation, qui avec l&#8217;agilitÃ© qui les caractÃ©risent s&#8217;occupent de tout et du reste. (Enfin c&#8217;est tout de mÃªme moi qui continue Ã  faire les factures que les gentils sponsors vont recevoir, des sousssssss)</li>
</ul>
<ul>
<li>pleins de bonnes volontÃ©s, qui ont dÃ©cidÃ©s que pour la troisiÃ¨me, il Ã©tait temps de montrer qu&#8217;eux aussi avait des biscottos sous le tee-shirt geek et ont trÃ¨s gentiment proposÃ©s leur aide.</li>
</ul>
<p>Un staff Ã©largi qui se retrousse les manches pour que cette troisiÃ¨me Ã©dition soit plus qu&#8217;un succÃ¨s, soit une apothÃ©ose.</p>
<p>Et pour cela, plusieurs chosesÂ :</p>
<ul>
<li>la retour du dÃ©coupage en quatre temps, avec simplement quelques arrangement pour parfaire le tout</li>
<li>une unitÃ© de lieu, &#8230; enfin.</li>
<li>Un lieu juste magique,.. les pieds dans l&#8217;eau, au bords de la plage, l&#8217;eau turquoise, les palmiers, le ciel bleu, le sable fin (et si il pleut Ã§a sera Ã  cause des nordistes).</li>
</ul>
<p>Mais pour que cette troisiÃ¨me Ã©dition soit vraiment une <a href="http://rencontres.django-fr.org/2012/" target="_blank">Ã©dition mÃ©morable</a>, une Ã©dition totalement gaga, il va falloir que toi, cher <a href="http://j-mad.com/blog/wp-content/uploads/2011/11/gaga.jpg" rel="thumbnail" rel="lightbox[1795]"><img class="alignright size-full wp-image-1799" style="margin: 15px;" title="gaga" src="http://j-mad.com/blog/wp-content/uploads/2011/11/gaga.jpg" alt="" width="240" height="218" /></a>lecteur, tu y mettes un peu du tien. Bien sur il faudra t&#8217;inscrire, des que cela sera possible (mais ne tâ€™inquiÃ¨te pas, tu seras au courant). Bien sur il faudra ne pas oublier de prendre tes billets de train, ton ordi et ton maillot starwars. <a href="http://j-mad.com/blog/wp-content/uploads/2011/11/stormtrooper.jpg" rel="thumbnail" rel="lightbox[1795]"><img class="alignright size-full wp-image-1798" style="margin: 15px;" title="stormtrooper" src="http://j-mad.com/blog/wp-content/uploads/2011/11/stormtrooper.jpg" alt="" width="240" height="180" /></a></p>
<p>Mais vous pouvez faire plusÂ . Pour cela rien de plus simple,Â  il va falloir <a href="https://docs.google.com/spreadsheet/viewform?hl=fr_FR&amp;formkey=dEFYWExmMDFxNzRSVk1rTS1RQndyelE6MQ" target="_blank">prendre son courage ponifique Ã  deux mains et proposer un sujet de confÃ©rence</a> (ATTENTION, tu n&#8217;as que jusqu&#8217;au 13 janvier). Vous ne savez pas de quoi parlerÂ ? Vous avez l&#8217;impression de ne rien avoir Ã  direÂ ? Si vous utilisez django, vous vous trompez sÃ»rement. Je suis sur que vous avez un retour d&#8217;expÃ©rience enrichissant pour tous et que vous allez pouvoir partager en douze minutes. Vous avez utilisÃ© django dans un contexte non web, fait des zigouigouis avec HTML5 ou de la haute dispo, lancÃ© le dev d&#8217;un module utilisÃ© par la terre entiÃ¨re et vous avez du coup une vraie expÃ©rience de lead de projet avec des utilisateursÂ ??? Vous voyez que vous en avez des choses Ã  nous apprendre.</p>
<p>&nbsp;</p>
<p>Vous ne vous reconnaissez dans aucune des phrases du dessusÂ ? C&#8217;est pas grave, vous avez sÃ»rement autre chose Ã  nous raconter. Et en plus, comme on est conciliant, si vous avez peur que douze minutes cela soit trop pour vous, si vous Ãªtes plus du genre 5 minutes douche comprise, alors vous allez Ãªtre aux anges. Parce que vous aller pouvoir candidater pour un LT de 5 minutes. Le monde est bien fait non ?<br />
<a href="http://j-mad.com/blog/wp-content/uploads/2011/11/lapin.jpg" rel="thumbnail" rel="lightbox[1795]"><img class="alignright size-full wp-image-1800" style="margin: 15px;" title="lapin" src="http://j-mad.com/blog/wp-content/uploads/2011/11/lapin.jpg" alt="" width="240" height="228" /></a><br />
<a href="http://j-mad.com/blog/wp-content/uploads/2011/11/musclor.jpg" rel="thumbnail" rel="lightbox[1795]"><img class="alignleft size-full wp-image-1808" style="margin: 15px;" title="musclor" src="http://j-mad.com/blog/wp-content/uploads/2011/11/musclor.jpg" alt="" width="240" height="184" /></a>Et si vraiment, vraiment tu penses que cette annÃ©e, non, tu ne peux proposer un sujet, ce n&#8217;est pas grave. AprÃ¨s avoir passÃ© une bonne demi journÃ©e Ã  apprendre en Ã©coutant des confÃ©rences qui seront, forcÃ©ment, super intÃ©ressantes tu pourras participer jusqu&#8217;Ã  plus soif (non je parle pas de l&#8217;apÃ©ro&#8230;) lors des sessions de barcamp et de sprint. Sans oublier la derniÃ¨re demi journÃ©e qui te permettra de faire le fou sur la plage (ou tout autre activitÃ© ne nÃ©cessitant pas de haut de forme).</p>
<p>Plus que 150 jours â€¦.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>PsÂ : pour ceux qui n&#8217;ont pas reconnu la rÃ©fÃ©rence du titreÂ : <a href="http://www.youtube.com/watch?v=lxn48wSiCzg" target="_blank">www.youtube.com/watch?v=lxn48wSiCzg</a><br />
Ps2Â : merci Ã  <a href="http://twitter.com/langlois_s/" target="_blank">stÃ©phane</a> de m&#8217;avoir fait dÃ©couvrir <a href="http://marikasurinen.com" target="_blank">Mari Kasurinen</a>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/11/15/pony-rider-in-the-skyyyy-cest-le-retour-des-djangocong-yeeha%c2%a0/" data-text="Pony rider in the skyyyy&#038;%238230; c&#038;%238217;est le retour des djangocong YeeHaÂ !!"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1795&amp;md5=b2f5985d8871d9dfbe399a66c4871d80" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/11/15/pony-rider-in-the-skyyyy-cest-le-retour-des-djangocong-yeeha%c2%a0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F11%2F15%2Fpony-rider-in-the-skyyyy-cest-le-retour-des-djangocong-yeeha%25c2%25a0%2F&amp;language=fr_FR&amp;category=text&amp;title=Pony+rider+in+the+skyyyy%26%238230%3B+c%26%238217%3Best+le+retour+des+djangocong+YeeHa%C2%A0%21%21&amp;description=Je+vous+pr%C3%A9viens%2C+tout+de+suite%2C+j%26%238217%3Baurais+pu+c%C3%A9der+%C3%A0+la+facilit%C3%A9+et+parsemer+mon+billet+d%26%238217%3Bannonce+d%26%238217%3Bimage+de+petit+poney+rose%2C+pour+coller+aux+th%C3%A8mes+du+poney%2C+de+django%2C...&amp;tags=blog" type="text/html" />
	</item>
		<item>
		<title>Django-ratelimit-backend ne rÃ©glera pas vos problÃ¨mes de foie, mais de rate oui&#8230;</title>
		<link>http://j-mad.com/blog/2011/11/01/django-ratelimit-backend-ne-reglera-pas-vos-problemes-de-foie-mais-de-rate-oui/</link>
		<comments>http://j-mad.com/blog/2011/11/01/django-ratelimit-backend-ne-reglera-pas-vos-problemes-de-foie-mais-de-rate-oui/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 22:42: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>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1754</guid>
		<description><![CDATA[DeuxiÃ¨me Ã©dition de la django app du mois prÃ©cÃ©dent, encore une fois sur le fil, alors que les citrouilles continuent Ã  ricaner dans leurs coins. Ce mois-ci c&#8217;est django-ratelimit-backend, une des multiples apps de monsieur Brutasse (qui ne doit jamais dormir pour publier autant de truc&#8230;) 1- OÃ¹ on le trouve, comment on lâ€™installe, tout <a href='http://j-mad.com/blog/2011/11/01/django-ratelimit-backend-ne-reglera-pas-vos-problemes-de-foie-mais-de-rate-oui/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>DeuxiÃ¨me Ã©dition de la django app du mois prÃ©cÃ©dent, encore une fois sur le fil, alors que les citrouilles continuent Ã  ricaner dans leurs coins. Ce mois-ci c&#8217;est <a href="https://github.com/brutasse/django-ratelimit-backend" target="_blank">django-ratelimit-backend</a>, une des multiples apps de monsieur <a href="https://twitter.com/brutasse" target="_blank">Brutasse</a> (qui ne doit jamais dormir pour publier autant de truc&#8230;)</p>
<p>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</p>
<p>Deux possibilitÃ©s pour le trouver, sur sa page <a href="https://github.com/brutasse/django-ratelimit-backend" target="_blank">github</a> (on regrettera le choix de github et non bitbucket mais bon:) )Â  ou sur sa page <a href="http://pypi.python.org/pypi/django-ratelimit-backend/0.1" target="_blank">pypi</a>. Ce qui du coup vous permettra de l&#8217;installer de deux faÃ§onÂ :</p>
<ul>
<li>un petit git clone bien de chez nous</li>
<li>un simpleÂ : pip install django-ratelimit-backend</li>
</ul>
<p>La doc est dispo sur la page<a href="http://django-ratelimit-backend.readthedocs.org/en/latest/index.html" target="_blank"> readthedocs du projet</a>. Et elle est bien fournie. Une aide Ã  l&#8217;install, un quickstart et une section pour expliquer comment modifier le critÃ¨re de limitation et une rÃ©fÃ©rence complÃ¨te du code.</p>
<h1>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h1>
<p>A empÃªcher les vilains mÃ©chants pas beau de crier &#8216;des logins ou un sort&#8217; devant vos jolis sites webs Django. En clair, Ã  &#8216;bannir&#8217; pendant 5 minutes des IP qui auraient tentÃ©es de se logguer sur votre appli Ã  de trop nombreuses reprises.<br />
Les rÃ©glages de base sont :</p>
<ul>
<li>si tu tentes de te logguer 30 fois sans y arriver</li>
<li>dans une pÃ©riode de moins de 5 minutes</li>
<li>alors tu es bannis 5 minutes.</li>
</ul>
<h1>3- Comment Ã§a marcheÂ ?</h1>
<p>C&#8217;est relativement facile.<br />
PremiÃ¨re chose, il n&#8217;est mÃªme pas nÃ©cessaire d&#8217;ajouter l&#8217;app dans vos INSTALLED_APPS, Ã  part si vous voulez lancer les tests (vous pourrez alors installer tox si vous voulez tester avec toutes les versions de django)</p>
<p>Il vous faudra par contre ajouter un backend d&#8217;authentification Ã  savoirÂ :Â  &#8216;ratelimitbackend.backends.RateLimitModelBackend&#8217;.</p>
<p>Il vous faudra de plusÂ :</p>
<ul>
<li>utiliser la vue ratelimitbackend.views.login Ã  la place de django.contrib.auth.views.login</li>
<li>si vous utilisez l&#8217;admin, utiliser ratelimitbackend. admin au lieu de l&#8217;admin normal de django.</li>
<li>Ajouter le middleware ratelimitbackend.middleware.RateLimitMiddleware</li>
</ul>
<p>Vous pourrez bien entendu modifier les critÃ¨res de dÃ©tection de vilains. Pour cela il vous suffira d&#8217;implÃ©menter votre propre middleware (tout est bien expliquÃ© dans la doc, ne paniquez pas!)
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/11/01/django-ratelimit-backend-ne-reglera-pas-vos-problemes-de-foie-mais-de-rate-oui/" data-text="Django-ratelimit-backend ne rÃ©glera pas vos problÃ¨mes de foie, mais de rate oui&#038;%238230;"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1754&amp;md5=4db01d81571d0a66a38e7597cdb4dc90" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/11/01/django-ratelimit-backend-ne-reglera-pas-vos-problemes-de-foie-mais-de-rate-oui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F11%2F01%2Fdjango-ratelimit-backend-ne-reglera-pas-vos-problemes-de-foie-mais-de-rate-oui%2F&amp;language=fr_FR&amp;category=text&amp;title=Django-ratelimit-backend+ne+r%C3%A9glera+pas+vos+probl%C3%A8mes+de+foie%2C+mais+de+rate+oui%26%238230%3B&amp;description=Deuxi%C3%A8me+%C3%A9dition+de+la+django+app+du+mois+pr%C3%A9c%C3%A9dent%2C+encore+une+fois+sur+le+fil%2C+alors+que+les+citrouilles+continuent+%C3%A0+ricaner+dans+leurs+coins.+Ce+mois-ci+c%26%238217%3Best+django-ratelimit-backend%2C+une...&amp;tags=Django%2CPython%2Creview%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Sans lui, zinnia-rrivait pas. Lui quiÂ ? Django Zinnia, la django app du mois prÃ©cÃ©dent</title>
		<link>http://j-mad.com/blog/2011/09/30/sans-lui-zinnia-rrivait-pas-lui-qui%c2%a0-django-zinnia-la-django-app-du-mois-precedent/</link>
		<comments>http://j-mad.com/blog/2011/09/30/sans-lui-zinnia-rrivait-pas-lui-qui%c2%a0-django-zinnia-la-django-app-du-mois-precedent/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 21:59:56 +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=1695</guid>
		<description><![CDATA[Cela fait maintenant plusieurs mois que je n&#8217;arrive pas Ã  rattraper le retard d&#8217;une django app du mois. J&#8217;ai donc dÃ©cidÃ© de suivre les conseils de ce cher daks et d&#8217;officialiser mon retard en parlant de Django app du mois prÃ©cÃ©dent. Voici donc la premiÃ¨re django app du mois prÃ©cÃ©dent (et bon j&#8217;ai bien failli <a href='http://j-mad.com/blog/2011/09/30/sans-lui-zinnia-rrivait-pas-lui-qui%c2%a0-django-zinnia-la-django-app-du-mois-precedent/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Cela fait maintenant plusieurs mois que je n&#8217;arrive pas Ã  rattraper le retard d&#8217;une django app du mois. J&#8217;ai donc dÃ©cidÃ© de suivre les conseils de ce cher daks et d&#8217;officialiser mon retard en parlant de Django app du mois prÃ©cÃ©dent. Voici donc la premiÃ¨re django app du mois prÃ©cÃ©dent (et bon j&#8217;ai bien failli devoir parler de la django app d&#8217;il y a deux mois), Django Zinnia, un moteur de blog qu&#8217;il est bien (et merci Ã  <a href="http://twitter.com/#!/arcagenis/" target="_blank">arcagenis</a> pour la dÃ©couverte)</p>
<h1>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</h1>
<p>OÃ¹ est ce qu&#8217;on le trouve, sur son <a href="http://django-blog-zinnia.com/blog/" target="_blank">site web</a>, sa page <a href="http://pypi.python.org/pypi/django-blog-zinnia/0.9" target="_blank">pypi</a> et sa page <a href="https://github.com/Fantomas42/django-blog-zinnia" target="_blank">github</a>.</p>
<p>Pour l&#8217;installer, vous aurez plusieurs plusieurs solutionsÂ :</p>
<ul>
<li>un git clone tout simple</li>
<li>un petit pip install en utilisant le support git de pip</li>
<li>un petit easy_install ( ou pip install normal) pour avoir la derniÃ¨re version stable.</li>
</ul>
<p>Niveau dÃ©mo, il existe et c&#8217;est carrÃ©ment coolÂ :</p>
<ul>
<li>une dÃ©mo du rendu (qui sert Ã  hÃ©berger la doc)</li>
<li>une dÃ©mo de la version d&#8217;administration.</li>
<li>Un planet qui liste tous les blogs utilisant Zinnia</li>
</ul>
<p>Concernant la <a href="http://django-blog-zinnia.com/documentation/" target="_blank">doc</a>, elle est vraiment super bien foutue et trÃ¨s complÃ¨te. Installation, Configuration, Configuration avancÃ©e, extensibilitÃ©, etc etc â€¦ C&#8217;est vraiment une des meilleures docs d&#8217;application django que j&#8217;ai pu lire. Pour ne pas dire la meilleure d&#8217;ailleurs.</p>
<p>Cerise sur le gÃ¢teau, on peut mÃªme voir la <a href="http://django-blog-zinnia.com/documentation/coverage/" target="_blank">couverture de code des tests.</a></p>
<h1>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h1>
<p>Bon, je l&#8217;ai dit c&#8217;est un moteur de blog. Donc on a des catÃ©gories, des billets, des tags, et des flux RSS.</p>
<p>Mais ce n&#8217;est pas tout, Zinnia propose vraiment pas mal de petites fonctionnalitÃ©s qui en font un vrai moteur de blog, qui (et je le dis sincÃ¨rement) peut imaginer concurrencer certains moteurs de blogs php trÃ¨s connus.</p>
<p>Zinnia offre par exempleÂ :</p>
<ul>
<li>des url shortenners</li>
<li>de la publication de tweets automatique sur publication d&#8217;article</li>
<li>un moteur de recherche interne</li>
<li>dÃ©tection des spams avec askimet (ou autre)</li>
<li>des sitemap</li>
<li>des channels, un truc spÃ©cifique Ã  Zinnia</li>
<li>une extension facile, â€¦.</li>
</ul>
<p>Et si vous avez dÃ©jÃ  un blogÂ ? Genre WordPress ou BloggerÂ ?</p>
<p>Et ben Zinnia offre des moulinettes d&#8217;import / export. Et Ã§a, c&#8217;est vraiment terrible.</p>
<h1>3- Bon et en conclusionÂ ?</h1>
<p>Il y a a mon sens plein de bonnes idÃ©es dans ZinniaÂ :</p>
<ul>
<li>Les script d&#8217;import / export sont tout simplement un must have qui vont que l&#8217;on peut vraiment imaginer migrer un blog existant sous Zinnia.</li>
<li>Les channels qui permettent de rÃ©utiliser le moteur de recherche interne (qui utilise <a href="http://pyparsing.wikispaces.com/" target="_blank">pyparsing</a>) pour faire des recherches parmis les articles et en sortir une partie.</li>
<li>Les models qui sont bien fait, Ã  base de classe abstract et permettent de surcharger sans difficultÃ© les choses.</li>
<li>Il utilise south ce qui doit faciliter les migrations.</li>
</ul>
<p>A tout cela il faut ajouter le fait qu&#8217;il n&#8217;y est au final que peu de dÃ©pendances. Au niveau des apps django, il n&#8217;y a que deux dÃ©pendances obligatoiresÂ :</p>
<ul>
<li><a href="https://github.com/django-mptt/django-mptt/" target="_blank">django-mptt</a></li>
<li><a href="http://code.google.com/p/django-tagging/" target="_blank">django-tagging</a></li>
</ul>
<p>AprÃ¨s cela dÃ©pends des fonctionnalitÃ©s que vous voulez mettre en place, mais cela reste trÃ¨s light et trÃ¨s clair. (je ne parlerais pas par exemple de pinax qui en comparaison me fait l&#8217;effet d&#8217;une usine Ã  gaz).</p>
<p>Je vais donc suivre ce projet avec intÃ©rÃªt et mÃªme si je ne suis pas sur de passer tout de suite le mad blog en Zinnia, je vais en migrer d&#8217;autre d&#8217;ici quelques temps, Ã§a, c&#8217;est certain.
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/09/30/sans-lui-zinnia-rrivait-pas-lui-qui%c2%a0-django-zinnia-la-django-app-du-mois-precedent/" data-text="Sans lui, zinnia-rrivait pas. Lui quiÂ %3f Django Zinnia, la django app du mois prÃ©cÃ©dent"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1695&amp;md5=ae8d0b48525a73b49422c194923bc4d3" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/09/30/sans-lui-zinnia-rrivait-pas-lui-qui%c2%a0-django-zinnia-la-django-app-du-mois-precedent/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F09%2F30%2Fsans-lui-zinnia-rrivait-pas-lui-qui%25c2%25a0-django-zinnia-la-django-app-du-mois-precedent%2F&amp;language=fr_FR&amp;category=text&amp;title=Sans+lui%2C+zinnia-rrivait+pas.+Lui+qui%C2%A0%3F+Django+Zinnia%2C+la+django+app+du+mois+pr%C3%A9c%C3%A9dent&amp;description=Cela+fait+maintenant+plusieurs+mois+que+je+n%26%238217%3Barrive+pas+%C3%A0+rattraper+le+retard+d%26%238217%3Bune+django+app+du+mois.+J%26%238217%3Bai+donc+d%C3%A9cid%C3%A9+de+suivre+les+conseils+de+ce+cher+daks+et...&amp;tags=blog" type="text/html" />
	</item>
		<item>
		<title>Django-Autocomplete, and all your requests will be complete, but  be careful with the horn</title>
		<link>http://j-mad.com/blog/2011/08/20/django-autocomplete-and-all-your-requests-will-be-complete-but-be-careful-with-the-horn/</link>
		<comments>http://j-mad.com/blog/2011/08/20/django-autocomplete-and-all-your-requests-will-be-complete-but-be-careful-with-the-horn/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 23:33: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>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1598</guid>
		<description><![CDATA[Bon, je suis encore en retard pour la django app du mois de juillet, mais je m&#8217;amÃ©liore, je n&#8217;ai plus que 20 jours de retard. EspÃ©rons que la django app du mois d&#8217;aout soit Ã  l&#8217;heure&#8230;. En attendant de voir si en aoÃ»t, Ã  l&#8217;heure je serais, je vous propose de dÃ©couvrir cette petite django-app <a href='http://j-mad.com/blog/2011/08/20/django-autocomplete-and-all-your-requests-will-be-complete-but-be-careful-with-the-horn/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Bon, je suis encore en retard pour la django app du mois de juillet, mais je m&#8217;amÃ©liore, je n&#8217;ai plus que 20 jours de retard.</p>
<p>EspÃ©rons que la django app du mois d&#8217;aout soit Ã  l&#8217;heure&#8230;. En attendant de voir si en aoÃ»t, Ã  l&#8217;heure je serais, je vous propose de dÃ©couvrir cette petite django-app bien sympatique.</p>
<p>Mais avant un peu de contexte. Je cherche depuis quelques temps une django app pour faire de l&#8217;autocompletion. <a href="http://djangopackages.com" target="_blank">Djangopackages</a> qui est dÃ©cidÃ©ment trÃ¨s souvent mon ami propose un <a href="http://djangopackages.com/grids/g/auto-complete/" target="_blank">tableau rÃ©capitulatif assez sympa d&#8217;un certain nombre d&#8217;app qui propose cela</a>.</p>
<p>Parmi la liste, j&#8217;ai dÃ©cidÃ© de tester <a href="https://bitbucket.org/tyrion/django-autocomplete" target="_blank">django-autocomplete</a> qui me paraissait le mieux rÃ©pondre Ã  mes besoin, Ã  savoir de l&#8217;autocomplete facile cotÃ© admin, comme cotÃ© site non admin.</p>
<p>NouveautÃ© ce mois si au niveau du billet, je vais vous prÃ©senter deux versions de l&#8217;app Ã  savoir la <a href="https://bitbucket.org/tyrion/django-autocomplete" target="_blank">version &#8216;officielle&#8217; faite par tyrion</a> et un <a href="https://bitbucket.org/etienned/django-autocomplete" target="_blank">fork fait par etienned</a>. Pourquoi vous prÃ©sentez deux versions&nbsp;? Parce que la version d&#8217;etienned propose quelques amÃ©liorations visuelles intÃ©ressantes (et quelques petits refactor pas dÃ©biles).</p>
<h1>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)&nbsp;?</h1>
<p>Ici cela dÃ©pends de la version que vous dÃ©sirez tester de django-autocomplete. Si vous voulez tester la <a href="https://bitbucket.org/tyrion/django-autocomplete" target="_blank">version premiÃ¨re de tyrion</a> alors vous avez&nbsp; deux possibilitÃ©&nbsp;:</p>
<ul>
<li>par un petit hg clone Ã  partir de sa page bitbucket</li>
<li>en utilisant easy_install ou pip.</li>
</ul>
<p>Par contre pour la version <a href="https://bitbucket.org/etienned/django-autocomplete" target="_blank">d&#8217;etienned</a>, pas de package, donc pas d&#8217;easy_install ou de pip, il n&#8217;y a qu&#8217;une solution, un bon vieux hg clone</p>
<p>Chose suffisamment rare pour qu&#8217;elle soit mis en avant, il y a une dÃ©mo de la version premiÃ¨re, que vous pourrez tester <a href="http://autocomplete.ep.io/example/" target="_blank">ici</a>.</p>
<p>Concernant la doc, pour les deux versions, tout se trouve dans bitbucket.</p>
<ul>
<li>Dans la version de tyrion vous aurez droit au fichier <a href="https://bitbucket.org/tyrion/django-autocomplete/src/fef4e822ff0f/README.rst" target="_blank">Readme</a> et au <a href="https://bitbucket.org/tyrion/django-autocomplete/wiki/Home" target="_blank">wiki</a>.</li>
<li>Dans la version d&#8217;etienned il n&#8217;y a que le fichier Readme qui est composÃ© en grande partie du descriptif des addons que propose ce fork (et qui se finit par un exemple d&#8217;utilisation dans l&#8217;admin).</li>
</ul>
<p>Est ce que c&#8217;est suffisant&nbsp;? Si vous envisagez de n&#8217;utiliser l&#8217;autocomplÃ©tion que dans la partie admin, clairement oui. Sinon alors lÃ , clairement non. Vraiment pas mÃªme. Et Ã  vous les joies de la lecture du code source pour comprendre comment cela fonctionne (ou alors vous pouvez continuer Ã  lire mon billet et voir comment tout cela fonctionne dans la partie 3 <img src='http://j-mad.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<h1>2- Mais au fait, Ã  quoi Ã§a sert&nbsp;?</h1>
<p>Tout simplement Ã  proposer un mÃ©canisme d&#8217;autocomplÃ©tion sur les champs texte ou Int mais aussi&nbsp; les foreignkey et les manytomany. Et qui, cerise sur le gÃ¢teau, ce veut simple au niveau de son dÃ©ploiement</p>
<p>Et Ã  le faire d&#8217;une faÃ§on un peu &#8216;magique&#8217;. On dÃ©clare seulement quels sont les models qui mettront en place l&#8217;autocomplÃ©tion et pour lesquels de leur champs. Et aprÃ¨s tout ce fait presque tout seul (en tout cas pour la mise en place des urls qui permettent de retourner le rÃ©sultat du filtrage en fonction des caractÃ¨res tapÃ©s, c&#8217;est tout automatique).</p>
<h1>3- Comment Ã§a marche&nbsp;?</h1>
<p>C&#8217;est presque tout simple.&nbsp; En tout cas si vous voulez intÃ©grer django-autcomplete dans l&#8217;admin.</p>
<p>Imaginons que vous vouliez autocomplete les auteurs de bouquin dans une app de critique de livre.</p>
<p>Vous allez commencer par dÃ©clarer une classe qui configure votre autocomplete&nbsp;:</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> autocomplete.<span style="color: black;">views</span> <span style="color: #ff7700;font-weight:bold;">import</span> AutocompleteSettings<br />
<span style="color: #ff7700;font-weight:bold;">class</span> AuthorAutocomplete<span style="color: black;">&#40;</span>AutocompleteSettings<span style="color: black;">&#41;</span>:<br />
search_fields <span style="color: #66cc66;">=</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">'^first_name'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'^last_name'</span><span style="color: black;">&#41;</span></div></div>
<p>Ensuite&nbsp;?</p>
<p>Vous dÃ©clarez simplement oÃ¹ vous voulez utiliser votre autocomplete. En partant du principe que votre model pour les reviews de bouquin s&#8217;appelle Reviews et que le champ pour l&#8217;autheur du bouquin s&#8217;appelle book_author cela donnera cela&nbsp;:</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> autocomplete.<span style="color: black;">views</span> <span style="color: #ff7700;font-weight:bold;">import</span> autocomplete<br />
autocomplete.<span style="color: black;">register</span><span style="color: black;">&#40;</span>Reviews.<span style="color: black;">book_author</span><span style="color: #66cc66;">,</span> AuthorAutocomplete<span style="color: black;">&#41;</span></div></div>
<p>et voilÃ . C&#8217;est fini. Vous avez dans votre admin, un champ ForeignKey en autocomplÃ©tion. Et sans forcer.</p>
<p>En lisant la doc vous verrez que l&#8217;on peut faire de faÃ§on diffÃ©rente, spÃ©cifier le queryset sur lequel on veut limiter l&#8217;autocomplete, etc etc â€¦</p>
<p>Maintenant, qu&#8217;est ce qui se passe si vous voulez mettre un peu d&#8217;autocomplÃ©tion dans votre site version pas admin&nbsp;?</p>
<p>Hum ben lÃ , c&#8217;est pas beaucoup plus compliquÃ© en fait. Le problÃ¨me est juste qu&#8217;il n&#8217;existe pas de doc.<br />
Mais si vous farfouillez dans le code vous verrez qu&#8217;il existe une classe de widget (AutocompleteWidget qui se trouve dans&nbsp; autocomplete.widgets qui permet de mettre en place l&#8217;autocomplÃ©tion).</p>
<p>Il vous suffit alors dans votre formulaire, de rajouter le paramÃªtre widget Ã  votre Field et de lui passer un AutocompleteWidget (qui a lui mÃªme en paramÃ¨tre le champ qui mettra en place l&#8217;autocomplÃ©tion).</p>
<p>Si l&#8217;on reprend l&#8217;exemple d&#8217;au dessus on pourrait avoir quelque chose ressemblant Ã  cela&nbsp;:</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> ReviewForm<span style="color: black;">&#40;</span>forms.<span style="color: black;">ModelForm</span><span style="color: black;">&#41;</span>:<br />
author <span style="color: #66cc66;">=</span> forms.<span style="color: black;">ChoiceField</span><span style="color: black;">&#40;</span>widget<span style="color: #66cc66;">=</span>AutocompleteWidget<span style="color: black;">&#40;</span>Review.<span style="color: black;">book_author</span> <span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></div></div>
<p>Il y a bien Ã©videment le widget qui va bien pour la version multiple sÃ©lection (MultipleAutocompleteWidget)</p>
<p>Et si l&#8217;on continue Ã  fouiller un peu plus, dans utils, on trouvera une trÃ¨s sympathique autocompleteform_factory qui permet de gÃ©nÃ©rer un form en prenant un paramÃ¨tre le Model qui va bien, un dictionnaire listant les champs implÃ©mentant l&#8217;autocomplÃ©tion<br />
ainsi que les champs Ã  exclure.</p>
<h1>4 conclusion et tips.</h1>
<p>J&#8217;ai eu quelques problÃ¨mes lors de mes tests lorsque j&#8217;ai voulu installer django-autocomplete en temps qu&#8217;app dans le rÃ©pertoire de mon projet et pas dans mon pythonpath. J&#8217;avais des phÃ©nomÃ¨nes bizarre de double exÃ©cution de code qui me donnais de jolies exception. Je n&#8217;ai pas vraiment rÃ©ussi Ã  comprendre le pourquoi du comment ni pourquoi en sortant simplement l&#8217;app du rÃ©pertoire de mon projet cela se mettait Ã  fonctionner parfaitement&#8230;</p>
<p>Pour ceux qui utilisent grappeli, je viens de voir qu&#8217;il existait un fork de<a href="https://bitbucket.org/dwaiter/django-autocomplete-grappelli" target="_blank"> django-autocomplete</a> pour en faciliter l&#8217;intÃ©gration. Mais par contre, lÃ , je n&#8217;ai pas du tout essayÃ©.</p>
<p>Ha et pour finir, le titre est une rÃ©fÃ©rence un peu obscure Ã  un film avec Jack Black:).
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/08/20/django-autocomplete-and-all-your-requests-will-be-complete-but-be-careful-with-the-horn/" data-text="Django-Autocomplete, and all your requests will be complete, but%2520be careful with the horn"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1598&amp;md5=38d9c06c803de5fc545baac75f968bb8" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/08/20/django-autocomplete-and-all-your-requests-will-be-complete-but-be-careful-with-the-horn/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F08%2F20%2Fdjango-autocomplete-and-all-your-requests-will-be-complete-but-be-careful-with-the-horn%2F&amp;language=fr_FR&amp;category=text&amp;title=Django-Autocomplete%2C+and+all+your+requests+will+be+complete%2C+but++be+careful+with+the+horn&amp;description=Bon%2C+je+suis+encore+en+retard+pour+la+django+app+du+mois+de+juillet%2C+mais+je+m%26%238217%3Bam%C3%A9liore%2C+je+n%26%238217%3Bai+plus+que+20+jours+de+retard.+Esp%C3%A9rons+que+la+django+app...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Impostor, aucun rapport avec le courrier, la poste ou les gens de petite taille</title>
		<link>http://j-mad.com/blog/2011/07/28/impostor-aucun-rapport-avec-le-courrier-la-poste-ou-les-gens-de-petite-taille/</link>
		<comments>http://j-mad.com/blog/2011/07/28/impostor-aucun-rapport-avec-le-courrier-la-poste-ou-les-gens-de-petite-taille/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 19:54:25 +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=1499</guid>
		<description><![CDATA[Avec Ã©normÃ©ment de retard (non monsieur Daks, je ne vais pas renommer ma rubrique la django app du mois dernier) voici donc la django app du mois de juin. Ce mois-ci, enfin le mois dernier, je vais vous prÃ©senter Impostor une application que j&#8217;ai dÃ©couvert au dÃ©tour d&#8217;un tweet (de dzen je crois ) 1- <a href='http://j-mad.com/blog/2011/07/28/impostor-aucun-rapport-avec-le-courrier-la-poste-ou-les-gens-de-petite-taille/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Avec Ã©normÃ©ment de retard (non monsieur <a href="https://twitter.com/daks_" target="_blank">Daks</a>, je ne vais pas renommer ma rubrique la django app du mois dernier) voici donc la django app du mois de juin.</p>
<p>Ce mois-ci, enfin le mois dernier, je vais vous prÃ©senter Impostor une application que j&#8217;ai dÃ©couvert au dÃ©tour d&#8217;un tweet (de <a href="https://twitter.com/dzen" target="_blank">dzen</a> je crois )</p>
<h1>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</h1>
<p>&nbsp;</p>
<p>Deux possibilitÃ© pour le trouver, sa page <a href="https://github.com/samastur/Impostor" target="_blank">github</a> ou sa page <a href="http://djangopackages.com/packages/p/impostor/" target="_blank">django packages</a>. Pas de page pypi, enfin pas encore, espÃ©rons qu&#8217;elle arrive vite.</p>
<p>Pour l&#8217;installer, pas le choix, il faut passer par github.<br />
Un petit git clone https://github.com/samastur/Impostor.git et c&#8217;est pliÃ©.</p>
<p>Quand Ã  la doc, Elle se limite au <a href="https://github.com/samastur/Impostor/blob/master/README.rst" target="_blank">readme.rst</a>. Mais cela suffit. Et puis le readme est bien clair. Il vous expliquera comment l&#8217;installer dans votre projet django et comment vous en servir (et puis si vous continuer Ã  lire, je vous l&#8217;expliquerais aussi)</p>
<h1>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h1>
<p>&nbsp;</p>
<p>Tout simplement Ã  se dÃ©guiser lorsque l&#8217;on se logue. D&#8217;ailleurs c&#8217;est un des meilleurs noms d&#8217;app django que j&#8217;ai pu croiser. DÃ©crivant Ã  la fois bien la finalitÃ© de l&#8217;app tout en Ã©tant rigolo.</p>
<p>Impostor vous permettra donc, si vous avez un login staff member de vous loguer en temps qu&#8217;un au tre utilisateur. Vous verrez donc l&#8217;appli comme il la voit, vous pourrez interagir avec django en Ã©tant considÃ©rÃ© comme l&#8217;utilisateur dont vous avez prit les traits (enfin le login).</p>
<h1>3- Comment Ã§a marcheÂ ?</h1>
<p>C&#8217;est tout simple.<br />
Il suffit d&#8217;ajouter un backend d&#8217;authentification Ã  votre application django, Ã  savoir &#8216;impostor.backend.AuthBackend&#8217;</p>
<p>ce qui doit vous donner quelque chose ressemblant Ã Â :</p>
<pre>
 AUTHENTICATION_BACKENDS = (
 'django.contrib.auth.backends.ModelBackend',
 'impostor.backend.AuthBackend',
 )</pre>
<p>et bien entendu il faut ajouter &#8216;impostor&#8217; Ã  vos INSTALLED_APPS</p>
<p>EnsuiteÂ ?</p>
<p>Un simple petit syncdb et c&#8217;est fini, vous allez pouvoir vous dÃ©guiser en un de vos utilisateurs. CommentÂ ?<br />
Au lieu de vous loguer avec votre login il vous suffira de vous loguer ainsiÂ :</p>
<pre>
 votrelogin as leloginquevousvoulezdevenir</pre>
<p>&nbsp;</p>
<p>et de taper votre password.
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/07/28/impostor-aucun-rapport-avec-le-courrier-la-poste-ou-les-gens-de-petite-taille/" data-text="Impostor, aucun rapport avec le courrier, la poste ou les gens de petite taille"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1499&amp;md5=8fcf70fbca716e51f44063aca3c2ff41" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/07/28/impostor-aucun-rapport-avec-le-courrier-la-poste-ou-les-gens-de-petite-taille/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F07%2F28%2Fimpostor-aucun-rapport-avec-le-courrier-la-poste-ou-les-gens-de-petite-taille%2F&amp;language=fr_FR&amp;category=text&amp;title=Impostor%2C+aucun+rapport+avec+le+courrier%2C+la+poste+ou+les+gens+de+petite+taille&amp;description=Avec+%C3%A9norm%C3%A9ment+de+retard+%28non+monsieur+Daks%2C+je+ne+vais+pas+renommer+ma+rubrique+la+django+app+du+mois+dernier%29+voici+donc+la+django+app+du+mois+de+juin.+Ce...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Django-urlcrypt, aprÃ¨s les contes c&#8217;est l&#8217;url de la crypte.</title>
		<link>http://j-mad.com/blog/2011/06/04/django-urlcrypt-apres-les-contes-cest-lurl-de-la-crypte/</link>
		<comments>http://j-mad.com/blog/2011/06/04/django-urlcrypt-apres-les-contes-cest-lurl-de-la-crypte/#comments</comments>
		<pubDate>Sat, 04 Jun 2011 15:26:46 +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=1463</guid>
		<description><![CDATA[Voila, comme dit dans le billet prÃ©cÃ©dent, je vais donc faire deux billets de django app de mai, Ã§a m&#8217;apprendra Ã  Ãªtre en retard. Donc la deuxiÃ¨me django app du mois sera django-urlcrypt. Une petite prÃ©cision avant d&#8217;aller plus loin, c&#8217;est une des toutes premiÃ¨res fois oÃ¹ je vais parler d&#8217;une app sans avoir fait <a href='http://j-mad.com/blog/2011/06/04/django-urlcrypt-apres-les-contes-cest-lurl-de-la-crypte/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Voila, comme dit dans le billet prÃ©cÃ©dent, je vais donc faire deux billets de django app de mai, Ã§a m&#8217;apprendra Ã  Ãªtre en retard.</p>
<p>Donc la deuxiÃ¨me django app du mois sera django-urlcrypt. Une petite prÃ©cision avant d&#8217;aller plus loin, c&#8217;est une des toutes premiÃ¨res fois oÃ¹ je vais parler d&#8217;une app sans avoir fait plus que la tester sur un projet de test, sans avoir d&#8217;idÃ©e prÃ©cise de oÃ¹ ni comment je vais l&#8217;utiliser &#8216;en vrai&#8217;.</p>
<h1>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</h1>
<p>Alors on le trouve soit sur sa page <a title="django-urlcrypt" href="http://pypi.python.org/pypi/django-urlcrypt" target="_blank">pypi</a> soit sur sa page <a title="django-urlcrypt" href="https://github.com/dziegler/django-urlcrypt" target="_blank">github</a>.</p>
<p>Pour l&#8217;installation lÃ  encore, les trois moyens habituelsÂ :</p>
<ul>
<li> par easy_install</li>
<li> pip</li>
<li> un petit git clone des familles</li>
</ul>
<p>La doc, lÃ  c&#8217;est comme l&#8217;app prÃ©cÃ©dente, elle est limitÃ©e au contenu de la page de pypi ou au fichier <a title="readme" href="https://github.com/dziegler/django-urlcrypt#readme" target="_blank">Readme.rst</a>.</p>
<p>Bon alors c&#8217;est vrai que la doc est suffisante pour comprendre comment l&#8217;app marche, mais sur une app qui est aussi &#8216;sensible&#8217;, une bonne lecture du code ne fait pas de mal (c&#8217;est d&#8217;ailleurs ce que j&#8217;ai fait quand j&#8217;ai commencÃ© Ã  faire joujou avec).</p>
<h1>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h1>
<p>En fait l&#8217;app a deux utilitÃ© mÃªme si une seule est vraiment mise en avant sur la doc de l&#8217;app. La premiÃ¨re c&#8217;est de fournir aux utilisateurs une url ressemblant Ã  Ã§a :Â  http://www.mydomain.com/r/TkNJBkNFAghDWkdFGPUAQEfcDUJfEBIREgEUFl1BQ18IQkdDUUcPSh4ADAYAWhYKHh8KHBsHEw qui les authentifiera automatiquement et qui en plus les redirigera vers l&#8217;url que vous aurez voulu.Â  (genre le renvoyer sur /profil ou /inbox)</p>
<p>L&#8217;autre fonctionnalitÃ© moins mise en avant, c&#8217;est que l&#8217;on peut encoder des infos dans l&#8217;url, dans un message qui se trouve Ãªtre un dictionnaire. Alors honnÃªtement je ne sais pas trop encore Ã  quoi cela peut servir, mais je trouve l&#8217;idÃ©e coolos.</p>
<h1>3- Comment Ã§a marcheÂ ?</h1>
<p>C&#8217;est tout simple.</p>
<p>Dans une vue, on peut utiliser la fonction urlcrypt.generate_login_token qui prend en param l&#8217;utilisateur et l&#8217;url de redirect et qui gÃ©nÃ©re le token qui encode le tout. Ensuite il suffit de crÃ©er l&#8217;url complÃ¨te qui va bien.</p>
<p>Dans un template, on utilise le template tags encoded_url qui prend comme argument un user et une url de redirect.</p>
<p>Enfin on peut utiliser les fonctions urlcrypt.encode_token et urlcrypt.decode_token<br />
qui permettront de crypter / dÃ©crypter un message contenu dans un dictionnaire (voir l&#8217;aide pour plus d&#8217;infos).</p>
<p>Au niveau des configurations possibles, on peut configurerÂ :</p>
<ul>
<li> Ã  combien de requÃªtes Ã  droit un visiteur</li>
<li> l&#8217;url de fallblack si l&#8217;authentification contenu dans l&#8217;url echoue</li>
<li> un path vers une clÃ© privÃ©e RSA qui permettra d&#8217;ajouter un cryptage RSA lorsque l&#8217;on gÃ©nÃ¨re le token.Â  L&#8217;utilisation de ce paramÃ¨tre est trÃ¨s trÃ¨s fortement recommandÃ© (pour rappel pour gÃ©nÃ©rÃ© le clÃ©Â : ssh-keygen -t rsa -f  )</li>
</ul>
<h1>4- conclusion</h1>
<p>Le mÃ©canisme de login par url cryptÃ©e me sÃ©duit beaucoup. Mais d&#8217;un autre cotÃ© je me pose des questions au niveau sÃ©curitÃ©. Parce que l&#8217;url, l&#8217;utilisateur il va devoir la stocker. Et qu&#8217;autant mÃ©moriser un mot de passe, on peut le faire, autant apprendre une url&#8230;, qu&#8217;en pensez vousÂ ?</p>
<p>La question de la durÃ©e de vie de l&#8217;url me semble aussi importante. J&#8217;aurais aimÃ© avoir dans l&#8217;app un systÃ¨me qui permette de rendre des url obsolÃ¨tes parce que trop vieilles..</p>
<p>Enfin concernant la deuxiÃ¨me mÃ©thode d&#8217;utilisation, Ã  savoir encoder des messages dans l&#8217;url, je trouve l&#8217;idÃ©e ravissante, j&#8217;ai envie de l&#8217;utiliser mais je ne sais pas Ã  quoi elle pourrait bien me servir. A rÃ©flÃ©chir donc.</p>
<p>&nbsp;</p>
<h2><span style="color: #ff0000;">UPDATE:</span></h2>
<p>on vient de me pointer quelques problÃ¨mes qui existent avec cette app (<a href="http://www.reddit.com/r/django/comments/e040c/djangourlcrypt/">discussion visible ici</a>) Apparement un des problÃ¨mes a Ã©tÃ© rÃ©glÃ© en utilisant RSA (mais son utilisation n&#8217;est toujours pas obligatoire) mais il me semble que le hash du password est toujours utilisÃ© dans certain cas. Ce qui n&#8217;est vraiment pas une bonne idÃ©e. En l&#8217;Ã©tat l&#8217;app n&#8217;est donc pas forcÃ©ment Ã  utiliser, mais plutÃ´t Ã  Ã©tudier pour imaginer son propre systÃ¨me.</p>
<p>&nbsp;
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/06/04/django-urlcrypt-apres-les-contes-cest-lurl-de-la-crypte/" data-text="Django-urlcrypt, aprÃ¨s les contes c&#038;%238217;est l&#038;%238217;url de la crypte."data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1463&amp;md5=b50a2fdf9bafa52eb8f996147905dbf0" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/06/04/django-urlcrypt-apres-les-contes-cest-lurl-de-la-crypte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F06%2F04%2Fdjango-urlcrypt-apres-les-contes-cest-lurl-de-la-crypte%2F&amp;language=fr_FR&amp;category=text&amp;title=Django-urlcrypt%2C+apr%C3%A8s+les+contes+c%26%238217%3Best+l%26%238217%3Burl+de+la+crypte.&amp;description=Voila%2C+comme+dit+dans+le+billet+pr%C3%A9c%C3%A9dent%2C+je+vais+donc+faire+deux+billets+de+django+app+de+mai%2C+%C3%A7a+m%26%238217%3Bapprendra+%C3%A0+%C3%AAtre+en+retard.+Donc+la+deuxi%C3%A8me+django+app+du...&amp;tags=blog" type="text/html" />
	</item>
		<item>
		<title>Django-countries ,l&#8217;app garantie sans cowboy ni rodÃ©o. djangoApp de mai 1 sur 2</title>
		<link>http://j-mad.com/blog/2011/06/04/django-countries-lapp-garantie-sans-cowboy-ni-rodeo-djangoapp-de-mai-1-sur-2/</link>
		<comments>http://j-mad.com/blog/2011/06/04/django-countries-lapp-garantie-sans-cowboy-ni-rodeo-djangoapp-de-mai-1-sur-2/#comments</comments>
		<pubDate>Sat, 04 Jun 2011 13:29:33 +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=1459</guid>
		<description><![CDATA[Il va falloir que je me surveille .. parce qu&#8217;encore une fois je publie ma django app du mois un peu en retard. Pas grand chose, juste 4 jours.. Mais Ã§a commence comme Ã§a et aprÃ¨s on finit par ne plus tenir de rythme du tout. Du coup, pour marquer, le coup, je publierais deux <a href='http://j-mad.com/blog/2011/06/04/django-countries-lapp-garantie-sans-cowboy-ni-rodeo-djangoapp-de-mai-1-sur-2/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Il va falloir que je me surveille .. parce qu&#8217;encore une fois je publie ma django app du mois un peu en retard. Pas grand chose, juste 4 jours.. Mais Ã§a commence comme Ã§a et aprÃ¨s on finit par ne plus tenir de rythme du tout.</p>
<p>Du coup, pour marquer, le coup, je publierais deux django app du mois de mai, mÃªme si je les publie en juin.</p>
<p>Et pour commencer, django-countries. C&#8217;est d&#8217;ailleurs assez rigolo parce que je parlais il y a peu de moyen de gÃ©rer les pays, avec une liste de choix existantes, etc.. et op, je tombe sur django-countries.</p>
<h1>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</h1>
<p>Vous trouverez django-countries soit sur sa page <a href="http://pypi.python.org/pypi/django-countries">pypi</a> soit sur sa page <a title="django-countries" href="https://bitbucket.org/smileychris/django-countries/">bitbucket</a>.</p>
<p>Pour l&#8217;installation, vous avez les trois moyens dÃ©sormais classiqueÂ :</p>
<ul>
<li> un easy_install</li>
<li> un pip install</li>
<li> un bon vieux hg clone</li>
</ul>
<p>La doc elle se limite Ã Â :</p>
<ul>
<li> la page pypi</li>
<li> le readme du repository</li>
</ul>
<p>Sachant que dans les deux cas, le contenu est le mÃªme. Mais vu la simplicitÃ© de l&#8217;app, cela suffit amplement.</p>
<h1>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h1>
<p>L&#8217;app rajoute tout simplement un nouveau type de field, le CountryField. Ce CountryField vous permettra de gÃ©rer les codes Ã  2 lettres internationaux qui modÃ©lisent les pays mais aussi d&#8217;afficher un petit gif du drapeau qui va bien.</p>
<p>Et oui, comme dans les vrais sites et tout quoi.</p>
<h1>3- Comment Ã§a marcheÂ ?</h1>
<p>C&#8217;est donc vraiment tout couillon. Un field CountryField. Et des instances de fiels qui ont les donnÃ©es membreÂ :</p>
<ul>
<li> code (le code Ã  deux lettres)</li>
<li> name (le vrai nom du pays)</li>
<li> flag (le chemin vers le drapeau)</li>
</ul>
<p>Rien de bien compliquÃ©.
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/06/04/django-countries-lapp-garantie-sans-cowboy-ni-rodeo-djangoapp-de-mai-1-sur-2/" data-text="Django-countries ,l&#038;%238217;app garantie sans cowboy ni rodÃ©o. djangoApp de mai 1 sur 2"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1459&amp;md5=8d3e9f470c3a3c7476a312cc2170594c" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/06/04/django-countries-lapp-garantie-sans-cowboy-ni-rodeo-djangoapp-de-mai-1-sur-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F06%2F04%2Fdjango-countries-lapp-garantie-sans-cowboy-ni-rodeo-djangoapp-de-mai-1-sur-2%2F&amp;language=fr_FR&amp;category=text&amp;title=Django-countries+%2Cl%26%238217%3Bapp+garantie+sans+cowboy+ni+rod%C3%A9o.+djangoApp+de+mai+1+sur+2&amp;description=Il+va+falloir+que+je+me+surveille+..+parce+qu%26%238217%3Bencore+une+fois+je+publie+ma+django+app+du+mois+un+peu+en+retard.+Pas+grand+chose%2C+juste+4+jours..+Mais...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Admin django, deux petits tips pour les change_list</title>
		<link>http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/</link>
		<comments>http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/#comments</comments>
		<pubDate>Tue, 03 May 2011 21:57:40 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1403</guid>
		<description><![CDATA[L&#8217;admin django est vraiment un bonheur pour la productivitÃ©. On peut faire plein de choses en moins de temps qu&#8217;il n&#8217;en faut pour Ã©crire le descriptif des choses en questions. AprÃ¨s avoir passÃ© quelques heures Ã  farfouiller dans la doc et Ã  faire quelques tests, je me suis dit qu&#8217;il n&#8217;y avait pas de raisons <a href='http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>L&#8217;admin django est vraiment un bonheur pour la productivitÃ©. On peut faire plein de choses en moins de temps qu&#8217;il n&#8217;en faut pour Ã©crire le descriptif des choses en questions.</p>
<p>AprÃ¨s avoir passÃ© quelques heures Ã  farfouiller dans la doc et Ã  faire quelques tests, je me suis dit qu&#8217;il n&#8217;y avait pas de raisons que je garde mes dÃ©couvertes pour moi.</p>
<p>Voici donc un premier billet pour partager les plus utiles avec vous.</p>
<h2>list_display, comment changer l&#8217;entÃªte d&#8217;une colonne fonction.</h2>
<p>On sait tous comment configurer les colonnes que l&#8217;on va afficher dans la vue en liste des content_type. En utilisant list_display. Mais est ce que cela ne vous ai jamais arrivÃ© de vouloir afficher le rÃ©sultat d&#8217;une fonction&nbsp;?</p>
<p>Aucun problÃ¨me, il suffit de mettre le nom de la fonction dans list_display. Oui c&#8217;est vrai, sauf que.. sauf que l&#8217;entÃªte de colonne c&#8217;est le nom de la fonction.. Et Ã§a, ce n&#8217;est pas trÃ¨s joli.</p>
<p>Sauf que, sauf que django pense Ã  tout. Pour pouvoir afficher un intitulÃ© de colonne sympa au lieu du nom de la fonction, il suffit de rajouter Ã  votre fonction un attribut short_description qui contiendra l&#8217;intitulÃ© voulu.</p>
<p>Un petit exemple&nbsp;:</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> TestAdmin <span style="color: black;">&#40;</span>admin.<span style="color: black;">ModelAdmin</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; list_display <span style="color: #66cc66;">=</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">'name'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'foo'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'bar'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'super_function'</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Test <span style="color: black;">&#40;</span>model.<span style="color: black;">Models</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; â€¦<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> super_function<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; â€¦.<br />
&nbsp; &nbsp;<span style="color: black;">super_function</span>.<span style="color: black;">short_description</span> <span style="color: #66cc66;">=</span>u<span style="color: #483d8b;">'mon intitulÃ© de colonne qui tue'</span></div></div>
<h2>list_display, comment utiliser du HTML dans les colonnes .</h2>
<p>De mÃªme, il se peut que votre super fonction qui tue, renvoie non pas une valeur simple (genre un nombre) mais du code html (que vous aurez bien entendu gÃ©nÃ©rÃ© avec un template). Sauf que lÃ , oh rage, oh dÃ©sespoir. Vous avez beau faire tout les mark_safe du monde, rien n&#8217;y fait. Votre code est escaped&#8230;</p>
<p>Comment modifier Ã§a&nbsp;? La encore, Ã§a passe par un attribut de fonction, allow_tags qu&#8217;il vous suffira de mettre Ã  True. Et miracle, Ã§a fonctionne.
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/" data-text="Admin django, deux petits tips pour les change_list"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1403&amp;md5=116571d61cbe26c690a0bee38f7740b9" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F05%2F03%2Fadmin-django-deux-petits-tips-pour-les-change_list%2F&amp;language=fr_FR&amp;category=text&amp;title=Admin+django%2C+deux+petits+tips+pour+les+change_list&amp;description=L%26%238217%3Badmin+django+est+vraiment+un+bonheur+pour+la+productivit%C3%A9.+On+peut+faire+plein+de+choses+en+moins+de+temps+qu%26%238217%3Bil+n%26%238217%3Ben+faut+pour+%C3%A9crire+le+descriptif+des+choses+en+questions....&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Django-extended-choices, l&#8217;app qui te donne le choix (mais pas la date)</title>
		<link>http://j-mad.com/blog/2011/04/30/django-extended-choices-lapp-qui-te-donne-le-choix-mais-pas-la-date/</link>
		<comments>http://j-mad.com/blog/2011/04/30/django-extended-choices-lapp-qui-te-donne-le-choix-mais-pas-la-date/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 16:24:00 +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=1392</guid>
		<description><![CDATA[J&#8217;avais plein d&#8217;app possible Ã  prÃ©senter pour ce billet du mois d&#8217;avril. Mais en rÃ©flÃ©chissant, je me suis dit que la meilleure app possible Ã  prÃ©senter ce moi-si c&#8217;Ã©tait celle qui a Ã©tÃ© libÃ©rÃ© pendant les DjangoCongs Ã  savoir Django-extended-choices. Et en plus, ce qui est bien, c&#8217;est que comme c&#8217;est une toute petite app, <a href='http://j-mad.com/blog/2011/04/30/django-extended-choices-lapp-qui-te-donne-le-choix-mais-pas-la-date/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;avais plein d&#8217;app possible Ã  prÃ©senter pour ce billet du mois d&#8217;avril. Mais en rÃ©flÃ©chissant, je me suis dit que la meilleure app possible Ã  prÃ©senter ce moi-si c&#8217;Ã©tait celle qui a Ã©tÃ© libÃ©rÃ© pendant les DjangoCongs Ã  savoir Django-extended-choices.</p>
<p>Et en plus, ce qui est bien, c&#8217;est que comme c&#8217;est une toute petite app, Ã§a ne sera pas fatiguant du tout d&#8217;Ã©crire ce billet.</p>
<h2>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)&nbsp;?</h2>
<p>LÃ  c&#8217;est tout simple, on la trouve sur github. Et uniquement sur github. Quand Ã  la doc elle tient toute entiÃ¨re dans le fichier Readme.rst qui se trouve lui aussi sur github. (et vous la trouverez aussi en docstring de l&#8217;unique classe que contient l&#8217;app).</p>
<p>Pour l&#8217;installation il suffit ou plutÃ´t il faut forcÃ©ment, cloner le repo github.</p>
<h2>2- Mais au fait, Ã  quoi Ã§a sert&nbsp;?</h2>
<p>A gÃ©rer d&#8217;une maniÃ¨re propre les Choices que l&#8217;on peut avoir Ã  mettre en place dans les fields Django.&nbsp; Parce qu&#8217;il est vrai que la mÃ©thode normale, Ã  base de constantes que l&#8217;on ne sait pas trop oÃ¹ dÃ©clarer et de tuples de tuples, me si elle fonctionne bien, n&#8217;est pas super Ã©lÃ©gante.</p>
<p>L&#8217;app permet donc d&#8217;encapsuler tout Ã§a dans une belle petite classe</p>
<h2>3- Comment Ã§a marche&nbsp;?</h2>
<p>Bon la je vais, sans aucun remords, faire un petit copiÃ©/collÃ© de la doc. Parce que l&#8217;explication de comment Ã§a marche est trÃ¨s bien faite.</p>
<p>Donc en fait cela marche comme Ã§a&nbsp;:</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> extended_choices <span style="color: #ff7700;font-weight:bold;">import</span> Choices<br />
<br />
STATES <span style="color: #66cc66;">=</span> Choices<span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span><span style="color: #483d8b;">'ONLINE'</span><span style="color: #66cc66;">,</span> &nbsp;<span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'Online'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span><span style="color: #483d8b;">'DRAFT'</span><span style="color: #66cc66;">,</span> &nbsp; <span style="color: #ff4500;">2</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'Draft'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span><span style="color: #483d8b;">'OFFLINE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">3</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'Offline'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> ContentModel<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; title &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">=</span> models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length<span style="color: #66cc66;">=</span><span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; content &nbsp; &nbsp;<span style="color: #66cc66;">=</span> models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; state &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">=</span> models.<span style="color: black;">PositiveSmallIntegerField</span><span style="color: black;">&#40;</span>choices<span style="color: #66cc66;">=</span>STATES.<span style="color: black;">CHOICES</span><span style="color: #66cc66;">,</span> default<span style="color: #66cc66;">=</span>STATES.<span style="color: black;">DRAFT</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; related_to <span style="color: #66cc66;">=</span> models.<span style="color: black;">ManyToManyField</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'self'</span><span style="color: #66cc66;">,</span> through<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;ContentToContent&quot;</span><span style="color: #66cc66;">,</span> symmetrical<span style="color: #66cc66;">=</span><span style="color: #008000;">False</span><span style="color: #66cc66;">,</span> blank<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span> null<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> u<span style="color: #483d8b;">'Content &quot;%s&quot; (state=%s)'</span> % <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">title</span><span style="color: #66cc66;">,</span> STATES.<span style="color: black;">CHOICES_DICT</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">state</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> get_related_content<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">related_to</span>.<span style="color: black;">select_related</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>state<span style="color: #66cc66;">=</span>STATES.<span style="color: black;">ONLINE</span><span style="color: black;">&#41;</span></div></div>
<p>plutÃ´t clair non&nbsp;?</p>
<p>Et cela remplace ce code lÃ &nbsp;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">STATE_ONLINE  <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span><br />
STATE_DRAFT   <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span><br />
STATE_OFFLINE <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">3</span><br />
<br />
STATE_CHOICES <span style="color: #66cc66;">=</span> <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>STATE_ONLINE<span style="color: #66cc66;">,</span> &nbsp;<span style="color: #483d8b;">'Online'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>STATE_DRAFT<span style="color: #66cc66;">,</span> &nbsp; <span style="color: #483d8b;">'Draft'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>STATE_OFFLINE<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'Offline'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
<span style="color: black;">&#41;</span><br />
<br />
STATE_DICT <span style="color: #66cc66;">=</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>STATE_CHOICES<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> ContentModel<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; title &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">=</span> models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length<span style="color: #66cc66;">=</span><span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; content &nbsp; &nbsp;<span style="color: #66cc66;">=</span> models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; state &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">=</span> models.<span style="color: black;">PositiveSmallIntegerField</span><span style="color: black;">&#40;</span>choices<span style="color: #66cc66;">=</span>STATE_CHOICES<span style="color: #66cc66;">,</span> default<span style="color: #66cc66;">=</span>STATE_DRAFT<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; related_to <span style="color: #66cc66;">=</span> models.<span style="color: black;">ManyToManyField</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'self'</span><span style="color: #66cc66;">,</span> through<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;ContentToContent&quot;</span><span style="color: #66cc66;">,</span> symmetrical<span style="color: #66cc66;">=</span><span style="color: #008000;">False</span><span style="color: #66cc66;">,</span> blank<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span> null<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> u<span style="color: #483d8b;">'Content &quot;%s&quot; (state=%s)'</span> % <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">title</span><span style="color: #66cc66;">,</span> STATE_DICT<span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">state</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> get_related_content<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">related_to</span>.<span style="color: black;">select_related</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>state<span style="color: #66cc66;">=</span>STATE_ONLINE<span style="color: black;">&#41;</span></div></div>
<p>Personnellement, je trouve que la notation pointÃ©e&nbsp; STATES.CHOICES ou&nbsp; STATES.DRAFT est bien bien plus clair que la notation prÃ©cÃ©dente.</p>
<h4>Conclusion</h4>
<p>Une petite app qui ne fait qu&#8217;une chose mais qui le fait bien. A utiliser de partout donc. (Il ne manque juste que des tests ..:) ) .
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/04/30/django-extended-choices-lapp-qui-te-donne-le-choix-mais-pas-la-date/" data-text="Django-extended-choices, l&#038;%238217;app qui te donne le choix (mais pas la date)"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1392&amp;md5=81086c6fe609243dd56c0dd6a4992717" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/04/30/django-extended-choices-lapp-qui-te-donne-le-choix-mais-pas-la-date/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F04%2F30%2Fdjango-extended-choices-lapp-qui-te-donne-le-choix-mais-pas-la-date%2F&amp;language=fr_FR&amp;category=text&amp;title=Django-extended-choices%2C+l%26%238217%3Bapp+qui+te+donne+le+choix+%28mais+pas+la+date%29&amp;description=J%26%238217%3Bavais+plein+d%26%238217%3Bapp+possible+%C3%A0+pr%C3%A9senter+pour+ce+billet+du+mois+d%26%238217%3Bavril.+Mais+en+r%C3%A9fl%C3%A9chissant%2C+je+me+suis+dit+que+la+meilleure+app+possible+%C3%A0+pr%C3%A9senter+ce+moi-si+c%26%238217%3B%C3%A9tait+celle...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Djangocong 2.0, le bilan</title>
		<link>http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/</link>
		<comments>http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 10:15:49 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1375</guid>
		<description><![CDATA[4 jours aprÃ¨s la fin des Cong, il est temps pour moi de faire le bilan de cette deuxiÃ¨me est, en tout cas Ã  mon sens, excellente Ã©dition. Les Congs en quelques chiffresÂ : 11 confÃ©rences le matin 12 slots de barcamp l&#8217;aprÃ¨s-midi 1 app releasÃ©e durant les Congs 1 doc de bonne pratique lancÃ©e 75 <a href='http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>4 jours aprÃ¨s la fin des <a href="http://rencontres.django-fr.org/2011/">Cong</a>, il est temps pour moi de faire le bilan de cette deuxiÃ¨me est, en tout cas Ã  mon sens, excellente Ã©dition.</p>
<h2>Les Congs en quelques chiffresÂ :</h2>
<ul>
<li>11 confÃ©rences le matin</li>
<li>12 slots de barcamp l&#8217;aprÃ¨s-midi</li>
<li>1 <a href="https://github.com/twidi/django-extended-choices/">app releasÃ©e durant les Congs</a></li>
<li>1 <a href="http://www.trunat.fr/djangocong/html/">doc de bonne pratique lancÃ©e</a></li>
<li>75 personnes le samedi matin dans l&#8217;amphi, Ã  Ã©couter les confÃ©rences (un peu moins le dimanche matin, aprÃ¨s la soirÃ©e arrosÃ©e, parce que comme lÃ  dit un illustre inconnuÂ : &#8216;ce matin, on a 50% de perte)</li>
<li>3 repas complÃ©tement pris en charge par l&#8217;organisation</li>
<li>un peu plus de 100 dosettes de Senseo utilisÃ©s sur les deux jours (mais qu&#8217;une dizaine de sachet de thÃ©, on le sait tous, le cafÃ© est supÃ©rieur au thÃ©)</li>
<li>200 litres d&#8217;eau bus, au bas mot, parce que dans le sud, il fait chaud, CongÂ !</li>
<li>Quelques bonnes dizaines de coup de soleil, cadeau surprise pour ceux qui n&#8217;ont pas l&#8217;habitude du vrai soleil du vrai sud.</li>
<li>36 litres de biÃ¨res (edit : j&#8217;avais oubliÃ© les 6litres de guinness) et 20 litres de vin bu lors des 6h qu&#8217;Ã  durer la soirÃ©e du samedi soir. Et pourtant tout le monde est rentrÃ© sur ses jambes.</li>
<li>Un nombre de kilo de paella engloutis par nos estomacs,Â  qui fait juste peur. Comme quoi les poneys, ils ont bon appÃ©tit.</li>
<li>un article dans <a href="http://www.gnulinuxmag.com/">Linux Magazine</a> dans le prochain numÃ©ro.</li>
</ul>
<h2>Les Congs du point de vue d&#8217;un organisateur.</h2>
<p>La deuxiÃ¨me Ã©dition fut l&#8217;occasion d&#8217;essayer d&#8217;Ãªtre plus pro dans l&#8217;organisation des choses. Et je pense qu&#8217;on a fait plus qu&#8217;essayer.</p>
<ul>
<li> Plus de salles dont un amphi bien Ã©quipÃ© niveau son (Merci encore Ã  <a href="https://www.centrale-marseille.fr">l&#8217;Ã©cole centrale de Marseille</a> nous avoir accueilli pendant ces deux jours).</li>
<li> Plus de prÃ©paration au niveau des repas. On a remplacÃ© les rÃ©servations dans de multiples restos par des plateaux repas et des sandwitch livrÃ©s sur site, pour gagner du temps et permettre de continuer en mangeant les discussions entamÃ©es pendant les confs.</li>
<li> Une vrai prÃ©paration pour la soirÃ©e du samedi (Ã  <a href="http://laboate.com/">la Boate</a>) et pas juste un &#8216;on va sur le vieux port et on trouve un resto comme l&#8217;annÃ©e derniÃ¨re).</li>
<li> Quelques choix un peu clivant comme des durÃ©es de conf courtes ou du <a href="http://nowificonferences.com">#Nowificonf</a> pendant une partie des Congs.</li>
<li> Moins de trajet dans ma voiture pour chercher les gens perdus ou les ramener. Marseille commence Ã  priori Ã  Ãªtre connu de tous et il n&#8217;y a plus de femme enceinte parmi les prÃ©sentes <img src='http://j-mad.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</li>
<li> Encore plein de points Ã  parfaire ou Ã  juste faire (comme prÃ©voir l&#8217;impression des badges en avance et les donner le premier matin, Ã  l&#8217;arrivÃ©e. Ou prÃ©voir un vrai carnet de route de l&#8217;accompagnant avec activitÃ©s et truc Ã  faire pour ne pas lÃ¢cher les gens comme Ã§a et qu&#8217;ils s&#8217;ennuient pendant deux jours).</li>
</ul>
<h2>Les congs d&#8217;un point de vue perso.</h2>
<p>Vivement la troisiÃ¨me Ã©dition. Comme les deux premiÃ¨res fois, la fin des Congs arrivant, un grand sentiment de vide se fait sentir et Ã  peine le dimanche soir arrivÃ©, l&#8217;envie d&#8217;Ãªtre dÃ©jÃ  Ã  l&#8217;annÃ©e prochaine, de pouvoir discuter Ã  nouveau en IRL avec des gens que je ne vois parfois qu&#8217;une fois par an.<br />
D&#8217;un point de vue perso, l&#8217;annÃ©e derniÃ¨re avait Ã©tÃ© une grande claque technique dans ma figure. Deux jours de confÃ©rences non stop, Ã§a en met plein les mirettes.<br />
Cette annÃ©e, malgrÃ© le fait qu&#8217;il y est moins de confÃ©rences ce fut encore mieux. Les confs auxquelles j&#8217;ai pu assister m&#8217;ont en effet fait dÃ©couvrir plein d&#8217;outil qu&#8217;il va falloir que je test, mais les barcamps ont permis d&#8217;Ã©changer pour de vrai, de commencer mÃªme pour certaines sessions Ã  poser les premiÃ¨res pierres de quelques choses (je pense lÃ  a Geek sans FrontiÃ¨re par exemple).</p>
<p>Mais ce n&#8217;est pas tout. L&#8217;un des points qui fait que cette deuxiÃ¨me Ã©dition fut immensÃ©ment mieux que la premiÃ¨re c&#8217;est que cette annÃ©e la partie &#8216;non technique&#8217; a Ã©tÃ© pensÃ©e et organisÃ©e. Et autant sur des dÃ©couvertes techniques, on peut imaginer les faire par IRC / billets de blog, autant rencontrer les gens et se rendre compte qu&#8217;on les apprÃ©cie, pour de vrai, hÃ© ben, y a pas Ã  dire, il faut Ãªtre dans la mÃªme piÃ¨ce.</p>
<p>On mange difficilement de la barbe Ã  papa rose sur IRC. Apprendre le GO, c&#8217;est aussi un peu compliquÃ©. Et je ne parlerais mÃªme pas de jouer Ã  &#8216;il Ã©tait une fois&#8217; avec Kael, <a href="https://twitter.com/arcagenis">Cyberj</a> et <a href="https://twitter.com/exirel">Exirel</a>. Ou de tenter de survivre Ã  une partie de PandÃ©mie. Et comme ArmagnacOverIP n&#8217;existe pas encore, on a encore besoin que <a href="https://twitter.com/dzen">dzen</a> ramÃ¨ne sa bouteille dans son sac pour y gouter (je ne t&#8217;oublie pas <a href="https://twitter.com/brutasse">brutasse</a>, ta chartreuse Ã©tait trÃ¨s bonne aussi:) ). C&#8217;est tout ces moments lÃ . Tout ces moments partagÃ©s qui font que pour de vrai, DjangoCong 2.0, putaing, c&#8217;Ã©tait terrible.</p>
<p>Et Ã  l&#8217;annÃ©e prochaine, pour d&#8217;autre aventure et une djangoCong 3.0</p>
<p>quelques liensÂ :</p>
<ul>
<li><a href="https://convore.com/django-fr/djangocong-2011-les-blogs/">le convore des articles de blog qui parlent des Congs</a></li>
<li><a href="https://convore.com/django-fr/djangocong-2011-slides/">le convore des slides des confs</a></li>
<li><a href="http://www.linkedin.com/groups?mostPopular=&amp;gid=1092347">le groupe djangofr sur linkedin</a></li>
<li><a href="http://openetherpad.org/xhKlmTVfJ2">l&#8217;etherpad de debrief collaboratif</a></li>
</ul>
<p>&nbsp;
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/" data-text="Djangocong 2.0, le bilan"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1375&amp;md5=ad7da95ca1536426d63f87747c36e976" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F04%2F21%2Fdjangocong-2-0-le-bilan%2F&amp;language=fr_FR&amp;category=text&amp;title=Djangocong+2.0%2C+le+bilan&amp;description=4+jours+apr%C3%A8s+la+fin+des+Cong%2C+il+est+temps+pour+moi+de+faire+le+bilan+de+cette+deuxi%C3%A8me+est%2C+en+tout+cas+%C3%A0+mon+sens%2C+excellente+%C3%A9dition.+Les+Congs...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Petites apps â€¦ petites mais costaudes</title>
		<link>http://j-mad.com/blog/2011/03/30/petites-apps-%e2%80%a6-petites-mais-costaudes/</link>
		<comments>http://j-mad.com/blog/2011/03/30/petites-apps-%e2%80%a6-petites-mais-costaudes/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 20:25:55 +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=1351</guid>
		<description><![CDATA[Pour ce mois de mars, je vais parler non pas d&#8217;une seule mais de deux petites apps. Deux apps parce que les apps sont tellement petites que l&#8217;on va m&#8217;accuser de tirer au flanc si je ne parle que de l&#8217;une d&#8217;entre elles. Mais que d&#8217;un autre cotÃ©s, ce n&#8217;est pas parce qu&#8217;elles sont petites <a href='http://j-mad.com/blog/2011/03/30/petites-apps-%e2%80%a6-petites-mais-costaudes/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Pour ce mois de mars, je vais parler non pas d&#8217;une seule mais de deux petites apps. Deux apps parce que les apps sont tellement petites que l&#8217;on va m&#8217;accuser de tirer au flanc si je ne parle que de l&#8217;une d&#8217;entre elles. Mais que d&#8217;un autre cotÃ©s, ce n&#8217;est pas parce qu&#8217;elles sont petites qu&#8217;il ne faut pas en parler.</p>
<h2>django-generic-aggregation</h2>
<p>&nbsp;</p>
<p>Qui n&#8217;a jamais utilisÃ© les agrÃ©gat dans DjangoÂ ? C&#8217;est quand mÃªme super utile. Et qui n&#8217;a pas ralÃ© sur le fait que zut alors&#8230; Saperlipopette mÃªme, on ne pouvait pas utiliser les agrÃ©gat sur les Generic FKÂ ?</p>
<p>Et c&#8217;est lÃ  qu&#8217;arrive <a href="http://pypi.python.org/pypi/django-generic-aggregation">django-generic-aggregation</a>. Qui permet justement de le faire.</p>
<p>Concernant l&#8217;installation, trois moyensÂ :</p>
<ul>
<li> easy_install</li>
<li> pip</li>
<li> un petit git des famille grÃ¢ce Ã  githubÂ : <a href="https://github.com/coleifer/django-generic-aggregation">https://github.com/coleifer/django-generic-aggregation</a></li>
</ul>
<p>Quand Ã  la doc, vous aurez droit Ã  la page de pypi qui est aussi la page de doc de github. Bon aprÃ¨s, il faut bien dire que l&#8217;app n&#8217;est pas super compliquÃ© Ã  comprendre.</p>
<p>Et au pire, il y a le code des tests. Une petite prÃ©cision toutefois concernant la doc, la page readthedoc de l&#8217;app renvoie pour l&#8217;instant sur un 404 readthedoc (un 404 en ASCII ART d&#8217;ailleurs)</p>
<p>Ensuite Ã  l&#8217;utilisation c&#8217;est tout simple, un petit exemple, tirÃ© de la docÂ :</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> generic_aggregation <span style="color: #ff7700;font-weight:bold;">import</span> generic_annotate<br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Sum<span style="color: #66cc66;">,</span> Avg<br />
<br />
<span style="color: #808080; font-style: italic;"># assume a Food model and a generic Rating model</span><br />
apple <span style="color: #66cc66;">=</span> Food.<span style="color: black;">objects</span>.<span style="color: black;">create</span><span style="color: black;">&#40;</span>name<span style="color: #66cc66;">=</span><span style="color: #483d8b;">'apple'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># create some ratings on the food</span><br />
Rating.<span style="color: black;">objects</span>.<span style="color: black;">create</span><span style="color: black;">&#40;</span>content_object<span style="color: #66cc66;">=</span>apple<span style="color: #66cc66;">,</span> rating<span style="color: #66cc66;">=</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><br />
Rating.<span style="color: black;">objects</span>.<span style="color: black;">create</span><span style="color: black;">&#40;</span>content_object<span style="color: #66cc66;">=</span>apple<span style="color: #66cc66;">,</span> rating<span style="color: #66cc66;">=</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><br />
Rating.<span style="color: black;">objects</span>.<span style="color: black;">create</span><span style="color: black;">&#40;</span>content_object<span style="color: #66cc66;">=</span>apple<span style="color: #66cc66;">,</span> rating<span style="color: #66cc66;">=</span><span style="color: #ff4500;">7</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> aggregate <span style="color: #66cc66;">=</span> generic_aggregate<span style="color: black;">&#40;</span>Food.<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: #66cc66;">,</span> Rating.<span style="color: black;">content_object</span><span style="color: #66cc66;">,</span> Sum<span style="color: black;">&#40;</span><span style="color: #483d8b;">'rating'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> aggregate<br />
<span style="color: #ff4500;">15</span><br />
<br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> aggregate <span style="color: #66cc66;">=</span> generic_aggregate<span style="color: black;">&#40;</span>Food.<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: #66cc66;">,</span> Rating.<span style="color: black;">content_object</span><span style="color: #66cc66;">,</span> Avg<span style="color: black;">&#40;</span><span style="color: #483d8b;">'rating'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">print</span> aggregate<br />
<span style="color: #ff4500;">5</span></div></div>
<p>Pour la petite histoire, j&#8217;ai dÃ©couvert cette app en testant <a href="http://pypi.python.org/pypi/django-simple-ratings">django-simple-ratings</a> une autre app du mÃªme monsieur.</p>
<h2>django-exposure</h2>
<p>&nbsp;</p>
<p>La encore une petite <a href="https://bitbucket.org/natgeo/django-exposure">app toute bÃªte qui permet de resizer</a> des images avant de les afficher.  Les images redimensionnÃ©es sont stockÃ©es en mÃ©moire et il y a mÃªme une gestion de cache.</p>
<p>La doc est prÃ©sente sur <a href="http://packages.python.org/django-exposure/">packages.python.org</a> et elle explique bien la maniÃ¨re de l&#8217;utiliser. AprÃ¨s pour vraiment comprendre, vive les sources.</p>
<p>Quand Ã  l&#8217;installation, vous pourrez soit utiliser :</p>
<p>un petit pip install django-exposure<br />
ou une rÃ©cupÃ©ration d&#8217;un tar.gz sur <a href="https://bitbucket.org/natgeo/django-exposure">bitbucket</a><br />
ou mÃªme un hg clone</p>
<p>L&#8217;utilisation en elle mÃªme est trÃ¨s simple. Il suffit en effet d&#8217;utiliser le filtre |resize en lui donnant trois paramÃªtre, Width, Height et Crop.</p>
<p>Crop peut prendre 5 valeurs de 0 Ã  5 suivant le crop que vous voulez mettre en place ( 0 Ã©tant pour un crop centrÃ©).</p>
<p>&nbsp;</p>
<p>Pour rester dans le mÃªme sujet, je ne peux finir ce billet sans parler de <a href="http://pypi.python.org/pypi/django-thumbnail-works">django-thumbnail-works</a> qui sert comme son nom l&#8217;indique Ã  gÃ©rer les thumbnail. Le principe Ã©tant de lÃ , gÃ©rer cela directement au niveau de l&#8217;ImageField. Mais je ne peux vous en dire plus, je n&#8217;ai pas eu le temps de la tester.
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/03/30/petites-apps-%e2%80%a6-petites-mais-costaudes/" data-text="Petites apps â€¦ petites mais costaudes"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1351&amp;md5=f819a4a8749323fb8c44fc1ee93f420c" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/03/30/petites-apps-%e2%80%a6-petites-mais-costaudes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F03%2F30%2Fpetites-apps-%25e2%2580%25a6-petites-mais-costaudes%2F&amp;language=fr_FR&amp;category=text&amp;title=Petites+apps+%E2%80%A6+petites+mais+costaudes&amp;description=Pour+ce+mois+de+mars%2C+je+vais+parler+non+pas+d%26%238217%3Bune+seule+mais+de+deux+petites+apps.+Deux+apps+parce+que+les+apps+sont+tellement+petites+que+l%26%238217%3Bon+va+m%26%238217%3Baccuser...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>DjangoAstuce : masquer certains champs des settings dans la vue de Debug</title>
		<link>http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/</link>
		<comments>http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 20:42:05 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1349</guid>
		<description><![CDATA[Par dÃ©faut, la vue de DEBUG affiche toutes les settings. Heureusement pour nous, gentils petits djangonautes, les password des BD mais aussi le password du user emails sont remplacÃ©s par des belles petites ***. &#160; Mais comment faire pour masquer d&#8217;autre champs ? Comme des champs de KEY d&#8217;API ou de password divers ? Parce <a href='http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Par dÃ©faut, la vue de DEBUG affiche toutes les settings. Heureusement pour nous, gentils petits djangonautes, les password des BD mais aussi le password du user emails sont remplacÃ©s par des belles petites ***.</p>
<p>&nbsp;</p>
<p>Mais comment faire pour masquer d&#8217;autre champs ? Comme des champs de KEY d&#8217;API ou de password divers ? Parce qu&#8217;aprÃ¨s tout, il peut arriver de devoir en stocker, et de vouloir les cacher Ã  certains des yeux qui pourraient voir la vue de DEBUG.</p>
<p>&nbsp;</p>
<p>He ben, encore une fois, django a tout prÃ©vu. Il suffit en effet que le nom de votre constante contienne soit :</p>
<ul>
<li>SECRET</li>
<li>PASSWORD</li>
<li>PROFANITIES_LIST</li>
<li>SIGNATURE</li>
</ul>
<p>&nbsp;</p>
<p>Pour que dans les vues de DEBUG, leur valeur soit remplacÃ© par des ***</p>
<p>&nbsp;</p>
<p>Et bien entendu, cela marche aussi pour les key des dictionnaires que vous pourriez dÃ©clarer dans vos settings (l&#8217;exemple parfait Ã©tant celui qui sert de configuration pour les BD).
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/" data-text="DjangoAstuce : masquer certains champs des settings dans la vue de Debug"data-count="vertical" data-via="mrjmad" data-lang="fr""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1349&amp;md5=41c3e7ab3bed8b8be6318f01849f1e2f" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=17478&amp;popout=1&amp;url=http%3A%2F%2Fj-mad.com%2Fblog%2F2011%2F03%2F28%2Fdjangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug%2F&amp;language=fr_FR&amp;category=text&amp;title=DjangoAstuce+%3A+masquer+certains+champs+des+settings+dans+la+vue+de+Debug&amp;description=Par+d%C3%A9faut%2C+la+vue+de+DEBUG+affiche+toutes+les+settings.+Heureusement+pour+nous%2C+gentils+petits+djangonautes%2C+les+password+des+BD+mais+aussi+le+password+du+user+emails+sont+remplac%C3%A9s+par...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>

