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

<channel>
	<title>Le Mad Blog &#187; Django</title>
	<atom:link href="http://j-mad.com/blog/tag/django/feed/" rel="self" type="application/rss+xml" />
	<link>http://j-mad.com/blog</link>
	<description>juste un blog</description>
	<lastBuildDate>Fri, 03 Feb 2012 11:20:26 +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/'>[...]</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="en""><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="http://j-mad.com/blog/?flattrss_redirect&amp;id=1754&amp;md5=4db01d81571d0a66a38e7597cdb4dc90" 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/'>[...]</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="en""><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="http://j-mad.com/blog/?flattrss_redirect&amp;id=1598&amp;md5=38d9c06c803de5fc545baac75f968bb8" 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/'>[...]</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="en""><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="http://j-mad.com/blog/?flattrss_redirect&amp;id=1499&amp;md5=8fcf70fbca716e51f44063aca3c2ff41" 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/'>[...]</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="en""><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="http://j-mad.com/blog/?flattrss_redirect&amp;id=1459&amp;md5=8d3e9f470c3a3c7476a312cc2170594c" type="text/html" />
	</item>
		<item>
		<title>Admin django, deux petits tips pour les change_list</title>
		<link>http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/</link>
		<comments>http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/#comments</comments>
		<pubDate>Tue, 03 May 2011 21:57:40 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1403</guid>
		<description><![CDATA[L&#8217;admin django est vraiment un bonheur pour la productivitÃ©. On peut faire plein de choses en moins de temps qu&#8217;il n&#8217;en faut pour Ã©crire le descriptif des choses en questions. AprÃ¨s avoir passÃ© quelques heures Ã  farfouiller dans la doc et Ã  faire quelques tests, je me suis dit qu&#8217;il n&#8217;y avait pas de raisons <a href='http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>L&#8217;admin django est vraiment un bonheur pour la productivitÃ©. On peut faire plein de choses en moins de temps qu&#8217;il n&#8217;en faut pour Ã©crire le descriptif des choses en questions.</p>
<p>AprÃ¨s avoir passÃ© quelques heures Ã  farfouiller dans la doc et Ã  faire quelques tests, je me suis dit qu&#8217;il n&#8217;y avait pas de raisons que je garde mes dÃ©couvertes pour moi.</p>
<p>Voici donc un premier billet pour partager les plus utiles avec vous.</p>
<h2>list_display, comment changer l&#8217;entÃªte d&#8217;une colonne fonction.</h2>
<p>On sait tous comment configurer les colonnes que l&#8217;on va afficher dans la vue en liste des content_type. En utilisant list_display. Mais est ce que cela ne vous ai jamais arrivÃ© de vouloir afficher le rÃ©sultat d&#8217;une fonction&nbsp;?</p>
<p>Aucun problÃ¨me, il suffit de mettre le nom de la fonction dans list_display. Oui c&#8217;est vrai, sauf que.. sauf que l&#8217;entÃªte de colonne c&#8217;est le nom de la fonction.. Et Ã§a, ce n&#8217;est pas trÃ¨s joli.</p>
<p>Sauf que, sauf que django pense Ã  tout. Pour pouvoir afficher un intitulÃ© de colonne sympa au lieu du nom de la fonction, il suffit de rajouter Ã  votre fonction un attribut short_description qui contiendra l&#8217;intitulÃ© voulu.</p>
<p>Un petit exemple&nbsp;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">class</span> TestAdmin <span style="color: black;">&#40;</span>admin.<span style="color: black;">ModelAdmin</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; list_display <span style="color: #66cc66;">=</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">'name'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'foo'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'bar'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'super_function'</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Test <span style="color: black;">&#40;</span>model.<span style="color: black;">Models</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; â€¦<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> super_function<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; â€¦.<br />
&nbsp; &nbsp;<span style="color: black;">super_function</span>.<span style="color: black;">short_description</span> <span style="color: #66cc66;">=</span>u<span style="color: #483d8b;">'mon intitulÃ© de colonne qui tue'</span></div></div>
<h2>list_display, comment utiliser du HTML dans les colonnes .</h2>
<p>De mÃªme, il se peut que votre super fonction qui tue, renvoie non pas une valeur simple (genre un nombre) mais du code html (que vous aurez bien entendu gÃ©nÃ©rÃ© avec un template). Sauf que lÃ , oh rage, oh dÃ©sespoir. Vous avez beau faire tout les mark_safe du monde, rien n&#8217;y fait. Votre code est escaped&#8230;</p>
<p>Comment modifier Ã§a&nbsp;? La encore, Ã§a passe par un attribut de fonction, allow_tags qu&#8217;il vous suffira de mettre Ã  True. Et miracle, Ã§a fonctionne.
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/" data-text="Admin django, deux petits tips pour les change_list"data-count="vertical" data-via="mrjmad" data-lang="en""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1403&amp;md5=116571d61cbe26c690a0bee38f7740b9" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/05/03/admin-django-deux-petits-tips-pour-les-change_list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1403&amp;md5=116571d61cbe26c690a0bee38f7740b9" 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/'>[...]</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="en""><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="http://j-mad.com/blog/?flattrss_redirect&amp;id=1392&amp;md5=81086c6fe609243dd56c0dd6a4992717" type="text/html" />
	</item>
		<item>
		<title>Djangocong 2.0, le bilan</title>
		<link>http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/</link>
		<comments>http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 10:15:49 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1375</guid>
		<description><![CDATA[4 jours aprÃ¨s la fin des Cong, il est temps pour moi de faire le bilan de cette deuxiÃ¨me est, en tout cas Ã  mon sens, excellente Ã©dition. Les Congs en quelques chiffresÂ : 11 confÃ©rences le matin 12 slots de barcamp l&#8217;aprÃ¨s-midi 1 app releasÃ©e durant les Congs 1 doc de bonne pratique lancÃ©e 75 <a href='http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>4 jours aprÃ¨s la fin des <a href="http://rencontres.django-fr.org/2011/">Cong</a>, il est temps pour moi de faire le bilan de cette deuxiÃ¨me est, en tout cas Ã  mon sens, excellente Ã©dition.</p>
<h2>Les Congs en quelques chiffresÂ :</h2>
<ul>
<li>11 confÃ©rences le matin</li>
<li>12 slots de barcamp l&#8217;aprÃ¨s-midi</li>
<li>1 <a href="https://github.com/twidi/django-extended-choices/">app releasÃ©e durant les Congs</a></li>
<li>1 <a href="http://www.trunat.fr/djangocong/html/">doc de bonne pratique lancÃ©e</a></li>
<li>75 personnes le samedi matin dans l&#8217;amphi, Ã  Ã©couter les confÃ©rences (un peu moins le dimanche matin, aprÃ¨s la soirÃ©e arrosÃ©e, parce que comme lÃ  dit un illustre inconnuÂ : &#8216;ce matin, on a 50% de perte)</li>
<li>3 repas complÃ©tement pris en charge par l&#8217;organisation</li>
<li>un peu plus de 100 dosettes de Senseo utilisÃ©s sur les deux jours (mais qu&#8217;une dizaine de sachet de thÃ©, on le sait tous, le cafÃ© est supÃ©rieur au thÃ©)</li>
<li>200 litres d&#8217;eau bus, au bas mot, parce que dans le sud, il fait chaud, CongÂ !</li>
<li>Quelques bonnes dizaines de coup de soleil, cadeau surprise pour ceux qui n&#8217;ont pas l&#8217;habitude du vrai soleil du vrai sud.</li>
<li>36 litres de biÃ¨res (edit : j&#8217;avais oubliÃ© les 6litres de guinness) et 20 litres de vin bu lors des 6h qu&#8217;Ã  durer la soirÃ©e du samedi soir. Et pourtant tout le monde est rentrÃ© sur ses jambes.</li>
<li>Un nombre de kilo de paella engloutis par nos estomacs,Â  qui fait juste peur. Comme quoi les poneys, ils ont bon appÃ©tit.</li>
<li>un article dans <a href="http://www.gnulinuxmag.com/">Linux Magazine</a> dans le prochain numÃ©ro.</li>
</ul>
<h2>Les Congs du point de vue d&#8217;un organisateur.</h2>
<p>La deuxiÃ¨me Ã©dition fut l&#8217;occasion d&#8217;essayer d&#8217;Ãªtre plus pro dans l&#8217;organisation des choses. Et je pense qu&#8217;on a fait plus qu&#8217;essayer.</p>
<ul>
<li> Plus de salles dont un amphi bien Ã©quipÃ© niveau son (Merci encore Ã  <a href="https://www.centrale-marseille.fr">l&#8217;Ã©cole centrale de Marseille</a> nous avoir accueilli pendant ces deux jours).</li>
<li> Plus de prÃ©paration au niveau des repas. On a remplacÃ© les rÃ©servations dans de multiples restos par des plateaux repas et des sandwitch livrÃ©s sur site, pour gagner du temps et permettre de continuer en mangeant les discussions entamÃ©es pendant les confs.</li>
<li> Une vrai prÃ©paration pour la soirÃ©e du samedi (Ã  <a href="http://laboate.com/">la Boate</a>) et pas juste un &#8216;on va sur le vieux port et on trouve un resto comme l&#8217;annÃ©e derniÃ¨re).</li>
<li> Quelques choix un peu clivant comme des durÃ©es de conf courtes ou du <a href="http://nowificonferences.com">#Nowificonf</a> pendant une partie des Congs.</li>
<li> Moins de trajet dans ma voiture pour chercher les gens perdus ou les ramener. Marseille commence Ã  priori Ã  Ãªtre connu de tous et il n&#8217;y a plus de femme enceinte parmi les prÃ©sentes <img src='http://j-mad.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</li>
<li> Encore plein de points Ã  parfaire ou Ã  juste faire (comme prÃ©voir l&#8217;impression des badges en avance et les donner le premier matin, Ã  l&#8217;arrivÃ©e. Ou prÃ©voir un vrai carnet de route de l&#8217;accompagnant avec activitÃ©s et truc Ã  faire pour ne pas lÃ¢cher les gens comme Ã§a et qu&#8217;ils s&#8217;ennuient pendant deux jours).</li>
</ul>
<h2>Les congs d&#8217;un point de vue perso.</h2>
<p>Vivement la troisiÃ¨me Ã©dition. Comme les deux premiÃ¨res fois, la fin des Congs arrivant, un grand sentiment de vide se fait sentir et Ã  peine le dimanche soir arrivÃ©, l&#8217;envie d&#8217;Ãªtre dÃ©jÃ  Ã  l&#8217;annÃ©e prochaine, de pouvoir discuter Ã  nouveau en IRL avec des gens que je ne vois parfois qu&#8217;une fois par an.<br />
D&#8217;un point de vue perso, l&#8217;annÃ©e derniÃ¨re avait Ã©tÃ© une grande claque technique dans ma figure. Deux jours de confÃ©rences non stop, Ã§a en met plein les mirettes.<br />
Cette annÃ©e, malgrÃ© le fait qu&#8217;il y est moins de confÃ©rences ce fut encore mieux. Les confs auxquelles j&#8217;ai pu assister m&#8217;ont en effet fait dÃ©couvrir plein d&#8217;outil qu&#8217;il va falloir que je test, mais les barcamps ont permis d&#8217;Ã©changer pour de vrai, de commencer mÃªme pour certaines sessions Ã  poser les premiÃ¨res pierres de quelques choses (je pense lÃ  a Geek sans FrontiÃ¨re par exemple).</p>
<p>Mais ce n&#8217;est pas tout. L&#8217;un des points qui fait que cette deuxiÃ¨me Ã©dition fut immensÃ©ment mieux que la premiÃ¨re c&#8217;est que cette annÃ©e la partie &#8216;non technique&#8217; a Ã©tÃ© pensÃ©e et organisÃ©e. Et autant sur des dÃ©couvertes techniques, on peut imaginer les faire par IRC / billets de blog, autant rencontrer les gens et se rendre compte qu&#8217;on les apprÃ©cie, pour de vrai, hÃ© ben, y a pas Ã  dire, il faut Ãªtre dans la mÃªme piÃ¨ce.</p>
<p>On mange difficilement de la barbe Ã  papa rose sur IRC. Apprendre le GO, c&#8217;est aussi un peu compliquÃ©. Et je ne parlerais mÃªme pas de jouer Ã  &#8216;il Ã©tait une fois&#8217; avec Kael, <a href="https://twitter.com/arcagenis">Cyberj</a> et <a href="https://twitter.com/exirel">Exirel</a>. Ou de tenter de survivre Ã  une partie de PandÃ©mie. Et comme ArmagnacOverIP n&#8217;existe pas encore, on a encore besoin que <a href="https://twitter.com/dzen">dzen</a> ramÃ¨ne sa bouteille dans son sac pour y gouter (je ne t&#8217;oublie pas <a href="https://twitter.com/brutasse">brutasse</a>, ta chartreuse Ã©tait trÃ¨s bonne aussi:) ). C&#8217;est tout ces moments lÃ . Tout ces moments partagÃ©s qui font que pour de vrai, DjangoCong 2.0, putaing, c&#8217;Ã©tait terrible.</p>
<p>Et Ã  l&#8217;annÃ©e prochaine, pour d&#8217;autre aventure et une djangoCong 3.0</p>
<p>quelques liensÂ :</p>
<ul>
<li><a href="https://convore.com/django-fr/djangocong-2011-les-blogs/">le convore des articles de blog qui parlent des Congs</a></li>
<li><a href="https://convore.com/django-fr/djangocong-2011-slides/">le convore des slides des confs</a></li>
<li><a href="http://www.linkedin.com/groups?mostPopular=&amp;gid=1092347">le groupe djangofr sur linkedin</a></li>
<li><a href="http://openetherpad.org/xhKlmTVfJ2">l&#8217;etherpad de debrief collaboratif</a></li>
</ul>
<p>&nbsp;
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/" data-text="Djangocong 2.0, le bilan"data-count="vertical" data-via="mrjmad" data-lang="en""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1375&amp;md5=ad7da95ca1536426d63f87747c36e976" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/04/21/djangocong-2-0-le-bilan/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1375&amp;md5=ad7da95ca1536426d63f87747c36e976" 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/'>[...]</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="en""><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="http://j-mad.com/blog/?flattrss_redirect&amp;id=1351&amp;md5=f819a4a8749323fb8c44fc1ee93f420c" type="text/html" />
	</item>
		<item>
		<title>DjangoAstuce : masquer certains champs des settings dans la vue de Debug</title>
		<link>http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/</link>
		<comments>http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 20:42:05 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1349</guid>
		<description><![CDATA[Par dÃ©faut, la vue de DEBUG affiche toutes les settings. Heureusement pour nous, gentils petits djangonautes, les password des BD mais aussi le password du user emails sont remplacÃ©s par des belles petites ***. &#160; Mais comment faire pour masquer d&#8217;autre champs ? Comme des champs de KEY d&#8217;API ou de password divers ? Parce <a href='http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Par dÃ©faut, la vue de DEBUG affiche toutes les settings. Heureusement pour nous, gentils petits djangonautes, les password des BD mais aussi le password du user emails sont remplacÃ©s par des belles petites ***.</p>
<p>&nbsp;</p>
<p>Mais comment faire pour masquer d&#8217;autre champs ? Comme des champs de KEY d&#8217;API ou de password divers ? Parce qu&#8217;aprÃ¨s tout, il peut arriver de devoir en stocker, et de vouloir les cacher Ã  certains des yeux qui pourraient voir la vue de DEBUG.</p>
<p>&nbsp;</p>
<p>He ben, encore une fois, django a tout prÃ©vu. Il suffit en effet que le nom de votre constante contienne soit :</p>
<ul>
<li>SECRET</li>
<li>PASSWORD</li>
<li>PROFANITIES_LIST</li>
<li>SIGNATURE</li>
</ul>
<p>&nbsp;</p>
<p>Pour que dans les vues de DEBUG, leur valeur soit remplacÃ© par des ***</p>
<p>&nbsp;</p>
<p>Et bien entendu, cela marche aussi pour les key des dictionnaires que vous pourriez dÃ©clarer dans vos settings (l&#8217;exemple parfait Ã©tant celui qui sert de configuration pour les BD).
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/" data-text="DjangoAstuce : masquer certains champs des settings dans la vue de Debug"data-count="vertical" data-via="mrjmad" data-lang="en""><img src="http://j-mad.com/blog/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
 <p><a href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1349&amp;md5=41c3e7ab3bed8b8be6318f01849f1e2f" title="Flattr" target="_blank"><img src="http://j-mad.com/blog/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://j-mad.com/blog/2011/03/28/djangoastuce-masquer-certains-champs-des-settings-dans-la-vue-de-debug/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1349&amp;md5=41c3e7ab3bed8b8be6318f01849f1e2f" 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/'>[...]</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="en""><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="http://j-mad.com/blog/?flattrss_redirect&amp;id=1314&amp;md5=0d8c6cd2e5ca5656b65c7e36d63e61e5" 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/'>[...]</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="en""><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="http://j-mad.com/blog/?flattrss_redirect&amp;id=1302&amp;md5=fa2a5e1b199d67580a592dc62fe71187" type="text/html" />
	</item>
		<item>
		<title>M2m, tout petite astuce</title>
		<link>http://j-mad.com/blog/2011/02/12/m2m-tout-petite-astuce/</link>
		<comments>http://j-mad.com/blog/2011/02/12/m2m-tout-petite-astuce/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 18:14:04 +0000</pubDate>
		<dc:creator>J-Mad</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://j-mad.com/blog/?p=1289</guid>
		<description><![CDATA[Il faut parfois utiliser des m2m. Dans django, il y a deux moyens de les utiliser. Soit d&#8217;une faÃ§on simple, en dÃ©clarant juste un ManyToManyField soit en passant par une table explicite grÃ¢ce Ã  l&#8217;argument through. L&#8217;argument through permet d&#8217;avoir une table explicitement dÃ©clarÃ© que l&#8217;on peut donc manipuler avec l&#8217;ORM. Mais si on utilise <a href='http://j-mad.com/blog/2011/02/12/m2m-tout-petite-astuce/'>[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Il faut parfois utiliser des m2m. Dans django, il y a deux moyens de les utiliser. Soit d&#8217;une faÃ§on simple, en dÃ©clarant juste un ManyToManyField soit en passant par une table explicite grÃ¢ce Ã  l&#8217;argument through.</p>
<p>L&#8217;argument through permet d&#8217;avoir une table explicitement dÃ©clarÃ© que l&#8217;on peut donc manipuler avec l&#8217;ORM.</p>
<p>Mais si on utilise la mÃ©thode commune, celle oÃ¹ c&#8217;est django qui fait tout, on pourrait avoir l&#8217;impression que l&#8217;on a alors, plus accÃ¨s Ã  cette table de jointure. Ce n&#8217;est pas utile allez vous me dire, on s&#8217;en fout, la seule info que l&#8217;on manque c&#8217;est la pk des tuples.</p>
<p>C&#8217;est vrai dans la plupart des cas. Mais comment faire si vous veniez Ã  avoir besoin de pouvoir mettre la main sur ces PKÂ ? Si par exemple vous voulez synchroniser des chosesÂ ??</p>
<p>Et bien, les choses sont bien faites en django. Il existe en effet une donnÃ©es membres through qui permet de rÃ©cupÃ©rer la table crÃ©er automatiquement dans django.</p>
<p>Un petit exemple (en reprenant celui de django)</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> Topping<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #808080; font-style: italic;"># ...</span><br />
<span style="color: #ff7700;font-weight:bold;">class</span> Pizza<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #808080; font-style: italic;"># ...</span><br />
&nbsp; &nbsp; toppings <span style="color: #66cc66;">=</span> models.<span style="color: black;">ManyToManyField</span><span style="color: black;">&#40;</span>Topping<span style="color: black;">&#41;</span></div></div>
<p>pour avoir accÃ©s Ã  la table qui relie les Pizza au Topping il suffit de faireÂ :</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">Pizza.<span style="color: black;">toppings</span>.<span style="color: black;">through</span></div></div>
</p>
<p>et donc pour filter il suffit de faireÂ :</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">Pizza.<span style="color: black;">toppings</span>.<span style="color: black;">through</span>.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span> <span style="color: black;">&#40;</span>â€¦. <span style="color: black;">&#41;</span></div></div>
</p>
<p>Et voilÃ .</p>
<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/12/m2m-tout-petite-astuce/" data-text="M2m, tout petite astuce"data-count="vertical" data-via="mrjmad" data-lang="en""><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=1289&amp;md5=d55bfafc63fe981d86c1a318edbbe5f4" 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/12/m2m-tout-petite-astuce/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="http://j-mad.com/blog/?flattrss_redirect&amp;id=1289&amp;md5=d55bfafc63fe981d86c1a318edbbe5f4" type="text/html" />
	</item>
	</channel>
</rss>

