
FAQ Odoo / OpenERPConsultez toutes les FAQ
Nombre d'auteurs : 2, nombre de questions : 39, dernière mise à jour : 25 décembre 2014
Sommaire→Développement de modules- Comment ajouter des chemins vers des modules?
- J'ai installé un module, mais il n'apparaît pas dans la liste des modules
- Comment appeler une fonction Python depuis JavaScript avec get_func()?
- Comment appeler une fonction Python depuis JavaScript avec call()?
- Comment récupérer des données de la base de données depuis JavaScript?
- Comment faire apparaitre un message de confirmation lors d'un click sur un bouton ?
- Comment permettre à l'utilisateur d'éditer ou supprimer seulement les enregistrements qu'il a créé?
- Comment empêcher qu'un champ many2one s'affiche comme un lien hypertexte dans une vue et l'afficher en texte seulement?
Pour ajouter des chemins vers un répertoire supplémentaire, éditez le fichier de configuration du serveur d'OpenERP : openerp-server.conf et ajoutez les chemins complets en les séparant par des virgules :
addons_path = /opt/openerp/addons,/openerp/addons,/autre/chemin/openerp/addons
Pour retrouver facilement vos modules, créez un dossier "openerp" dans le répertoire de votre choix, puis créez un dossier "addons".
Changez ensuite le groupe des dossiers openerp + addons pour "openerp".
Changez également le propriétaire des dossiers pour "openerp".
Redémarrez ensuite le serveur OpenERP.
Encore un problème que l'on rencontre souvent sur le Web.
Vous venez de terminer votre Super-Module, vous l'avez placé sur le serveur en suivant bien les instructions, mais il refuse de se montrer !
- Tout d'abord, assurez-vous d'avoir bien ajouté le chemin vers votre répertoire qui contient vos modules additionnels dans le fichier de configuration du serveur.
- Vous devez ensuite redémarrer le serveur OpenERP.
- Connectez-vous à OpenERP en tant qu'administrateur de la base de données que vous gérez.
- Cliquez sur le menu "Configuration" dans la barre de menu du haut.
- Cliquez sur "Mettre à jour la liste des modules" dans la rubrique "Modules".
- Cliquez ensuite sur "Modules installés".
- Dans la barre de recherche en haut à droite, supprimez le filtre «Installé».
- Puis entrez le nom ou une partie du nom de votre module, il devrait finalement apparaître.
Si vous cliquez sur "Applications" dans la rubrique des modules, vous ne le verrez pas, même si vous supprimez les filtres dans la barre de recherche. Il semblerait qu'OpenERP ne reconnaisse pas votre module comme une application.
Pour appeler une fonction Python depuis JavaScript, vous pouvez utiliser la fonction get_func().
new instance.web.Model('model')).get_func('py_function')([parameters])Où :
- model : le nom de la table dans la base de données;
- py_function : le nom de la fonction Python à appeler;
- parameters : les paramètres à passer à la fonction;
Vous devez écrire le nom de la table en remplaçant le signe underscore _ par le point . :
Exemple : remplacer pos_order par pos.order, product_product par product.product, etc.
Voici un exemple extrait du module Point Of Sale (Point De Vente) lors de la validation de la commande :
(new instance.web.Model('pos.order')).get_func('create_from_ui')([order])
.fail(function(unused, event){
//don't show error popup if it fails
event.preventDefault();
console.error('Failed to send order:',order);
self._flush(index+1);
})
.done(function(){
//remove from db if success
self.db.remove_order(order.id);
self._flush(index);
});
Ici, on envoit les commandes à la fonction create_from_ui() qui se trouve dans le fichier point_of_sale.py du module.
En cas de succès, on supprime les commandes de la base de données du Point De Vente (puisqu'elles ont été envoyées à OpenERP), et en cas d'échec un message sera affiché dans la console JavaScript.
Pour appeler une fonction Python depuis JavaScript, vous pouvez utiliser la fonction call().
new instance.web.Model('model')).call('py_function', [parameters], ctx)Où :
- model : le nom de la table dans la base de données;
- py_function : le nom de la fonction Python à appeler;
- parameters : les paramètres à passer à la fonction;
- ctx : dictionnaire de contexte : {'lang': 'fr_FR'};
Vous devez écrire le nom de la table en remplaçant le signe underscore _ par le point . :
Exemple : remplacer pos_order par pos.order, product_product par product.product, etc.
Voici un exemple qui permet d'appeler la fonction write_partner_from_pos() depuis JavaScript:
(new instance.web.Model('res.partner')).call('write_partner_from_pos', [cid, cname, cfirstname, czip, cphone], { shadow:true })
.fail(function(clientId){
alert('Error : customer has not been created nor updated');
})
.done(function(clientId){
// retourne le résultat de la fonction
});
Ici, on envoit les données du client à la fonction write_partner_from_pos().
En cas d'échec un message sera affiché.
Voici une fonction qui vous permettra de récupérer des données de la base de données d'OpenERP depuis JavaScript :
fetch: function(model, fields, domain, ctx){
return new instance.web.Model(model).query(fields).filter(domain).context(ctx).all();
},Où :
- model : le nom de la table dans la base de données;
- fields : le nom des champs dans un tableau : ['champ1', 'champ2'];
- domain : le domaine de la recherche : ['company_id', '=', id];
- ctx : dictionnaire de contexte : {'lang': 'fr_FR'};
- all() : retourne tous les enregistrements;
- first() : retourne le premier enregistrement (à mettre à la place de all());
Astuce :
On aurait pu rajouter également le paramètre limit à la fonction : function(model, fields, domain, ctx, limit)
Avec le paramètre .limit(10) et .all(), la fonction retournerait alors les 10 premiers enregistrements.
Voici un exemple qui permet de récupérer les caissiers du Point De Vente (Voir le module Pos_CashierVoir le module Pos_Cashier) :
var loaded = self.fetch('pos.cashier',['cashier_name'],[['pos_config_id','=', config_id], ['active', '=','true']])
.then(function(cashiers){
// ici le reste du code sera exécuté lorsque les données auront été récupérées
});La fonction retourne un tableau d'objets (ici cashiers). Il vous sera ensuite facile de parcourir le tableau pour récupérer les données.
Astuce :
Rajoutez console.log(cashiers) à l'intérieur de la fonction pour voir les objets dans la console JavaScript (avec FirebugFirebug, par exemple).
Pour faire apparaîte un message de confirmation lors d'un click sur un bouton dans une vue, il faut simplement rajouter l'attribut "confirm" dans le code XML du bouton :
<button name="apply_my_function" type="object" confirm="Are you sure you want to apply this function ?" />Prenons le cas où vous créez votre module et vous voulez que l'utilisateur puisse éditer ou supprimer ses propres enregistrements et qu'il puisse voir les enregistrements des autres utilisateurs en lecture seule
Pour cela, il vous faut créer des règles d'accès dans un fichier XML que vous n'oublierez pas de mentionner dans le fichier __openerp__.py du module. Ce fichier doit comporter deux règles. Une règle globale (pour tous) qui permet de lire les enregistrements, puis une règle qui s'appliquera à l'utilisateur et qui lui permettra d'éditer ou de supprimer ses propres enregistrements:
#Règle de lecture pour tous (globale)
<record id="rule_pos_support_read" model="ir.rule">
<field name="name">Point Of Sale Support read</field>
<field name="model_id" ref="model_pos_support" />
<field eval="1" name="global"/>
<field eval="0" name="perm_unlink"/>
<field eval="0" name="perm_write"/>
<field eval="1" name="perm_read"/>
<field eval="0" name="perm_create"/>
</record>
#règle ecriture pour ses propres objets
<record id="rule_pos_support" model="ir.rule">
<field name="name">Point Of Sale Support</field>
<field name="model_id" ref="model_pos_support" />
<field name="domain_force">[('create_uid', '=', user.id)]</field>
<field eval="0" name="global"/>
<field eval="[(6,0,[ref('point_of_sale.group_pos_manager')])]" name="groups"/>
<field eval="1" name="perm_unlink"/>
<field eval="1" name="perm_write"/>
<field eval="0" name="perm_read"/>
<field eval="1" name="perm_create"/>
</record>
Dans le code ci-dessus, il s'agit de règles d'accès pour un module personnel, pos_support.
Il s'agit ici de mettre un champ pour chaque permission:
- perm_unlink : suppression
- perm_write : édition
- perm_read : lecture
- perm_create : création
Et de les mettre à True (eval="1") ou False (eval="0") selon le cas.
La règle rule_pos_support_read s'appliquera à tous les utilisateurs, elle autorise seulement la lecture.
La règle rule_pos_support autorise la création, l'édition et la suppression seulement pour l'utilisateur qui la créé l'enregistrement, et à condition qu'il soit membre du groupe "Manager" du Point De Vente. Pour cela on a rajouté un champ domain_force pour autoriser seulement l'utilisateur qui a créé l'enregistrement.
Pour qu'un champ many2one n'affiche pas de lien hypertexte dans une vue, il faut rajouter l'option no_open :
<field name="company_id" options="{'no_open': True}" />


