-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtesting_fields.py
More file actions
89 lines (72 loc) · 4.54 KB
/
testing_fields.py
File metadata and controls
89 lines (72 loc) · 4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#-*- coding: utf8 -*-
from openerp.osv import osv, fields
class FieldTesting(osv.Model):
"""Classe permettant de tester les principaux types de données"""
# Nom de la table dans la base de données
_name= "testing.fieldtesting"
# Description de la table
_description = "FieldTesting"
# Utile pour le champs sélection à venir
SELECTION = [
('key1', 'value1'),
('key2', 'value2'),
('key3', 'value3'),
]
# Utile pour le champs fonction à venir
def _func_test_proc(self, cr, uid, ids, field, arg, context=None):
"""
Champs fonction :
à haut niveau, il semble être un champs de la base comme un autre
à bas niveau, il est en réalité calculé
Il faut comprendre la signature de la méthode, la clé de l'ORM de OpenERP :
cr = curseur vers la bdd PGSQL, passé à toutes les méthodes en première position
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
ids = liste des id pour lesquels le champs fonction est calculé (plusieurs dans une vue liste, un seul dans une vue formulaire)
field = nom du champs associé
arg = éventuel argument donné dans la déclaration du champs fonction
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, ...)
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.
"""
# On crée un dictionnaire, qui va contenir chaque id en tant que clé et chaque valeur calculée en tant que valeur
result={}
# Si j'ai une liste de X ids, le browse va me ramener X enregistrement.
for test_obj in self.browse(cr, uid, ids, context=context):
# Pour chaque enregistrement, on réalise l'association entre l'identifiant et la valeur du champs
result[test_obj.id] = test_obj.float + test_obj.integer
return result
# Utile pour le champs fonction à venir
def _func_test_fonc(self, cr, uid, ids, field, arg, context=None):
"""
Ce qui suit est exactement identique à la fonction précédente,
mais écrit en utilsant le paradigme fonctionnel
"""
# On utilise normalement des noms de variables plus courts dans une écriture fonctionnelle,
# mais pour illustrer le fait qu'il s'agit du même algo, on a laissé des noms identiques.
# les accolades délimitent ici un dictionnaire, et les deux points la séparation entre clé et valeur.
# Ce qui suit après le for décrit l'itération.
#return {test_obj.id: test_obj.float + test_obj.integer for test_obj in self.browse(cr, uid, ids, context=context)}
return dict((test_obj.id, test_obj.float + test_obj.integer) for test_obj in self.browse(cr, uid, ids, context=context))
_columns = {
# Par défaut, on a toujours un id, pas besoin de le préciser.
# Voici quelques champs classiques
"char": fields.char(string="Champs principal", size=8, required=True, select=True),
"bool": fields.boolean(string='Champs booléen', required=True),
"date": fields.date(string='Champs date'),
"datetime": fields.datetime(string='Champs date', select=True),
"float": fields.float(string="Champs flottant", digits=(6,2), required=True),
"integer": fields.integer(string="Champs entier", required=True),
"selection": fields.selection(selection=SELECTION, string="Champs sélection"),
# Voici des clés étrangères
"parent": fields.many2one(obj="testing.fieldtesting", string="Parent"),
"freres": fields.many2many(obj="testing.fieldtesting", rel="testing_fieldtesting_association", id1="gauche", id2="droite", string="Frères"),
# Voici un champs fonction
"function_proc": fields.function(_func_test_proc, type="float", string="Champs fonction"),
"function_fonc": fields.function(_func_test_fonc, type="float", store=True, string="Champs fonction"),
}
# par défaut, il faut toujours un champs "name", il s'agit du champs principal
# Comme ce n'est pas le cas ici, on doit dire quel est le champs qui est le champs principal
_rec_name = "char"
_defaults = {
"date": fields.date.today(),
"datetime": fields.datetime.now(),
}