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

<channel>
	<title>Le Mad Blog &#187; La Django-app du mois</title>
	<atom:link href="http://j-mad.com/blog/category/developpement/python/django/la-django-app-du-mois/feed/" rel="self" type="application/rss+xml" />
	<link>http://j-mad.com/blog</link>
	<description>juste un blog</description>
	<lastBuildDate>Fri, 18 May 2012 21:58:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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>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>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>Django-mockups, l&#8217;application mi moquette, mi ketchup</title>
		<link>http://j-mad.com/blog/2011/02/28/django-mockups-lapplication-mi-moquette-mi-ketchup/</link>
		<comments>http://j-mad.com/blog/2011/02/28/django-mockups-lapplication-mi-moquette-mi-ketchup/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 21:58:13 +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=1314</guid>
		<description><![CDATA[MalgrÃ© le fait que le mois de fÃ©vrier ne fasse que 28 jours, malgrÃ© le fait que j&#8217;ai maintenant une petiote qui gazouille gentiment en me regardant avec ses grands yeux bleus, malgrÃ© le fait que les journÃ©es au boulot ne se finissent jamais, mÃªme le week-end, je rÃ©ussi donc la prouesses de sortir Ã  <a href='http://j-mad.com/blog/2011/02/28/django-mockups-lapplication-mi-moquette-mi-ketchup/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>MalgrÃ© le fait que le mois de fÃ©vrier ne fasse que 28 jours, malgrÃ© le fait que j&#8217;ai maintenant une petiote qui gazouille gentiment en me regardant avec ses grands yeux bleus, malgrÃ© le fait que les journÃ©es au boulot ne se finissent jamais, mÃªme le week-end, je rÃ©ussi donc la prouesses de sortir Ã  temps la django app du mois de fÃ©vrier (et de tenter de vous prÃ©parer des petits trucs cools pour ceux qui viendront aux djangocongs, je dis Ã§a, j&#8217;en dis pas plus) (et parenthÃ¨se bis, je suis trÃ¨s fier de mon titre)</p>
<h1>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</h1>
<p>Alors on le trouve sur sa <a href="http://pypi.python.org/pypi/django-mockups">page pipy</a> mais aussi sur sa page <a href="https://github.com/sorl/django-mockups">github</a>.<br />
Pour l&#8217;installation, comme souvent on Ã  le choix entreÂ :</p>
<ul>
<li>passer par pip avec un petit pip install django-mockups</li>
<li>passer par easy_install</li>
<li>passer par un git clone</li>
</ul>
<p>Quand Ã  la doc, elle est gÃ©nÃ©rable quand on installe le paquet sinon la page pipy (mais aussi la home page du projet) en contient une bonne partie. Elle est, en l&#8217;Ã©tat, il faut bien le dire, un peu limitÃ© et d&#8217;ailleurs l&#8217;auteur le dit lui mÃªme dans la derniÃ¨re partie. C&#8217;est dommage, mais en attendant une doc plus prÃ©cise, il y a toujours la possibilitÃ© de lire le code.</p>
<h1>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h1>
<p>A gÃ©nÃ©rer des donnÃ©es. De grosse masse de donnÃ©es de test gÃ©nÃ©rÃ©es alÃ©atoirement pour remplir vos bases de tests et rendre vos tests plus facile.</p>
<h1>3- Comment Ã§a marcheÂ ?</h1>
<p>En fait on peut utiliser django-mockups de deux faÃ§ons. Soit en utilisant une ligne de commande soit en mettant un place un script qui va utiliser les classes fourni par l&#8217;app et vous permettra de faire bien plus de choses que la simple ligne de commande.<br />
Vous pourrez entre-autreÂ :</p>
<ul>
<li>dÃ©finir combien de donnÃ©es par modÃ¨les vous voulez gÃ©nÃ©rer.</li>
<li>dÃ©cider si vous voulez gÃ©nÃ©rer ou pas des donnÃ©es de table reliÃ©s par fk ou m2m aux tables que vous configurez dans mockups, sachant que bien entendu vous pouvez dÃ©cider lesquelles des fk vous voulez gÃ©nÃ©rer.</li>
<li>Pour les m2m, choisir combien de relation vous allez vouloir crÃ©er, en pouvant utiliser un intervalle.</li>
<li>SpÃ©cifier lorsque que vous voulez, au milieu de votre masse de donnÃ©es gÃ©nÃ©rÃ©es, insÃ©rer des donnÃ©es bien prÃ©cises.</li>
</ul>
<h1>4 Conclusion</h1>
<p>Je dÃ©couvre Ã  peine django-mockup depuis quelques jours. Mais dÃ©jÃ  je lui vois de multiples utilisations possibles, que ce soit pour tester des algos de recherche dans une grosse masse de donnÃ©es ou faire des tests de charges plus rÃ©alistes qu&#8217;auparavant.
<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/02/28/django-mockups-lapplication-mi-moquette-mi-ketchup/" data-text="Django-mockups, l&#038;%238217;application mi moquette, mi ketchup"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=1314&amp;md5=0d8c6cd2e5ca5656b65c7e36d63e61e5" 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/02/28/django-mockups-lapplication-mi-moquette-mi-ketchup/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%2F02%2F28%2Fdjango-mockups-lapplication-mi-moquette-mi-ketchup%2F&amp;language=fr_FR&amp;category=text&amp;title=Django-mockups%2C+l%26%238217%3Bapplication+mi+moquette%2C+mi+ketchup&amp;description=Malgr%C3%A9+le+fait+que+le+mois+de+f%C3%A9vrier+ne+fasse+que+28+jours%2C+malgr%C3%A9+le+fait+que+j%26%238217%3Bai+maintenant+une+petiote+qui+gazouille+gentiment+en+me+regardant+avec+ses+grands...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Django-admin-tools, la django app de janvier, presque Ã  l&#8217;heure</title>
		<link>http://j-mad.com/blog/2011/02/13/django-admin-tools-la-django-app-de-janvier-presque-a-lheure/</link>
		<comments>http://j-mad.com/blog/2011/02/13/django-admin-tools-la-django-app-de-janvier-presque-a-lheure/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 18:27:21 +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=1302</guid>
		<description><![CDATA[Jusqu&#8217;Ã  prÃ©sent j&#8217;avais toujours rÃ©ussi Ã  poster mes billets de django app Ã  l&#8217;heure. Mais lÃ , lÃ , j&#8217;ai une excuse. Je suis devenu papa le 31 janvier. Du coup, je n&#8217;ai vraiment pas eu le temps pour Ã©crire mon billet de django app (les raleurs qui me diront que j&#8217;avais tout les jours d&#8217;avant le <a href='http://j-mad.com/blog/2011/02/13/django-admin-tools-la-django-app-de-janvier-presque-a-lheure/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Jusqu&#8217;Ã  prÃ©sent j&#8217;avais toujours rÃ©ussi Ã  poster mes billets de django app Ã  l&#8217;heure. Mais lÃ , lÃ , j&#8217;ai une excuse. Je suis devenu papa le 31 janvier. Du coup, je n&#8217;ai vraiment pas eu le temps pour Ã©crire mon billet de django app (les raleurs qui me diront que j&#8217;avais tout les jours d&#8217;avant le 31 pour Ã©crire mon billet auront raison.. mais chut, j&#8217;ai une excuse, c&#8217;est tout).</p>
<p>Ce mois-ci (enfin le mois dernier quoi), je vais parler d&#8217;une partie de django dont je ne parle pas assez l&#8217;admin, en vous prÃ©sentant django-admin-tools.</p>
<h1>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</h1>
<p>OÃ¹ on le trouve sur sa page <a href="https://bitbucket.org/izi/django-admin-tools">bitbucket</a> sur laquelle vous trouverez aussi tout plein de screenshoot (que je reproduis ici en partie), une mini doc et un lien vers une doc trÃ¨s trÃ¨s complÃ¨te.</p>

<a href='http://j-mad.com/blog/2011/02/13/django-admin-tools-la-django-app-de-janvier-presque-a-lheure/djangon_admin_tools1/' title='djangon_admin_tools1'><img width="150" height="120" src="http://j-mad.com/blog/wp-content/uploads/2011/02/djangon_admin_tools1-150x120.png" class="attachment-thumbnail" alt="djangon_admin_tools1" title="djangon_admin_tools1" /></a>
<a href='http://j-mad.com/blog/2011/02/13/django-admin-tools-la-django-app-de-janvier-presque-a-lheure/djangon_admin_tools2/' title='djangon_admin_tools2'><img width="150" height="120" src="http://j-mad.com/blog/wp-content/uploads/2011/02/djangon_admin_tools2-150x120.png" class="attachment-thumbnail" alt="djangon_admin_tools2" title="djangon_admin_tools2" /></a>

<p>Quand Ã  l&#8217;installation vous pouvez soitÂ :</p>
<ul>
<li>cloner le repo puis faire un python setup.py install</li>
<li>utiliser easy installÂ : easy_install django-admin-tools</li>
<li>utiliser pipÂ : pip install django-admin-tools</li>
<li>simplement mettre le repertoire admin_tools dans votre python path</li>
</ul>
<p>Quand Ã  la doc, elle est prÃ©sente sur <a href="http://django-admin-tools.readthedocs.org/en/latest/index.html">readthedocs.org</a> et est vraiment trÃ¨s bien faite. bien fournie et claire.</p>
<h1>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h1>
<p>Django-admin-tools va vous permettre de customiser votre admin django.</p>
<p>Vous allez pouvoir des petits dasboards en page d&#8217;accueil, personnalisable et drag and dropable et foldable. Vous allez aussi pouvoir avoir un menu horizontal et une gestion des bookmarks. Les menus pourront Ãªtre constituÃ©s de sous menus, de liens finaux ou de menus construits automatiquement Ã  partir deÂ  la liste des app (moins celles que l&#8217;on dÃ©cide d&#8217;exclure).</p>
<h1>3- Comment Ã§a marcheÂ ?</h1>
<p>Dans tout les cas, il y a une config par dÃ©faut. Si on veut changer la config des dashboard ou du menu, il faut gÃ©nÃ©rer un module python ( qui par dÃ©faut sera celui qui donne la config par dÃ©faut), le modifier et indiquer que l&#8217;on veut l&#8217;utiliser. On peut aussi modifier le thÃ¨me CSS qui sera utilisÃ©.</p>
<h3>Pour le menu :</h3>
<ul>
<li>python manage.py custommenu</li>
</ul>
<p>ou</p>
<ul>
<li>python manage.py custommenu somefile.py</li>
</ul>
<p>puisÂ :</p>
<ul>
<li>ADMIN_TOOLS_MENU = &#8216;yourproject.menu.CustomMenu&#8217;</li>
</ul>
<h3>pour le dashboard, mÃªme choseÂ :</h3>
<ul>
<li>python manage.py customdashboard</li>
</ul>
<p>ou</p>
<ul>
<li>python manage.py customdashboard somefile.py</li>
</ul>
<p>puis</p>
<ul>
<li>ADMIN_TOOLS_INDEX_DASHBOARD = &#8216;yourproject.dashboard.CustomIndexDashboard&#8217;</li>
</ul>
<ul>
<li>ADMIN_TOOLS_APP_INDEX_DASHBOARD = &#8216;yourproject.dashboard.CustomAppIndexDashboard&#8217;</li>
</ul>
<h1>4 Conclusion</h1>
<p>Je dois bien avouer que je pense sous utilisais l&#8217;admin django. Je suis toujours Ã  refaire des trucs en espace non admin alors que l&#8217;admin offre pourtant des possibilitÃ©s immenses, pour trÃ¨s peu de temps passÃ©s. La dÃ©couverte de django-admin-tools me conforte dans l&#8217;idÃ©e qu&#8217;il faut que je me force Ã  utiliser plus souvent l&#8217;interface admin. Et donc Ã  tester de nouvelles app d&#8217;extension de l&#8217;admin.
<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/02/13/django-admin-tools-la-django-app-de-janvier-presque-a-lheure/" data-text="Django-admin-tools, la django app de janvier, presque Ã  l&#038;%238217;heure"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=1302&amp;md5=fa2a5e1b199d67580a592dc62fe71187" 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/02/13/django-admin-tools-la-django-app-de-janvier-presque-a-lheure/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%2F02%2F13%2Fdjango-admin-tools-la-django-app-de-janvier-presque-a-lheure%2F&amp;language=fr_FR&amp;category=text&amp;title=Django-admin-tools%2C+la+django+app+de+janvier%2C+presque+%C3%A0+l%26%238217%3Bheure&amp;description=Jusqu%26%238217%3B%C3%A0+pr%C3%A9sent+j%26%238217%3Bavais+toujours+r%C3%A9ussi+%C3%A0+poster+mes+billets+de+django+app+%C3%A0+l%26%238217%3Bheure.+Mais+l%C3%A0%2C+l%C3%A0%2C+j%26%238217%3Bai+une+excuse.+Je+suis+devenu+papa+le+31+janvier.+Du+coup%2C+je...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Django-easy-maps, c&#8217;est comme google maps, mais dans ton site</title>
		<link>http://j-mad.com/blog/2010/12/31/django-easy-maps-cest-comme-google-maps-mais-dans-ton-site/</link>
		<comments>http://j-mad.com/blog/2010/12/31/django-easy-maps-cest-comme-google-maps-mais-dans-ton-site/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 16:55: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=1215</guid>
		<description><![CDATA[Cette annÃ©e se finira comme elle a commencÃ©, en bossant et avec beaucoup moins de temps que ce que j&#8217;aimerais en avoir. Il y a pas Ã  dire, il faut vraiment que je me remette Ã  jouer au loto, histoire de pouvoir rÃªver Ã  un jour, avoir tout le temps que j&#8217;aimerais avoir. Mais ne <a href='http://j-mad.com/blog/2010/12/31/django-easy-maps-cest-comme-google-maps-mais-dans-ton-site/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Cette annÃ©e se finira comme elle a commencÃ©, en bossant et avec beaucoup moins de temps que ce que j&#8217;aimerais en avoir. Il y a pas Ã  dire, il faut vraiment que je me remette Ã  jouer au loto, histoire de pouvoir rÃªver Ã  un jour, avoir tout le temps que j&#8217;aimerais avoir.</p>
<p>Mais ne pas avoir de temps n&#8217;est pas une raison pour ne pas perpÃ©tuer la tradition des django apps du mois. Surtout que cela fait dÃ©jÃ  16 mois que je tiens, et que tout les mois, qu&#8217;il fasse chaud ou froid, que les zombies ou les ET menacent de nous Ã©radiquer ou que le tout derniers MMO Ã  la mode sorte sa bÃ©ta, je publie un billet de prÃ©sentation de django app.</p>
<p>Et ce mois ci, je vais vous parler d&#8217;une app que j&#8217;ai dÃ©couvert il n&#8217;y a que quelques dizaines jours mais qui est bien sympathique (il est mÃªme possible que je l&#8217;utilise dans un contexte de business).</p>
<p>Cette App c&#8217;est donc django-easy-maps.</p>
<h2>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</h2>
<p>Vous trouverez django-easy-maps sur sa page <a href="https://bitbucket.org/kmike/django-easy-maps/src">bitbucket</a> (enfin un projet qui a compris qu&#8217;il fallait utiliser mercurial parce que rien n&#8217;est mieux que mercurial).<br />
Mais vous aurez aussi le droit Ã  une <a href="http://pypi.python.org/pypi/django-easy-maps/">page pypi</a> (Ã  l&#8217;heure ou j&#8217;Ã©cris, la version sur pypi est la 0.7).</p>
<p>Pour l&#8217;installation, vous avez deux mÃ©thodesÂ :</p>
<ul>
<li> un petit hg clone ( hg clone https://VOTREUSER@bitbucket.org/kmike/django-easy-maps )</li>
<li> un pip ou un easy_install suivant votre prÃ©fÃ©rence.</li>
</ul>
<p>La doc, elle, tient dans le fichier Readme du projet et dans les commentaires du code. Mais il faut bien avouer que vu la taille de l&#8217;app, c&#8217;est bien suffisant pour comprendre comment l&#8217;utiliser. Si vous voulez comprendre comment elle marche, la par contre, il faudra lire le code.</p>
<h2>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h2>
<p>Elle sert Ã  afficher une carte, directement tirÃ© de google maps, qui montre une adresse.</p>
<p>Vous donnez l&#8217;adresse que vous voulez voir apparaÃ®tre Ã  un templatetags et au moment du rendu, vous voyez apparaÃ®tre un joli composant google maps, avec zoom, dÃ©placage de la carte possible, etc etc. Et en plus, sans avoir besoin d&#8217;API Key google ou autre. PlutÃ´t cool nanÂ ?</p>
<p>On peut de plus dÃ©finir les tailles de la carte, passer un template custom ou utiliser le cache template django.</p>
<h2>3- Comment Ã§a marcheÂ ?</h2>
<p>Tout d&#8217;abord il faut penser Ã  installer geopy qui est une dÃ©pendance obligatoire. (par pip ou easy_install).</p>
<p>Ensuite, c&#8217;est tout simple. On commence par loader le bon templatetagsÂ :<br />
{% load easy_maps_tags %}</p>
<p>et ensuite on demande l&#8217;affichage de la carteÂ :<br />
<!-- Default map with 300x400 dimensions --><br />
{% easy_map &#8220;Russia, Ekaterinburg, Mira 32&#8243; 300 400 %}</p>
<p>Si on veut personnaliser, on peut, en faisant par exempleÂ :<br />
<!-- Variable address, custom detail level and custom template --><br />
{% easy_map address 200 200 5 using &#8216;map.html&#8217; %}</p>
<p>La syntaxe complÃ¨te du templatetags Ã©tantÂ :</p>
<p>{% easy_map &lt; address &gt; [ &lt; width &gt; &lt; height &gt;] [&lt; zoom &gt;] [using &lt; template_name &gt;] %}</p>
<p>Vu mes explications, vous pensez peut-Ãªtre qu&#8217;il n&#8217;y a pas de modÃ¨les BD. En fait si. L&#8217;app stocke en effet la longitude et latitude en BD pour ne pas avoir Ã  les recalculer Ã  chaque fois.</p>
<h2>4-Conclusion</h2>
<p>Django-easy-maps est une petite app, qui fait pas forcÃ©ment beaucoup de chose mais qui les fait bien. Et Ã§a j&#8217;aime.</p>
<p>Une prÃ©cision importante, elle fonctionne avec South, donc si vous avez mis en place South pour votre projet django, un simple ./manage.py migrate easy_maps Ã  la place syncdb et Ã§a roule â€¦</p>
<h2>5-Conclusion bis</h2>
<p>C&#8217;est donc avec django-easy-maps que je termine cette annÃ©e de django-apps du mois. J&#8217;espÃ¨re que certains billets vous ont Ã©tÃ© utile et vous ont fait dÃ©couvrir des apps que vous utilisez maintenant quotidiennement.</p>
<p>En tout cas, je vous souhaite un trÃ¨s bon rÃ©veillon 2010 et vous dit Ã  l&#8217;annÃ©e prochaine, en espÃ©rant que j&#8217;aurais le temps de tester l&#8217;app que j&#8217;ai prÃ©vu de vous prÃ©senter en janvier qui sera, cette fois-ci, une app d&#8217;une toute autre dimension (si j&#8217;ai le temps).
<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/2010/12/31/django-easy-maps-cest-comme-google-maps-mais-dans-ton-site/" data-text="Django-easy-maps, c&#038;%238217;est comme google maps, mais dans ton site"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=1215&amp;md5=bb0404e9d57bc4936a9cf070416c5c3b" 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/2010/12/31/django-easy-maps-cest-comme-google-maps-mais-dans-ton-site/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%2F2010%2F12%2F31%2Fdjango-easy-maps-cest-comme-google-maps-mais-dans-ton-site%2F&amp;language=fr_FR&amp;category=text&amp;title=Django-easy-maps%2C+c%26%238217%3Best+comme+google+maps%2C+mais+dans+ton+site&amp;description=Cette+ann%C3%A9e+se+finira+comme+elle+a+commenc%C3%A9%2C+en+bossant+et+avec+beaucoup+moins+de+temps+que+ce+que+j%26%238217%3Baimerais+en+avoir.+Il+y+a+pas+%C3%A0+dire%2C+il+faut...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>PrÃ©parez un solide alibi, parce que nous savons que vous avez un mobile, un django-mobile</title>
		<link>http://j-mad.com/blog/2010/11/12/preparez-un-solide-alibi-parce-que-nous-savons-que-vous-avez-un-mobile-un-django-mobile/</link>
		<comments>http://j-mad.com/blog/2010/11/12/preparez-un-solide-alibi-parce-que-nous-savons-que-vous-avez-un-mobile-un-django-mobile/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 07:36: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=1045</guid>
		<description><![CDATA[J&#8217;ai dÃ©jÃ  fait un billet parlant d&#8217;une app de monsieur gregmuellegger, Ã  savoir celui sur les websockets. Mais le monsieur Ã©tant prolifique, je me vois &#8216;obligÃ©&#8217; d&#8217;Ã©crire Ã  nouveau sur une de ses apps, Ã  savoir django-mobile. 1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ? Alors on trouve django-mobile <a href='http://j-mad.com/blog/2010/11/12/preparez-un-solide-alibi-parce-que-nous-savons-que-vous-avez-un-mobile-un-django-mobile/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai dÃ©jÃ  fait un billet parlant d&#8217;une app de monsieur <a href="https://github.com/gregmuellegger">gregmuellegger</a>, Ã  savoir celui sur les <a href="http://j-mad.com/blog/2010/07/31/django-websocket-parce-que-sans-chaussettes-le-web-il-pue-un-peu-des-pieds/">websockets</a>. Mais le monsieur Ã©tant prolifique, je me vois &#8216;obligÃ©&#8217; d&#8217;Ã©crire Ã  nouveau sur une de ses apps, Ã  savoir django-mobile.</p>
<h1>1- OÃ¹ on le trouve, comment on lâ€™installe, tout Ã§a quoi (et la doc)Â ?</h1>
<p>Alors on trouve django-mobile Ã  la fois surÂ :</p>
<ul>
<li>sa page <a href="http://pypi.python.org/pypi/django-mobile/">pypi</a></li>
<li>sa page <a href="https://github.com/gregmuellegger/django-mobile">github</a>.</li>
</ul>
<p>Pour l&#8217;installer donc, un petit coup de</p>
<ul>
<li>easy install ou apparentÃ©</li>
<li>git clone</li>
</ul>
<p>et le tour est jouÃ©.</p>
<p>La doc quand a elle, est bien fournie. Avec une description &#8216;thÃ©orique&#8217;, des exemples prÃ©cis et une explication pour chacune des variables de configuration utilisable</p>
<h1>2- Mais au fait, Ã  quoi Ã§a sertÂ ?</h1>
<p>Comme son nom l&#8217;indique, django-mobile permet d&#8217;avoir un mode de visualisation mobile pour son site django. Mais en fait, pas seulement. Il permet en fait d&#8217;avoir X modes de visualisation pour son siteÂ :Â  mobile, Ipad, sans image, etc â€¦.</p>
<h1>3- Comment Ã§a marcheÂ ?</h1>
<p>Django-mobile fonctionne avec le concept de &#8216;flavour&#8217;.<br />
Vous commencez par dÃ©finir plusieurs &#8216;flavour&#8217; pour votre site, tout simplement en les listant dans votre settings.py.</p>
<p>Chaque flavour se dÃ©fini par son nom et surtout son jeu de template propre qui sont tous rangÃ© dans un ou des sous-rÃ©pertoires ayant le nom de la flavour en question.</p>
<p>Ensuite il suffit de passer d&#8217;une flavour Ã  l&#8217;autre. Pour cela deux faÃ§on soit c&#8217;est une dÃ©tection automatique (pour passer en mode mobile) soit vos visiteurs peuvent passer d&#8217;une flavour Ã  une autre. La valeur de la flavour courante sera alors stockÃ©e comme une variable de session (dont le nom est paramÃ©trable)</p>
<p>Le tout fonctionne assez simplement en se basant surÂ :</p>
<ul>
<li>un middleware qui dÃ©tecte automatiquement si vous venez d&#8217;un terminal mobile ou pas</li>
<li>un loader qui rajoute le nom de la flavour en rÃ©pertoire prÃ©fixe pour vos templates</li>
<li>deux context processor qui injectent l&#8217;un le nom de la flavour courante et l&#8217;autre indique si on est en mode mobile ou pas</li>
<li>un middleware qui permet de changer la flavour courante.</li>
</ul>
<p>Django-mobile, en plus d&#8217;Ãªtre simple est pas mal customisable, presque Ã  l&#8217;excÃ¨s. On peut configurer le nom du paramÃ¨tre de ssion qui stockera la flavour courante choisi par vos visiteurs, le nom du paramÃ¨tre GET qui permet de changer la flavour courante. On peut Ã©galement dÃ©sactiver la possibilitÃ© pour l&#8217;utilisateur de choisir sa flavour ou choisir si on veut rajouter un rÃ©pertoire prÃ©fix de plus Ã  tout les rÃ©pertoires de flavour (pour les ranger proprement tous dans un rÃ©pertoire flavour par exemple).</p>
<p>Que du bon donc, et une petite app Ã  utiliser sans modÃ©ration (va falloir que je pense Ã  l&#8217;intÃ©grer pour histoire de rolistes tiens ). Et puis en plus, j&#8217;ai mÃªme pu faire un jeu de mot dont je suis excessivement fier dans mon titre de billet&#8230;:)
<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/2010/11/12/preparez-un-solide-alibi-parce-que-nous-savons-que-vous-avez-un-mobile-un-django-mobile/" data-text="PrÃ©parez un solide alibi, parce que nous savons que vous avez un mobile, un django-mobile"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=1045&amp;md5=bae67a30c63f79ecfb1e8f8f169c6321" 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/2010/11/12/preparez-un-solide-alibi-parce-que-nous-savons-que-vous-avez-un-mobile-un-django-mobile/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%2F2010%2F11%2F12%2Fpreparez-un-solide-alibi-parce-que-nous-savons-que-vous-avez-un-mobile-un-django-mobile%2F&amp;language=fr_FR&amp;category=text&amp;title=Pr%C3%A9parez+un+solide+alibi%2C+parce+que+nous+savons+que+vous+avez+un+mobile%2C+un+django-mobile&amp;description=J%26%238217%3Bai+d%C3%A9j%C3%A0+fait+un+billet+parlant+d%26%238217%3Bune+app+de+monsieur+gregmuellegger%2C+%C3%A0+savoir+celui+sur+les+websockets.+Mais+le+monsieur+%C3%A9tant+prolifique%2C+je+me+vois+%26%238216%3Boblig%C3%A9%26%238217%3B+d%26%238217%3B%C3%A9crire+%C3%A0+nouveau+sur...&amp;tags=Django%2CPython%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>

