* Les champs complexes :
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).
def essai(self, cr, uid, ids,field_name=None,arg=None,context={}):
res = {}
for m in ...
res[m.id] = ...
return res
'a': fields.function(essai, method=True, string='A',type='char').
On a définie la fonction essai ayant comme paramètres :
- self : l'objet courant .
- cr : le curesseur courant (base de données ouverte) .
- uid : l'identifiant du user connecté .
- ids : les identifiants de l'objet courant .
Le champs a est du type function .
La fonction est essai .
2- Les selections : selection (options_possibles, ...)
* Exemple:
'state': fields.selection (('e','encours'),('c','confirme'), 'Etat', required = True).
* Les champs relation :
1- many2one (obj, ...) :
* Exemple :
'service': fields.many2one('ir.module.category', 'Service Demandeur') .
2- one2many (obj, field_id, ...) :
* Exemple :
'addresse': fields.one2many('res.partner.address', 'partner_id', 'Contacts') .
L'attribut "_defaults" permet de définir des valeurs par défaut pour un ou plusieurs champs simples d'un objet .
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 fonctions de valeurs par défaut et pas des simples valeurs constantes .
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, ...} .
* Syntax:
_defaults = {
'nom_champs': function,
...
}
* Exemple
_defaults = {
'etat': lambda *a: 'engage'
}
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 .
g = lambda x: x*2
g(7)
14
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
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 :) .
* Méthodes prédéfinies des objets :
1- Create :
- Description : Créer une nouvelle ressource
- Signature : def create(self, cr, uid, vals, context={})
Retourne le id de la ressource créée
- Parametres :
● vals: Un dictionnaire de valeurs pour les champs. Ce dictionnaire doit avoir la forme suivante: {'nom_du_champs': valeur, ...}
● context (optionel): Le contexte actuel.
2- Search :
- Description : Cherche toutes les ressources satisfaisant certains critéres .
- Signature :
def search(self, cr, uid, args, offset=0, limit=2000)
args = [('field_name', 'operator', value), ...] .
Elle retourne une liste de ids .
3- Read :
- Description: Liste des valeurs de champs .
- Signature :
def read(self, cr, uid, ids, fields=None, context={})
- Parametres :
● ids: liste des identifients des ressources à lire .
● fields (optionel): la liste des champs spécifiques. Si nous n'introduisons pas ce parmétre, la fonction contrôle tous les champs.
● context (optionel): le contexte actuel.
Elle retourne une liste de dictionaires (un dictionaire par resource intérrogé) de la forme: [{'field_name': value}] .
4- Write :
- Description :
Elle écrit des valeurs sur un ou plusieurs champs d'une ou plusieurs ressources .
- Signature :
def write(self, cr, uid, ids, vals, context={})
vals = {'field_name': value, ...}
retourne True .
5- Unlink :
- Description :
Supprime une ou plusieurs ressources
- Signature :
def unlink(self, cr, uid, ids)
retourne True .
6- Browse :
- Description: Retourne une ou plusieurs ressources d'un objet.
def browse(self, cr, uid, ids, offset=0, limit=2000)
- Signature :
addr_obj = self.pool.get('res.partner.address').browse(cr, uid, contact_ids)
contact_name = addr_obj.name
contact_bank = addr_obj.partner_id.bank .
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 ;) .
Bonjour,
ReplyDeletej'éssai de créer une methode pour faire la somme de deux champs pour avoir un autre champs,
est-ceque quelqu'un pourrait m'aider?
j'essai avec les codes suivant:
def _compute_c(self, cr, uid, ids, field_name,arg, context={}):
result = {}
for id in ids:
myself = self.browse(cr, uid, id, context=context)
res = 0
if myself:
res = myself.a * myself.b
result[id] = res
return result
_columns = {
'a': fields.float('Champs A'),
'b': fields.float('Champs B'),
'c': fields.function( _compute_c, method=True, type='float', string='Champs C', store=False, readonly=True ),
}
et pour la vue un simple record pour l'objet!!
est-ce que quelqu'un peut m'aider avec des codes pour débuter et l'afichage(avec ou sans on_change)?
merci!
Narisoa Mijoro
INGENOSYA
mail: jandriampenomanana@ingenosya.mg