<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4471279657154274165</id><updated>2011-12-16T05:38:30.900-08:00</updated><category term='Без рубрики'/><title type='text'>OpenERP</title><subtitle type='html'>Apprendre OpenERP de A à Z !</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-2844814583499537024</id><published>2010-01-07T09:03:00.000-08:00</published><updated>2010-12-28T12:39:25.527-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Evénements du mois de Janvier</title><content type='html'>&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-weight:bold"&gt;CRM avec OpenERP : Le 14/01/2010&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Séminaire en ligne gratuit pour vous présenter un cas typique d'utilisation de OpenERP pour pour la gestion de la relation client (avant-vente et après-vente).&lt;br /&gt;&lt;span style="font-weight:bold"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-weight:bold"&gt;GPAO avec OpenERP : Le 20/01/2010&lt;/span&gt;&lt;span style="font-weight:bold"&gt;&lt;br /&gt;&lt;/span&gt;Séminaire en ligne gratuit pour vous présenter un cas typique d'utilisation de OpenERP dans un contexte de gestion des approvisionnement au travers de nomenclatures et de gammes.&lt;br /&gt;&lt;span&gt;&lt;span style="font-size:100%"&gt;&lt;span style="font-weight:normal"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight:bold"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-weight:bold"&gt;Configuration et administration de OpenERP : Le 27/01/2010&lt;br /&gt;&lt;span style="font-weight:bold"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Séminaire en ligne gratuit pour vous présenter les méthodes de gestion et de configuration de OpenERP :&lt;br /&gt;- Gestion des droits&lt;br /&gt;- Design des écrans&lt;br /&gt;- Gestion des traduction&lt;br /&gt;- Modifications des processus&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vous pouvez recevoir une invitation en contactant : &lt;a href="mailto:info@open-net.ch"&gt;info@open-net.ch&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%"&gt;&lt;span style="font-weight:bold"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-5784182891185070965?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-2844814583499537024?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/2844814583499537024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2010/01/evenements-du-mois-de-janvier.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/2844814583499537024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/2844814583499537024'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2010/01/evenements-du-mois-de-janvier.html' title='Evénements du mois de Janvier'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-3755807275628293643</id><published>2009-12-21T10:44:00.000-08:00</published><updated>2010-12-28T12:39:25.515-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>La gestion des rapports</title><content type='html'>Introduction:&lt;br /&gt;&lt;br /&gt;* Il existe 3 méthodes pour gérer des rapports dans OpenERP:&lt;br /&gt;&lt;br /&gt;● Les rapports OpenOffice .&lt;br /&gt;● Les rapports XML et XLS:RML .&lt;br /&gt;● Les rapports colonnes créés directement dans le client OpenERP .&lt;br /&gt;Nous nous intéresserons à la première méthode qui est à la fois la plus&lt;br /&gt;simple et la plus fléxible .&lt;br /&gt;&lt;br /&gt;* Le processus de création d'un nouveau :&lt;br /&gt;&lt;br /&gt;OpenERP propose une intégration des rapports avec OpenOffice.Il est ainsi possible de faire la mise en page d'un rapport dans OpenOffice puis de l'importer dans OpenERP.&lt;br /&gt;OpenERP utilise un 'dialecte' XML pour définir les rapports, le "RML". Les fichiers RML décrivent la structure du document ainsi que les expressions et les champs à inclure.&lt;br /&gt;Il est bien sûr possible de modifier directement un rapport au travers de l'édition de son fichier RML, mais alors la possibilité de mise en page ultérieure avec OpenOffice est perdue .&lt;br /&gt;&lt;br /&gt;* Exemple Création du report PDF de commande :&lt;br /&gt;&lt;br /&gt;OpenERP possède une structure complètement modulaire, chaque module se trouve dans un&lt;br /&gt;répertoire /addons/ qui contient le code source de définition des classes, des écrans et des rapports .&lt;br /&gt;Le report de commande doit faire partie du module 'mon_module', il se trouvera donc dans bin/addons/mon_module/report/ .&lt;br /&gt;Dans ce répertoire, le fichier rml génère le formulaire pdf tandis que le fichier sxw est capable de regénérer le fichier rml. Ce fichier sxw est éditable par Open Office (version 2.x ou 3.x), vous pouvez le télécharger à partir de ce lien OpenOffice .&lt;br /&gt;&lt;br /&gt;* Etapes de création du fichier .RML :&lt;br /&gt;&lt;br /&gt;1. Editer le fichier commande avec Open Office (enregistrez le au format .swx) .&lt;br /&gt;&lt;br /&gt;2. Uploader le fichier commande.swx créé dans votre compte sur le serveur .&lt;br /&gt;&lt;br /&gt;3. Déplacer vous dans le répertoire ou se trouve le script tiny_sxw2rml.py .&lt;br /&gt;&lt;br /&gt;4. Lancer la conversion d'un rapport en rml avec la commande suivante:&lt;br /&gt;tiny_sxw2rml.py file.sxw &amp;gt;file.rml .&lt;br /&gt;tiny_sxw2rml.py commande.sxw &amp;gt;commande.rml .&lt;br /&gt;&lt;br /&gt;* Construction d'un rapport :&lt;br /&gt;&lt;br /&gt;Chaque rapport est construit sur la base d'un objet [[o]] et des attributs de cet objet. Par exemple, la description de la commande achat (order) est représentée par l'expression suivante: [[ o.name ]] .L'objet 'order' est relié à l'objet&lt;br /&gt;'res.partner' par le champ many2one 'partner_id'. Il est donc possible d'afficher le&lt;br /&gt;nom du partenaire en utilisant le code suivant: [[o.partner_id.name]] . L'objet 'order' possède un objet 'line', c'est à dire qu'un order est composé d'une ou de plusieurs lignes de commande .&lt;br /&gt;Il est possible d'accéder à ces lignes de commandes par la fonction:&lt;br /&gt;"[[ repeatIn(o.line_ids,'line') ]]" qui nous fournit un nouvel objet&lt;br /&gt;'line' contenant les attributs de chaque ligne de commande. Par exemple "[[line.quantity]]" affiche la quantité commandée .&lt;br /&gt;Order line possède un attribut 'product_id' qui est une relation many2one avec l'objet 'product' . L'objet product possède un attribut 'name'.&lt;br /&gt;Nous pouvons donc écrire [[ line.product_id and line.product_id.name]] . Après avoir éditer le fichier commande.sxw, on procéde à sa converssion du sxw en rml via le&lt;br /&gt;programme : tiny_sxw2rml.py Le fichier commande.rml ainsi converti doit se trouvé dans le dossier: addons\mon_module\report .&lt;br /&gt;Dans le fichier __init__.py qui va appeller les fonctions nécessaires ajouter la fonction suivante: import report .&lt;br /&gt;Puis ajouter le dossier report qui contiendra le fichier commande.rml .&lt;br /&gt;Ensuite dans le fichier __terp__.py qui va permettre de déclarer le report, modifier la ligne update_xml :&lt;br /&gt;"update_xml" : ["tiny_purchase_view.xml”,"tiny_purchase_report.xml”] .&lt;br /&gt;La définition du report se trouvera dans le fichier : (mon_module_report.xml).&lt;br /&gt;&lt;br /&gt;Editer un fichier xml correspondant au report: mon_module_report.xml .&lt;br /&gt;&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;&amp;lt; ?xml version=&amp;quot;1.0&amp;quot;? &amp;gt;&lt;br /&gt;&amp;lt;&amp;gt;&lt;br /&gt;&amp;lt;&amp;gt;&lt;br /&gt;&amp;lt; id=&amp;quot;report.order&amp;quot; string=&amp;quot;Order&amp;quot; model=&amp;quot;mon_module.order&amp;quot; name=&amp;quot;commande&amp;quot; rml=&amp;quot;mon_module/report/commande.rml&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt; /data &amp;gt;&lt;br /&gt;&amp;lt; /openerp &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;name="commande", "commande" : est un nom interne donné au report&lt;br /&gt;rml="tiny_purchase/report/commande.rml" .&lt;br /&gt;L'exécution est très simple : faites une mise à jour du module et c'est tout  :) !&lt;br /&gt;&lt;br /&gt;Dans le cas où le report contient un champs ne se trouvant pas dans l'objet en&lt;br /&gt;question, alors il faut définir une classe spécifique à ce report contenant la&lt;br /&gt;définition du champs en question, Par exemple le total de la commande ne&lt;br /&gt;se trouve nul part dans l'objet order.&lt;br /&gt;Dans ce cas, nous devons définir la classe commande de la façon suivante :&lt;br /&gt;&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;from report import report_sxw&lt;br /&gt;class commande(report_sxw.rml_parse):&lt;br /&gt;def __init__(self, cr, uid, name, context):&lt;br /&gt;super(commande, self).__init__(cr, uid, name, context)&lt;br /&gt;self.localcontext.update({&lt;br /&gt;'time': time,&lt;br /&gt;'total': self.total,&lt;br /&gt;})&lt;br /&gt;def total(self, lines):&lt;br /&gt;res=0&lt;br /&gt;for i in lines:&lt;br /&gt;res += i.price&lt;br /&gt;return res&lt;br /&gt;report_sxw.report_sxw('report.commande','tiny_purchase.order','addons/tiny_purc&lt;br /&gt;hase/report/commande.rml', parser=commande)&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Dans le fichier mon_module_report.xml on doit ajouter le paramètre auto:&lt;br /&gt;auto=”False” si le report utilise des champs définis par un code.&lt;br /&gt;auto=”True” si le report n'utilise que les champs définis dans la base de donnée (valeur par défaut=True) .&lt;br /&gt;Enrégistrer cette déclaration dans le fichier : commande.py&lt;br /&gt;puis ajouter un fichier init.py dans le dossier addons\mon_module\report&lt;br /&gt;qui appellera commande.py : import commande .&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-1812148590043753628?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-3755807275628293643?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/3755807275628293643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/12/la-gestion-des-rapports.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/3755807275628293643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/3755807275628293643'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/12/la-gestion-des-rapports.html' title='La gestion des rapports'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-6348514080326532038</id><published>2009-12-14T12:16:00.000-08:00</published><updated>2010-12-28T12:39:25.482-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Le worflow</title><content type='html'>On appelle workflow la modélisation et la gestion informatique de l'ensemble des tâches à accomplir et des différents acteurs impliqués dans la réalisation d'un processus métier (aussi appelé processus opérationnel ou bien procédure d'entreprise). Le terme de « workflow » pourrait donc être traduit en français par « gestion électronique des processus métier ». De façon plus pratique, le workflow décrit le circuit de validation, les tâches à accomplir entre les différents acteurs d'un processus, les délais, les modes de validation, et fournit à chacun des acteurs les informations nécessaires pour la réalisation de sa tâche. Pour un processus de publication en ligne par exemple, il s'agit de la modélisation des tâches de l'ensemble de la chaîne éditoriale.&lt;br /&gt;&lt;br /&gt;Il permet généralement un suivi et identifie les acteurs en précisant leur rôle et la manière de le remplir au mieux.&lt;br /&gt;&lt;br /&gt;1 - Définir un worflow :&lt;br /&gt;* name: nom du workflow .&lt;br /&gt;* osv: nom de l'objet .&lt;br /&gt;* on_create: instancie en création .&lt;br /&gt;&lt;br /&gt;2 - Définier une liste de noeuds :&lt;br /&gt;* wkf_id&lt;br /&gt;* flow_start&lt;br /&gt;* flow_stop&lt;br /&gt;* kind&lt;br /&gt; - dummy (ne fait rien)&lt;br /&gt; - function (appelle une methode objet )&lt;br /&gt; - subflow (appelle un subworkflow)&lt;br /&gt;* Action (= nom de methode)&lt;br /&gt; - si kind est une “function” ou un “subflow”&lt;br /&gt;* subflow_id&lt;br /&gt; - si kind = “subflow”&lt;br /&gt; - &amp;lt; name=&amp;quot;subflow_id&amp;quot; search=&amp;quot;[(&amp;#39;name&amp;#39;,&amp;#39;=&amp;#39;,&amp;#39;account.invoice.basic&amp;#39;)]&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;3 - Définier une liste de transactions :&lt;br /&gt;* Champs :&lt;br /&gt;- act_from: id de l'activité source .&lt;br /&gt;- act_to: id de activité destination .&lt;br /&gt;- condition: expression python .&lt;br /&gt;- signal: nom d'un bouton attendu .&lt;br /&gt;- role_id: role necessaire pour l'execution de la transition .&lt;br /&gt;&lt;br /&gt;** Exemple :&lt;br /&gt;Commencez par créer un fichier nom_module_worflow.xml dans le dossier qui contient les .py et les vues que vous avez créer déja .&lt;br /&gt;Dans la partie qui suit, on déclare les activités workflow où on spécifie l'id du workflow, la nature de l'activité ainsi que l'action qui doit s'exécuter .&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;&amp;lt; record model=&amp;quot;workflow&amp;quot; id=&amp;quot;account&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;name&amp;quot;&amp;gt;budget.account.basic&amp;lt; /field&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;osv&amp;quot;&amp;gt;budget.account&amp;lt; /field&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;on_create&amp;quot;&amp;gt;True&amp;lt; /field&amp;gt;&lt;br /&gt;&amp;lt; /record&amp;gt;&lt;br /&gt;&amp;lt; record model=&amp;quot;workflow.activity&amp;quot; id=&amp;quot;retour&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;wkf_id&amp;quot; ref=&amp;quot;account&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;flow_start&amp;quot;&amp;gt;True&amp;lt; /field&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;name&amp;quot;&amp;gt;draft&amp;lt; /field&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;kind&amp;quot;&amp;gt;function&amp;lt; /field&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;action&amp;quot;&amp;gt;budget_confirm()&amp;lt; /field&amp;gt;&lt;br /&gt;&amp;lt; /record&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ensuite on déclare les transactions, c'est ici que se manifeste le fonctionnement du workflow .&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;&amp;lt; record model=&amp;quot;workflow.transition&amp;quot; id=&amp;quot;valide_account&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;act_from&amp;quot; ref=&amp;quot;non_valide&amp;quot;/ &amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;act_to&amp;quot; ref=&amp;quot;valide&amp;quot;/ &amp;gt;&lt;br /&gt;&amp;lt; field name=&amp;quot;signal&amp;quot;&amp;gt;valider&amp;lt; /field&amp;gt;&lt;br /&gt;&amp;lt; /record&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Dans la partie act_from, on mets l'activité à partir de laquelle le flux commence, et dans act_to ç'est là où mène le flux .&lt;br /&gt;&lt;br /&gt;Enfin, voici un petit shéma explicatif qui résume le fonctionnement d'un workflow au sein d'une opération sur OpenERP .&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://3.bp.blogspot.com/__76bx9l5zrg/SyaCDAD-OgI/AAAAAAAAAHQ/YlE7SS-xG7I/s1600-h/workflow.bmp"&gt;&lt;img style="width:320px;height:177px" src="http://3.bp.blogspot.com/__76bx9l5zrg/SyaCDAD-OgI/AAAAAAAAAHQ/YlE7SS-xG7I/s320/workflow.bmp" alt="" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-4044723696851331512?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-6348514080326532038?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/6348514080326532038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/12/le-worflow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/6348514080326532038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/6348514080326532038'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/12/le-worflow.html' title='Le worflow'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__76bx9l5zrg/SyaCDAD-OgI/AAAAAAAAAHQ/YlE7SS-xG7I/s72-c/workflow.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-397191709699268083</id><published>2009-12-08T18:17:00.000-08:00</published><updated>2010-12-28T12:39:25.396-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Les objets en détails</title><content type='html'>Dans cette partie, on verra d'autres types de champs qu'on utilise souvent dans la programmation pour OpenERP .&lt;br /&gt;&lt;br /&gt;* Les champs complexes :&lt;br /&gt;&lt;br /&gt;1- function (nom_methode, type_methode, ...) : Un champs de type fonction est un champs dont la valeur est calculée par une fonction (plutôt que étant stockées dans la base de données).&lt;br /&gt;&lt;br /&gt;def essai(self, cr, uid, ids,field_name=None,arg=None,context={}):&lt;br /&gt;res = {}&lt;br /&gt;for m in ...&lt;br /&gt;res[m.id] = ...&lt;br /&gt;return res&lt;br /&gt;&lt;br /&gt;'a': fields.function(essai, method=True, string='A',type='char').&lt;br /&gt;&lt;br /&gt;On a définie la fonction &lt;span style="font-weight:bold"&gt;essai&lt;/span&gt; ayant comme paramètres :&lt;br /&gt;-&lt;span style="font-weight:bold"&gt; self&lt;/span&gt; : l'objet courant .&lt;br /&gt;- &lt;span style="font-weight:bold"&gt;cr&lt;/span&gt; : le curesseur courant (base de données ouverte) .&lt;br /&gt;- &lt;span style="font-weight:bold"&gt;uid&lt;/span&gt; : l'identifiant du user connecté .&lt;br /&gt;- &lt;span style="font-weight:bold"&gt;ids&lt;/span&gt; : les identifiants de l'objet courant .&lt;br /&gt;Le champs a est du type &lt;span style="font-weight:bold"&gt;function&lt;/span&gt; .&lt;br /&gt;La fonction est &lt;span style="font-weight:bold"&gt;essai&lt;/span&gt; .&lt;br /&gt;&lt;br /&gt;2- Les selections : selection (options_possibles, ...)&lt;br /&gt;* Exemple:&lt;br /&gt;'state': fields.selection (('e','encours'),('c','confirme'), 'Etat', required = True).&lt;br /&gt;&lt;br /&gt;* Les champs relation :&lt;br /&gt;&lt;br /&gt;1- many2one (obj, ...) :&lt;br /&gt;* Exemple :&lt;br /&gt;'service': fields.many2one('ir.module.category', 'Service Demandeur') .&lt;br /&gt;&lt;br /&gt;2- one2many (obj, field_id, ...) :&lt;br /&gt;* Exemple :&lt;br /&gt;'addresse': fields.one2many('res.partner.address', 'partner_id', 'Contacts') .&lt;br /&gt;&lt;br /&gt;L'attribut "_defaults" permet de définir des valeurs par défaut pour un ou plusieurs champs simples d'un objet .&lt;br /&gt;Puisque les valeurs par défaut ne doivent pas être statiques (elles peuvent , par exemple, dependre des valeurs des resources déjà créés), vous devez définir les &lt;span style="font-weight:bold"&gt;fonctions&lt;/span&gt; de valeurs par défaut et pas des simples valeurs &lt;span style="font-weight:bold"&gt;constantes&lt;/span&gt; .&lt;br /&gt;Pour définir les valeurs par défaut pour des champs d'un objet , vous devez definir un dictionaire de la forme: {'nom_du_champs': function, ...} .&lt;br /&gt;&lt;br /&gt;* Syntax:&lt;br /&gt;_defaults = {&lt;br /&gt;'nom_champs': function,&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;* Exemple&lt;br /&gt;_defaults = {&lt;br /&gt;'etat': lambda *a: 'engage'&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Python permet une syntaxe intéressante qui vous laisse définir des minifonctions d’une ligne à la volée. Empruntées à Lisp, ces fonctions dites lambda peuvent être employées partout où une fonction est nécéssaire .&lt;br /&gt;&lt;br /&gt;g = lambda x: x*2&lt;br /&gt;g(7)&lt;br /&gt;14&lt;br /&gt;&lt;br /&gt;La fonction lambda fait la même chose qu'une fonction ordinaire . Notez la syntaxe condensée : il n’y a pas de parenthèses autour de la liste d’arguments et le mot&lt;br /&gt;clé return est manquant (il est implicite, la fonction complète ne pouvant être qu’une seule expression). Remarquez aussi que la fonction n’a pas de nom, mais qu’elle peut être appelée à travers la variable à laquelle elle est assignée, c'est un peu étrange mais très intéressant :) .&lt;br /&gt;&lt;br /&gt;* Méthodes prédéfinies des objets :&lt;br /&gt;&lt;br /&gt;1- Create :&lt;br /&gt;- Description : Créer une nouvelle ressource&lt;br /&gt;- Signature : def create(self, cr, uid, vals, context={})&lt;br /&gt;Retourne le id de la ressource créée&lt;br /&gt;- Parametres :&lt;br /&gt;● vals: Un dictionnaire de valeurs pour les champs. Ce dictionnaire doit avoir la forme suivante: {'nom_du_champs': valeur, ...}&lt;br /&gt;● context (optionel): Le contexte actuel.&lt;br /&gt;&lt;br /&gt;2- Search :&lt;br /&gt;- Description : Cherche toutes les ressources satisfaisant certains critéres .&lt;br /&gt;- Signature :&lt;br /&gt;   def search(self, cr, uid, args, offset=0, limit=2000)&lt;br /&gt;   args = [('field_name', 'operator', value), ...] .&lt;br /&gt;Elle retourne une liste de ids .&lt;br /&gt;&lt;br /&gt;3- Read :&lt;br /&gt;- Description: Liste des valeurs de champs .&lt;br /&gt;- Signature :&lt;br /&gt;def read(self, cr, uid, ids, fields=None, context={})&lt;br /&gt;- Parametres :&lt;br /&gt;● ids: liste des identifients des ressources à lire .&lt;br /&gt;● fields (optionel): la liste des champs spécifiques. Si nous n'introduisons pas ce parmétre, la fonction contrôle tous les champs.&lt;br /&gt;● context (optionel): le contexte actuel.&lt;br /&gt;Elle retourne une liste de dictionaires (un dictionaire par resource intérrogé) de la forme: [{'field_name': value}] .&lt;br /&gt;&lt;br /&gt;4- Write :&lt;br /&gt; - Description :&lt;br /&gt;Elle écrit des valeurs sur un ou plusieurs champs d'une ou plusieurs ressources .&lt;br /&gt; - Signature :&lt;br /&gt;def write(self, cr, uid, ids, vals, context={})&lt;br /&gt;vals = {'field_name': value, ...}&lt;br /&gt;retourne True .&lt;br /&gt;&lt;br /&gt;5- Unlink :&lt;br /&gt; - Description :&lt;br /&gt;Supprime une ou plusieurs ressources&lt;br /&gt; - Signature :&lt;br /&gt;def unlink(self, cr, uid, ids)&lt;br /&gt;retourne True .&lt;br /&gt;&lt;br /&gt;6- Browse :&lt;br /&gt; - Description: Retourne une ou plusieurs ressources d'un objet.&lt;br /&gt;def browse(self, cr, uid, ids, offset=0, limit=2000)&lt;br /&gt; - Signature :&lt;br /&gt;addr_obj = self.pool.get('res.partner.address').browse(cr, uid, contact_ids)&lt;br /&gt;contact_name = addr_obj.name&lt;br /&gt;contact_bank = addr_obj.partner_id.bank .&lt;br /&gt;&lt;br /&gt;Je mettrai à votre disposition un exemple bien détaillé englobant tout ce qu'on a vu dans la partie administration, que vous pouvez intégrer facilement sous OpenERP, tester et meme y faire des modifictions et personnaliser ;) .&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-4111738913241320906?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-397191709699268083?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/397191709699268083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/12/les-objets-en-details.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/397191709699268083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/397191709699268083'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/12/les-objets-en-details.html' title='Les objets en détails'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-8880830699083079737</id><published>2009-12-08T16:57:00.000-08:00</published><updated>2010-12-28T12:39:25.337-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Les vues (Partie 2)</title><content type='html'>Dans cette partie, on va voir comment personnaliser la vue dans OpenERP :&lt;br /&gt;&lt;br /&gt;* Les attributs pour le tag des champs :&lt;br /&gt;select="1" .&lt;br /&gt;colspan="2" .&lt;br /&gt;string="Nom libellé" .&lt;br /&gt;readonly="1" .&lt;br /&gt;nolabel="1" .&lt;br /&gt;required="1" .&lt;br /&gt;on_change:&lt;br /&gt;- Exemple:&lt;br /&gt;on_change = ''_onchange_partner_id(type,partner_id)'' .&lt;br /&gt;Signature&lt;br /&gt;- def _onchange_partner_id(self, cr, uid, ids, type, partner_id) :&lt;br /&gt;Return value :&lt;br /&gt;{&lt;br /&gt;'value': {'field_name': value}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Citant maintenant d'autres tags pour les vues :&lt;br /&gt;&lt;br /&gt;- &amp;lt; form string=&amp;quot;Sale Order&amp;quot; &amp;gt;&lt;br /&gt;- &amp;lt; tree string=&amp;quot;&amp;quot; sale=&amp;quot;&amp;quot; order=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;- &amp;lt; sparator string=&amp;quot;Links&amp;quot; colspan=&amp;quot;4&amp;quot;/ &amp;gt; : Il sert à mettre un separateur entre deux parties, par exemple entre zones de formulaires .&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://1.bp.blogspot.com/__76bx9l5zrg/Sx7PPnHClSI/AAAAAAAAAGM/Y5DMJpV_jBk/s1600-h/sep.bmp"&gt;&lt;img style="width:320px;height:35px" src="http://1.bp.blogspot.com/__76bx9l5zrg/Sx7PPnHClSI/AAAAAAAAAGM/Y5DMJpV_jBk/s320/sep.bmp" alt="" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:left"&gt;- &amp;lt; notebook &amp;gt;&lt;br /&gt;          &amp;lt; page string=&amp;quot;Order Line&amp;quot;&amp;gt;&lt;br /&gt;           ...&lt;br /&gt;          &amp;lt; /page &amp;gt;&lt;br /&gt;  &amp;lt; /notebook &amp;gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://1.bp.blogspot.com/__76bx9l5zrg/Sx7VHwKJ0_I/AAAAAAAAAGw/-TYbqCDz9-8/s1600-h/not.bmp"&gt;&lt;img style="width:320px;height:160px" src="http://1.bp.blogspot.com/__76bx9l5zrg/Sx7VHwKJ0_I/AAAAAAAAAGw/-TYbqCDz9-8/s320/not.bmp" alt="" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align:center"&gt;&lt;br /&gt;&lt;div style="text-align:left"&gt;La partie encadrée en noir s'appelle "page" et le notebook regroupe plusieurs pages comme le montre la figure ci-dessous :) .&lt;br /&gt;&lt;br /&gt;- &amp;lt; newline/ &amp;gt; : Sert à sauter une ligne .&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align:left"&gt;- &amp;lt; group colspan=&amp;quot;4&amp;quot; col=&amp;quot;6&amp;quot;&amp;gt; : Sert à regrouper plusieurs champs :&lt;br /&gt;&lt;br /&gt;     &amp;lt; group colspan=&amp;quot;4&amp;quot; col=&amp;quot;7&amp;quot;&amp;gt;&lt;br /&gt;                           &amp;lt; field name=&amp;quot;amount_untaxed&amp;quot; sum=&amp;quot;Untaxed amount&amp;quot;/ &amp;gt;&lt;br /&gt;                           &amp;lt; field name=&amp;quot;amount_tax&amp;quot;/ &amp;gt;&lt;br /&gt;     &amp;lt; /group &amp;gt;&lt;br /&gt;&lt;br /&gt;- &amp;lt; label string=&amp;quot;Test&amp;quot;&amp;gt; : Libellé du champs .&lt;br /&gt;&lt;br /&gt;- &amp;lt; button &amp;gt; : Il sert à déclarer un bouton dans la vue .&lt;br /&gt;string: libellé du bouton&lt;br /&gt;*type:&lt;br /&gt;-  "workflow" (valeur par défaut) : Transition du workflow.&lt;br /&gt;-  "object": Appelle une méthode dans un objet.&lt;br /&gt;-  "action": Appelle une action (imprimer, ouvrir une vue, wizard).&lt;br /&gt;*name : Nom de la transition workflow , methode de l'objet ou une action à appeler .&lt;br /&gt;*Signature de la method objet : method_name(cr, uid, ids, *args).&lt;br /&gt;*states: Liste des états pour lesquels le bouton est visible .&lt;br /&gt;**Exemple:&lt;br /&gt;      &amp;lt; button string=&amp;quot;&amp;#39;&amp;#39;Press&amp;quot; type=&amp;quot;&amp;#39;&amp;#39;object&amp;#39;&amp;#39;&amp;quot; name=&amp;quot;&amp;#39;&amp;#39;method_name&amp;#39;&amp;#39;&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt; /button &amp;gt;&lt;/div&gt;&lt;/div&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-8319279641940401363?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-8880830699083079737?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/8880830699083079737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/12/les-vues-partie-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/8880830699083079737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/8880830699083079737'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/12/les-vues-partie-2.html' title='Les vues (Partie 2)'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__76bx9l5zrg/Sx7PPnHClSI/AAAAAAAAAGM/Y5DMJpV_jBk/s72-c/sep.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-3857093436535518069</id><published>2009-12-04T19:52:00.000-08:00</published><updated>2010-12-28T12:39:25.324-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Les vues (Partie 1)</title><content type='html'>&lt;span style="font-weight:bold"&gt;*Introduction au fichiers XML dans OpenERP :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dans OpenEPR, les fichiers XML servent pour :&lt;br /&gt;- Definir les views (modulename_view.xml)&lt;br /&gt;- Definir les workflow (modulename_workflow.xml)&lt;br /&gt;- Declarer les reports (modulename_report.xml)&lt;br /&gt;- Declarer les wizards (modulename_wizard.xml)&lt;br /&gt;- Importer des données (modulename_data.xml)&lt;br /&gt;- Importer des donées de demonstration (modulename_demo.xml) .&lt;br /&gt;&lt;br /&gt;* La structure des fichiers XML dans OpenERP :&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;1- &amp;lt; openerp &amp;gt;&lt;br /&gt;2-  &amp;lt; data &amp;gt;&lt;br /&gt;3-   &amp;lt; record model=&amp;quot;object_name&amp;quot; id=&amp;quot;record_id&amp;quot;&amp;gt;&lt;br /&gt;4-     &amp;lt; field name=&amp;quot;field_name&amp;quot;&amp;gt;field_value&amp;lt; /field &amp;gt;&lt;br /&gt;5-   &amp;lt; /record &amp;gt;&lt;br /&gt;6-   &amp;lt; record model=&amp;quot;other_object_name&amp;quot; id=&amp;quot;other_record_id&amp;quot;&amp;gt;&lt;br /&gt;7-     &amp;lt; field name=&amp;quot;relation_field_name&amp;quot; ref=&amp;quot;”record_id”/&amp;quot;&amp;gt;&amp;lt; /field &amp;gt;&lt;br /&gt;8-   &amp;lt; /record &amp;gt;&lt;br /&gt;9-  &amp;lt; /data &amp;gt;&lt;br /&gt;10-&amp;lt; /openerp &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Prenons un petit exemple concret :&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;1- &amp;lt; openerp &amp;gt;&lt;br /&gt;2-  &amp;lt; data &amp;gt;&lt;br /&gt;3-   &amp;lt; record model=&amp;quot;account.currency&amp;quot; id=&amp;quot;EUR&amp;quot;&amp;gt;&lt;br /&gt;4-     &amp;lt; field name=&amp;quot;name&amp;quot;&amp;gt;EUR&amp;lt; /field &amp;gt;&lt;br /&gt;5-     &amp;lt; field name=&amp;quot;rate&amp;quot;&amp;gt;1.0&amp;lt; /field &amp;gt;&lt;br /&gt;6-     &amp;lt; field name=&amp;quot;digits&amp;quot;&amp;gt;2&amp;lt; /field &amp;gt;&lt;br /&gt;7-     &amp;lt; field name=&amp;quot;accuracy&amp;quot;&amp;gt;4&amp;lt; /field &amp;gt;&lt;br /&gt;8-     &amp;lt; field name=&amp;quot;priority&amp;quot;&amp;gt;1&amp;lt; /field &amp;gt;&lt;br /&gt;9-   &amp;lt; /record &amp;gt;&lt;br /&gt;10-  &amp;lt; record model=&amp;quot;account.account&amp;quot; id=&amp;quot;a0&amp;quot; &amp;gt;&lt;br /&gt;11-    &amp;lt; field name=&amp;quot;name&amp;quot;&amp;gt;Account chart&amp;lt; /field &amp;gt;&lt;br /&gt;12-    &amp;lt; field name=&amp;quot;type&amp;quot;&amp;gt;view&amp;lt; /field &amp;gt;&lt;br /&gt;13-    &amp;lt; field name=&amp;quot;currency_id&amp;quot; ref=&amp;quot;EUR&amp;quot;/ &amp;gt;&lt;br /&gt;14-    &amp;lt; field name=&amp;quot;code&amp;quot;&amp;gt;0&amp;lt; /field &amp;gt;&lt;br /&gt;15-  &amp;lt; /record &amp;gt;&lt;br /&gt;16- &amp;lt; /data &amp;gt;&lt;br /&gt;17-&amp;lt; /openerp &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;*Les vues :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Les Vues définissent comment le client affiche les objets. Il peut y avoir plusieurs vues pour le même objet .&lt;br /&gt;- Les differents types de vues :&lt;br /&gt;- Form&lt;br /&gt;- Tree&lt;br /&gt;- Actions&lt;br /&gt;- Ouvrir une fenêtre (form ou tree)&lt;br /&gt;- Imprimer un raport&lt;br /&gt;- Executer un wizard&lt;br /&gt;- Menu items .&lt;br /&gt;&lt;br /&gt;* En ce qui concerne la syntaxe des vues, elle est de la forme suivante :&lt;br /&gt;&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;1- &amp;lt; record model=&amp;quot;ir.ui.view&amp;quot; id=&amp;quot;id_vue&amp;quot;&amp;gt;&lt;br /&gt;2-  &amp;lt; field name=&amp;quot;name&amp;quot;&amp;gt;view_name&amp;lt; /field &amp;gt;&lt;br /&gt;3-  &amp;lt; field name=&amp;quot;model&amp;quot;&amp;gt;view_object&amp;lt; /field &amp;gt;&lt;br /&gt;4-  &amp;lt; field name=&amp;quot;type&amp;quot;&amp;gt;form&amp;lt; /field &amp;gt;&lt;br /&gt;5-  &amp;lt; field name=&amp;quot;arch&amp;quot; type=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;6-   &amp;lt; form string=&amp;quot;libellé de la vue&amp;quot;&amp;gt;&lt;br /&gt;7-    &amp;lt; field name=&amp;quot;fields_name&amp;quot;&amp;gt;&lt;br /&gt;...&lt;br /&gt;8-    &amp;lt; /field &amp;gt;&lt;br /&gt;9-   &amp;lt; /form &amp;gt;&lt;br /&gt;10- &amp;lt; /field &amp;gt;&lt;br /&gt;11-&amp;lt; /record &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Le "ir.ui.view est l'objet qui contient les vues (views).&lt;br /&gt;&lt;br /&gt;Commencez par créer un fichier XML budget.xml dans le dossier addons/budget et mettez-y le code suivant :&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;1- &amp;lt; record model=&amp;quot;ir.ui.view&amp;quot; id=&amp;quot;line.form&amp;quot; &amp;gt;&lt;br /&gt;2-  &amp;lt; field name=&amp;quot;name&amp;quot;&amp;gt;budget.account.form&amp;lt; /field &amp;gt;&lt;br /&gt;3-  &amp;lt; field name=&amp;quot;model&amp;quot;&amp;gt;budget.account&amp;lt; /field &amp;gt;&lt;br /&gt;4-  &amp;lt; field name=&amp;quot;type&amp;quot;&amp;gt;form&amp;lt; /field &amp;gt;&lt;br /&gt;5-  &amp;lt; field name=&amp;quot;arch&amp;quot; type=&amp;quot;xml&amp;quot; &amp;gt;&lt;br /&gt;6-   &amp;lt; form string=&amp;quot;Budget&amp;quot; &amp;gt;&lt;br /&gt;7-    &amp;lt; field name=&amp;quot;name&amp;quot;/ &amp;gt;&lt;br /&gt;8-    &amp;lt; field name=&amp;quot;code_economique&amp;quot;/ &amp;gt;&lt;br /&gt;9-    &amp;lt; field name=&amp;quot;ref&amp;quot;/ &amp;gt;&lt;br /&gt;10-  &amp;lt; /form &amp;gt;&lt;br /&gt;11- &amp;lt; /field &amp;gt;&lt;br /&gt;12-&amp;lt; /record &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Comme on le constate dans l'exemple ci-dessus, dans chaque fichier XML de la vue, on doit déclarer le modèle (model) suivi de l'id qu'on utilisera après dans l'appel de la vue (&lt;span style="font-weight:bold"&gt;form&lt;/span&gt; ou &lt;span style="font-weight:bold"&gt;tree&lt;/span&gt; ou les deux) . Pour la déclaration des champs, on doit les écrire tels qu'ils sont déclarés dans la classe mère (le fichier budget.py) :) .&lt;br /&gt;&lt;br /&gt;* Passons maintenant à une partie qui est pas mal intéressante que les autres, c'est la déclaration des &lt;span style="font-weight:bold"&gt;action window&lt;/span&gt; et du &lt;span style="font-weight:bold"&gt;menu item&lt;/span&gt; .&lt;br /&gt;&lt;br /&gt;C'est tout un petit paragraphe de codes qu'on ajoute après la partie précédente de la vue et où on déclare l'id du record, le nom de la page, le nom du modèle (model) et le type de la vue (form, tree, ...).&lt;br /&gt;&lt;br /&gt;&lt;div style="background:rgb(204, 204, 255) none repeat scroll 0% 0%"&gt;&lt;br /&gt;&lt;pre style="color:rgb(102, 102, 102)"&gt;1- &amp;lt; record model=&amp;quot;ir.actions.act_window&amp;quot; id=&amp;quot;action_id&amp;quot; &amp;gt;&lt;br /&gt;2-  &amp;lt; field name=&amp;quot;name&amp;quot;&amp;gt;action_name&amp;lt; /field &amp;gt;&lt;br /&gt;3-  &amp;lt; field name=&amp;quot;res_model&amp;quot;&amp;gt;object_name&amp;lt; /field &amp;gt;&lt;br /&gt;4-  &amp;lt; field name=&amp;quot;view_type&amp;quot;&amp;gt;form&amp;lt; /field &amp;gt;&lt;br /&gt;5- &amp;lt; /record &amp;gt;&lt;br /&gt;6-  &amp;lt; menuitemname=&amp;quot;Outil/Tiny Purchase&amp;quot; action=&amp;quot;action_id&amp;quot;&amp;gt;&lt;br /&gt;7-  &amp;lt; /menuitem &amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Pour la dernière ligne, il s'agit du menu qui apparaitera dans la page .&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold"&gt;N.B :&lt;/span&gt;&lt;br /&gt;Si on utilise "&lt;span style="font-weight:bold"&gt;form&lt;/span&gt;" pour le type de la vue, on aura des formulaires à remplir .&lt;br /&gt;Si on utilise "&lt;span style="font-weight:bold"&gt;tree&lt;/span&gt;" pour le type de la vue, on aura un tableau affichant les données de la table concernée (ici abudget.accoun , c-à-d la table des comptes budgets ) .&lt;br /&gt;&lt;br /&gt;Vous pouvez faire des améliorations sur ces codes de sorte de rendre votre interface plus riche et plus belle ;) .&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-2269793052114136420?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-3857093436535518069?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/3857093436535518069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/12/les-vues-partie-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/3857093436535518069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/3857093436535518069'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/12/les-vues-partie-1.html' title='Les vues (Partie 1)'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-3083763644190050677</id><published>2009-12-03T18:22:00.000-08:00</published><updated>2010-12-28T12:39:25.312-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Les données OpenERP sur Google Map !</title><content type='html'>&lt;span&gt;&lt;span style="background-color:rgb(255, 255, 255)" title="There is a new very interesting OpenERP  Module which imports OpenERP data into Google Map."&gt;Il existe un nouveau  module très intéressant OpenERP qui importe des données OpenERP dans  Google Map.&lt;/span&gt;&lt;span style="background-color:rgb(255, 255, 255)" title=""&gt;  simple and really interesting.&amp;quot;&amp;gt; Ce module crée un fichier. KML avec tous  les partenaires et les données de chiffre d&amp;#39;affaires des partenaires, qui  pourraient être importés dans Google Maps. Résultat : simple et vraiment  intéressant. Comment ça se fait ?? La vidéo ci-dessous vous explique !&lt;br /&gt;&lt;br /&gt;&lt;embed allowFullScreen="false" allowScriptAccess="never" src="http://blip.tv/play/AYGG6zmQn2A" height="400" width="550" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="background-color:rgb(255, 255, 255)" title="Two questions :"&gt;--&amp;gt;  Deux questions se posent après :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color:rgb(255, 255, 255)" title="* Who is the owner  of the data ?"&gt;* Qui est le propriétaire des données?&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color:rgb(255, 255, 255)" title="* Is it really a  good idea to put financial data (which should be kept secret) into  google map ?"&gt;* Est-ce vraiment une bonne idée de mettre les données  financières (qui doivent être tenues secrètes) dans google map?&lt;br /&gt;&lt;/span&gt;&lt;span title="The best solution would be to create a MapFish project and  import kml data into mapfish :-)"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="background-color:rgb(255, 255, 255)" title=""&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-1497743426400577596?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-3083763644190050677?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/3083763644190050677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/12/les-donnees-openerp-sur-google-map.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/3083763644190050677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/3083763644190050677'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/12/les-donnees-openerp-sur-google-map.html' title='Les données OpenERP sur Google Map !'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-5353107622463323149</id><published>2009-12-02T16:01:00.000-08:00</published><updated>2010-12-28T12:39:25.290-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Création d'un module (partie 2)</title><content type='html'>Toutes les données OpenERP sont accessibles à travers des "objets". Par exemple,&lt;br /&gt;il y a un objet res.partner qui accéde aux données du partenaire , un objet account.invoice concernant les données factures, etc... .&lt;br /&gt;Pour définir un nouvel objet, on doit définir une nouvelle classe dans Python puis l'instantier. Cette classe doit hériter de la classe osv module osv.Le fichier: addons/module_name/module_name.py : &lt;br /&gt;&lt;div style="background:#CCCCFF"&gt;&lt;br /&gt;&lt;pre style="color:#666666"&gt;1- &lt;span style="color:#0000FF"&gt;class&lt;/span&gt; &lt;span style="color:#FF0000"&gt;object_name&lt;/span&gt;(osv.osv):&lt;br /&gt;2- &lt;span style="color:#339933"&gt;_name&lt;/span&gt; = "module_name.object_name"&lt;br /&gt;3- &lt;span style="color:#339933"&gt;_columns&lt;/span&gt; = {&lt;br /&gt;4- &lt;span&gt;'field_name'&lt;/span&gt;: fields.field_type('Libellé du champs', ...),&lt;br /&gt;5- &lt;span&gt;'other_field_name'&lt;/span&gt; : fields.other_field_type(...),&lt;br /&gt;6- }&lt;br /&gt;7- &lt;span style="color:#FF0000"&gt;object_name()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Exemple :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1- &lt;span style="color:#0000FF"&gt;class&lt;/span&gt; &lt;span style="color:#FF0000"&gt;res_partner_address&lt;/span&gt;(osv.osv):&lt;br /&gt;2- &lt;span style="color:#339933"&gt;_name&lt;/span&gt; = 'res.partner'&lt;br /&gt;3- &lt;span style="color:#339933"&gt;_columns&lt;/span&gt; = {&lt;br /&gt;4-   &lt;span&gt;'name'&lt;/span&gt;: fields.char('Name', size=128, required=True, select=True),&lt;br /&gt;5-   &lt;span&gt;'date'&lt;/span&gt;: fields.date('Date'),&lt;br /&gt;6-   &lt;span&gt;'ref'&lt;/span&gt;: fields.char('Code', size=64),&lt;br /&gt;7- }&lt;br /&gt;8- &lt;span style="color:#FF0000"&gt;res_partner()&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Deux sont obligatoires(_name et _columns), le reste est optionel.&lt;br /&gt;&lt;br /&gt;Les noms des champs doivent respecter les normes suivantes :&lt;br /&gt;- Tout doit etre minuscule.&lt;br /&gt;- Pas d'espace.&lt;br /&gt;- Pas de caractéres spéciaux.&lt;br /&gt;&lt;br /&gt;* Types simples de champs :&lt;br /&gt;&lt;br /&gt;- Boolean : un booléen (true, false).&lt;br /&gt;* Syntax : fields.boolean('Nom du champ' [, Parametres Optionels]),&lt;br /&gt;- Integer :&lt;br /&gt;* Syntax : fields.integer('Nom du champ' [, Parametres Optionels]),&lt;br /&gt;- float :&lt;br /&gt;* Le paramètre digits est optionnel.&lt;br /&gt;Exemple : 'credit_limit': fields.float(string='Credit Limit', digits=(12,6))&lt;br /&gt;- char :&lt;br /&gt;* Paramétre size&lt;br /&gt; Exemple : 'ref': fields.char('Code', size=64),&lt;br /&gt;- text : champs texte de longueur illimité.&lt;br /&gt;* Syntax : fields.text('Nom du champ' [, Parametres Optionels]),&lt;br /&gt;- date : Une date.&lt;br /&gt;* Syntax : fields.date('Nom du champ' [, Parametres Optionels]),&lt;br /&gt;- datetime : Pemet de stocker une date et l'heure de la journée dans le même champs.&lt;br /&gt;* Syntax : fields.datetime('Nom du champ' [, Parametres Optionels]),&lt;br /&gt;&lt;br /&gt;** Voici un petit exemple d'un module standard qui vous aidera à mieux comprendre comment ça marche  :)     :&lt;br /&gt;&lt;br /&gt;Créer le dossier budget dans \server\bin\addons&lt;br /&gt;● Créer le fichier __init__.py dans le dossier&lt;br /&gt;budget&lt;br /&gt;Ce fichier contiendra l'instruction suivante:&lt;br /&gt;import budget&lt;br /&gt;● Cette instruction permet d'importer le module&lt;br /&gt;budget&lt;br /&gt;● Créer le fichier __terp__.py dans le dossier&lt;br /&gt;budget qui correspond au fichier config de module :&lt;br /&gt;&lt;div style="background:#CCCCFF"&gt;&lt;br /&gt;  &lt;pre style="color:#666666"&gt;&lt;br /&gt;1- {&lt;br /&gt;2- &lt;span style="color:#339933"&gt;"name"&lt;/span&gt;: "Budget",&lt;br /&gt;3- &lt;span style="color:#339933"&gt;"version"&lt;/span&gt;: "0.1",&lt;br /&gt;4- &lt;span style="color:#339933"&gt;"author"&lt;/span&gt; : "iGenius",&lt;br /&gt;5- &lt;span style="color:#339933"&gt;"depends"&lt;/span&gt;: ['base',],&lt;br /&gt;6- &lt;span style="color:#339933"&gt;"init_xml"&lt;/span&gt;: [],&lt;br /&gt;7- &lt;span style="color:#339933"&gt;"update_xml"&lt;/span&gt;: [],&lt;br /&gt;8- &lt;span style="color:#339933"&gt;"active"&lt;/span&gt;: False,&lt;br /&gt;9- &lt;span style="color:#339933"&gt;"installable"&lt;/span&gt;: True,&lt;br /&gt;9- }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Créer le fichier budget.py dans le dossier budget :&lt;br /&gt;● Ce fichier contiendra toutes les classes du module .&lt;br /&gt;● On commence par une classe permettant de gérer les comptes des budgets :&lt;br /&gt;&lt;div style="background:#CCCCFF"&gt;&lt;br /&gt;  &lt;pre style="color:#666666"&gt;&lt;br /&gt;1- &lt;span style="color:#0000FF"&gt;class&lt;/span&gt; &lt;span style="color:#FF0000"&gt;budget_account&lt;/span&gt;(osv.osv):&lt;br /&gt;2- &lt;span style="color:#339933"&gt;_name&lt;/span&gt; = "budget.account"&lt;br /&gt;3- &lt;span style="color:#339933"&gt;_description&lt;/span&gt; = "Budget Account"&lt;br /&gt;4- &lt;span style="color:#339933"&gt;_columns&lt;/span&gt; = {&lt;br /&gt;5-     &lt;span&gt;'name'&lt;/span&gt;: fields.char('Intitule du compte', size=128, ),&lt;br /&gt;6-     &lt;span&gt;'code_economique'&lt;/span&gt;: fields.char('Code economique', size=10, ),&lt;br /&gt;7-     &lt;span&gt;'chapitre'&lt;/span&gt;: fields.char('Chapitre', size=10, ),&lt;br /&gt;8-     &lt;span&gt;'article'&lt;/span&gt;: fields.char('Article', size=10, ),&lt;br /&gt;9- }&lt;br /&gt;10- &lt;span style="color:#FF0000"&gt;budget_account()&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://1.bp.blogspot.com/__76bx9l5zrg/Sxbem_FJNmI/AAAAAAAAADU/i1yePtU0Fx4/s1600-h/maj.bmp"&gt;&lt;img src="http://1.bp.blogspot.com/__76bx9l5zrg/Sxbem_FJNmI/AAAAAAAAADU/i1yePtU0Fx4/s320/maj.bmp" alt="" name="BLOGGER_PHOTO_ID_5410756763681633890" border="0" style="width:320px;height:146px"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:left"&gt;Après avoir mis à jour la liste des modules, on doit trouver  nouveau module ajouté dans la liste des modules non installés .&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://3.bp.blogspot.com/__76bx9l5zrg/SxbgVP9e9GI/AAAAAAAAADk/B03uoSDhlSI/s1600-h/nninst.bmp"&gt;&lt;img src="http://3.bp.blogspot.com/__76bx9l5zrg/SxbgVP9e9GI/AAAAAAAAADk/B03uoSDhlSI/s320/nninst.bmp" alt="" name="BLOGGER_PHOTO_ID_5410758657998517346" border="0" style="width:320px;height:314px"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On l'installe et voilà !! Notre module est prêt à l'emploi  :) .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-8291091385426300897?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-5353107622463323149?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/5353107622463323149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/12/creation-d-module-partie-2.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/5353107622463323149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/5353107622463323149'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/12/creation-d-module-partie-2.html' title='Création d&amp;#39;un module (partie 2)'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__76bx9l5zrg/Sxbem_FJNmI/AAAAAAAAADU/i1yePtU0Fx4/s72-c/maj.bmp' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-1032848494311988140</id><published>2009-11-29T20:05:00.000-08:00</published><updated>2010-12-28T12:39:25.275-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Création d'un module (Partie 1)</title><content type='html'>Les modules sur OpenERP se trouvent dans le dossier server/bin/addons/ , un dossier par module :&lt;br /&gt;✔ base&lt;br /&gt;✔ account&lt;br /&gt;✔ product&lt;br /&gt;✔ crm&lt;br /&gt;✔ stock&lt;br /&gt;✔ sale&lt;br /&gt;✔ purchase&lt;br /&gt;✔ marketing&lt;br /&gt;✔ project&lt;br /&gt;✔ ...&lt;br /&gt;&lt;br /&gt;Les étapes suivantes sont indispensables pour créer un nouveau module:&lt;br /&gt;● créer un sous répertoire dans server/bin/addons&lt;br /&gt;● créer un fichier de description du module : __terp__.py&lt;br /&gt;● créer un fichier Python contenant les objets&lt;br /&gt;● créer les fichiers .xml qui chargent les données (vues, menu , données de demo , ...)&lt;br /&gt;● optionnellement créer les reports, wizards ou workflows.&lt;br /&gt;&lt;br /&gt;Le contenu du dossier d'un module (addons/module_name) :&lt;br /&gt;✔ __terp__.py.&lt;br /&gt;&lt;br /&gt;*  Objets:&lt;br /&gt;✔ modulename.py, autres possibilités :&lt;br /&gt;✔ __init__.py.&lt;br /&gt;&lt;br /&gt;*  Les fichiers XML :&lt;br /&gt;✔ modulename_view.xml.&lt;br /&gt;✔ modulename_workflow.xml (optional).&lt;br /&gt;✔ modulename_report.xml (optional).&lt;br /&gt;✔ modulename_wizard.xml (optional).&lt;br /&gt;✔ modulename_data.xml (optional).&lt;br /&gt;✔ modulename_demo.xml (optional).&lt;br /&gt;&lt;br /&gt;* report/sous dossier :&lt;br /&gt;✔ report_name.xml.&lt;br /&gt;✔ report_name.xsl.&lt;br /&gt;ou&lt;br /&gt;✔ report_name.rml.&lt;br /&gt;✔ report_name.sxw.&lt;br /&gt;✔ report_name.py (optional).&lt;br /&gt;&lt;br /&gt;*  wizard/sous dossier&lt;br /&gt;✔ __init__.py&lt;br /&gt;✔ wizard_name.py&lt;br /&gt;&lt;br /&gt;* Étape 1 - création du fichier de description du module : __terp__.py :&lt;br /&gt;&lt;br /&gt;Dans le dossier du module créé, vous devez ajouter un fichier __terp__.py .&lt;br /&gt;Ce fichier , qui doit être écrit sous Python , est responsable de :&lt;br /&gt;● déterminer les fichiers XML qui doivent être analysés durant l'initialisation du serveur.&lt;br /&gt;● déterminer les dépendances du module créé.&lt;br /&gt;✔ Le fichier doit contenir un dictionnaire Python avec les valeurs suivantes:&lt;br /&gt;&lt;br /&gt;✔ name : Le nom du module.&lt;br /&gt;✔ version : La version du module.&lt;br /&gt;✔ depends : Liste des modules dont dépend le module. Le module base est presque toujours dans les dépendances car des données indisponsables pour les vues, reports, ... sont dans le module base .&lt;br /&gt;✔ init_xml : Liste de fichiers .xml à charger quand le serveur est&lt;br /&gt;lancé avec l'argument "init=&lt;br /&gt;module".&lt;br /&gt;✔ update_xml : Liste de fichiers .xml à charger quand le serveur est&lt;br /&gt;lancé avec l'argument "update= module" .&lt;br /&gt;✔ active : True or False. Détermine si le module est actif ou non en utilisant le client.&lt;br /&gt;✔ Installable : True or False. Détermine si le module est installable ou non. Si le module n'est pas&lt;br /&gt;installable, il n'est pas possible de l'activer en utilisant le client.&lt;br /&gt;&lt;br /&gt;Prenons cet exemple :&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;"name" : "Mon Module",&lt;br /&gt;"version" : "1.0",&lt;br /&gt;"depends" : ['base'],&lt;br /&gt;"init_xml": [],&lt;br /&gt;"update_xml": ["mon_module_view.xml",&lt;br /&gt;mon_module_report.xml"],&lt;br /&gt;"active": True&lt;br /&gt;"installable": True,&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;✔ init_xml &amp;amp; update_xml sont équivalent.&lt;br /&gt;*  additional keys:&lt;br /&gt;✔ "author" : "iGENIUS",&lt;br /&gt;✔ "website" : "igenius.com",&lt;br /&gt;✔ "category" : "Generic Modules/Mon module",&lt;br /&gt;✔ "translations" :&lt;br /&gt;{&lt;br /&gt;"fr": "i18n/french_fr.csv"&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;* Le fichier __init__.py est comme tout module Python , exécute au démarrage du programme. Il a besoin d'importer les fichiers Python pour être chargés.&lt;br /&gt;Ainsi, si vous crééez le fichier "module.py", contenant la description de vos objets, vous devez écrire une ligne dans __init__.py: import module  .&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-6087465749014045780?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-1032848494311988140?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/1032848494311988140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/11/creation-d-module-partie-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/1032848494311988140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/1032848494311988140'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/11/creation-d-module-partie-1.html' title='Création d&amp;#39;un module (Partie 1)'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4471279657154274165.post-8874647593366198053</id><published>2009-11-29T19:24:00.000-08:00</published><updated>2010-12-28T12:39:25.261-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Без рубрики'/><title type='text'>Architecture technique et modulaire</title><content type='html'>Avant &lt;span&gt;d'entamer&lt;/span&gt; la partie 'Administration de &lt;span&gt;OpenERP&lt;/span&gt;', il me semble nécessaire de faire un petit &lt;span&gt;aperçu&lt;/span&gt; sur le langage de programmation 'Python' avec lequel est programmé &lt;span&gt;OpenERP&lt;/span&gt; .&lt;br /&gt;Pour cela, je vous invite à faire une petite balade sur le &lt;span&gt;tutoriel&lt;/span&gt; &lt;span&gt;présent&lt;/span&gt; sur ce lien http://python.developpez.com/cours/TutoSwinnen/ .&lt;br /&gt;&lt;br /&gt;*  L’architecture technique&lt;br /&gt;&lt;br /&gt;* Architecture  client/serveur :&lt;br /&gt;&lt;br /&gt;&lt;span&gt;OpenERP&lt;/span&gt; est basé sur une  architecture  client/serveur comme le décrit le schéma ci-dessous:&lt;br /&gt;&lt;br /&gt;&lt;img src="javascript:void(0);" alt=""&gt;&lt;br /&gt;                                &lt;div style="text-align:center"&gt;&lt;a href="http://4.bp.blogspot.com/__76bx9l5zrg/SxMSD96fshI/AAAAAAAAADE/wYvgrQA6U5U/s1600/architecture.bmp"&gt;&lt;img style="width:320px;height:202px" src="http://4.bp.blogspot.com/__76bx9l5zrg/SxMSD96fshI/AAAAAAAAADE/wYvgrQA6U5U/s320/architecture.bmp" alt="" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;       &lt;br /&gt;L’&lt;span&gt;OpenERP&lt;/span&gt; est couplé à une base de données &lt;span&gt;PostgreSQL&lt;/span&gt;. De plus, il est compatible au  pack Open Office, et aussi  avec des outils de &lt;span&gt;reporting&lt;/span&gt; (Open Report) pour produire des rapports en &lt;span&gt;PDF&lt;/span&gt; ou en HTML.&lt;br /&gt;Le serveur et le client communiquent entre eux en utilisant  le protocole &lt;span&gt;XML&lt;/span&gt;­RPC.&lt;br /&gt;La logique du &lt;span&gt;OpenERP&lt;/span&gt; (&lt;span&gt;TinyERP&lt;/span&gt;) est entièrement du côté serveur. Le client  est  simple; sa tâche  est de demander les données (formulaire ou listes) au serveur et de les renvoyer. Avec cette approche, presque tout le développement est fait du côté serveur. Ce qui rend &lt;span&gt;OpenERP&lt;/span&gt; plus simple au  développement et à la maintenance.&lt;br /&gt;L'opération client est très simple; Quand un utilisateur exécute une action (sauvegarder une forme, ouvrir un menu, imprimer, ...) il envoie cette action au serveur. Le serveur envoi alors la nouvelle action pour s'exécuter au client.&lt;br /&gt;Il y a trois types d'actions :&lt;br /&gt;• Ouvrir une fenêtre (formulaire, listes)&lt;br /&gt;• Imprimer un document&lt;br /&gt;• Exécuter un &lt;span&gt;wizard&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;*&lt;span&gt;MVC&lt;/span&gt; modèle dans la théorie classique de la &lt;span&gt;POO&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt; Un (&lt;span&gt;MVC&lt;/span&gt;)  est une architecture de modèles utilisée en génie logiciel. Dans des applications complexes qui  présentent des  lots de données aux utilisateurs, on souhaite souvent séparer les données (modèle) et l'interface utilisateur (vue), de sorte que les changements à l'interface utilisateur n'affectent pas le traitement des  données, et que les  données  peuvent être réorganisées sans changer l'interface utilisateur.&lt;br /&gt;&lt;br /&gt; Le &lt;span&gt;MVC&lt;/span&gt; résout ce genre de  problème en découplant l'accès  des données  et la logique des  applications  de la  présentation des  données  et de l'interaction utilisateur,  en introduisant un composant intermédiaire : « le contrôleur ».&lt;br /&gt;&lt;br /&gt;Dans &lt;span&gt;OpenERP&lt;/span&gt;, on peut appliquer cette sémantique de &lt;span&gt;model&lt;/span&gt;­&lt;span&gt;view&lt;/span&gt;­&lt;span&gt;controller&lt;/span&gt; avec :&lt;br /&gt;• &lt;span&gt;Modele&lt;/span&gt; : les modèles sont les objets déclarés dans &lt;span&gt;OpenERP&lt;/span&gt;. Ils sont  également des  tables  &lt;span&gt;PostgreSQL&lt;/span&gt;.&lt;br /&gt;• &lt;span&gt;view&lt;/span&gt; : les vues sont définies en fichiers &lt;span&gt;XML&lt;/span&gt; dans &lt;span&gt;OpenERP&lt;/span&gt;.&lt;br /&gt;• contrôleur : le contrôleur est Python qui contrôle &lt;span&gt;OpenERP&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;* L’architecture modulaire:&lt;br /&gt;&lt;br /&gt;    Comme il est déjà cité que le principe fondateur du &lt;span&gt;OpenERP&lt;/span&gt; est de construire des applications informatiques de manière modulaire (&lt;span&gt;modules indépendants&lt;/span&gt; entre eux) tout en partageant une base de données unique et commune. Cela crée une différence importante avec la situation préexistante (les applications sur mesure existant avant les &lt;span&gt;ERP&lt;/span&gt;) car les données sont désormais supposées standardisées et partagées, ce qui élimine les saisies multiples et évite l'ambiguïté&lt;br /&gt;des données multiples de même nature donc  &lt;span&gt;OpenERP&lt;/span&gt; est un ensemble dont toutes les parties fonctionnent les unes avec les autres d'où l'ergonomie et l'unicité des informations et donc la cohérence du système informatique.&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1342369218616810671-2186563395760955152?l=myopenerp.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4471279657154274165-8874647593366198053?l=myopenerp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://myopenerp.blogspot.com/feeds/8874647593366198053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://myopenerp.blogspot.com/2009/11/architecture-technique-et-modulaire.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/8874647593366198053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4471279657154274165/posts/default/8874647593366198053'/><link rel='alternate' type='text/html' href='http://myopenerp.blogspot.com/2009/11/architecture-technique-et-modulaire.html' title='Architecture technique et modulaire'/><author><name>RPJ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__76bx9l5zrg/SxMSD96fshI/AAAAAAAAADE/wYvgrQA6U5U/s72-c/architecture.bmp' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
