FAQ Odoo / OpenERPConsultez toutes les FAQ
Nombre d'auteurs : 2, nombre de questions : 39, dernière mise à jour : 25 décembre 2014
- 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}
"
/
>