2 from openerp.osv import osv, fields
5 class FieldTesting(osv.Model):
6 """Classe permettant de tester les principaux types de données"""
8 # Nom de la table dans la base de données
9 _name= "testing.fieldtesting"
11 # Description de la table
12 _description = "FieldTesting"
14 # Utile pour le champs sélection à venir
21 # Utile pour le champs fonction à venir
22 def _func_test_proc(self, cr, uid, ids, field, arg, context=None):
25 à haut niveau, il semble être un champs de la base comme un autre
26 à bas niveau, il est en réalité calculé
28 Il faut comprendre la signature de la méthode, la clé de l'ORM de OpenERP :
29 cr = curseur vers la bdd PGSQL, passé à toutes les méthodes en première position
30 uid = uid de l'utilisateur courant (permet de savoir s'il a le droit d'être là, par rapport à des permissions (hors périmètre), passé à toutes les méthodes en seconde position
31 ids = liste des id pour lesquels le champs fonction est calculé (plusieurs dans une vue liste, un seul dans une vue formulaire)
32 field = nom du champs associé
33 arg = éventuel argument donné dans la déclaration du champs fonction
34 context = contexte, objet non obligatoire donné en paramètre dans les fonctions d'OpenERP, il n'est pas forcément utilisé, mais peut contenir le contexte utilisateur (langue, par exemple, ...)
36 On utilise ici un self.browse, ce qui va faire une requête sur tous les champs dans la base et va permettre de les parcourir.
38 # On crée un dictionnaire, qui va contenir chaque id en tant que clé et chaque valeur calculée en tant que valeur
40 # Si j'ai une liste de X ids, le browse va me ramener X enregistrement.
41 for test_obj in self.browse(cr, uid, ids, context=context):
42 # Pour chaque enregistrement, on réalise l'association entre l'identifiant et la valeur du champs
43 result[test_obj.id] = test_obj.float + test_obj.integer
46 # Utile pour le champs fonction à venir
47 def _func_test_fonc(self, cr, uid, ids, field, arg, context=None):
49 Ce qui suit est exactement identique à la fonction précédente,
50 mais écrit en utilsant le paradigme fonctionnel
52 # On utilise normalement des noms de variables plus courts dans une écriture fonctionnelle,
53 # mais pour illustrer le fait qu'il s'agit du même algo, on a laissé des noms identiques.
55 # les accolades délimitent ici un dictionnaire, et les deux points la séparation entre clé et valeur.
56 # Ce qui suit après le for décrit l'itération.
57 #return {test_obj.id: test_obj.float + test_obj.integer for test_obj in self.browse(cr, uid, ids, context=context)}
58 return dict((test_obj.id, test_obj.float + test_obj.integer) for test_obj in self.browse(cr, uid, ids, context=context))
61 # Par défaut, on a toujours un id, pas besoin de le préciser.
63 # Voici quelques champs classiques
64 "char": fields.char(string="Champs principal", size=8, required=True, select=True),
65 "bool": fields.boolean(string='Champs booléen', required=True),
66 "date": fields.date(string='Champs date'),
67 "datetime": fields.datetime(string='Champs date', select=True),
68 "float": fields.float(string="Champs flottant", digits=(6,2), required=True),
69 "integer": fields.integer(string="Champs entier", required=True),
70 "selection": fields.selection(selection=SELECTION, string="Champs sélection"),
72 # Voici des clés étrangères
73 "parent": fields.many2one(obj="testing.fieldtesting", string="Parent"),
74 "freres": fields.many2many(obj="testing.fieldtesting", rel="testing_fieldtesting_association", id1="gauche", id2="droite", string="Frères"),
76 # Voici un champs fonction
77 "function_proc": fields.function(_func_test_proc, type="float", string="Champs fonction"),
78 "function_fonc": fields.function(_func_test_fonc, type="float", store=True, string="Champs fonction"),
81 # par défaut, il faut toujours un champs "name", il s'agit du champs principal
82 # Comme ce n'est pas le cas ici, on doit dire quel est le champs qui est le champs principal
86 "date": fields.date.today(),
87 "datetime": fields.datetime.now(),