Rajout des tests sur fields
[OpenERP/testing.git] / testing_fields.py
1 #-*- coding: utf8 -*-
2 from openerp.osv import osv, fields
3
4
5 class FieldTesting(osv.Model):
6     """Classe permettant de tester les principaux types de données"""
7
8     # Nom de la table dans la base de données
9     _name= "testing.fieldtesting"
10
11     # Description de la table
12     _description = "FieldTesting"
13
14     # Utile pour le champs sélection à venir
15     SELECTION = [
16         ('key1', 'value1'),
17         ('key2', 'value2'),
18         ('key3', 'value3'),
19     ]
20
21     # Utile pour le champs fonction à venir
22     def _func_test_proc(self, cr, uid, ids, field, arg, context=None):
23         """
24         Champs fonction :
25             à haut niveau, il semble être un champs de la base comme un autre
26             à bas niveau, il est en réalité calculé
27
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, ...)
35
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.
37         """
38         # On crée un dictionnaire, qui va contenir chaque id en tant que clé et chaque valeur calculée en tant que valeur
39         result={}
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
44         return result
45
46     # Utile pour le champs fonction à venir
47     def _func_test_fonc(self, cr, uid, ids, field, arg, context=None):
48         """
49         Ce qui suit est exactement identique à la fonction précédente,
50         mais écrit en utilsant le paradigme fonctionnel
51         """
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.
54
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))
59
60     _columns = {
61         # Par défaut, on a toujours un id, pas besoin de le préciser.
62
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"),
71
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"),
75
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"),
79     }
80
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
83     _rec_name = "char"
84
85     _defaults = {
86         "date": fields.date.today(),
87         "datetime": fields.datetime.now(),
88     }
89