<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel>
<title><![CDATA[Planet Python francophone]]></title>
<description><![CDATA[News Python francophones]]></description>
<link>http://www.afpy.org/planet/</link>
<language>en</language>
<copyright>Copyright 2008, Atomisator</copyright>
<pubDate>Sat, 15 Mar 2008 00:15:05 +0200</pubDate>
<lastBuildDate>Sat, 15 Mar 2008 00:15:05 +0200</lastBuildDate>
  <item>
    <title><![CDATA[[wikiPython] Ctypes]]></title>
    <description><![CDATA[utilise le shebang python]]></description>
    <link><![CDATA[http://wikipython.flibuste.net/Ctypes]]></link>
    <pubDate>2009-04-16 16:47:01</pubDate>
  </item>
  <item>
    <title><![CDATA[[wikiPython] PageD'Accueil]]></title>
    <description><![CDATA[]]></description>
    <link><![CDATA[http://wikipython.flibuste.net/PageD%27Accueil]]></link>
    <pubDate>2009-04-16 16:38:06</pubDate>
  </item>
  <item>
    <title><![CDATA[[Afpy] Pilot Systems organise le World Plone Day 2009 à Paris]]></title>
    <description><![CDATA[Pilot Systems organise le World Plone Day 2009 le 22 avril à La Cantine, à Paris. Cet événement international rassemble plus de 35 localités dans le monde entier, en organisant des conférences, ateliers et autres présentations autour de Plone.]]></description>
    <link><![CDATA[http://www.afpy.org/Members/pilotsystems/world-plone-day-2009-paris]]></link>
    <pubDate>2009-04-16 12:19:50</pubDate>
    <category>A la une</category>
  </item>
  <item>
    <title><![CDATA[[wikiPython] InterfaceAvecLangage]]></title>
    <description><![CDATA[pyrex remplacé par cython]]></description>
    <link><![CDATA[http://wikipython.flibuste.net/InterfaceAvecLangage]]></link>
    <pubDate>2009-04-16 09:10:13</pubDate>
  </item>
  <item>
    <title><![CDATA[[wikiPython] BadContent]]></title>
    <description><![CDATA[]]></description>
    <link><![CDATA[http://wikipython.flibuste.net/BadContent]]></link>
    <pubDate>2009-04-16 09:10:12</pubDate>
  </item>
  <item>
    <title><![CDATA[[tarek] new blog location, new design, update your bookmarks]]></title>
    <description><![CDATA[I was thinking about doing this change for a while, and I took the time to do it last week-end:
My personal website at http://ziade.org is now powered by Pylons and Atomisator. It&#8217;s both in French and English (the urls are translated too).
It contains:

a home page with my latest twitter entries
a blog (this one)
some other pages [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=702&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/04/15/new-blog-location-new-design-update-your-bookmarks/]]></link>
    <pubDate>2009-04-15 15:51:03</pubDate>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[tarek] Distutils: introducing the check command (reStructuredText control)]]></title>
    <description><![CDATA[I am introducing the check command in Distutils. This command will check your package metadata, like the sdist and the register command already do (they display warnings).
But the new thing is that it will also allow you to check if long_description is reStructuredText compliant.
Its usage will be:
$ python setup.py check --restructuredtext
running check
warning: check: Title underline [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=692&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/04/10/distutils-introducing-the-check-command-restructuredtext-control/]]></link>
    <pubDate>2009-04-10 14:11:13</pubDate>
    <category>distutils</category>
    <category>python</category>
    <category>quality</category>
  </item>
  <item>
    <title><![CDATA[[wikiPython] email]]></title>
    <description><![CDATA[update du listing]]></description>
    <link><![CDATA[http://wikipython.flibuste.net/email]]></link>
    <pubDate>2009-04-07 15:14:53</pubDate>
  </item>
  <item>
    <title><![CDATA[[Ohan] Le contrôle de versions de sources: pourquoi?]]></title>
    <description><![CDATA[Je vais vous raconter l&#8217;histoire de Brian. Brian est ingénieur informaticien.
Le crash disque
Brian n&#8217;a pas de chance, et il a failli devoir pointer à l&#8217;ANPE quand il s&#8217;est rendu compte que

Son disque dur avait crashé
Il n&#8217;avait pas fait de sauvegarde de son boulot

Heureusement, il a pu récuperer les sources sur le serveur de production, et [...]]]></description>
    <link><![CDATA[http://mathieu.agopian.info/blog/2009/03/le-controle-de-versions-de-sources-pourquoi/]]></link>
    <pubDate>2009-03-30 18:07:54</pubDate>
    <category>(D)VCS</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] L'AFPY à Solutions Linux 2009]]></title>
    <description><![CDATA[L'AFPY est présente du 31 mars au 2 avril sur le stand VA55 du salon Solutions Linux à Paris, Porte de Versailles.]]></description>
    <link><![CDATA[http://www.afpy.org/Members/ccomb/afpynews.2009-03-30.7866508238]]></link>
    <pubDate>2009-03-30 13:45:52</pubDate>
    <category>A la une</category>
  </item>
  <item>
    <title><![CDATA[[tarek] Pycon hallway session #2: thoughts for multiple versions in Python]]></title>
    <description><![CDATA[We had an excellent brainstorming session today in the hall, with Toshio, Georg, Martin, Thomas, etc.. (sorry we were so many I don&#8217;t have the full list) with some insights from Guido and Brett. We tried to think about a way to handle multiple versions of a same package.
Here&#8217;s the two most important concepts :

Unicity: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=683&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/03/30/pycon-hallway-session-2-thoughts-for-multiple-versions-in-python/]]></link>
    <pubDate>2009-03-30 07:16:06</pubDate>
    <category>distutils</category>
    <category>pycon</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[tarek] Pycon hallway session #1: a keyring library for Python]]></title>
    <description><![CDATA[Before I sit down and clean up my summit notes to send them to python-dev, I wanted to post an entry about a small project which I think could be a great task for a student at the Summer of Code (I doubt it can fill 4 months of work but it could be done [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=676&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/03/27/pycon-hallway-session-1-a-keyring-library-for-python/]]></link>
    <pubDate>2009-03-27 14:55:30</pubDate>
    <category>pycon</category>
    <category>python</category>
    <category>gsoc</category>
  </item>
  <item>
    <title><![CDATA[[Biologeek] Réflexions sur les conférences de geeks]]></title>
    <description><![CDATA[<p>Ah le printemps, période de sortie des geeks pour aller à leurs rendez-vous préférés : se retrouver entre eux pour discuter technique de vive voix. Après avoir assisté à pas mal de confs de geeks (et parfois participé), je me suis enfin décidé à écrire quelques idées à ce sujet.</p>

<h2>Proposition et préparation</h2>

<p>Il y a deux moments importants lorsque vous choisissez de participer :</p>

<ul>
<li>le moment où vous choisissez le contenu de votre intervention ;</li>
<li>le moment où vous choisissez la manière de le présenter.</li>
</ul>

<p>Le contenu fait partie de vous, de votre expérience, de votre passion. C'est de l'acquis et il va donc falloir faire un effort de concision et de pertinence. <strong>C'est difficile mais nécessaire</strong>. Normalement au moment où vous faites votre proposition c'est déjà bouclé (d'où le travail en amont et le secret espoir qu'il n'ait pas été inutile !), au moins dans les grandes lignes.</p>

<p>Reste le format. Malheureusement, c'est souvent imposé et trop long. Il n'y a qu'à regarder <a href="http://www.ted.com">TED</a> qui est une référence en la matière : <strong>pas plus de 20 minutes. C'est le seul moyen de garder l'attention du public et d'être pertinent</strong>. Au-delà ça devient un tutoriel avec des lignes de codes ou alors ça part dans des explications trop avancées pour la moitié de la salle. J'ai fait ces erreurs, et je ne les souhaite à personne ;-).</p>

<p>D'une manière plus générale, trop peu de temps est alloué aux "entractes" qui sont aussi importantes et intéressantes que les conférences elles-mêmes. C'est bien dommage. Les barcamps évitent cela mais il serait peut-être intéressant de trouver un juste milieu. Le <a href="http://www.fing.org/jsp/fiche_actualite.jsp?STNAV=&amp;RUBNAV=&amp;CODE=1234447853381&amp;LANGUE=0">Lift Marseille</a> a l'air d'éviter ça d'après le programme.</p>

<p>Pour ce qui est de la préparation, je suis persuadé qu'il est important d'essayer de faire une pré-présentation mais pour cela il faut un auditoire pertinent (sinon je n'y arrive vraiment pas), et ça c'est malheureusement très difficile à trouver...</p>

<h2>Interactivité et discussions</h2>

<p>Beaucoup ont été surpris de me voir me ruer sur twitter à la fin de mon intervention lors de Paris Web. Je n'en ai pas reparlé mais à la base je voulais afficher les résultats de la recherche pendant les questions pour pouvoir interagir directement avec les plus timides. À la réflexion, j'aurais aimé avoir le fil des commentaires en live pendant mon intervention aussi. Je pense à twitter mais <strong>un simple curseur (anonyme) permettant de voir si on arrive à transmettre le bon message serait vraiment utile</strong>. Ça permettrait de mettre en confiance ou de redresser la barre si nécessaire. Voire d'arrêter si l'on se rend compte que l'on ne s'adresse pas au bon public.</p>

<p>Un autre point qui est toujours assez délicat lors d'une intervention c'est le passage aux questions. Impossible de savoir s'il va y en avoir trop, pas assez, pas du tout, il manque ici aussi <strong>un outil permettant de faire remonter les questions pertinentes et d'estimer avant la fin s'il faut consacrer une large par aux questions ou pas</strong>.</p>

<p>Est-ce que ces outils seraient sources de distraction ? Bien entendu mais bon, lors d'une conf de geek la moitié de l'audience a déjà un laptop sur les genoux et l'autre prend des photos en tweetant de son téléphone donc bon :-).</p>

<p>Si la conférence permet de donner une première approche sur un sujet, il serait très intéressant que la discussion se poursuive. Bien sûr il y a les questions personnelles à la fin mais ça ne concerne qu'une poignée de personnes alors qu'il y aurait matière à discuter entre tous les auditeurs autour de la problématique abordée. Quels moyens proposer pour poursuive la discussion ?</p>

<h2>Partage et expérience</h2>

<p>Qu'est-ce qui fait préférer une conférence plutôt qu'un livre ou un article sur le net ? Au-delà du charisme, c'est l'expérience de l'orateur qu'il vient partager. Je me fous de savoir qu'il faut lancer telle et telle commande pour arriver à ça. En revanche si l'auteur a eu ce problème et l'a résolu après avoir tenté ça puis ça, là ça m'intéresse. <strong>Un public a besoin qu'on lui raconte une histoire</strong>, toujours.</p>

<p><a href="http://sethgodin.typepad.com/seths_blog/2009/03/the-two-elements-of-a-great-presenter.html">Seth Godin définit deux éléments</a> permettant d'être un bon orateur :</p>

<ol>
<li>Respect (de l'auditoire)</li>
<li>Amour (pour l'auditoire)</li>
</ol>

<p>C'est exactement ça. En bonus, quelques <a href="http://www.cs.umd.edu/class/spring2002/cmsc434-0101/MUIseum/applications/presentationtips.html">conseils pertinents</a> et pleins de bon sens.</p>

<h2>Mise en application</h2>

<p>J'aurais la chance de pouvoir mettre en pratique au moins une partie de ces conseils lors d'<a href="http://euro.djangocon.org/">EuroDjangoCon à Prague du 4 au 8 mai</a> puisque j'y organise <strong>un panel autour d'Open Stack et de ses implémentations dans Django</strong>. Ça sera une première pour moi de m'exprimer en anglais et ça va être difficile car j'ai un niveau vraiment moyen mais il faut de toute façon que je m'y mette sérieusement car ça me frustre souvent.</p>

<p>J'ai aussi soumis pas mal de propositions pour <a href="http://pycon.fr/">Pyconfr</a> qui se tiendra les 30-31 mai et je me réjouis de voir qu'une partie de ces réflexions sur lesquelles je cogite depuis un moment ont été mises en pratique via les choix de formats et les durées proposées par les organisateurs.</p>

<p>Au plaisir de vous y retrouver. :-)</p>



<div>
<p>
    <a href="http://www.biologeek.com/" title="">
        <img src="http://media2.biologeek.com/css/images/logo.png" alt="Logo biologeek" />
    </a>
    <a href="http://www.biologeek.com/conferences,django,python,web/reflexions-sur-les-conferences-de-geeks/"><strong>Réflexions sur les conférences de geeks</strong></a> 
    a été rédigé par <a href="http://david.larlet.fr">David Larlet</a> pour 
    <a href="http://www.biologeek.com">biologeek.com</a> et a été originellement 
    posté le 27 mars 2009. À part exceptions, c'est 
    ©2004-2009 David Larlet et sous <a href="http://www.biologeek.com/contact/#licence" title="À lire avant toute (re)copie">licence (presque) libre</a> autorisant 
    la reproduction, la distribution et la modification sous certaines conditions.
    Veuillez les respecter.
</p>
</div><br/><br/>
<div>
  <strong>Related</strong>
  <ul>
         <li><a href="http://www.biologeek.com/conferences,django,python/lelitisme-de-la-curiosite/">[Biologeek] L'élitisme de la curiosité</a></li>

     <li><a href="http://www.biologeek.com/django,python,web/son-propre-tinyurl-en-python-et-html5-avec-webpy/">[Biologeek] Son propre TinyURL en Python et HTML5 avec webpy</a></li>

     <li><a href="http://www.biologeek.com/django,python,web-frameworks/sortie-de-django-10-une-annee-de-nouveautes/">[Biologeek] Sortie de Django 1.0, une année de nouveautés</a></li>

     <li><a href="http://www.biologeek.com/conferences,django,python/conferences-django-pour-pycon-fr/">[Biologeek] ★ Conférences Django pour PyCon fr</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,conferences,django,python,traduction/bonnes-pratiques-et-astuces-python/">[Biologeek] Bonnes pratiques et astuces Python</a></li>

     <li><a href="http://www.biologeek.com/django,informatique,python,web-frameworks,web-semantique/des-vacances-et-des-liens/">[Biologeek] Des vacances et des liens</a></li>

     <li><a href="http://www.biologeek.com/critique,livre,python/envie-de-developper-agilement-en-python-suivez-le-guide/">[Biologeek] Envie de développer agilement en Python ? Suivez le guide !</a></li>

     <li><a href="http://www.biologeek.com/django,python,rest,web-frameworks/une-solution-pour-faciliter-la-conception-d-applications-web-restful-avec-django/">[Biologeek] Une solution pour faciliter la conception d'applications web RESTful avec Django</a></li>

     <li><a href="http://www.biologeek.com/conferences,django,python/presentation-de-django-aux-journees-python-francophones/">[Biologeek] Présentation de Django aux journées Python francophones</a></li>

     <li><a href="http://www.biologeek.com/python,web-frameworks/developpement-web-python-et-frameworks-tour-d-horizon-debut-2007/">[Biologeek] Développement web python et frameworks, tour d'horizon début 2007</a></li>

     <li><a href="http://www.biologeek.com/django,python,web-frameworks/modelisation-d-un-workflow-lineaire-avec-django/">[Biologeek] Modélisation d'un workflow linéaire avec Django</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/benchmarks-map-filter-vs-list-comprehensions/">[Biologeek] Benchmarks map, filter vs. list-comprehensions</a></li>

     <li><a href="http://www.biologeek.com/python,web/analyse-des-donnees-utilisateur-d-aol-suite-et-fin/">[Biologeek] Analyse des données utilisateur d'AOL : suite et fin</a></li>

     <li><a href="http://www.biologeek.com/python,web/les-100-premiers-mots-cles-recherches-par-les-utilisateurs-d-aol/">[Biologeek] Les 100 premiers mots-clés recherchés par les utilisateurs d'AOL</a></li>

     <li><a href="http://www.biologeek.com/python/pourquoi-programmer-en-python/">[Biologeek] ★ Pourquoi programmer en Python ?</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/python-et-underscore/">[Biologeek] Python : lisibilité vs simplicité</a></li>

     <li><a href="http://www.biologeek.com/critique,livre,python/critique-du-livre-programmation-python/">[Biologeek] Critique du livre Programmation Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/principales-nouveautes-dans-python-25/">[Biologeek] Principales nouveautés dans Python 2.5</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/un-template-python-pour-parser-des-arguments/">[Biologeek] Un template python pour parser des arguments</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/optimisation-des-chaines-de-caracteres-en-python-le-retour/">[Biologeek] Optimisation des chaînes de caractères en Python : le retour !</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/formatage-des-chaines-de-caracteres-en-python/">[Biologeek] Formatage des chaînes de caractères en Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/optimisation-des-chaines-de-caracteres-en-python/">[Biologeek] Optimisation des chaînes de caractères en Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/bonnes-pratiques-de-la-programmation-en-python/">[Biologeek] ★ Bonnes pratiques de la programmation en Python</a></li>

     <li><a href="http://www.biologeek.com/python,web/convertisseur-de-syntaxes-wiki-dotclear-a-dokuwiki/">[Biologeek] Convertisseur de syntaxes wiki Dotclear à Dokuwiki</a></li>

  </ul>
</div>
]]></description>
    <link><![CDATA[http://www.biologeek.com/conferences,django,python,web/reflexions-sur-les-conferences-de-geeks/]]></link>
    <pubDate>2009-03-27 12:57:20</pubDate>
    <category>conferences</category>
    <category>django</category>
    <category>python</category>
    <category>web</category>
  </item>
  <item>
    <title><![CDATA[[QuiSaura] Intro à Plone 3 : partie 3]]></title>
    <description><![CDATA[<p><em><p>Troisi&egrave;me partie de l'intro &agrave; Plone 3 .</p></em></p>
<p><p>Mieux vaut tard que jamais.</p>
<p>Dans cette partie on va :</p>
<p>- configurer le fichier content/configure.zcml<br />- cr&eacute;er un profil<br /><br />et puis je pense que ca suffira.</p>
<p>&nbsp;</p>
<h1>Une petite mise en bouche</h1>
<p>Dans content/configure.zcml on va d&eacute;finir les permissions sur nos classes :</p>
<div class="code">
<p>&lt;configure<br />&nbsp;   xmlns="http://namespaces.zope.org/zope"<br />&nbsp;   xmlns:five="http://namespaces.zope.org/five"<br />&nbsp;   i18n_domain="jesuisunconnard.metier"&gt;<br /><br /><br />&nbsp;  &nbsp;<br />&nbsp;   &lt;<span>class</span> class=".DossierHistoire.<span>DossierHistoire</span>"&gt;<br />&nbsp;       &lt;require<br />&nbsp;           permission="<span>zope2.View</span>"<br />&nbsp;           interface="..interfaces.<span>IDossierHistoire</span>"<br />&nbsp;           /&gt;<br />&nbsp;       &lt;require<br />&nbsp;           permission="<span>cmf.ModifyPortalContent</span>"<br />&nbsp; <span>set_schema</span>="..interfaces.<span>IDossierHistoire</span>"<br />&nbsp;           /&gt;<br />&nbsp;   &lt;<span>/class</span>&gt;<br />&nbsp;  &nbsp;<br />&nbsp; &nbsp;<br />&nbsp;   &lt;<span>class</span> class=".Histoire.<span>Histoire</span>"&gt;<br />&nbsp;       &lt;require<br />&nbsp;           permission="<span>zope2.View</span>"<br />&nbsp;           interface="..interfaces.<span>IHistoire</span>"<br />&nbsp;<span> </span>/&gt;<br />&nbsp;       &lt;require<br />&nbsp;           permission="<span>cmf.ModifyPortalContent</span>"<br />&nbsp;<span> set_schema</span>="..interfaces.<span>IHistoire</span>"<br />&nbsp;           /&gt;<br />&nbsp; &lt;<span>/class</span>&gt;  <br />&lt;/configure&gt;</p>
</div>
<p><br />Pas compliqu&eacute;.<br /><span>Tout le monde</span> poura acc&eacute;der aux m&eacute;thodes&amp;attributs de l'interface  <span>IDossierHistoire </span>qu'impl&eacute;mente <span>DossierHistoire</span>, alors que pour les &nbsp;<span>&eacute;diter </span>il faudra avoir <span>un certain droit</span>.<br />Et c'est pareil pour <span>Histoire</span>.</p>
<p>Voil&agrave;, voil&agrave; c'est termin&eacute; pour le dossier <strong>content</strong>.</p>
<p>Maintenant il faut l'inclure dans <strong>jesuisunconnard.metier</strong> , pour cela il suffit &nbsp;de rajouter une ligne dans le<strong> configure.zcml</strong> principal (<em>jesuisunconnard.metier/jesuisunconnard/metier/configure.zcml</em>) ; ce qui donne :</p>
<div class="code">
<p>&lt;configure<br />&nbsp;   xmlns="http://namespaces.zope.org/zope"<br />&nbsp;   xmlns:five="http://namespaces.zope.org/five"<br />&nbsp;   i18n_domain="jesuisunconnard.metier"&gt;<br /><br />&nbsp;   <strong>&lt;include package=".</strong><span>content</span><strong>" /&gt;</strong><br />&nbsp;   &lt;five:<span>registerPackage</span> package="." /&gt;<br /><br />&lt;/configure&gt;</p>
</div>
<p><br />&Agrave; &nbsp;noter que dans la balise  <span>registerPackage</span>, j ai enlev&eacute; &nbsp;l'attribut i<strong>nitialize</strong>, vu qu'il nous sert &agrave; rien pour le moment.</p>
<p>&nbsp;</p>
<h1>Le plat de r&eacute;sistance</h1>
<p>Souvenez-vous, dans la partie 2, on d&eacute;clarait un type pour chacune de nos 2 classes.<br />Et je disais justement, qu'il faudrait les d&eacute;finir via des fichiers <strong>.xml</strong>, et bah ya plus qu'&agrave;! &nbsp;<br />Je vous pr&eacute;viens va falloir r&eacute;sister &agrave; la tentation de dormir, sinon je ne vous d&eacute;livrerai pas de votre ignorance. AMEN.</p>
<p>On va devoir cr&eacute;er nos fichiers <strong>.xml</strong> &nbsp;dans un profil.<br />Or <strong>jesuisunconnard.metier</strong> n'en a pas, donc on en cr&eacute;e un.<br /><br />Fichier <em>jesuisunconnard.metier/jesuisunconnard/metier/configure.zcml </em>:</p>
<div class="code">
<p>&lt;configure<br />&nbsp; &nbsp;xmlns="http://namespaces.zope.org/zope"<br /> &nbsp; &nbsp;xmlns:five="http://namespaces.zope.org/five"<br /> &nbsp; &nbsp;i18n_domain="jesuisunconnard.metier"&gt;<br />&nbsp; &nbsp;&lt;genericsetup:registerProfile<br />&nbsp; &nbsp; &nbsp; name="default"<br /> &nbsp; &nbsp; &nbsp; directory="profiles/default"<br /> /&gt;<br />&lt;/configure&gt;</p>
</div>
<p><br />puis il faut cr&eacute;er les dossiers :</p>
<div class="code">
<p>$ cd jesuisunconnard.metier/jesuisunconnard/metier/ &amp;&amp; mkdir -p profiles/default</p>
</div>
<p>Je ne r&eacute;-explique pas &nbsp;&agrave; quoi ca sert un profil, cf <a title="partie 1 plone" href="http://www.qui-saura.fr/syndication/monBlog/plone3-1.html" target="_blank">partie 1</a>.<br />Voil&agrave; la base est faite.<br /><br />Pour d&eacute;finir nos types/objets, il faut d'abord les enregistrer :<br />nouveau fichier <strong>profiles/default/types.xml</strong> :</p>
<div class="code"><span>&lt;object name="portal_types" meta_type="Plone Types Tool"&gt;</span> <br />&nbsp; &nbsp;<strong>&lt;object</strong> name="<span>DossierHistoire</span>"<br /> <strong>meta_type</strong>="Factory-based Type Information with dynamic views"/&gt;<br /> &nbsp; &nbsp;&lt;<strong>object</strong> name="<span>Histoire</span>"<br /> <strong>meta_type</strong>="Factory-based Type Information with dynamic views"/&gt;<br /> &lt;/object&gt;<br /></div>
<p><br />C'est la meme logique que pour le <strong>.xml</strong> de la <a title="partie 1 plone" href="http://www.qui-saura.fr/syndication/monBlog/plone3-1.html" target="_blank">partie 1</a> :<br />on s&eacute;lectionne notre objet <span>portal_types&nbsp;</span>et on va y enregistrer nos 2 nouveaux types :<br />les <strong>objets</strong> <span>DossierHistoire</span> &nbsp;et <span>Histoire</span> (<span>ils</span> doivent correspondre aux valeurs de <strong>portal_type</strong> dans la d&eacute;claration des classes)<br /><strong>meta_type</strong> : pas important pour ce tuto, mettez &ccedil;a et mangez du saucisson.</p>
<p>&Agrave; pr&eacute;sent on va les d&eacute;finir ; pour ce faire, dans le dossier <strong>default</strong> on cr&eacute;e le dossier <strong>types</strong> .<br />Dedans, on va cr&eacute;er 2 fichiers <strong>.xml</strong> qui auront pour noms ceux de nos objets fraichement enregistr&eacute;s :<br />soient <span>DossierHistoire</span>.xml et <span>Histoire</span>.xml .</p>
<p>Voici <span>DossierHistoire</span>.xml :</p>
<div class="code">
<p>&lt;?xml version="1.0"?&gt;<br />&lt;<strong>object</strong> <span>name</span>="DossierHistoire"<br />&nbsp;&nbsp; <span>meta_type</span>="Factory-based Type Information with dynamic views"<br />&nbsp;&nbsp; i18n:domain="jesuisunconnard.metier" xmlns:i18n="http://xml.zope.org/namespaces/i18n"&gt;<br />&nbsp;&nbsp; <br />&nbsp;&lt;<span>property</span> name="<span>title</span>" i18n:translate=""&gt;DossierHistoire&lt;/property&gt;<br />&nbsp;&lt;<span>property</span> name="<span>description</span>"<br />&nbsp;&nbsp;&nbsp;&nbsp; i18n:translate=""&gt;Un dossier pour les histoires&lt;/property&gt;<br /><br />&nbsp;&lt;<span>property</span> name="<span>content_meta_type</span>"&gt;DossierHistoire&lt;/property&gt;<br />&nbsp;&lt;<span>property</span> name="<span>product</span>"&gt;jesuisunconnard.metier&lt;/property&gt;<br />&nbsp;&lt;<span>property</span> name="<span>factory</span>"&gt;addDossierHistoire&lt;/property&gt;<br /><br />&nbsp;&lt;<span>property</span> name="<span>immediate_view</span>"&gt;atct_edit&lt;/property&gt;<br />&nbsp;<br />&nbsp;&lt;<span>property </span>name="<span>global_allow</span>"&gt;True&lt;/property&gt;<br />&nbsp;&lt;<span>property</span> name="<span>filter_content_types</span>"&gt;True&lt;/property&gt;<br />&nbsp;&lt;<span>property</span> name="<span>allowed_content_types</span>"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;<span>element </span>value="Histoire" /&gt;<br />&nbsp;&lt;/<span>property</span>&gt;<br />&nbsp; &lt;<span>property </span>name="<span>allow_discussion"</span>&gt;False&lt;/property&gt;<br />&nbsp;&lt;<span>property</span> name="<span>default_view</span>"&gt;derniers&lt;/property&gt;<br />&nbsp;&lt;<span>property</span> name="<span>view_methods</span>"&gt;<br />&nbsp; &lt;element value="derniers"/&gt;<br />&nbsp; &lt;element value="aleatoire"/&gt;<br />&nbsp; &lt;element value="view"/&gt;<br />&nbsp; &lt;element value="folder_summary_view"/&gt;<br />&nbsp; &lt;element value="folder_tabular_view"/&gt;<br />&nbsp; &lt;element value="folder_listing"/&gt;<br />&nbsp;&lt;/<span>property</span>&gt;<br />&nbsp;<br />&nbsp;&lt;<span>alias</span> from="<span>(Default)</span>" to="(dynamic view)"/&gt;<br />&nbsp;&lt;<span>alias</span> from="<span>edit</span>" to="atct_edit"/&gt;<br />&nbsp;&lt;<span>alias</span> from="<span>sharing</span>" to="@@sharing"/&gt;<br />&nbsp;&lt;<span>alias</span> from="<span>view</span>" to="(selected layout)"/&gt;<br />&nbsp;&lt;<span>action</span> title="<span>View</span>" action_id="view" category="object" condition_expr=""<br />&nbsp;&nbsp;&nbsp; url_expr="string:${folder_url}/" visible="True"&gt;<br />&nbsp; &lt;permission value="View"/&gt;<br />&nbsp;&lt;/action&gt;<br />&nbsp;&lt;<span>action</span> title="<span>Edit</span>" action_id="edit" category="object" condition_expr=""<br />&nbsp;&nbsp;&nbsp; url_expr="string:${object_url}/edit" visible="True"&gt;<br />&nbsp; &lt;permission value="Modify portal content"/&gt;<br />&nbsp;&lt;/action&gt;<br />&lt;/object&gt;</p>
</div>
<p><br />Bon allez c'est la ligne droite : si vous ne vous plantez pas comme senna apr&egrave;s &ccedil;a c'est la fin de la partie.</p>
<p><span>ligne 2</span> : le <span>nom</span> de notre <strong>objet</strong> : le m&ecirc;me que celui &eacute;crit dans <strong>types.xml</strong> .<br /><span>ligne 3 :</span> le m&ecirc;me que celui &eacute;crit dans <em>types.xml</em>.<br /><span>ligne 6 </span>: le <span>titre</span> de notre <strong>objet</strong> : on met le <span>nom </span>de l'<strong>objet</strong> .<br /><span>ligne 7/8</span> : une <span>description</span> pour notre <strong>objet</strong>.<br /><span>ligne 10</span> : ici on met le <span>nom</span> de notre <strong>objet.</strong><br /><span>ligne 11</span> : le produit auquel appartient l'<strong>objet</strong> : notre egg.<br /><span>ligne 12</span> :&nbsp; on d&eacute;finit un factory qui doit &ecirc;tre de la forme : <em>addMonType</em>.<br />Il sera cr&eacute;&eacute; par <strong>Archetypes</strong> (cf une future partie).<br />Il va &ecirc;tre charg&eacute; entre autre (pas s&ucirc;r de l'orthographe) de cr&eacute;er l'<strong>objet</strong>.<br /><span>ligne 14</span> : absolument inutile pour le moment.<br />Est cens&eacute; nous <span>rediriger</span> sur la <span>vue</span> (en l'occurence <em>atct_edit</em>, cr&eacute;&eacute;e automatiquement par Archetypes) une fois l'<strong>objet</strong> cr&eacute;&eacute;, mais ne fonctionne pas pour le moment.<br /><span>ligne 16</span> : &agrave; <span>True</span>, permet d'ajouter notre <strong>objet</strong> depuis n'importe quel autre objet.<span><br />ligne 17</span> :&nbsp; Va avec les lignes 18, 19 et 20 . &agrave;<span> True</span>, permet de filtrer les objets que l'on peut ajouter dedans.<br /><span>ligne 18</span> : Comme on a mis &agrave; <span>True</span> la propri&eacute;t&eacute; pr&eacute;c&eacute;dente, on doit indiquer les objets que l'on peut ajouter dans notre<strong> objet</strong> &agrave; l'int&eacute;rieur de cette <span>balise</span> ;<br /><span>ligne 19 </span>:&nbsp; ceci ce fait via &lt;<span>element</span> value="MonType" /&gt; : ici, on autorise seulement les histoires &agrave; &ecirc;tre ajout&eacute;es dans notre DossierHistoire ( normal hein).<br /><span>ligne 20</span> : on ferme la balise.<br /><span>ligne 21</span> : Si on autorise les commentaires sur notre objet , bien s&ucirc;r que non ! donc <span>False</span>. Manquerait plus que &ccedil;a ...<br /><span>ligne 22</span> : la vue par d&eacute;faut de notre objet cad qu'acc&eacute;der &agrave;&nbsp; <strong>www.jesuisunconnard.com/monObjet/</strong> revient &agrave;<strong> www.jesuisunconnard.com/monObjet/maVueParDefaut </strong>. Ici la vue par d&eacute;faut est <strong>derniers</strong> que l'on verra dans une autre partie.<br /><span>ligne 23/30</span> : heureusement que c'est la fin, je commence &agrave; manquer de couleurs.<br />Liste les diff&eacute;rentes vues d'affichage disponibles pour notre objet (que l'on verra via "affichage"), la vue <strong>aleatoire</strong> sera cr&eacute;&eacute;e &eacute;galement plus tard, les autres existent d&eacute;j&agrave;.<br /><span>ligne 32</span> : "surchage" la ligne 22. Acc&eacute;der &agrave; <strong>www.jesuisunconnard.com/monObjet/</strong> reviendra &agrave; <strong>www.jesuisunconnard.com/monObjet/maVueAffichageParDefautEnCours</strong><br /><span>ligne 33</span> :&nbsp; action "editer" notre <strong>objet</strong> : nous redirigera sur la vue <span>atct_edit</span>.<br /><span>ligne 34</span> :&nbsp; action "partager" notre <strong>objet</strong>: nous redirigera sur la vue <span>@@sharing</span>.<br /><span>ligne 35</span> :&nbsp; action "voir" notre <strong>objet</strong> : nous redirigera sur la vue d'affichage actuelle de notre <strong>objet</strong>.<br /><span>ligne 36/37/38</span> : Appuyer sur le bouton "voir" est associ&eacute; &agrave; l'action "voir"(<span>ligne 34</span> ) , le lien sera de la forme : <strong>www.jesuisunconnard.com/monObjet/ </strong>et sera accessible par tous.<br />igne 39 : on la ferme<br />ligne 40/41/42 : Appuyer sur le bouton "Edit" est associ&eacute; &agrave; l'action "edit"(<span>ligne 33</span> ), le lien sera de la forme <strong>www.jesuisunconnard.com/monObjet/edit</strong> et sera accessible uniquement par les admins. <br />ligne 43 : on la ferme<br />ligne 44 : fini !</p>
<p>Voil&agrave;,je suis conscient que les explications doivent &ecirc;tre assez pourries pour ces 44 lignes mais j'aime le chocolat.<br /><br />je ne r&eacute;-explique pas le fichier Histoire.xml que voici :</p>
<div class="code">
<p>&lt;?xml version="1.0"?&gt;<br />&lt;object name="Histoire"<br />&nbsp;&nbsp; meta_type="Factory-based Type Information with dynamic views"<br />&nbsp;&nbsp; i18n:domain="jesuisunconnard.metier" xmlns:i18n="http://xml.zope.org/namespaces/i18n"&gt;<br />&nbsp;&lt;property name="title" i18n:translate=""&gt;Histoire&lt;/property&gt;<br />&nbsp;&lt;property name="description"<br />&nbsp;&nbsp;&nbsp;&nbsp; i18n:translate=""&gt;Detail Histoire&lt;/property&gt;<br />&nbsp;&lt;property name="content_meta_type"&gt;Histoire&lt;/property&gt;<br />&nbsp;&lt;property name="product"&gt;jesuisunconnard.metier&lt;/property&gt;<br />&nbsp;&lt;property name="factory"&gt;addHistoire&lt;/property&gt;<br />&nbsp;&lt;property name="immediate_view"&gt;atct_edit&lt;/property&gt;<br />&nbsp;&lt;property name="global_allow"&gt;False&lt;/property&gt;<br />&nbsp;&lt;property name="filter_content_types"&gt;False&lt;/property&gt;<br />&nbsp;&lt;property name="allowed_content_types" /&gt;<br />&nbsp;&lt;property name="allow_discussion"&gt;True&lt;/property&gt;<br />&nbsp;&lt;property name="default_view"&gt;details&lt;/property&gt;<br />&nbsp;&lt;property name="view_methods"&gt;<br />&nbsp; &lt;element value="details"/&gt;<br />&nbsp;&lt;/property&gt;<br />&nbsp;&lt;alias from="(Default)" to="(dynamic view)"/&gt;<br />&nbsp;&lt;alias from="edit" to="atct_edit"/&gt;<br />&nbsp;&lt;alias from="sharing" to="@@sharing"/&gt;<br />&nbsp;&lt;alias from="view" to="(selected layout)"/&gt;<br />&nbsp;&lt;action title="View" action_id="view" category="object" condition_expr=""<br />&nbsp;&nbsp;&nbsp; url_expr="string:${object_url}" visible="True"&gt;<br />&nbsp; &lt;permission value="View"/&gt;<br />&nbsp;&lt;/action&gt;<br />&nbsp;&lt;action title="Edit" action_id="edit" category="object" condition_expr=""<br />&nbsp;&nbsp;&nbsp; url_expr="string:${object_url}/edit" visible="True"&gt;<br />&nbsp; &lt;permission value="Modify portal content"/&gt;<br />&nbsp;&lt;/action&gt;<br />&lt;/object&gt;</p>
</div>
<p><br />Puisqu'il y a exactement les m&ecirc;mes balises.<br /><br /><br />Si vous remaquez <span>une</span> des erreurs, n'h&eacute;sitez-pas,<br />pour les questions pareil ( d'ailleurs mon mail david [arrobase] qui-saura [point] fr ne marche toujours pas [je dois compiler postfix &agrave; "la main" pour avoir les modules sasl&amp;co] donc d&eacute;sol&eacute; pour ceux &agrave; qui je ne peux plus r&eacute;pondre, utiliez le mail de la page "A propos" ).</p></p>]]></description>
    <link><![CDATA[http://www.qui-saura.fr/monBlog/plone3-3.html]]></link>
    <pubDate>2009-03-26 23:15:17</pubDate>
  </item>
  <item>
    <title><![CDATA[[tarek] Packaging Survey first results]]></title>
    <description><![CDATA[Around 570 people answered the survey, which is a great number I didn&#8217;t expect. Thanks again to Massimo for his help on this.
I have a lot of work to read all the open question answers, and all the comments that goes with the &#8220;other&#8221; answer, but I wanted to publish the results of the closed [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=656&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/03/26/packaging-survey-first-results/]]></link>
    <pubDate>2009-03-26 03:35:09</pubDate>
    <category>distutils</category>
    <category>packaging</category>
    <category>pycon</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[tarek] Pycon Language Summit is tomorrow]]></title>
    <description><![CDATA[Tomorrow is the Language Summit, yeepee.  
The package and distribution part of the Summit is going to be great since we have key people coming up.
zc.buildout and pip leaders (Jim Fulton and Ian Bicking) will be  present, and many others. I&#8217;ll be representing Distutils,  since I am its current maintainer. Unfortunately Philip [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=645&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/03/26/pycon-language-summit-is-tomorrow/]]></link>
    <pubDate>2009-03-26 02:38:15</pubDate>
    <category>distutils</category>
    <category>pycon</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[wikiPython] moin.py/WxPython]]></title>
    <description><![CDATA[]]></description>
    <link><![CDATA[http://wikipython.flibuste.net/moin.py/WxPython]]></link>
    <pubDate>2009-03-25 23:26:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[glooze] Une communauté python accueillante !]]></title>
    <description><![CDATA[Après avoir été guidé dans l&#8217;apprentissage par quelques amis (apprentissage qui ne fut pas vraiment long, le plus long sera d&#8217;apprendre les petites spécificités et particularités du langage), avoir trouvé des gens sympathiques sur le salon de discussion #afpy sur le serveur irc.freenode.net, me voilà sur le planet de l&#8217;afpy !

Donc bonjour à tous ceux [...]]]></description>
    <link><![CDATA[http://blog.segle.org/index.php/2009/03/16/une-communaute-python-accueillante/]]></link>
    <pubDate>2009-03-16 14:07:29</pubDate>
    <category>Ma vie</category>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[tarek] How to upload your package to Plone.org]]></title>
    <description><![CDATA[We have been working hard in the past few months with my Plone friends to make it happen.
It&#8217;s now available : Plone.org is acting like PyPI in its Products section, which means that you can use Distutils to register and upload your packages in both places now.
I have written a small tutorial on plone.org to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=638&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/03/15/how-to-upload-your-package-to-ploneorg/]]></link>
    <pubDate>2009-03-15 13:35:49</pubDate>
    <category>distutils</category>
    <category>plone</category>
    <category>python</category>
    <category>zc.buildout</category>
  </item>
  <item>
    <title><![CDATA[[Ohan] Django, sqlite et mod_wsgi, attention au piège!]]></title>
    <description><![CDATA[Tout d&#8217;abord, je tiens à préciser que le problème qui suit n&#8217;est pas limité à l&#8217;utilisation de django ou de mod_wsgi.
Le contexte
Utilisation de SQLite pour un projet django déployé sur mod_wsgi:
# settings.py
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = '/opt/mysite/mysite.db'
Et voici les permissions sur le système de fichier:
-rw-rw-rw- 1 ohan ohan 29696 2009-03-14 13:30 mysite.db
Tous les répertoires parents sont [...]]]></description>
    <link><![CDATA[http://mathieu.agopian.info/blog/2009/03/django-sqlite-et-mod_wsgi-attention-au-piege/]]></link>
    <pubDate>2009-03-14 14:34:18</pubDate>
    <category>django</category>
    <category>mod_wsgi</category>
    <category>sqlite</category>
  </item>
  <item>
    <title><![CDATA[[ccomb] Votre blog sur le Planet de l'AFPY]]></title>
    <description><![CDATA[<div class="document">
<p>Pour rappel, l'AFPY possède un flux RSS avec des nouvelles fraîches parlant de Python.</p>
<p>L'adresse du flux est ici : <a href="http://www.afpy.org/planet/rss.xml" class="reference external">http://www.afpy.org/planet/rss.xml</a></p>
<p>Un <a href="http://fr.wikipedia.org/wiki/Planet" class="reference external">Planet</a> nommé <a href="https://svn.afpy.org/misc/atomisator.afpy.org/packages/Yap/trunk/" class="reference external">Yap</a> fabriqué avec <a href="http://pylonshq.com" class="reference external">Pylons</a> présente ce flux sur le site de l'AFPY :</p>
<p><a href="http://www.afpy.org/planet/" class="reference external">http://www.afpy.org/planet/</a></p>
<p>Le flux lui-même est créé grâce à <a href="http://atomisator.ziade.org" class="reference external">Atomisator</a>, le framework d'agrégation web de Tarek, à partir d'une liste de sources prédéfinie. Si vous possédez un blog parlant de Python, ou qui peut être filtré par Tag, Catégorie ou Recherche sur Python, vous pouvez m'envoyer l'adresse et je l'ajouterai à la liste.</p>
</div>]]></description>
    <link><![CDATA[http://ccomb.gorfou.fr/2009/3/14/votre-blog-sur-le-planet-de-l-afpy]]></link>
    <pubDate>2009-03-14 09:17:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[glooze] Dis papa, comment t’es devenu un monsieur qui a une peluche d’éléphant et une peluche de serpent ?]]></title>
    <description><![CDATA[Et si aujourd&#8217;hui en ce vendredi ensoleillé, je vous racontais ma vie et pourquoi/comment je suis devenu développeur avec PHP ? J&#8217;ai pas d&#8217;enfant, mais un jour, il me posera quand même peut-être cette question, si on suppose qu&#8217;entre temps j&#8217;ai acheté les peluches des mascottes de mes langages préférés&#8230;
Les débuts plutôt basiques &#8230;
TI-83. Obtenue [...]]]></description>
    <link><![CDATA[http://blog.segle.org/index.php/2009/03/13/dis-papa-comment-tes-devenu-un-monsieur-qui-a-une-peluche-delephant-et-une-peluche-de-serpent/]]></link>
    <pubDate>2009-03-13 14:39:06</pubDate>
    <category>Ma vie</category>
    <category>Prog</category>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[glooze] Dans la série “Glooze découvre Python …”]]></title>
    <description><![CDATA[... je demande &#8220;Les paramètres nommés&#8220;.

Moi, quand même, ça me bluffe comment il est bourré de petites choses sympa et puissantes, ce langage. Les paramètres optionnels, c&#8217;est courant dans plein de langages, mais les paramètres nommés nettement moins&#8230;]]></description>
    <link><![CDATA[http://blog.segle.org/index.php/2009/03/13/dans-la-serie-glooze-decouvre-python/]]></link>
    <pubDate>2009-03-13 09:33:33</pubDate>
    <category>Ma vie</category>
    <category>Prog</category>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[Biologeek] L'élitisme de la curiosité]]></title>
    <description><![CDATA[<p>J'ai comme prévu fait une rapide description des <a href="http://www.biologeek.com/2009/01/django-vs-concurrence-php/">avantages de Django à La Cantine</a> (oui ce billet date un peu...) et je ne compte pas faire un résumé de ce qui a été dit. Je souhaiterais en revanche revenir sur une question concernant l'élitisme de Python ou Ruby face à PHP car c'est vraiment dommage que ce soit ressenti comme tel par les développeurs PHP.</p>

<p>Ces langages sont <strong>accessibles</strong>, il ne faut pas une semaine pour faire son premier programme mais une après-midi, il suffit juste d'être motivé pour essayer et pouvoir en juger par soi-même. Il y a énormément de support derrière (listes de diffusion, salons irc, tutoriels, blogs, etc) donc ce n'est finalement qu'un problème de « barrière psychologique » qui peut venir :</p>

<h2>D'une peur de l'inconnu</h2>

<p>Ou peut-être plus <strong>surestimation</strong> finalement. Il ne faut pas croire que certains langages sont réservés à certaines personnes ultra-compétentes, c'est faux.</p>

<p>Le plus marrant c'est qu'il s'agit du contraire avec ces langages car ils permettent de créer ses premières applications très rapidement, sans avoir besoin de connaître toutes les fonctions/modules de la bibliothèque standard.</p>

<p>Pour reprendre <a href="http://www.clochix.net/post/2009/01/21/C-est-le-printemps">un témoignage récent</a> :</p>

<blockquote>
  <p>je l'ai [Django] testé, et ai été assez épaté par sa simplicité et sa puissance. Je suis fan de Symfony, mais il est assez complexe, et sa courbe d'apprentissage est rude. Django m'est apparu bien plus simple. Sans connaître Python, j'ai pu en quelques heures seulement commencer à jouer avec le framework, réaliser une première application, la faire évoluer assez rapidement...</p>
</blockquote>

<p>Il faut aller au-delà de cette peur, <strong>prendre le temps d'essayer et de juger si ça vaut l'investissement en temps que vous allez y consacrer</strong>. C'est un risque mais... une vie sans risque doit être bien ennuyeuse ! :-)</p>

<h2>D'un manque de confiance en soi</h2>

<p>Suivre un tutoriel d'apprentissage est rapide et facile. C'est lorsqu'il faut aller plus loin que ça prend du temps (j'apprends encore de nouvelles choses sur Django et Python quasi-quotidiennement), mais si un simple tutoriel vous permet d'apercevoir les fondements du langage et s'il va vous plaire ou pas. <a href="http://www.biologeek.com/python/cours-pour-apprendre-python/">Ces tutoriels</a> ne sont pas réservés à une élite !</p>

<p>Après il faut aussi accepter de repartir, non pas de rien (si vous connaissez Symfony par exemple, essayer/adopter Django sera très simple) mais forcément apprendre de nouvelles méthodes, de nouvelles façons d'envisager certains problèmes. <strong>Accepter de redevenir débutant fait du bien mais demande une bonne part de confiance en soi, en sa capacité d'adaptation</strong>.</p>

<h2>D'un manque de curiosité</h2>

<p>Il est bien sûr plus simple de rester dans son petit confort mais c'est peut-être ce qui me déprime le plus, penser qu'il y a des développeurs qui vont utiliser pendant 10 ans une même techno, sans essayer autre chose alors que l'<strong>on fait un métier qui permet de ne jamais s'ennuyer grâce à son évolution constante</strong>.</p>

<p>Je commence à bien connaître Python et je n'en deviens pas monomaniaque pour autant, je suis conscient de ses limites et j'explore d'autres pistes qui pourraient y pallier. Bien sûr ça demande un certain effort mais je considère que ça fait partie de ma veille technologique quotidienne.</p>

<p>Pour revenir à l'événement, mon but n'était pas de convaincre tout le monde de passer à Django mais juste d'attiser la curiosité de certains (ce qui aura au moins marché <a href="http://twitter.com/yannickc/status/1116792721">pour une personne</a> \o/).</p>

<p>En guise de conclusion, j'ai écrit <a href="http://www.gnulinuxmag.com/index.php/2009/02/27/gnulinux-magazine-n%C2%B0114-mars-2009-chez-votre-marchand-de-journaux">un article pour Linux Magazine</a> qui devrait être dans vos kiosques et qui permet de débuter avec Django en prenant l'exemple de développement d'un blog (très proche de <a href="http://gillesfabio.com/blog/2009/01/29/creer-un-blog-avec-django/">celui de Gilles</a>). L'avantage c'est qu'il s'agit aussi d'une comparaison avec d'autres frameworks web Python vous permettant de choisir en fonction de vos besoins. Si votre curiosité vous démange ;-).</p>



<div>
<p>
    <a href="http://www.biologeek.com/" title="">
        <img src="http://media2.biologeek.com/css/images/logo.png" alt="Logo biologeek" />
    </a>
    <a href="http://www.biologeek.com/conferences,django,python/lelitisme-de-la-curiosite/"><strong>L'élitisme de la curiosité</strong></a> 
    a été rédigé par <a href="http://david.larlet.fr">David Larlet</a> pour 
    <a href="http://www.biologeek.com">biologeek.com</a> et a été originellement 
    posté le 13 mars 2009. À part exceptions, c'est 
    ©2004-2009 David Larlet et sous <a href="http://www.biologeek.com/contact/#licence" title="À lire avant toute (re)copie">licence (presque) libre</a> autorisant 
    la reproduction, la distribution et la modification sous certaines conditions.
    Veuillez les respecter.
</p>
</div><br/><br/>
<div>
  <strong>Related</strong>
  <ul>
         <li><a href="http://www.biologeek.com/conferences,django,python,web/reflexions-sur-les-conferences-de-geeks/">[Biologeek] Réflexions sur les conférences de geeks</a></li>

     <li><a href="http://www.biologeek.com/django,python,web/son-propre-tinyurl-en-python-et-html5-avec-webpy/">[Biologeek] Son propre TinyURL en Python et HTML5 avec webpy</a></li>

     <li><a href="http://www.biologeek.com/django,python,web-frameworks/sortie-de-django-10-une-annee-de-nouveautes/">[Biologeek] Sortie de Django 1.0, une année de nouveautés</a></li>

     <li><a href="http://www.biologeek.com/conferences,django,python/conferences-django-pour-pycon-fr/">[Biologeek] ★ Conférences Django pour PyCon fr</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,conferences,django,python,traduction/bonnes-pratiques-et-astuces-python/">[Biologeek] Bonnes pratiques et astuces Python</a></li>

     <li><a href="http://www.biologeek.com/django,informatique,python,web-frameworks,web-semantique/des-vacances-et-des-liens/">[Biologeek] Des vacances et des liens</a></li>

     <li><a href="http://www.biologeek.com/critique,livre,python/envie-de-developper-agilement-en-python-suivez-le-guide/">[Biologeek] Envie de développer agilement en Python ? Suivez le guide !</a></li>

     <li><a href="http://www.biologeek.com/django,python,rest,web-frameworks/une-solution-pour-faciliter-la-conception-d-applications-web-restful-avec-django/">[Biologeek] Une solution pour faciliter la conception d'applications web RESTful avec Django</a></li>

     <li><a href="http://www.biologeek.com/conferences,django,python/presentation-de-django-aux-journees-python-francophones/">[Biologeek] Présentation de Django aux journées Python francophones</a></li>

     <li><a href="http://www.biologeek.com/python,web-frameworks/developpement-web-python-et-frameworks-tour-d-horizon-debut-2007/">[Biologeek] Développement web python et frameworks, tour d'horizon début 2007</a></li>

     <li><a href="http://www.biologeek.com/django,python,web-frameworks/modelisation-d-un-workflow-lineaire-avec-django/">[Biologeek] Modélisation d'un workflow linéaire avec Django</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/benchmarks-map-filter-vs-list-comprehensions/">[Biologeek] Benchmarks map, filter vs. list-comprehensions</a></li>

     <li><a href="http://www.biologeek.com/python,web/analyse-des-donnees-utilisateur-d-aol-suite-et-fin/">[Biologeek] Analyse des données utilisateur d'AOL : suite et fin</a></li>

     <li><a href="http://www.biologeek.com/python,web/les-100-premiers-mots-cles-recherches-par-les-utilisateurs-d-aol/">[Biologeek] Les 100 premiers mots-clés recherchés par les utilisateurs d'AOL</a></li>

     <li><a href="http://www.biologeek.com/python/pourquoi-programmer-en-python/">[Biologeek] ★ Pourquoi programmer en Python ?</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/python-et-underscore/">[Biologeek] Python : lisibilité vs simplicité</a></li>

     <li><a href="http://www.biologeek.com/critique,livre,python/critique-du-livre-programmation-python/">[Biologeek] Critique du livre Programmation Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/principales-nouveautes-dans-python-25/">[Biologeek] Principales nouveautés dans Python 2.5</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/un-template-python-pour-parser-des-arguments/">[Biologeek] Un template python pour parser des arguments</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/optimisation-des-chaines-de-caracteres-en-python-le-retour/">[Biologeek] Optimisation des chaînes de caractères en Python : le retour !</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/formatage-des-chaines-de-caracteres-en-python/">[Biologeek] Formatage des chaînes de caractères en Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/optimisation-des-chaines-de-caracteres-en-python/">[Biologeek] Optimisation des chaînes de caractères en Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/bonnes-pratiques-de-la-programmation-en-python/">[Biologeek] ★ Bonnes pratiques de la programmation en Python</a></li>

     <li><a href="http://www.biologeek.com/python,web/convertisseur-de-syntaxes-wiki-dotclear-a-dokuwiki/">[Biologeek] Convertisseur de syntaxes wiki Dotclear à Dokuwiki</a></li>

  </ul>
</div>
]]></description>
    <link><![CDATA[http://www.biologeek.com/conferences,django,python/lelitisme-de-la-curiosite/]]></link>
    <pubDate>2009-03-12 23:15:24</pubDate>
    <category>conferences</category>
    <category>django</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[gfabio] Why Django does not want my static files?]]></title>
    <description><![CDATA[<p>By default, Django does not serve media (static files). It leaves that job to Web server. So if you add some CSS, JavaScript and images into your templates, nothing should appear, as ignored. In fact, Django supports static files but we must add support explicitly. <strong>Beware: only during development, never in production use</strong> for performance and security issues (there is <a class="reference" href="http://docs.djangoproject.com/en/dev/howto/static-files/#the-big-fat-disclaimer">a big and fat disclaimer</a> in the related documentation).</p>
<p>In your project's <tt class="docutils literal"><span class="pre">urls.py</span></tt>, add this <tt class="docutils literal"><span class="pre">urlpattern</span></tt>:</p>
<pre class="literal-block">
... YOUR URLS HERE ...

from django.conf import settings

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^media/(?P&lt;path&gt;.*)$',
            'django.views.static.serve', {
                'document_root': settings.MEDIA_ROOT,
                'show_indexes': True,
            },
        ),
    )
</pre>
<p>With this pattern, static files will be available at the URL: <tt class="docutils literal"><span class="pre">/media/</span></tt>. Don't forget to adjust <tt class="docutils literal"><span class="pre">settings.MEDIA_URL</span></tt>:</p>
<pre class="literal-block">
MEDIA_URL = '/media/'
</pre>
<p>And to avoid conflicts, we need to redefine <tt class="docutils literal"><span class="pre">settings.ADMIN_MEDIA_PREFIX</span></tt>:</p>
<pre class="literal-block">
ADMIN_MEDIA_PREFIX = '%sadmin/' % MEDIA_URL
</pre>
<p>When your project is ready for production use, you can define different <tt class="docutils literal"><span class="pre">settings.MEDIA_URL</span></tt>. For example, depending on <tt class="docutils literal"><span class="pre">settings.DEBUG</span></tt>:</p>
<pre class="literal-block">
if DEBUG:
    MEDIA_URL = '/media/'
else:
    MEDIA_URL = 'http://media.yourdomain.com/'
</pre>
<p>But you can define a <tt class="docutils literal"><span class="pre">DEVELOPMENT_MODE</span></tt> setting or anything else. Take a look at the <a class="reference" href="http://code.djangoproject.com/browser/djangoproject.com/django_website/settings.py">djangoproject.com settings.py</a>. It uses the <tt class="docutils literal"><span class="pre">platform.node()</span></tt> trick.</p>
<p>Into your templates, it is recommended to use <tt class="docutils literal"><span class="pre">{{</span> <span class="pre">MEDIA_URL</span> <span class="pre">}}</span></tt> instead of <tt class="docutils literal"><span class="pre">/media/</span></tt>:</p>
<pre class="literal-block">
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;all&quot; href=&quot;{{ MEDIA_URL }}css/main.css&quot; /&gt;
</pre>
<p>Now if you modify <tt class="docutils literal"><span class="pre">settings.MEDIA_URL</span></tt>, you will not have to modify all your templates. Thanks to <tt class="docutils literal"><span class="pre">django.core.context_processors.media</span></tt> which adds media-related context variables to the context. This context processor is enabled by default.</p>
<p>To know more about how Django serves static files: <a class="reference" href="http://docs.djangoproject.com/en/dev/howto/static-files/#howto-static-files">How to serve static files</a>.</p>]]></description>
    <link><![CDATA[http://gillesfabio.com/blog/2009/03/11/why-django-does-not-want-my-static-files/]]></link>
    <pubDate>2009-03-11 06:40:10</pubDate>
  </item>
  <item>
    <title><![CDATA[[fantomas] Un CMS en Django ? la suite]]></title>
    <description><![CDATA[<p><img src="http://fantomas.willbreak.it/wp-content/uploads/puzzle.jpg" title="Vive les puzzles" />Ces derniers temps occupé par certains projets personnels, j'ai pu tester de nouveaux outils de développement. L'idée est d'en faire un retour et je vais commencer par la suite de mon dernier article.</p><p><a href="http://fantomas.willbreak.it/blog/2009/jan/25/un-cms-en-django/" title="Un CMS en Django">La dernière fois</a> je vois ai parlé d'une des premières applications disponible en Django permettant d'intégrer un CMS dans son site, nommé <a href="http://django-cms.org" title="Django-cms">Django-cms</a>. Mais mon retour sur cette application m'avait laissé un petit goût de frustration, me laissant penser que ce n'étais pas encore au point. Mais cela va mieux avec <a href="http://code.google.com/p/django-page-cms/" title="Django-page-cms">Django-page-cms</a>. <img class="smiley" src="http://fantomas.willbreak.it//img/smileys/smile.gif" /></p><p>Ce dernier en plus des fonctionnalités essentielles, comme la gestion de l'arborescence dans le module d'administration et la prise en charge de différents langages, possède certains atouts qui en font mon favoris. </p><p>Voici les petits plus qui m'ont séduit :</p><ul>
 <li>Définition de plusieures zones de contenus dans un template. (trop fort !)</li><li>Surcharge des urls existante dans le CMS. (enfin !)</li><li>Possibilité d'édition du contenu directement depuis le Front. (la classe !)</li><li>Les contenus du CMS peuvent être interprétés en temps que code. (super !)</li>
 
 <li>Pas de besoin de définir une "RootPage" comme dans Django-cms.</li>
 <li>Gestion des révisions.</li><li>Code propre.
 </li></ul><p>De plus j'ai pu tester la rapidité de l'équipe du projet qui a intégré en moins de 12h ma contribution pour fixer un bug mineur.</p><p>Un projet qui mérite donc d'être suivis.</p><p>Le site de web de <a href="http://code.google.com/p/django-page-cms/" title="Le site du projet sur GoogleCode">Django-pages-cms</a>.</p><p><em>Edit du 7 avril 2009 :</em> une traduction en français est désormais disponible, ou <a title="Traduction française de django-page-cms" href="http://fantomas.willbreak.it/wp-content/uploads/django-page-cms-fr.po">ici</a>.</p>]]></description>
    <link><![CDATA[http://fantomas.willbreak.it/blog/2009/mar/10/un-cms-en-django-la-suite/]]></link>
    <pubDate>2009-03-10 14:19:33</pubDate>
    <category>Découvertes</category>
    <category>Expériences</category>
  </item>
  <item>
    <title><![CDATA[[tarek] Take the Python Packaging Survey]]></title>
    <description><![CDATA[The Python Langage Summit is coming up. To prepare this event, I have put online a survey you can take to tell us a bit more about you and how you package your Python applications.

Who should take the survey : any Python developer that packages and distributes his code, no matter how.
Take the survey: http://tinyurl.com/packaging-survey

Thanks [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=631&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/03/09/take-the-python-packaging-survey/]]></link>
    <pubDate>2009-03-09 05:41:07</pubDate>
    <category>packaging</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[No] Bientôt PyRoom 0.4]]></title>
    <description><![CDATA[<p><a href="https://edge.launchpad.net/pyroom/0.4">PyRoom 0.4</a> approche à grands pas, et apporte son lot de nouveautés qui risquent d'en faire une release majeure. Tout d'abord, la "boîte de texte" a été complètement revue, et grâce à la suppression d'une dépendance avec <em>gtksourceview</em>, on a rendu le programme plus facilement portable sur d'autres plateformes.<br />
Les efforts de l'équipe de développement montrent que le portage pour Windows est en bonne voie. En revanche, il faudrait qu'une bonne âme utilisant Mac OSX fasse des tests en utilisant la version "trunk" de PyRoom et nous signale ce qui empêcherait les <del>fanboys</del>pardon les utilisateurs d'Apple de bénéficier de ce si bel éditeur de texte plein-écran.
</p>
<p>D'autre part, il est intéressant de noter qu'on redemande aux traducteurs de tous poils de se remettre à l'ouvrage, afin de fournir <a href="https://translations.edge.launchpad.net/pyroom/0.4/+translations">des traductions pour PyRoom</a> dans toutes les langues de la terre du monde. Avis aux amateurs. Avec Rosetta, il suffit d'un simple navigateur web et c'est joué.
</p>
<p>Je rappelle que les rapports de bug <a href="https://bugs.edge.launchpad.net/pyroom/">se feront via Launchpad, merci</a>.
</p>
<p>Tiens ! En parlant de launchpad, d'ailleurs, j'ai eu le plaisir de voir un texte que j'avais adressé à sa demande à Matthew Revell débarquer <a href="http://blog.launchpad.net/projects/why-pyroom-chose-launchpad">sur le blog de Launchpad</a>. Il m'avait simplement demandé pourquoi j'avais opté pour la plateforme Launchpad pour héberger PyRoom. Je ne pensais pas que ça en ferait un article...
</p>
<p>Et pour finir, cerise sur le gâteau, si on va fouiller dans les <a href="http://video.fosdem.org/2009/lightningtalks/">répertoires archives de vidéos du dernier Fosdem</a>, on peut tomber sur <a href="http://ftp.heanet.ie/mirrors/fosdem-video/2009/lightningtalks/pyroom.xvid.avi">la vidéo d'un type mal rasé</a>, arborant un horrible accent outrageusement britannique et qui explique à un parterre assez dubitatif pourquoi PyRoom est un outil intéressant, bien que dépouillé au maximum.
</p>
<p>Le son crache, c'est horrible, mais c'est pas ma faute, désolé.
</p>]]></description>
    <link><![CDATA[http://jehaisleprintemps.net/blog/fr/2009/03/05/bientot-pyroom-04/]]></link>
    <pubDate>2009-03-05 21:18:23</pubDate>
  </item>
  <item>
    <title><![CDATA[[Afpy] PyConFR (Rencontre Francophone Python) - 30 & 31 mai 2009]]></title>
    <description><![CDATA[Le 30 et 31 mai se déroulement pour la quatrième fois PyCon France, deux journées complètes sur le langage Python.]]></description>
    <link><![CDATA[http://www.afpy.org/Members/tarek/pycon-fr-2009]]></link>
    <pubDate>2009-03-03 12:30:18</pubDate>
    <category>A la une</category>
  </item>
  <item>
    <title><![CDATA[[Afpy] Afpyro de mars - Rennes]]></title>
    <description><![CDATA[]]></description>
    <link><![CDATA[http://www.afpy.org/Members/Nightlybuild/afpyro-rennes-mars-2009]]></link>
    <pubDate>2009-03-02 10:03:18</pubDate>
  </item>
  <item>
    <title><![CDATA[[Ohan] Checklist: différences entre MySQL et les modèles Django]]></title>
    <description><![CDATA[Comme vu dans un précédent billet (MySQL et les modèles Django), il existe des inconsistances entre une base de donnée MySQL et sa représentation par des modèles Django.
Création des tables à partir des modèles Django
Lorsqu&#8217;on utilise python manage.py syncdb, les tables créées dans la base de données

N&#8217;auront aucun commentaire, que ce soit sur les champs [...]]]></description>
    <link><![CDATA[http://mathieu.agopian.info/blog/2009/03/checklist-differences-entre-mysql-et-les-modeles-django/]]></link>
    <pubDate>2009-03-02 09:54:36</pubDate>
    <category>django</category>
  </item>
  <item>
    <title><![CDATA[[ccomb] Python et le web dans Linux Mag n°114]]></title>
    <description><![CDATA[<div class="document">
<p>C'est avec un plaisir non dissimulé que je vois enfin mes articles et ceux de David publiés dans Linux Mag n°114. Initialement ils devaient paraître dans le <a href="http://ccomb.gorfou.fr/2009/1/28/hors-serie-python-de-linux-mag-:-presentation-de-la-component-architecture" class="reference external">Hors-Série n°40</a>, actuellement en kiosque, mais les 26 pages d'articles n'ont pas pu rentrer et ont été reportés dans ce numéro régulier :</p>
<a href="http://www.linuxmag-france.org/feuille_lmag114/index.html" class="reference external image-reference"><div align="center" class="align-center"><img src="http://ccomb.gorfou.fr/static/lm114/damag-000001.jpg" alt="Linux Magazine n°114" class="align-center" /></div>
</a>
<p>C'est découpé en trois parties. La première, en 6 pages, fait le tour des <strong>techniques de publication web en Python</strong> depuis le vieux CGI, jusqu'au WSGI, avec un petit benchmark sur les différentes techniques. Ensuite, 7 pages de <strong>présentation de trois frameworks web</strong> en parallèle : Pylons, Django et Zope 3, accompagnée d'un rapide tutoriel. Enfin, un <strong>comparatif technique</strong> un peu plus long (13 pages) qui présente les différents aspects (M, V, C, sécurité, administration) des frameworks, toujours en parallèle.</p>
<p>Je tiens à signaler une belle <strong>erreur de PAO</strong> à la page 81 : « Pylons, une alternative proposée par Google ». Bien évidemment Pylons n'est pas du tout proposé par Google :) Il faut séparer le titre du chapitre « Pylons » de ce qui devait normalement être un encart à propos de Google App Engine, et qui s'est malencontreusement transformé en paragraphe.</p>
<p>Sinon, un nouveau merci à Philippe Biondi, Gael Pasgrimaud et Thierry Florac pour leur aide sur ces articles.</p>
<p><a href="http://www.linuxmag-france.org/feuille_lmag114/index.html" class="reference external">Voir un aperçu du magazine</a></p>
</div>]]></description>
    <link><![CDATA[http://ccomb.gorfou.fr/2009/2/28/python-et-le-web-dans-linux-mag-n114]]></link>
    <pubDate>2009-02-28 00:03:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[QuiSaura] Astuce 1 : Plone : désactiver un css en python]]></title>
    <description><![CDATA[<p><em><p>Astuce du jour ! Que dis-je, astuce du mois ! astuce de l'ann&eacute;e meme ! en fait toute toute premi&egrave;re astuce, toute premi&egrave;re astuce.</p></em></p>
<p><p>Vous devez d&eacute;sactiver/activer un fichier css, mais vous en avez marre de devoir passer par le <strong>portal_css</strong> de la <strong>ZMI</strong> parce que vous ne savez pas le faire en python ?<br /><br />Et bien voil&agrave; le petit bout de code :</p>
<div class="code">
<p><span>portal_css</span> = getToolByName(<span>portal</span> , '<strong>portal_css</strong>')<br />try:<br />&nbsp; &nbsp;<span>monCss</span> = <span>portal_css</span>.<span>getResource</span>('monFichier.css')<br />&nbsp; <span>monCss</span>.<span>setEnabled</span>(<strong>False</strong>)<br />&nbsp; &nbsp;#<span>monCss</span>.<span>setEnabled</span>(<strong>True</strong>) pour l'activer<br />except:<br />&nbsp; &nbsp;pass</p>
</div>
<p>&nbsp;<br />Et c'est tout.<br /><br />&Eacute;lu billet le plus court de l'ann&eacute;e.<br /><br />ps : la partie 3 ne devrait pas tarder (me reste juste &agrave; tenter d'expliquer un <strong>.xml</strong>, mais vu qu'il est long....)</p></p>]]></description>
    <link><![CDATA[http://www.qui-saura.fr/monBlog/astuce1.html]]></link>
    <pubDate>2009-02-26 10:21:27</pubDate>
  </item>
  <item>
    <title><![CDATA[[Afpy] Soutenez la ZODB sur NovaForge et 01Net]]></title>
    <description><![CDATA[01Net propose un guide des meilleurs logiciels Open Source régulièrement mis à jour. L'annuaire des bases de données va bientôt paraître avec des classements et de nombreux avis. Voilà l'occasion de témoigner de votre soutien en votant pour la ZODB.]]></description>
    <link><![CDATA[http://www.afpy.org/Members/pilotsystems/zope-zodb-novaforge-01net-base-de-donnees]]></link>
    <pubDate>2009-02-25 08:01:25</pubDate>
    <category>Zope</category>
  </item>
  <item>
    <title><![CDATA[[Ohan] MySQL et les modèles Django]]></title>
    <description><![CDATA[Le problème
D&#8217;un côté, une base de donnée MySQL maintenue par MySQLWorkbench. De l&#8217;autre, Django et ses modèles.
Entre les deux&#8230; pas grand chose.
Les acquis
MySQL et MySQLWorkbench
MySQLWorkbench est un outil excellent pour pouvoir maintenir une base de donnée:

Gestion des commentaires sur les tables et champs
Affichage des relations entre les tables d&#8217;une base de données sous forme d&#8217;un [...]]]></description>
    <link><![CDATA[http://mathieu.agopian.info/blog/2009/02/mysql-et-les-modeles-django/]]></link>
    <pubDate>2009-02-24 18:45:15</pubDate>
    <category>django</category>
  </item>
  <item>
    <title><![CDATA[[glooze] Pour un programmeur, à 25 ans, si t’as pas essayé Python, t’as raté ta vie.]]></title>
    <description><![CDATA[...

Tout est dans le titre.

Dans le temps j&#8217;aimais bien Ruby. Une syntaxe de rêve, des outils de rêve, un framework web de rêve. J&#8216;étais même dans le CA de l&#8217;association RubyFrance, j&#8217;ai bu des coups avec l&#8217;ex prèz (salut fredix).

Et pis j&#8217;ai commencé à en avoir marre des perfs foireuses, des hash plus simples que [...]]]></description>
    <link><![CDATA[http://blog.segle.org/index.php/2009/02/23/pour-un-programmeur-a-25-ans-si-tas-pas-essaye-python-tas-rate-ta-vie/]]></link>
    <pubDate>2009-02-23 21:18:36</pubDate>
    <category>Ma vie</category>
    <category>Prog</category>
    <category>Python</category>
  </item>
  <item>
    <title><![CDATA[[tarek] Raising Distutils test coverage : half-way]]></title>
    <description><![CDATA[After the next commit I will make in Distutils (that adds tests for bdist_rpm), the test coverage of this Python standard library  package will be at 41%. This means that I have doubled the test coverage over the past few months, from 18% to 41%.
My goal is to double it again, and reach 80% in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=620&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/02/23/raising-distutils-test-coverage-half-way/]]></link>
    <pubDate>2009-02-23 13:06:45</pubDate>
    <category>distutils</category>
    <category>python</category>
    <category>quality</category>
  </item>
  <item>
    <title><![CDATA[[Ohan] Apprendre à faire, et faire]]></title>
    <description><![CDATA[Quelle est la meilleure méthode d&#8217;apprentissage?
Scénario: &#8220;moi, j&#8217;apprends&#8221;
J&#8217;apprends.

Je commence par le tutoriel, que je lis de fond en comble
Je continue par les concepts annexes
J&#8217;approfondis quelques sujets qui me paraissent importants, utiles, bons à connaître

Malheureusement, très rapidement

Je prends du retard sur mon projet
Je m&#8217;éparpille, je me documente sur des concepts qui ne me serviront peut-être jamais
J&#8217;approfondis [...]]]></description>
    <link><![CDATA[http://mathieu.agopian.info/blog/2009/02/apprendre-a-faire-et-faire/]]></link>
    <pubDate>2009-02-22 14:03:01</pubDate>
    <category>Uncategorized</category>
  </item>
  <item>
    <title><![CDATA[[Biologeek] Son propre TinyURL en Python et HTML5 avec webpy]]></title>
    <description><![CDATA[<p>Avec Twitter, la concision est de mise. Tout le monde utilise des "raccourcisseurs" d'URL comme TinyURL ou Bit.ly mais ça pose plusieurs problèmes : vous n'avez aucune idée de la pérennité du service (et en ce moment on voit bien le problème des services gratuits et non rentables qui ferment) et aucune garantie que les liens seront toujours redirigés vers les bonnes destinations sans passer par une pub/un outil de traçabilité/insérez votre délire parano ici.</p>

<p>J'ai enregistré hier bgk.me pour remédier à ça et avoir mon propre service de redirections courtes. Ça prend une centaine de lignes en Python et c'est sous <a href="http://sam.zoy.org/wtfpl/">WTFPL</a>, comme ce blog. Enfin HTML5 c'est juste pour être plus concis, rien de bien évolué dans ce domaine, allez voir l'<a href="http://svay.com/blog/index/post/2009/02/19/Creer-un-client-Twitter-offline-pour-l-iPhone-avec-HTML5">excellent billet de Maurice</a> si vous voulez apprendre à exploiter certaines capacités utiles de HTML5.</p>

<h2>Choix techniques</h2>

<p>Au niveau des fonctionnalités :</p>

<ul>
<li>la possibilité de rediriger facilement vers mes billets ou mes brèves ;</li>
<li>la possibilité de choisir un nom de raccourci pertinent (je déteste les tinyurls qui ont un hash ne permettant pas d'avoir une idée de ce qu'il y a derrière) ;</li>
<li>une interface d'administration simpliste.</li>
</ul>

<p>Il y a des centaines de façons de coder ça et j'aurais aussi pu utiliser <a href="http://ur1.ca/">ur1</a> en PHP <a href="http://twitter.com/znarf/status/1230052100">mentionné par znarf</a>, je pense que c'est une bonne solution aussi, tout dépend de votre infrastructure. <strong>Edit</strong> : <a href="http://twitter.com/xavierlacot/status/1232570280">Xavier vient de mentionner urly</a> en Python aussi.</p>

<p>Je voulais rester super simple, un seul fichier, pas de base de données et une base qui ne soit pas une usine à gaz comme Django, inutile dans notre cas. J'ai donc opté pour <a href="http://webpy.org/">webpy</a> qui est excellent pour ça, bon c'est devenu un peu trop complet à mon goût encore (ah le bon temps où ça tenait dans un fichier unique :-)) mais suffisamment simple à prendre en main pour ceux qui voudraient se mettre à Python ;-).</p>

<h2>Redirections</h2>

<p>On commence par les redirections des billets et brèves, il faut pour cela ajouter les URL suivantes :</p>

<pre><code>urls = (
    "/p/(\d+)",         "RedirectToPost",
    "/t/(\d+)",         "RedirectToThought",
)
</code></pre>

<p>Et ensuite construire les classes de redirection :</p>

<pre><code>class RedirectToPost:
    def GET(self, post_id):
        return web.redirect(POST_REDIRECT_URL % post_id)

class RedirectToThought:
    def GET(self, thought_id):
        return web.redirect(THOUGHT_REDIRECT_URL % thought_id)
</code></pre>

<p>Ici vous pouvez voir que j'ai misé sur la réutilisation du code en définissant pas mal de variables en début de fichier permettant d'adapter facilement le code à votre propre usage. Grâce à ces redirections, <a href="http://bgk.me/p/270">http://bgk.me/p/270</a> va rediriger vers ce billet par exemple.</p>

<p>Passons maintenant au redirections vers d'autres URL, ici aussi il faut ajouter une entrée dans les URL :</p>

<pre><code>urls = (
    "/(.*)",            "RedirectToOthers",
)
</code></pre>

<p>Là il faut aller chercher les URL qui ont été créées via l'admin (que l'on verra ensuite) et qui sont stockées dans un objet shelve qui permet rapidement d'avoir une correspondance clé-valeur en Python.</p>

<pre><code>class RedirectToOthers:
    def GET(self, short_name):
        storage = shelve.open(SHELVE_FILENAME)
        # shelve does not allow unicode keys
        short_name = str(short_name)
        if storage.has_key(short_name):
            response = web.redirect(storage[short_name])
        else:
            response = FAIL_MESSAGE
        storage.close()
        return response
</code></pre>

<p>Ici aussi ça reste très simple puisque ça redirige vers l'URL trouvée ou ça affiche un message d'erreur.</p>

<h2>Administration</h2>

<p>Bon si vous avez toujours un shell ouvert sur votre serveur, vous pouvez directement remplir votre fichier shelve avec le shell Python. Mais ça coûte pas grand chose de faire une admin toute simple pour pouvoir faire ça en web alors on ne va pas s'en priver.</p>

<p>Pour protéger cette URL, on va juste la rendre difficile à trouver, je vous laisser utiliser ce qui vous semble le plus pertinent, ici aussi dans une variable :</p>

<pre><code>urls = (
    ADMIN,              "Admin",
    ADMIN+"/done/(.*)", "AdminDone",
)
</code></pre>

<p>La classe Admin vous permet d'afficher le formulaire et de soumettre une nouvelle correspondance raccourci-url :</p>

<pre><code>class Admin:
    def GET(self):
        admin_form = web.form.Form(
            web.form.Textbox("url",     description="Long URL"),
            web.form.Textbox("shortcut",description="Shortcut"),
        )
        admin_template = web.template.Template("""$def with(form)
        &lt;!DOCTYPE HTML&gt;
        &lt;html lang="en"&gt;
          &lt;head&gt;
            &lt;meta charset=utf-8&gt;
            &lt;title&gt;URL shortener administration&lt;/title&gt;
          &lt;/head&gt;
          &lt;body onload="document.getElementById('url').focus()"&gt;
            &lt;header&gt;&lt;h1&gt;Admin&lt;/h1&gt;&lt;/header&gt;
            &lt;form method="POST" action="/admin"&gt;
              $:form.render()
              &lt;input type="submit" value="Shorten this long URL"&gt;
            &lt;/form&gt;
          &lt;/body&gt;
        &lt;/html&gt;
        """)
        return admin_template(admin_form())

    def POST(self):
        data = web.input()
        shortcut = str(data.shortcut) or random_shortcut()
        storage = shelve.open(SHELVE_FILENAME)
        if storage.has_key(shortcut) or not data.url:
            response = web.badrequest()
        else:
            storage[shortcut] = data.url
            response = web.seeother(ADMIN+'/done/'+shortcut)
        storage.close()
        return response
</code></pre>

<p>Les formulaires et templates de webpy sont utilisés directement dans le code ici car ils restent super concis. Si c'est un GET on construit le formulaire et on l'envoie au template, si c'est un POST on ajoute l'URL à la base et on redirige vers la page de confirmation. Très peu de vérifications car ça ne sert pas à grand chose dans ce cas, on s'assure juste de ne pas écraser une URL existante et qu'une URL a bien été soumise.</p>

<p>Il ne reste plus qu'à afficher une page la page de confirmation avec le lien nouvellement créer (en dur sinon on pourrait facilement détecter votre admin grâce au referer...) et un raccourci pour tweeter le lien directement :</p>

<pre><code>class AdminDone:
    def GET(self, short_name):
        admin_done_template = web.template.Template("""$def with(new_url)
        &lt;!DOCTYPE HTML&gt;
        &lt;html lang="en"&gt;
          &lt;head&gt;
            &lt;meta charset=utf-8&gt;
            &lt;title&gt;URL shortener administration&lt;/title&gt;
          &lt;/head&gt;
          &lt;body&gt;
            &lt;header&gt;&lt;h1&gt;Done!&lt;/h1&gt;&lt;/header&gt;
            &lt;p&gt;You created: $new_url&lt;/p&gt;
            &lt;p&gt;&lt;a href="http://twitter.com/home?status=$new_url" 
              title="Tweet it!"&gt;Tweet it?&lt;/a&gt;&lt;/p&gt;
          &lt;/body&gt;
        &lt;/html&gt;
        """)
        return admin_done_template(SERVICE_URL+short_name)
</code></pre>

<p>Et voilà, après vous pouvez ajouter tout pleins de choses mais la base est là, suffisante pour mon usage. Ça m'a pris 2h et 10€ (car ils se gavent sur les .me mais c'est la seule extension qu'il restait) mais c'est le prix de l'indépendance.</p>

<h2>Mise en production</h2>

<p>J'utilise <a href="http://www.lighttpd.net/">lighty</a>, à adapter selon votre configuration (ne pas oublier de rendre code.py exécutable et de modifier ADMIN !) :</p>

<pre><code>$HTTP["host"] =~ "bgk.me" {
        server.document-root = "/path/"

        fastcgi.server = (
            "/code.py" =&gt; (
                "main" =&gt; (
                    "socket" =&gt; "/path/bgkme.socket",
                    "bin-path" =&gt; "/path/code.py",
                    "max-procs" =&gt; 1,
                    "bin-environment" =&gt; (
                        "REAL_SCRIPT_NAME" =&gt; ""
                    ),
                    "check-local" =&gt; "disable"
                )
            )
        )

        url.rewrite-once = (
            "^(/.*)$" =&gt; "/code.py$1",
        )
}
</code></pre>

<p>Pour terminer, <a href="http://code.welldev.org/bgk/">le code est sur ma ferme de dépôts</a>, à utiliser, modifier, critiquer sans modération, enjoy!</p>



<div>
<p>
    <a href="http://www.biologeek.com/" title="">
        <img src="http://media2.biologeek.com/css/images/logo.png" alt="Logo biologeek" />
    </a>
    <a href="http://www.biologeek.com/django,python,web/son-propre-tinyurl-en-python-et-html5-avec-webpy/"><strong>Son propre TinyURL en Python et HTML5 avec webpy</strong></a> 
    a été rédigé par <a href="http://david.larlet.fr">David Larlet</a> pour 
    <a href="http://www.biologeek.com">biologeek.com</a> et a été originellement 
    posté le 21 février 2009. À part exceptions, c'est 
    ©2004-2009 David Larlet et sous <a href="http://www.biologeek.com/contact/#licence" title="À lire avant toute (re)copie">licence (presque) libre</a> autorisant 
    la reproduction, la distribution et la modification sous certaines conditions.
    Veuillez les respecter.
</p>
</div><br/><br/>
<div>
  <strong>Related</strong>
  <ul>
         <li><a href="http://jehaisleprintemps.net/blog/fr/2008/09/04/beer-over-ip-version-2/">[No] Beer Over IP, version 2</a></li>

     <li><a href="http://www.biologeek.com/python,web-frameworks/developpement-web-python-et-frameworks-tour-d-horizon-debut-2007/">[Biologeek] Développement web python et frameworks, tour d'horizon début 2007</a></li>

     <li><a href="http://www.biologeek.com/conferences,django,python,web/reflexions-sur-les-conferences-de-geeks/">[Biologeek] Réflexions sur les conférences de geeks</a></li>

     <li><a href="http://www.biologeek.com/conferences,django,python/lelitisme-de-la-curiosite/">[Biologeek] L'élitisme de la curiosité</a></li>

     <li><a href="http://www.biologeek.com/django,python,web-frameworks/sortie-de-django-10-une-annee-de-nouveautes/">[Biologeek] Sortie de Django 1.0, une année de nouveautés</a></li>

     <li><a href="http://www.biologeek.com/conferences,django,python/conferences-django-pour-pycon-fr/">[Biologeek] ★ Conférences Django pour PyCon fr</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,conferences,django,python,traduction/bonnes-pratiques-et-astuces-python/">[Biologeek] Bonnes pratiques et astuces Python</a></li>

     <li><a href="http://www.biologeek.com/django,informatique,python,web-frameworks,web-semantique/des-vacances-et-des-liens/">[Biologeek] Des vacances et des liens</a></li>

     <li><a href="http://www.biologeek.com/critique,livre,python/envie-de-developper-agilement-en-python-suivez-le-guide/">[Biologeek] Envie de développer agilement en Python ? Suivez le guide !</a></li>

     <li><a href="http://www.biologeek.com/django,python,rest,web-frameworks/une-solution-pour-faciliter-la-conception-d-applications-web-restful-avec-django/">[Biologeek] Une solution pour faciliter la conception d'applications web RESTful avec Django</a></li>

     <li><a href="http://www.biologeek.com/conferences,django,python/presentation-de-django-aux-journees-python-francophones/">[Biologeek] Présentation de Django aux journées Python francophones</a></li>

     <li><a href="http://www.biologeek.com/django,python,web-frameworks/modelisation-d-un-workflow-lineaire-avec-django/">[Biologeek] Modélisation d'un workflow linéaire avec Django</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/benchmarks-map-filter-vs-list-comprehensions/">[Biologeek] Benchmarks map, filter vs. list-comprehensions</a></li>

     <li><a href="http://www.biologeek.com/python,web/analyse-des-donnees-utilisateur-d-aol-suite-et-fin/">[Biologeek] Analyse des données utilisateur d'AOL : suite et fin</a></li>

     <li><a href="http://www.biologeek.com/python,web/les-100-premiers-mots-cles-recherches-par-les-utilisateurs-d-aol/">[Biologeek] Les 100 premiers mots-clés recherchés par les utilisateurs d'AOL</a></li>

     <li><a href="http://www.biologeek.com/python/pourquoi-programmer-en-python/">[Biologeek] ★ Pourquoi programmer en Python ?</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/python-et-underscore/">[Biologeek] Python : lisibilité vs simplicité</a></li>

     <li><a href="http://www.biologeek.com/critique,livre,python/critique-du-livre-programmation-python/">[Biologeek] Critique du livre Programmation Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/principales-nouveautes-dans-python-25/">[Biologeek] Principales nouveautés dans Python 2.5</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/un-template-python-pour-parser-des-arguments/">[Biologeek] Un template python pour parser des arguments</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/optimisation-des-chaines-de-caracteres-en-python-le-retour/">[Biologeek] Optimisation des chaînes de caractères en Python : le retour !</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/formatage-des-chaines-de-caracteres-en-python/">[Biologeek] Formatage des chaînes de caractères en Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/optimisation-des-chaines-de-caracteres-en-python/">[Biologeek] Optimisation des chaînes de caractères en Python</a></li>

     <li><a href="http://www.biologeek.com/bonnes-pratiques,python/bonnes-pratiques-de-la-programmation-en-python/">[Biologeek] ★ Bonnes pratiques de la programmation en Python</a></li>

     <li><a href="http://www.biologeek.com/python,web/convertisseur-de-syntaxes-wiki-dotclear-a-dokuwiki/">[Biologeek] Convertisseur de syntaxes wiki Dotclear à Dokuwiki</a></li>

  </ul>
</div>
]]></description>
    <link><![CDATA[http://www.biologeek.com/django,python,web/son-propre-tinyurl-en-python-et-html5-avec-webpy/]]></link>
    <pubDate>2009-02-21 18:55:06</pubDate>
    <category>django</category>
    <category>python</category>
    <category>web</category>
  </item>
  <item>
    <title><![CDATA[[Ohan] Django FileField et ImageField, upload_to et shell python]]></title>
    <description><![CDATA[Le paramètre upload_to des FileField et ImageField
Le champ upload_to permet d&#8217;indiquer où sauver un fichier de type django.core.files.File par rapport au MEDIA_ROOT spécifié dans les settings.
Ce champ peut être une chaîne de caractères, ou un callable.
Chaîne de caractères pour upload_to
Pour notre example, prenons le modèle suivant:
class MonModele(models.Model):
    fichier = models.FileField(upload_to="chemin")
Dans ce cas simple, tous les [...]]]></description>
    <link><![CDATA[http://mathieu.agopian.info/blog/2009/02/django-filefield-et-imagefield-upload_to-et-shell-python/]]></link>
    <pubDate>2009-02-19 18:30:16</pubDate>
    <category>django</category>
  </item>
  <item>
    <title><![CDATA[[Ohan] Django svn et mod_wsgi, attention au piège!]]></title>
    <description><![CDATA[Une erreur de débutant qui peut être fastidieuse à debug...]]></description>
    <link><![CDATA[http://mathieu.agopian.info/blog/2009/02/django-svn-et-mod_wsgi-attention-au-piege/]]></link>
    <pubDate>2009-02-17 21:34:25</pubDate>
    <category>django</category>
    <category>mod_wsgi</category>
  </item>
  <item>
    <title><![CDATA[[ccomb] Sortie de Zope 3.4]]></title>
    <description><![CDATA[<div class="document">
<blockquote class="highlights">
Deux ans après Zope 3.3, voici enfin Zope 3.4, sorti le 29 janvier 2009. Zope 3
est une plateforme logicielle pour le web, c'est-à-dire un ensemble cohérent de
briques de programmation pour créer des sites et des applications web. La
particularité de Zope 3 est de permettre un découpage propre d'une application
en composants réutilisables et interchangeables, chaque composant correspondant
à une fonctionnalité bien délimitée, décrite et documentée par une ou plusieurs interfaces. Les composants peuvent être développés et testés
séparément, puis changés ou étendus sans impacter le reste de l'application.
C'est une garantie de fiabilité, perennité, et extensibilité pour de grosses
applications.</blockquote>
<div id="traduction-de-l-annonce-officielle-de-stephan-richter" class="section">
<h3>Traduction de l'annonce officielle de Stephan Richter</h3>
<p>Bonjour tout le monde,</p>
<p>Elle est enfin là ! Merci à tous ceux qui y ont participé !</p>
<p>29 janvier 2009 - L'équipe de développement de Zope 3 annonce la version 3.4.0
de Zope.</p>
<p>Après deux ans de développement, la Fondation Zope et la communauté Zope sont
fiers de vous annoncer la sortie de Zope 3.4.0.</p>
<p>L'effort de développement de Zope 3.4 a été porté vers la transformation d'une
arborescence de code source monolithique en un ensemble de petits paquets (eggs)
qui peuvent être utilisés indépendemment les uns des autres. Le coeur a été
encore stabilisé grâce à de nombreuses corrections de bogues et plusieurs
nouveaux paquets additionnels ont été développés pour enrichir les possibilités
de développement.</p>
<p>Avec cette nouvelle version, vient également un effort pour garantir un cycle
de sortie de nouvelles versions tous les 6 mois.</p>
<div id="paquets-et-eggs" class="section">
<h4>Paquets et Eggs</h4>
<p>Zope 3 est maintenant complètement basé sur des <em>eggs</em>. Bien qu'il reste encore
du travail à accomplir, il s'intègre fort bien au reste de la communauté Python.
La conversion en <em>eggs</em> permet également aux autres développeurs Python de
n'utiliser que de petits morceaux du système Zope. La conversion implique
également que les développeurs Zope 3 n'utilisent plus le gros paquet « tar.gz »
classique. Celui-ci sera tout de même fourni pour Zope 3.4 et probablement Zope
3.5, pour ceux qui y sont habitués.</p>
<p>Mais alors comment les applications Zope 3 sont-elles construites ?</p>
<div id="le-kgs-known-good-set" class="section">
<h5>Le KGS (Known Good Set)</h5>
<p>Le KGS est un ensemble précis de paquets et de versions, connues pour
fonctionner correctement ensemble. La compatibilité est vérifiée fréquemment
grâce au lancement quotidien de plus de douze mille tests <a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id6" id="id1" class="footnote-reference">[1]</a>. Le KGS est testé
avec Python 2.4 et Python 2.5, pour les architectures 32 et 64 bits. La liste
des paquets contrôlés et leurs versions pour Zope 3.4 peut être consultée sur le
site du KGS <a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id7" id="id2" class="footnote-reference">[2]</a>.</p>
<p>Le KGS peut être utilisé de différentes façons <a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id8" id="id3" class="footnote-reference">[3]</a>. La façon la plus courante
est de figer les versions en téléchargeant le fichier de définition des
versions <a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id9" id="id4" class="footnote-reference">[4]</a> et en l'insérant dans votre configuration <em>buildout</em> de la façon
suivante :</p>
<blockquote>
<p>[buildout]
versions = versions
...</p>
<p>[versions]
zope.interface = 3.4.0
...</p>
</blockquote>
</div>
<div id="outil-de-d-marrage-rapide-zopeproject" class="section">
<h5>Outil de démarrage rapide <tt class="docutils literal"><span class="pre">zopeproject</span></tt></h5>
<p>Pour démarrer un nouveau projet rapidement en utilisant une configuration
habituelle, un paquet appelé « zopeproject » peut être utilisé. La documentation
de <cite>zopeproject</cite> est fournie sur la page d'accueil de cet outil <a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id10" id="id5" class="footnote-reference">[5]</a>. <cite>zopeproject</cite>
utilise <cite>Paste</cite> ou <cite>ZDaemon</cite> pour créer le serveur. Les commandes suivantes sont
suffisantes pour lancer un projet :</p>
<pre class="literal-block">$ easy_install zopeproject
$ zopeproject HelloWorld
$ cd HelloWorld
$ bin/helloworld-ctl foreground
</pre>
</div>
<div id="d-mo" class="section">
<h5>Démo</h5>
<p>Pour l'instant il n'existe pas de paquet dédié à la démonstration d'un
exemple simple de configuration d'une application Zope 3. Cependant le paquet
<tt class="docutils literal"><span class="pre">z3c.formdemo</span></tt> peut être utilisé comme un exemple minimal. Pour l'essayer,
il suffit de taper les commandes suivantes :</p>
<pre class="literal-block">$ svn co svn://svn.zope.org/repos/main/z3c.formdemo/tags/1.5.3 formdemo
$ cd formdemo
$ python bootstrap.py
$ ./bin/buildout -v
$ ./bin/demo fg
</pre>
<table rules="none" frame="void" id="id6" class="docutils footnote">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id1" class="fn-backref">[1]</a></td><td><a href="http://zope3.pov.lt/buildbot" class="reference external">http://zope3.pov.lt/buildbot</a></td></tr>
</tbody>
</table>
<table rules="none" frame="void" id="id7" class="docutils footnote">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id2" class="fn-backref">[2]</a></td><td><a href="http://download.zope.org/zope3.4/3.4.0/controlled-packages.cfg" class="reference external">http://download.zope.org/zope3.4/3.4.0/controlled-packages.cfg</a></td></tr>
</tbody>
</table>
<table rules="none" frame="void" id="id8" class="docutils footnote">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id3" class="fn-backref">[3]</a></td><td><a href="http://download.zope.org/zope3.4/intro.html" class="reference external">http://download.zope.org/zope3.4/intro.html</a></td></tr>
</tbody>
</table>
<table rules="none" frame="void" id="id9" class="docutils footnote">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id4" class="fn-backref">[4]</a></td><td><a href="http://download.zope.org/zope3.4/3.4.0/versions.cfg" class="reference external">http://download.zope.org/zope3.4/3.4.0/versions.cfg</a></td></tr>
</tbody>
</table>
<table rules="none" frame="void" id="id10" class="docutils footnote">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a href="http://ccomb.gorfou.fr/tags/python/feed.atom#id5" class="fn-backref">[5]</a></td><td><a href="http://pypi.python.org/pypi/zopeproject" class="reference external">http://pypi.python.org/pypi/zopeproject</a></td></tr>
</tbody>
</table>
</div>
</div>
<div id="t-l-chargements" class="section">
<h4>Téléchargements</h4>
<ul>
<li><dl class="first docutils">
<dt>KGS pour Zope 3.4 :</dt>
<dd><p class="first last"><a href="http://download.zope.org/zope3.4" class="reference external">http://download.zope.org/zope3.4</a></p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Versions contrôlées des paquets Zope 3.4 :</dt>
<dd><p class="first last"><a href="http://download.zope.org/zope3.4/3.4.0/controlled-packages.cfg" class="reference external">http://download.zope.org/zope3.4/3.4.0/controlled-packages.cfg</a></p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Fichier de définition des versions pour Zope 3.4 :</dt>
<dd><p class="first last"><a href="http://download.zope.org/zope3.4/3.4.0/versions.cfg" class="reference external">http://download.zope.org/zope3.4/3.4.0/versions.cfg</a></p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Paquet classique de l'ensemble des sources de Zope 3 :</dt>
<dd><p class="first last"><a href="http://download.zope.org/zope3.4/3.4.0/Zope-3.4.0.tgz" class="reference external">http://download.zope.org/zope3.4/3.4.0/Zope-3.4.0.tgz</a></p>
</dd>
</dl>
</li>
</ul>
<p>Les instructions d'installation pour Windows et Un*x/Linux sont maintenant
disponibles dans le fichier <cite>README.txt</cite> à la racine de l'arborescence.
L'installateur binaire est recommandé pour Windows.</p>
<p>Zope 3.4 nécessite Python 2.4 ou 2.5. Vous devez également installer la
bibliothèque <tt class="docutils literal"><span class="pre">zlib</span></tt> sur votre système.</p>
</div>
<div id="ressources" class="section">
<h4>Ressources</h4>
<ul>
<li><dl class="first docutils">
<dt>Site de développement de Zope 3 :</dt>
<dd><p class="first last"><a href="http://wiki.zope.org/zope3" class="reference external">http://wiki.zope.org/zope3</a></p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Liste de diffusion des développeurs Zope 3 :</dt>
<dd><p class="first"><a href="http://mail.zope.org/mailman/listinfo/zope-dev" class="reference external">http://mail.zope.org/mailman/listinfo/zope-dev</a></p>
<p class="last">Ancienne liste : <a href="http://mail.zope.org/mailman/listinfo/zope3-dev" class="reference external">http://mail.zope.org/mailman/listinfo/zope3-dev</a></p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Liste de diffusion des utilisateurs de Zope 3 :</dt>
<dd><p class="first last"><a href="http://mail.zope.org/mailman/listinfo/zope-users" class="reference external">http://mail.zope.org/mailman/listinfo/zope-users</a></p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Suivi de bogues dans le <cite>Launchpad</cite> :</dt>
<dd><p class="first last"><a href="https://launchpad.net/zope3" class="reference external">https://launchpad.net/zope3</a></p>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt>Canal IRC :</dt>
<dd><p class="first last">#zope3-dev sur irc.freenode.net</p>
</dd>
</dl>
</li>
</ul>
</div>
<div id="propos-de-zope-3" class="section">
<h4>À propos de Zope 3</h4>
<p>Zope 3 est un serveur d'application web hérité de Zope. Il a été réécrit
entièrement en se basant sur les derniers motifs de conception et l'expérience
issue de Zope 2.</p>
<p>La « Component Architecture » constitue le coeur de Zope 3 et permet aux
développeurs de créer des applications flexibles et puissantes.</p>
<div id="compatibilit-avec-zope-2" class="section">
<h5>Compatibilité avec Zope 2</h5>
<p>Zope 3 n'est pas rétrocompatible avec Zope 2. Cela signifie qu'il ne peut pas
être utilisé pour faire fonctionner des applications Zope 2.</p>
<p>Nous continuons de travailler sur la transision entre Zope 2 et Zope 3 en
permettant à Zope 2 d'utiliser une part grandissante de l'infrastructure de Zope
3. Cela signifie que tout nouveau code écrit pour Zope 2 peut bénéficier de la
technologie Zope 3. Avec un peu de soin il est même possible d'écrire du code
qui fonctionne à la fois sur les deux versions. Cela permet à une application
Zope 2 de migrer doucement vers Zope 3. Cependant les applications Zope 2
existantes ne pourront jamais fonctionner avec Zope 3 sans aucun changement.</p>
</div>
</div>
<div id="propos-de-la-fondation-zope" class="section">
<h4>À propos de la Fondation Zope</h4>
<p>La Fondation Zope, basée à Fredricksburg en Virginie, est une organisation à but
non lucratif qui supporte la communauté Zope, la plateforme logicielle Zope
et ses projets associés. Sa communauté comprend à la fois la communauté des
contributeurs particuliers à l'open-source et la communauté des entreprises et
des organisations qui utilisent Zope.</p>
</div>
</div>
</div><br/><br/>
<div>
  <strong>Related</strong>
  <ul>
         <li><a href="http://ccomb.gorfou.fr/2007/12/13/tutoriel-sur-buildout">[ccomb] Tutoriel sur Buildout</a></li>

  </ul>
</div>
]]></description>
    <link><![CDATA[http://ccomb.gorfou.fr/2009/2/17/sortie-de-zope-3-4]]></link>
    <pubDate>2009-02-17 09:09:00</pubDate>
  </item>
  <item>
    <title><![CDATA[[wikiPython] moin.py/CodeWindows]]></title>
    <description><![CDATA[]]></description>
    <link><![CDATA[http://wikipython.flibuste.net/moin.py/CodeWindows]]></link>
    <pubDate>2009-02-16 13:50:24</pubDate>
  </item>
  <item>
    <title><![CDATA[[QuiSaura] Intro à Plone 3 : partie 2]]></title>
    <description><![CDATA[<p><em><p>Seconde partie de l'intro &agrave; Plone 3 .<br /><br />Si vous voulez connaitre Archetypes ou si vous n'avez rien d'autre &agrave; faire.</p></em></p>
<p><p>Si vous n'avez pas lu la <a title="partie 1" href="http://www.qui-saura.fr/../../../monBlog/plone3-1.html" target="_blank">1&deg;partie</a>, je vous invite &agrave; le faire tout de suite : il y a quelques notions ( &nbsp;c'est quoi un profil, comment ca fonctionne, etc...) &agrave; connaitre.<br />Et son code se trouve toujours <a title="code partie pr&eacute;c&eacute;dente" href="http://www.qui-saura.fr/../../../css/images/jesuisunconnard.politique.tar.bz2" target="_blank">l&agrave;</a>.</p>
<p>&Agrave; partir de cette partie on va s'occuper du paquet <strong>jesuisunconnard.metier</strong> .<br /> <br />C'est lui qui va nous permettre r&eacute;ellement de faire de notre site Plone le site <strong>jesuisunconnard</strong>.<br />En effet, on va y cr&eacute;er:<br />- nos Vues (nos nouvelles pages : &Agrave; propos, Raconte ton histoire, etc...).<br />- nos contenus ( <span>Histoire</span> et <span>DossierHistoire</span>) via Archetypes.<br />- etc ...</p>
<p>Mais dans cette partie, on va "seulement" cr&eacute;er nos deux classes.</p>
<p>Bon bah, c'est parti mon kiki .</p>
<h1>Cr&eacute;ation du paquet</h1>
<div class="code">
<p>cd src/ &amp;&amp; paster create -t plone jesuisunconnard.metier</p>
</div>
<p><br />Namespace du paquet : jesuisunconnard<br />Le nom du paquet : metier<br />Zope2Product : True</p>
<p>Donc maintenant il faut mettre &agrave; jour le <strong>buildout.cfg</strong> :</p>
<div class="code">
<p>[buildout]<br />parts =<br />&nbsp;   plone<br /><br />[...]<br /><br />eggs =<br />&nbsp;   elementtree<br />&nbsp;   plonetheme.keepitsimple<br />&nbsp;   jesuisunconnard.politique<br />&nbsp;<strong> jesuisunconnard.metier</strong><br /><br />develop =<br />&nbsp; &nbsp; src/jesuisunconnard.politique<br />&nbsp; <strong>&nbsp; src/jesuisunconnard.metier</strong></p>
</div>
<p><br />Bon, maintenant que le paquet est cr&eacute;&eacute; on peut passer aux choses s&eacute;rieuses.</p>
<h1>Interfaces<br /></h1>
<p>On va donc commencer par cr&eacute;er nos interfaces .<br />Elles vont servir &agrave; d&eacute;crire comment nos classes les impl&eacute;mentant doivent se comporter.</p>
<p>fichier <strong>src/jesuisunconnard.metier/jesuisunconnard/metier/interfaces.py</strong> :</p>
<div class="code">
<p>#-*- coding:Utf-8 -*-<br />from zope.interface import Interface<br />from zope import schema<br />from zope.app.container.constraints import contains<br /><br /><span>from jesuisunconnard.metier import JesuisunconnardMessageFactory as _</span><br /><br /><br />class <span>IHistoire</span>(<span>Interface</span>):<br />&nbsp;       """ une histoire """<br />&nbsp;      &nbsp;<br />&nbsp;       <strong>nom</strong> = <em>schema</em>.<span>TextLine</span>(title=_(u"Nom"), required=True)<br />&nbsp;       <strong>texte</strong> = <em>schema</em>.<span>SourceText</span>(title=_(u"Histoire"),description=_(u""), required=True)&nbsp;<br /><br />class <span>IDossierHistoire</span>(<span>Interface</span>):<br />&nbsp;       """ dossier contenant les histoires """<br />&nbsp;      &nbsp;<br />&nbsp;       <span>contains</span>('jesuisunconnard.metier.interfaces.<span>IHistoire</span>')<br />&nbsp;       <strong>titre</strong> = <em>schema</em>.<span>TextLine</span>(title=_(u"Titre"), required=True)</p>
</div>
<p><br />(bon ok le bleu et le orange &ccedil;a ne va pas du tout ensemble...)<br />le <span>_</span> va nous servir pour l'i18n, je ne vais pas en parler maintenant(on verra &ccedil;a dans une des derni&egrave;res parties je pense), mais il va permettre de marquer nos chaines en tant que chaines &agrave; traduire.</p>
<p>Ici, on d&eacute;clare 2 classes: <span>IHistoire</span> et <span>IDossierHistoire</span> qui deviennent des <span>interfaces</span> en h&eacute;ritant d'<span>Interface</span>.<br /><br /><span>IHistoire</span> a 2 attributs:<br /><strong>nom</strong> : l'auteur de l'histoire,<br /><strong>texte</strong> : l'histoire.<br />&nbsp;<br /><span>IDossierHistoire</span> a 1 seul attribut:<br /><strong>titre</strong> &nbsp;: le titre du dossier.<br /><span>contains</span>() indique que nos <span>dossierHistoire</span> ne devront contenir exclusivement que des objets impl&eacute;mentant  <span>IHistoire</span>, cad uniquement des <span>Histoire</span>.</p>
<p>Quand on voudra &eacute;crire/&eacute;diter une <span>Histoire</span> : <br />le <strong>nom </strong>: devra etre une chaine repr&eacute;sent&eacute;e par un "<span>&lt;input type="text"&gt;</span>",<br />le <strong>texte</strong> : devra etre une chaine repr&eacute;sent&eacute;e par un "<span>&lt;textarea&gt;</span>".</p>
<p>Quand on voudra ajouter un <span>DossierHistoire</span>:<br />le <strong>titre</strong> : devra etre une chaine repr&eacute;sent&eacute;e par un "<span>&lt;input type="text"&gt;</span>".</p>
<p>Et c'est fini pour nos interfaces.</p>
<h1>Contenu</h1>
<p>Maintenant on va s'occuper des classes les impl&eacute;mentant : <span>Histoire</span> et <span>DossierHistoire</span> qui vont etre le "<strong>contenu</strong>" de notre site.</p>
<p>On cr&eacute;e un dossier <strong>content</strong> dans <strong>src/jesuisunconnard.metier/jesuisunconnard/metier</strong>, agr&eacute;ment&eacute; d'un fichier <strong>__init__.py</strong> .</p>
<p>Pour cr&eacute;er nos classes, on va se servir du framework <strong>Archetypes</strong>, et ca va se passer en deux temps :<br />- on va d'abord cr&eacute;er le <span>sch&eacute;ma </span><br />- puis notre <span>cla</span><span>sse</span>.<br />et <strong>Archetypes</strong> se chargera du reste ( sauver/supprimer les objets, nous cr&eacute;er les pages d'affichage/&eacute;dition/suppression, et j'en passe) ! Si c'est pas beau &ccedil;&agrave; ?!</p>
<p>Le <span>sch&eacute;ma</span> : c'est l&agrave; o&ugrave; on va d&eacute;finir les champs que l'on souhaite avoir pour notre classe .<br />La <span>cla</span><span>sse </span>: on va seulement impl&eacute;menter notre interface, mettre dans un attribut notre <span>sch&eacute;ma</span>, et ce sera fini (enfin il y aura 2-3 bricoles &agrave; faire, mais c'est tout).<br /> <br />Bon, c'est pas tr&egrave;s parlant, donc on va passer &agrave; la pratique.<br /><br />&nbsp;On a notre <span>cla</span><span>sse</span> <span>Histoire</span> ; lorsque l'on voudra en cr&eacute;er/&eacute;diter une, il nous faudra&nbsp; logiquement:<br />- un <span>champs</span> <span>&nbsp;</span><span>&lt;input type="text"&gt; </span>pour l'auteur de l'histoire<br />- un<span> champs</span> <span>&lt;textarea&gt;</span><span> </span>pour le texte de l'histoire&nbsp;<br /><br />OK&nbsp; ? (en m&ecirc;me temps vous avez pas le choix)<br />Et bien on aura juste &agrave; d&eacute;finir ces deux<span> champs</span> dans le <span>sch&eacute;ma</span> de notre <span>Histoire</span>.</p>
<p>Ce qui donnera pour le  <span>sch&eacute;ma</span>:</p>
<div class="code">
<p>from Products.Archetypes import atapi<br />from Products.ATContentTypes.content import schemata<br />from Products.ATContentTypes.content.schemata import finalizeATCTSchema<br /><br /><br /><span>schemaHistoire</span> = schemata.<span>ATContentTypeSchema</span>.<strong>copy</strong>() + atapi.Schema((<br /><br />&nbsp;&nbsp;&nbsp; atapi.<span>StringField</span>('<span>nom</span>',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>required</span>=<strong>True</strong>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>searchable</span>=<strong>True</strong>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>storage</span>=atapi.<strong>AnnotationStorage</strong>(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>widget</span>=atapi.<span>StringWidget</span>(label=_(u"Nom"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description=_(u""))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br /><br />&nbsp;&nbsp;&nbsp; atapi.<span>TextField</span>('<span>histoire</span>',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>required</span>=<strong>True</strong>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>searchable</span>=<strong>True</strong>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>storage</span>=atapi.<strong>AnnotationStorage</strong>(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>default_output_type</span>='<strong>text/x-html-safe</strong>',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>widget</span>=atapi.<span>RichWidget</span>(label=_(u"Histoire"),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; description=_(u""),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rows=45,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allow_file_upload=False),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ))<br /><br /><span>finalizeATCTSchema</span>(schemaHistoire, folderish=False, moveDiscussion=False)</p>
</div>
<p><br />On doit commence par <strong>copier</strong> le sch&eacute;ma <span>ATContentTypeSchema</span>.<br />Il va nous copier le  sch&eacute;ma de base(cr&eacute;ation d'un champs <strong>id</strong>, <strong>title</strong>, <strong>description</strong>, etc...).<br /> Ensuite on rajoute nos 2 <span>champs</span> :<br />-  <span>nom</span> : un simple <span>StringField</span>, vu que l'on souhaite quelquechose du type <span>&lt;input type="text"&gt;</span><br /> - <span>histoire</span> : un <span>TextField</span>, vu que l'on souhaite quelquechose du type <span>&lt;textarea&gt;</span><br /><br />Les<span> deux</span> sont <span>obligatoires</span> ( nb : &agrave; remplir ) et seront <span>index&eacute;s</span>.<br /><span>storage </span>: &agrave; ne pas oublier, il faut mettre <strong>AnnotationStorage</strong>() (afin d' &eacute;viter des probl&egrave;mes de namespace).<br /><span>defalut_output_type</span> : &nbsp;'<strong>text/x-html-safe</strong>', afin d'&eacute;chapper les caract&egrave;res sp&eacute;ciaux, pour &eacute;viter le XSS ( et oui ya des cons de partout)<br /><span>widget</span> : Ce sera le widget que l'on verra sur la page d'ajout par exemple, pour repr&eacute;senter le champs : <br />- pour le <span>nom</span> : ,ce sera <span>StringWidget</span>, c'est &agrave; dire un <span>&lt;input type="text"&gt;<br /></span>- pour l'<span>histoire</span> : ce sera <span>RichWidget</span>, c'est &agrave; dire un <span>WYSIWYG</span> ( un  <span>textarea </span>am&eacute;lior&eacute;).</p>
<p>L&agrave; &nbsp;quelquechose vous titille l"occiput :<br /><em>"mais il sert &agrave; rien le param&egrave;tre  <span>widget </span>puisqu'en fonction du<span> champs </span>on sait de suite le&nbsp;<span>widget</span> qui va le repr&eacute;senter !</em>"<br />Et bien pas tout &agrave; fait, puisque un <span>champs</span>&nbsp;peut avoir plusieurs  <span>widgets</span> de disponibles, par exemple<span> </span><span>TextField</span> peut avoir comme widget <span>RichWidget </span>&nbsp;ou bien <span>TextAreaWidget</span> (un simple <span>textarea</span>).</p>
<p>Enfin,on appelle la fonction <span>finalizeATCTSchema</span>().<br />Elle va juste servir &agrave; finaliser la cr&eacute;ation de notre nouveau <span>sch&eacute;ma</span>, ya pas r&eacute;ellement besoin d'en savoir plus (elle va r&eacute;ordonner les champs, et en renommer certains).</p>
<p>&nbsp;</p>
<p>Et voil&agrave;, l'explication du  <span>sch&eacute;ma</span> est finie.</p>
<p>Place &agrave; la <span>cla</span><span>sse </span>:</p>
<div class="code">
<p>from jesuisunconnard.metier.config import PROJECTNAME<br />from jesuisunconnard.metier import JesuisunconnardMessageFactory as _<br />from jesuisunconnard.metier.interfaces import IHistoire</p>
<p>class <span>Histoire</span>(base.<span><strong>ATCTContent</strong></span>):<br /> """ une histoire """<br /> <span>implements</span>( <span>IHistoire</span>)<br /> <br /> <span>portal_type</span> = "<strong>Histoire</strong>"<br /> <span>_at_rename_after_creation</span> = <strong>True</strong><br /> <span>schema</span> = <strong>HistoireSchema</strong><br /> <br /> <span>nom</span> = atapi.<span>ATFieldProperty</span>("<strong>nom</strong>")<br /> <span>texte</span> = atapi.<span>ATFieldProperty</span>("<strong>histoire</strong>")<br /> <br />atapi.<span>registerType</span>(<span>Histoire</span>, <strong>PROJECTNAME</strong>)</p>
</div>
<p><br /><span>Histoire</span> doit h&eacute;riter de <strong>ATCTContent</strong> &nbsp;puisque c'est un <em>contenu</em> (&ccedil;a va lui permettre d'acc&eacute;der &agrave; des m&eacute;thodes&amp;co de<em> contenus</em>).<br /><br />Ensuite, on <span>impl&eacute;mente</span> <span>IHistoire</span>, normal.<br /><br />Puis on d&eacute;clare le <strong>type plone</strong> de notre classe via <span>portal_type</span>(les diff&eacute;rents <strong>types plone</strong> sont accessibles &agrave; partir de<em><strong> portal_types</strong></em>).<br />( &Agrave; noter que l'on d&eacute;clare juste un <strong>type</strong>, il faut aussi le d&eacute;finir. Cela se fera via un fichier xml dans le futur profil de notre paquet m&eacute;tier )<br /><span>_at_rename_after_creation</span> : afin de renommer automatiquement notre objet si son <strong>id</strong> est foireux( doublon, caract&egrave;re(s) interdit(s), etc...)</p>
<p>Notre <strong>schemaHistoire</strong> vient se greffer &agrave; notre classe via l'attribut <span>schema</span>.</p>
<p>Et puis on d&eacute;clare nos 2 attributs <span>nom</span> et <span>texte</span> puisqu'ils sont pr&eacute;sents dans l'<span>interface</span>.&nbsp;<br />via <span>ATFieldProperty</span>(),  <span>nom</span> et <span>texte </span>vont prendre respectivement les valeurs des champs <strong>nom </strong>et <strong>histoire</strong> et inversement proportionnel, les champs  <strong>nom </strong>et <strong>histoire </strong>vont contenir les valeurs des attributs <span>nom</span> et <span>texte</span>.<br /><br />Et l&agrave; vous pouvez vous dire (en tout cas moi, &ccedil;a m'avait choqu&eacute;):<br />"<em>mais pourquoi doit-on "re-d&eacute;clarer" nos 2 attributs alors qu'on les a mis dans le sch&eacute;ma ? nom d'une pipe!</em>"<br />Bah parce que :<br />- le sch&eacute;ma peut comporter moult champs que l'on ne souhaite pas forc&eacute;ment sauvegarder dans notre objet (par exemple, on se fout royalement du champs <strong>description</strong>, pr&eacute;sent par d&eacute;faut dans le sch&eacute;ma).<br />- on  <span>impl&eacute;mente </span>une<span> interface</span>, donc il faut <span>impl&eacute;menter </span>"explicitement" ses attributs&amp;co (meme si python n'en a rien &agrave; foutre qu'un attribut manque &agrave; l'appel).<br />- pour acc&eacute;der plus facilement aux valeurs<br />- etc...</p>
<p>&nbsp;Et on termine par l'incontournable <span>registerType</span>() !<br />Qui va enregistrer notre classe <span>Histoire</span>, et lui &nbsp;ajouter 3 m&eacute;thodes pour chaque champs:<br />- un accesseur == getter (pour acc&eacute;der &agrave; la valeur)<br />- un accesseur d'&eacute;dition == &eacute;dition ( pour &eacute;diter la valeur)<br />- un mutateur == setter (pour mettre une valeur)</p>
<p>&nbsp;<strong>PROJECTNAME</strong> va contenir le nom de notre paquet, que l'on d&eacute;finira ult&eacute;rieurement dans un futur fichier config.py</p>
<p>&nbsp;Et voil&agrave; on a notre classe toute belle, pas ch&egrave;re, et prete &agrave; travailler!</p>
<h1>La v&eacute;rit&eacute;<br /></h1>
<p>Nous on va &nbsp;etre intelligent pour une fois.<br />Je vous ai dit, que les sch&eacute;mas de nos classes contiennentt des champs par d&eacute;faut dont <strong>title</strong> et <strong>description</strong>.<br />Alors pourquoi re-cr&eacute;er des champs, on a qu'&agrave; s'en servir, non ?<br /><br />Pour acc&eacute;der &agrave; un champs d'un sch&eacute;ma c'est comme ca :</p>
<div class="code"><span>monSchema</span>['<span>monChamps</span>'].<strong>monAttribut/methode</strong></div>
<p><br />Pour notre classe <span>DossierHistoire</span>, on a besoin que d'un seul attribut donc d'un seul champs &nbsp;et il faut que ce soit un simple <span>&lt;input type="text"&gt;</span>&nbsp;donc on va se servir du champs <strong>title</strong> .<br />Voici <strong>jesuisunconnard.metier/jesuisunconnard/metier/content/DossierHistoire.py</strong> :</p>
<div class="code">
<p>#-*-coding:Utf-8-*-</p>
<p>from zope.interface import implements<br />from Products.Archetypes import atapi<br />from Products.ATContentTypes.content import folder<br />from Products.ATContentTypes.content import schemata<br />from Products.ATContentTypes.content.schemata import finalizeATCTSchema</p>
<p>from jesuisunconnard.metier.config import PROJECTNAME<br />from jesuisunconnard.metier import JesuisunconnardMessageFactory as _<br />from jesuisunconnard.metier.interfaces import IDossierHistoire</p>
<p><br />DossierHistoireSchema = folder.<span>ATFolderSchema</span>.copy()</p>
<p>DossierHistoireSchema['title'].storage = atapi.AnnotationStorage()<br />DossierHistoireSchema['title'].widget.label = _(u"Titre")<br />DossierHistoireSchema['title'].widget.description = _(u"")</p>
<p><br />finalizeATCTSchema(DossierHistoireSchema, folderish=True, moveDiscussion=False)</p>
<p>class <span>DossierHistoire</span>(folder.<strong><span>ATFolder</span></strong>):<br /> """ Le Dossier """<br /> implements(IDossierHistoire)<br /> <br /> portal_type = "DossierHistoire"<br /> _at_rename_after_creation = True<br /> schema = DossierHistoireSchema<br /> <br /> titre = atapi.ATFieldProperty("title")                      <br /> <br />atapi.registerType(DossierHistoire, PROJECTNAME)</p>
</div>
<p><br />On copie <span>ATFolderSchema</span> et non pas <span>ATContentTypeSchema </span>puisque c'est, certes un contenu, mais aussi un dossier .&nbsp;<br />Tout comme la classe <span>DossierHistoire</span> h&eacute;rite de&nbsp;<strong><span>ATFolder</span></strong> et non pas de <span><strong>ATCTContent</strong></span> puisque c'est un dossier.</p>
<p>&nbsp;</p>
<p>Pour notre classe Histoire on va servir du champs <strong>title</strong> et <strong>description</strong> ( qui va nous fournir, quant &agrave; lui, un  <span>WYSIWYG</span>).<br />Voici <strong>jesuisunconnard.metier/jesuisunconnard/metier/content/Histoire.py</strong> :</p>
<div class="code">
<p>#-*-coding:Utf-8-*-</p>
<p>from zope.interface import implements<br />from Products.Archetypes import atapi<br />from Products.ATContentTypes.content import base<br />from Products.ATContentTypes.content import schemata<br />from Products.ATContentTypes.content.schemata import finalizeATCTSchema</p>
<p>from jesuisunconnard.metier.config import PROJECTNAME<br />from jesuisunconnard.metier import JesuisunconnardMessageFactory as _<br />from jesuisunconnard.metier.interfaces import IHistoire</p>
<p><br />HistoireSchema = schemata.ATContentTypeSchema.copy()</p>
<p>HistoireSchema['title'].searchable = True<br />HistoireSchema['title'].storage = atapi.AnnotationStorage()<br />HistoireSchema['title'].default_output_type = 'text/x-html-safe'<br />HistoireSchema['title'].widget.label = _(u"Pseudo")<br />HistoireSchema['title'].widget.description = _(u"")</p>
<p>HistoireSchema['description'].searchable = True<br />HistoireSchema['description'].required = True<br />HistoireSchema['description'].storage = atapi.AnnotationStorage()<br />HistoireSchema['description'].default_output_type = 'text/x-html-safe'<br />HistoireSchema['description'].widget.label = _(u"Description")<br />HistoireSchema['description'].widget.description = _(u"")</p>
<p>finalizeATCTSchema(HistoireSchema, folderish=False, moveDiscussion=False)</p>
<p>class Histoire(base.ATCTContent):<br /> """ une histoire """<br /> implements(IHistoire)<br /> <br /> portal_type = "Histoire"<br /> _at_rename_after_creation = True<br /> schema = HistoireSchema<br /> <br /> nom = atapi.ATFieldProperty("title")<br /> texte = atapi.ATFieldProperty("description")<br /> <br />atapi.registerType(Histoire, PROJECTNAME)</p>
</div>
<p><br />Et voil&agrave;, c'est termin&eacute; !</p>
<p>Alors dans la 1&deg; partie, j'avais &eacute;crit qu'en une semaine, le tuto serait termin&eacute;,<br />et bien je me suis tromp&eacute; !&nbsp;<br />En une semaine, je viens &agrave; peine de terminer cette partie,<br />et donc, je m'en excuse (enfin aux rares qui suivent mes articles)<br /><br />Mais si j'ai mis si longtemps, c'est pour diverses raisons :<br />- coupures de courant<br />- coupures du net ( vid&eacute;otron....)<br />- je met v&eacute;ritablement beaucoup de temps pour &eacute;crire un article, meme trop<br />- et un grave manque de motivation, j'ai pas vraiment aim&eacute; l'&eacute;crire sauf une fois fini( faut dire que j'ai pass&eacute; r&eacute;ellement 3 jours &agrave; savoir comment pr&eacute;senter Archetypes)</p>
<p>Alors il me semble que cette partie soit moins bien faite que la premi&egrave;re, tantpis, enfin si vous avez des critiques n'h&eacute;sitez pas<br /><br />Ce sera une partie par semaine dor&eacute;navant.<br /><br />Donc Rendez-vous &agrave; d'ici dimanche pour la 3&deg; partie (configure.zcml de content et fichier config.py en perspective et que sais-je), enfin si l'envie m'endive...</p></p><br/><br/>
<div>
  <strong>Related</strong>
  <ul>
         <li><a href="http://www.qui-saura.fr/monBlog/plone3-1.html">[QuiSaura] Intro à Plone 3 : partie 1</a></li>

  </ul>
</div>
]]></description>
    <link><![CDATA[http://www.qui-saura.fr/monBlog/plone3-2.html]]></link>
    <pubDate>2009-02-16 00:41:41</pubDate>
  </item>
  <item>
    <title><![CDATA[[Ohan] 30 ans, et toutes mes dents]]></title>
    <description><![CDATA[30 ans aujourd&#8217;hui.
Il reste encore une petite heure dans cette première journée de mes 30 ans. Et je commence un blog.
Je jette dans ce tout premier billet les motivations pour ce blog (qui restent pour l&#8217;heure très vagues):

Avoir un aide-mémoire
Structurer mes pensées et divagations
Ajouter ma pierre à l&#8217;édifice

Quelques règles pour les futurs billets:

Travailler sur la [...]]]></description>
    <link><![CDATA[http://mathieu.agopian.info/blog/2009/02/30-ans-et-toutes-mes-dents/]]></link>
    <pubDate>2009-02-15 22:06:45</pubDate>
    <category>Uncategorized</category>
  </item>
  <item>
    <title><![CDATA[[tarek] What’s new in Distutils ?]]></title>
    <description><![CDATA[Since Python 3.0.1 was released this week, here&#8217;s a quick wrapup of what is going on in Distutils.
Code work (since one month)
New features

Issue 2563 : now the manifest is embed in windows extensions
Issue 4394 : the storage of the password in .pypirc file is optional now

Fixed bugs

Issue 4524: distutils was failing to build scripts with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=tarekziade.wordpress.com&blog=448161&post=614&subd=tarekziade&ref=&feed=1" />]]></description>
    <link><![CDATA[http://tarekziade.wordpress.com/2009/02/15/whats-new-in-distutils/]]></link>
    <pubDate>2009-02-15 10:35:45</pubDate>
    <category>distutils</category>
    <category>python</category>
  </item>
  <item>
    <title><![CDATA[[wikiPython] PyWin]]></title>
    <description><![CDATA[]]></description>
    <link><![CDATA[http://wikipython.flibuste.net/PyWin]]></link>
    <pubDate>2009-02-12 21:09:28</pubDate>
  </item>
  <item>
    <title><![CDATA[[No] Le FOSDEM et moi]]></title>
    <description><![CDATA[<p>Je tiens à le dire de suite : je suis très partagé concernant le <a href="http://fosdem.org/2009/">FOSDEM</a> auquel j'ai assisté. Je tiens également à souligner que je ne fais ici aucun reproche à qui que ce soit, je constate purement et simplement. Il faut dire que si j'ai fait le déplacement à Bruxelles, c'est d'abord parce que l'idée de donner une conférence sur <a href="http://pyroom.org/">PyRoom</a> a été émise via notre liste de diffusion par Ploum, et que ça m'était apparu comme une bonne idée.
</p>
<p>Devant les indisponibilités de chacun, je me suis donc proposé. Cela faisait quelques années que ça me démangeait d'aller au FOSDEM, poussé par les membres de la communauté LugRadio, qui étaient habitués de l'événement.
</p>
<p>En fait, quelques jours avant FOSDEM, j'ai regardé le programme et j'ai de suite senti la différence avec le Lugradio Live. Beaucoup, beaucoup, beaucoup plus de scènes, certes, mais beaucoup moins de sujets qui pouvaient m'intéresser aussi. Une piste entière dédiée à Drupal, très peu pour moi, merci, une autre sur Ada (os court, le langage vert !). Peu de choses liées au web (il y avait Ruby &amp; Rails et Mozilla pour sauver l'honneur des développeurs web).
   Quant à Python, que dalle. Ou presque. Si on excepte la présentation de Victor Stinner sur <a href="http://fusil.hachoir.org/trac">Fusil</a> et celle que j'ai donnée sur PyRoom, y'avait rien à se mettre sous la dent.
</p>
<p>Encore une fois, cela n'a rien à voir avec l'organisation. FOSDEM est une énorme machine, il en faut certainement pour tous les goûts, et comme Olivier Grisel et moi en avons convenu en en parlant : il suffisait que les Pythonistas européens se mettent d'accord pour proposer des choses pour FOSDEM et les organisateurs auraient sûrement apprécié. Apparemment, lors d'une année précédente, il y avait un atelier Python qui paraît-il était plein à craquer. Ça doit être que je suis arrivée la mauvaise année. Peut-être que pour le prochain PYCON, il faudra glisser l'idée de proposer des animations en coordination avec les autres groupes de Pythonistes Européens, je suis certain que ce langage mérite plus de visibilité à l'échelon international.
</p>
<p>Autrement, pour l'ambiance de l'événement, rien à dire : des bénévoles à fond les manettes, des geeks partout, l'indispensable Josette toujours fidèle au stand O'Reilly, un panneau <em>"GNOME love / GNOME hate"</em> très marrant, etc.
</p>
<p>Ce fut l'occasion pour moi de discuter avec des gens que je n'avais jamais rencontré (salut Ploum) et revoir d'autres que je ne vois pas assez souvent et de boire de très bonnes bières belges avec plaisir.
</p>
<p>J'ai même eu l'occasion de voir <a href="http://standblog.org/">Tristan Nitot</a> en chair et en chair. Ouaou.
</p>
<p>En ce qui concerne ma conférence, je n'ai qu'un regret : celui d'avoir voulu modifier au tout dernier moment la taille du seul screenshot qui devait être affiché, et qui a trop largement débordé de l'écran. Autrement tout est allé comme sur des roulettes, et j'ai même gagné un paquet de mignonettes (c'est des biscuits) à la fin (comme tous les gens qui ont fait un Lightening talk - je trouve l'idée excellente). La présentation a été apparemment très bien reçue et j'espère qu'elle attirera plus d'utilisateurs et plus de contributeurs sur PyRoom.
</p>
<p>D'ailleurs le présent article a été rédigé à l'aide de PyRoom. Voilà. <em>Eat your own dog food</em>.
</p>]]></description>
    <link><![CDATA[http://jehaisleprintemps.net/blog/fr/2009/02/11/le-fosdem-et-moi/]]></link>
    <pubDate>2009-02-11 21:46:15</pubDate>
  </item>
  <item>
    <title><![CDATA[[QuiSaura] Intro à Plone 3 : partie 1]]></title>
    <description><![CDATA[<p><em><p>Premi&egrave;re partie d'une intro &agrave; Plone 3 .</p></em></p>
<p><p>Alors , dans ce tuto on va voir comment &nbsp;cr&eacute;er une appli Plone 3.</p>
<p>Je ne sais pas combien il y aura de parties, mais je vais essayer de publier et terminer cette intro le plus vite possible ( en une semaine ce serait pas mal).<br />Et donc du coup l'intro &agrave; Zope 3 est mise en berne .</p>
<p>Le site que l'on va faire ? <a title="je suis un connard" href="http://jesuisunconnard.com" target="_blank">jesuisunconnard.com</a> (bah oui &nbsp;&agrave; d&eacute;faut d'etre connu, faut bien qu'il serve &agrave; quelquechose) .</p>
<p>Jesuisunconnard sera d&eacute;compos&eacute; en 2 packages :<br />jesuisunconnard.politique<br />jesuisunconnard.metier ( j'ai pas trouv&eacute; mieux comme nom)<br /><br />Alors oui, on ne va pas voir comment cr&eacute;er un th&egrave;me vite-fait bien fait, mais je ferais surement un petit article apr&egrave;s ce tuto d'intro.</p>
<p>Je ne vais pas non plus traiter les tests, tr&egrave;s importants, mais ca prendrait bien trop de place dans cette intro &agrave; Plone 3, mais qui sait, surement dans un prochain (mais tr&egrave;s lointain) article ?</p>
<p>Et avant de commencer :&nbsp; je n'arrive pas &agrave; faire d'accents circonflexes sur op&eacute;ra 10.</p>
<p>C'est parti.</p>
<p>&nbsp;</p>
<h1>Installation de Plone via Buildout<br /></h1>
<div class="code">
<p>&nbsp;$ paster create -t plone3_buildout monSite</p>
</div>
<p><br />R&eacute;pondez aux questions (mettez et laissez &agrave; on le <strong>debug_mode</strong> et <strong>verbose_security</strong> pour le moment ).</p>
<p>Et on lance le buildout :</p>
<div class="code">
<p>$ cd monSite &amp;&amp; python2.4 bootstrap.py &amp;&amp; ./bin/buildout</p>
</div>
<p><br />C'est termin&eacute;.</p>
<h1>&nbsp;Le th&egrave;me<br /></h1>
<p>Comme dit plus haut, on ne va pas faire de th&egrave;me personnalis&eacute; : j'en ai trouv&eacute; un tr&egrave;s joli, et comme je suis une quiche en design ca tombe bien !<br />C'est <a title="keepitsimple" href="http://plone.org/products/plonetheme-keepitsimple" target="_blank">keepitsimple</a>. Et il est disponible chez <a title="pypi" href="http://pypi.python.org/pypi/" target="_blank">pypi</a>.<br />On rajoute donc dans <strong>buildout.cfg</strong>, dans la section <strong>[eggs]</strong> ceci :</p>
<div class="code">
<p>[buildout]<br />parts =<br />&nbsp;   plone<br />&nbsp;   zope2<br />[...]<br />eggs =<br />&nbsp;   elementtree<br />&nbsp; <strong>plonetheme.keepitsimple</strong></p>
</div>
<p><br />puis dans <strong>zcml</strong> de <strong>[instance]</strong> ceci :</p>
<div class="code">
<p>[instance]<br />recipe = plone.recipe.zope2instance<br />zope2-location = ${zope2:location}<br />[...]<br />zcml =<br />&nbsp;    <strong>plonetheme.keepitsimple<br /><br /></strong></p>
</div>
<p><br />Qui va cr&eacute;er un fichier dans <strong>parts/instance/etc/site-package-includes</strong> afin que Zope trouve notre joli th&egrave;me.</p>
<h1>Cr&eacute;ation de notre politique<br /></h1>
<p>Les 2 premi&egrave;res parties &eacute;taient assez triviales mais bon.</p>
<p>On &nbsp;va donc cr&eacute;er notre package plone 3 :</p>
<div class="code">
<p>$ cd src &amp;&amp; paster -create -t plone jesuisunconnard.politique</p>
</div>
<p><br />Namespace du paquet : jesuisunconnard<br />Le nom du paquet : politique<br />Zope2Product : True</p>
<p>&nbsp;Et comme vous vous en doutez, il faut rajouter ceci dans notre <strong>buildout.cfg</strong> :</p>
<div class="code">
<p>[buildout]<br />parts =<br />&nbsp;   plone<br />&nbsp;   zope2<br />[...]<br /><br />eggs =<br />&nbsp;   elementtree<br />&nbsp;   plonetheme.keepitsimple<br />&nbsp;   <strong>jesuisunconnard.politique</strong><br /><br />develop =<br />&nbsp;       <strong>src/jesuisunconnard.politique<br /></strong>[...]<br />[instance]<br />recipe = plone.recipe.zope2instance<br />zope2-location = ${zope2:location}<br />[...]<br />zcml =<br />&nbsp; plonetheme.keepitsimple<br />&nbsp; <strong>jesuisunconnard.politique</strong><strong><br /><br /></strong></p>
</div>
<p><br />Ce package va nous permettre de configurer globalement notre site Plone, c'est &agrave; dire que, grace &agrave; lui, on va pouvoir :<br />- rajouter un onglet<br />- lister uniquement nos types dans "ajout d'&eacute;l&eacute;ment"<br />- modifier le nom du site<br />- ajouter par d&eacute;pendances, d'autres packages<br />&nbsp;[...]</p>
<p>Maintenant que notre politique est cr&eacute;&eacute;e, on va &eacute;diter le fichier <strong>src/jesuisunconnard.politique/jesuisunconnard/politique/configure.zcml</strong> :</p>
<div class="code">
<p>&lt;configure<br />&nbsp;   xmlns="http://namespaces.zope.org/zope"<br />&nbsp;   <strong>xmlns:five="http://namespaces.zope.org/five"<br />&nbsp;   xmlns:genericsetup="http://namespaces.zope.org/genericsetup"</strong><br />&nbsp;   <strong>i18n_domain="jesuisunconnard.politique"</strong>&gt;<br /><br />&nbsp;<span> </span>&lt;<span>five</span>:<span>registerPackage </span>package=<span>"." </span>/&gt;<br />&nbsp;  &nbsp;<br />&nbsp;   &lt;<span>genericsetup</span>:<span>registerProfile</span><br />&nbsp;       <span>name</span>="<span>default</span>"<br />&nbsp;&nbsp;<span>directory</span>="profiles/default"<br />&nbsp;&nbsp;   /&gt;<br /><br />&lt;/configure&gt;</p>
</div>
<p><br />La balise<span> five</span> sert &agrave; <span>enregistrer</span> notre <span>paquet</span> en tant que Produit Zope2 .</p>
<p>la balise <span>genericsetup</span>, quant &agrave; elle, permet d'enregistrer un profil pour notre politique.<br /><br />Mais c'est quoi un profil ? on va prendre une photo ?<br />Non ; &nbsp;un profil va contenir certaines configurations pour notre site ( le nom, la description, les worflows, les roles, etc...)</p>
<p>Le profil s'<span>appellera</span> donc <span>default</span>.<br />Et <span>directory</span> est l'emplacement de ce profil.</p>
<p><br />Comme vous vous en doutez il faut donc cr&eacute;er les dossiers profiles et default :</p>
<div class="code">
<p>$ cd jesuisunconnard.politique/jesuisunconnard/politique/ &amp;&amp; mkdir -p profiles/default</p>
</div>
<p><br />Donc, comme dit juste avant, notre profil va contenir certaines configurations, qui se feront uniquement via fichiers XML.</p>
<h1>&nbsp;Configuration de notre profil<br /></h1>
<p>On va commencer par modifier le nom du site ainsi que sa description .<br />On cr&eacute;e donc le fichier <strong>src/jesuisunconnard.politique/jesuisunconnard/politique/profiles/default/properties.xml</strong> :</p>
<div class="code">
<p>&lt;?xml version="1.0" ?&gt;<br />&lt;site&gt;<br />&nbsp;       &lt;property name="<span>title</span>"&gt;Je suis un connard&lt;/property&gt;<br />&nbsp;       &lt;property name="<span>description</span>"&gt;Parce qu'il faut savoir rire de tout&lt;/property&gt;<br />&lt;/site&gt;</p>
</div>
<p><br />Et c'est tout.<br />la prori&eacute;t&eacute; <span>title</span> repr&eacute;sente le titre du site et <span>description</span> la description [ je pr&eacute;cise au cas o&ugrave; il y ait des ames &eacute;gar&eacute;es ].</p>
<p>Maintenant, on veut rajouter 3 onglets : "A propos", "Raconte ton histoire" &nbsp;et "Aleatoire".<br />Ces 3 onglets vont, non pas rediriger vers un dossier (sinon on aurait pas besoin de les rajouter &agrave; la "main"), mais rediriger sur des pages que l'on cr&eacute;era dans une prochaine partie :&nbsp;<br />on va donc pr&eacute;parer le terrain.</p>
<p>On va devoir cr&eacute;er le fichier <strong>src/jesuisunconnard.politique/jesuisunconnard/politique/profiles/default/actions.xml </strong>&nbsp;et y mettre :</p>
<div class="code">
<p>&lt;?xml version="1.0" ?&gt;<br /><span>&lt;object name="<strong>portal_actions</strong>" meta_type="Plone Actions Tool" xmlns:i18n="http://xml.zope.org/namespaces/i18n"&gt;</span><br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span> &lt;object name="<strong>portal_tabs</strong>" meta_type="CMF Action Category"&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>&lt;object name="<strong>aPropos</strong>" meta_type="<strong>CMF Action</strong>" i18n:domain="plone"&gt;</span><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>title</span>" i18n:translate="ongletApropos"&gt;A propos&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;property name="<span>description</span>" i18n:translate=""&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>url_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>icon_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>available_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>permissions</span>"&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element value="<strong><span>View</span></strong>"/&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>visible</span>"&gt;<span><strong>True</strong></span>&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/object&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>&lt;object name="<strong>ajout</strong>" meta_type="</span><span><strong>CMF Action</strong></span><span>" i18n:domain="plone"&gt;</span><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>title</span>" i18n:translate="ongletRaconte"&gt;Raconte ton histoire&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;property name="<span>description</span>" i18n:translate=""&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>url_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>icon_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>available_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>permissions</span>"&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element value="<strong><span>View</span></strong>"/&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>visible</span>"&gt;<span><strong>True</strong></span>&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/object&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span> &lt;object name="<strong>aleatoire</strong>" meta_type="</span><span><strong>CMF Action</strong></span><span>" i18n:domain="plone"&gt;</span><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>title</span>" i18n:translate="ongletAleatoire"&gt;Aleatoire&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>description</span>" i18n:translate=""&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>url_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>icon_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>available_expr</span>"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>permissions</span>"&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element value="<strong><span>View</span></strong>"/&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="<span>visible</span>"&gt;<span><strong>True</strong></span>&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/object&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/object&gt;<br />&lt;/object&gt;</p>
</div>
<p><br />La <span>2&deg; ligne</span> permet de s&eacute;lectionner notre objet, en l'occurence <strong><span>portal_actions</span></strong> ( d'o&ugrave; le nom du fichier).<br />Et oui, nos onglets vont &ecirc;tre enregistr&eacute;s dans <strong><span>portal_actions</span></strong> et plus particuli&egrave;rement dans <strong><span>son</span></strong> objet <strong><span>portal_tabs</span></strong> ( tabs = onglets , je pr&eacute;cise on ne sait jamais) : d'o&ugrave; la <span>4&deg; ligne</span>.</p>
<p>Et apr&egrave;s c'est assez trivial poursuit :<br />&agrave; l'int&eacute;rieur de <strong><span>portal_tabs</span></strong>, on d&eacute;finit <span>3 objets</span> ( <span><strong>aPropos</strong></span>, <span><strong>ajout</strong></span>, <span><strong>aleatoire</strong></span>) &eacute;tant de type <span><strong>CMF Action</strong></span> : et hop ce sont devenus des onglets.</p>
<p><span>title</span> : le titre de l'onglet<br /><span>description</span>: la description de l'onglet<br /><span>url_expr</span>: l'url o&ugrave; pointe l'onglet : vide pour le moment<br /><span>icon_expr</span>: l'icone de l'onglet : on n'en veut pas<br /><span>available_expr</span>: condition &eacute;ventuelle pour qu'apparaisse l'onglet<br /><span>permissions</span>: la permission pour l'onglet, ici, <span><strong>tout le monde</strong></span> peut le <strong><span>voir</span></strong><br /><span>visible</span>: si l'onglet est cach&eacute; (<span><strong>False</strong></span>) ou pas (<span><strong>True</strong></span>)</p>
<h1>C'est bientot la fin<br /></h1>
<p>Il nous reste une derni&egrave;re chose &agrave; faire, avant de terminer cette premi&egrave;re partie.</p>
<p>Comme dit plus haut, je veux uniquement lister dans "ajout d'un &eacute;l&eacute;ment" les objets que l'on cr&eacute;era dans une prochaine partie , c'est&nbsp; &agrave; dire que "Document", "Evenement" et compagnie doivent disparaitre.<br />Et Comment on fait &ccedil;a ?</p>
<p>On cr&eacute;e le fichier <strong>src/jesuisunconnard.politique/jesuisunconnard/politique/profiles/default/import_steps.xml</strong>, contenant ceci :</p>
<div class="code">
<p>&lt;?xml version="1.0" ?&gt;<br />&lt;import-steps&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>&lt;import-step</span> <strong>id</strong>="jesuisunconnard-etapes" version="06022009-01"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>handler</span>="jesuisunconnard.politique.setuphandlers.<span>importVarious</span>" title="autreEtapes"<span>&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span> &lt;/import-step&gt;</span><br />&lt;/import-steps&gt;</p>
</div>
<p><br />Mais c'est quoi ce fichier <strong>import_steps.xml</strong> ? tu veux qu'on fasse du step ?<br />Queneni ! <br />Enfait quand on va installer notre paquet, <span>genericsetup</span> va importer notre profil <span>default</span> afin de configurer notre site .<br />Et cette configuration se fait &eacute;tape par &eacute;tape : normal.<br />Mais si l'on veut rajouter une &eacute;tape comme c'est le cas ( lister seulement nos objets dans "ajout d'un &eacute;l&eacute;ment"), on doit cr&eacute;er ce fichier.</p>
<p>on cr&eacute;e une nouvelle &eacute;tape via la balise <span>&lt;import-step&gt;</span>, en oubliant pas de lui mettre un <strong>id</strong>.<br />Le <span>handler</span> sera ce que notre nouvelle &eacute;tape va appeler ; ici, c'est la fonction <span>importVarious</span>() qui le sera.</p>
<p>Bon bah il ne nous reste plus qu'&agrave; la cr&eacute;er .<br />fichier <strong>src/jesuisunconnard.politique/jesuisunconnard/politique/setuphandlers.py</strong> :</p>
<div class="code">
<p>#-*- coding:Utf-8 -*-<br /><br />from Products.CMFCore.utils import getToolByName<br /><br />def <span>desactiveTout</span>(portal):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>portal_types</span> = <span><strong>getToolByName</strong></span>(portal, 'portal_types')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'Document').<span>global_allow</span> = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'Event').<span>global_allow</span> = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'Favorite').<span>global_allow</span> = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'File').<span>global_allow</span> = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'Folder').<span>global_allow</span> = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'Image').<span>global_allow</span> = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'Link').<span>global_allow</span> = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'Topic').<span>global_allow</span> = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>getattr</strong>(<span>portal_types</span>, 'News Item').<span>global_allow</span> = False<br /><br /><br />def <span>importVarious</span>(context):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portal = context.getSite()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; desactiveTout(portal)</p>
</div>
<p><br /><span>importVarious</span> ne fait qu'appeler <span>desactiveTout</span>().</p>
<p>On r&eacute;cup&egrave;re l'objet <span>portal_types</span> (qui est un singleton) via <span><strong>getToolByName</strong></span><strong></strong>().<br />Puis, on r&eacute;cup&egrave;re chaque objet repr&eacute;sentant un type ind&eacute;sirable via <strong>getattr</strong>(<span>portal_types</span>, monType) ,&nbsp; que l'on d&eacute;sactive via l' attribut <span>global_allow</span>.</p>
<p>Et voil&agrave;.</p>
<h1>Et merde, c'est pas la fin</h1>
<p>Ceci est le dernier paragraphe , mais le vrai.</p>
<p>Dans le paragraphe pr&eacute;c&eacute;dent, j'ai &eacute;cris : <br /><em>Enfait quand on va installer notre paquet, <span>genericsetup</span> va importer notre profil <span>default</span> afin de configurer notre site .</em><br />Vous avez du vous dire : "<em>mais comment il sait qu'il doit importer default et pas un autre ou rien du tout ?</em></p>
<p>Et bien ca se passe du c&ocirc;t&eacute; <span>de chez swan</span> du dossier <strong>src/jesuisunconnard.politique/jesuisunconnard/politique/Extensions</strong>, qu'il faut cr&eacute;er ( il faut en faire un package donc n'omellettez pas le fichier <strong>__init__.py</strong> ) .</p>
<p>Dedans, cr&eacute;ez le fichier <strong>Install.py</strong> (avec le <strong>I</strong> majuscule) :</p>
<div class="code">
<p>import transaction<br />from Products.CMFCore.utils import getToolByName<br /><br />#PRODUCT_DEPENDENCIES = ('jesuisunconnard.metier',)<br /><span>PRODUCT_DEPENDENCIES</span> = ()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span>EXTENSION_PROFILES</span> = ('jesuisunconnard.politique:default',)<br /><br />def <span>install</span>(self, reinstall=False):<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; portal_quickinstaller = getToolByName(self, 'portal_quickinstaller')<br />&nbsp;&nbsp;&nbsp; portal_setup = getToolByName(self, 'portal_setup')<br /><br />&nbsp;&nbsp;&nbsp; for product in PRODUCT_DEPENDENCIES:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if reinstall and portal_quickinstaller.isProductInstalled(product):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portal_quickinstaller.reinstallProducts([product])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transaction.savepoint()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif not portal_quickinstaller.isProductInstalled(product):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portal_quickinstaller.installProduct(product)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transaction.savepoint()<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; for extension_id in EXTENSION_PROFILES:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portal_setup.runAllImportStepsFromProfile('profile-%s' % extension_id, purge_old=False)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; product_name = extension_id.split(':')[0]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portal_quickinstaller.notifyInstalled(product_name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transaction.savepoint()</p>
</div>
<p><br />Ce code n'est pas de moi, je l'ai trouv&eacute; dans pas mal de codes et sur des sites, donc je n'ai pas vraiment de sources &agrave; donner.<br />Je ne vais pas l'expliquer, puisqu'on s'en fou du fonctionnement.<br /><br />Tout ce qui nous int&eacute;resse c'est de savoir, que <span>install</span>() va permettre d'installer d'autres paquets : <br />il nous suffira d'ajouter le nom du paquet dans <span>PRODUCT_DEPENDENCIES</span> (on rajoutera par la suite jesuisunconnard.metier)<br /><br />Et il nous permet aussi d'importer nos profils via <span>EXTENSION_PROFILES&nbsp;</span> (monPaquet:nomProfil) .<br />C'est comme ca que <span>genericsetup</span> sait qu'il doit importer notre profil <span>default</span>.</p>
<p>&nbsp;</p>
<p>Et c'est vraiment la fin de cette premi&egrave;re partie ( n'oubliez pas de faire un buildout), si vous voulez le code c'est <a title="code" href="http://www.qui-saura.fr/../../../css/images/jesuisunconnard.politique.tar.bz2" target="_blank">ici</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>(et dire que je dois finir cette intro en une semaine...)</p></p><br/><br/>
<div>
  <strong>Related</strong>
  <ul>
         <li><a href="http://www.qui-saura.fr/monBlog/plone3-2.html">[QuiSaura] Intro à Plone 3 : partie 2</a></li>

  </ul>
</div>
]]></description>
    <link><![CDATA[http://www.qui-saura.fr/monBlog/plone3-1.html]]></link>
    <pubDate>2009-02-06 22:15:07</pubDate>
  </item>
  <item>
    <title><![CDATA[[ccomb] Doing music with a stepper motor and... Python]]></title>
    <description><![CDATA[<div class="document">
<a href="http://relief.fr" class="reference external image-reference"><img src="http://ccomb.gorfou.fr/static/relief.png" alt="relief.fr" class="align-left" align="left" /></a>
<p><a href="http://relief.fr" class="reference external">Relief.fr</a> is an agency specialized in 3D stereographic technologies (what we call "relief" in french), located in Paris. It's a great team, they have a long-standing know-how with stereography, anaglyphs, 3D projection, and they also really master the production of images dedicated to the innovative <a href="http://relief.fr/3d-sans-lunettes/relief-sans-lunettes" class="reference external">3D LCD panels</a> from <a href="http://www.alioscopy.com" class="reference external">Alioscopy</a>.</p>
<img src="http://ccomb.gorfou.fr/static/Alioscopy40.jpg" alt="/static/Alioscopy40.jpg" class="align-right" align="right" />
<p>Stereoscopy normally needs making 2 images: one for the left eye, one for the right eye. Producing images for these 3D screen is much harder because they require shooting 8 images. Seeing such a screen for the first time is really astonishing, because you not only see in 3D <strong>without 3D glasses</strong>, but you can also <strong>turn around the object</strong> on the screen! Not a lot, but you can. Just put a screen on your stand in an exhibition, and you are guaranteed to see everybody stopping in front of you. I'll try to bring one at <a href="http://www.solutionslinux.fr" class="reference external">Solution Linux 2009</a> for the <a href="http://afpy.org" class="reference external">AFPY</a> stand.</p>
<p>To be able to shoot 8 images, we need to move a camera on an aluminium rail very quickly, while the camera is in burst mode. Everything is home made. The rail and the power supply is manufactured by a motion control specialist, while I'm programming the movements of the stepper motor in <a href="http://python.org" class="reference external">Python</a>, with an USB controller, an eee-pc, and everything on Linux.</p>
<p>Since I'm also a musician, I really like to do music with everything: that's really easy with a stepper motor: you just give him a frequency to make it move, and a frequency is just a note. Starting with the 440Hz <em>A</em>, you just have to multiply by the twelfth root of two ( <tt class="docutils literal"><span class="pre">2^(1/12)</span></tt> ) to get the next semitone. Then you can play music :)</p>

  
  
  
  
  
    
<p>This is very noisy because the rail is on a wood box. The high notes are not exactly right, because of some harmonics, and also the rounding of frequencies to the nearest integer.</p>
</div><br/><br/>
<div>
  <strong>Related</strong>
  <ul>
         <li><a href="http://www.gawel.org/weblog/fr/2008/07/packager-ses-scripts-python">[gawel] Packager ses scripts Python</a></li>

  </ul>
</div>
]]></description>
    <link><![CDATA[http://ccomb.gorfou.fr/2009/2/6/doing-music-with-a-stepper-motor-and-python]]></link>
    <pubDate>2009-02-06 16:02:00</pubDate>
  </item>
</channel>
</rss>


