Rajout des tests sur fields
[OpenERP/testing.git] / testing_fields.py
diff --git a/testing_fields.py b/testing_fields.py
new file mode 100644 (file)
index 0000000..00bac93
--- /dev/null
@@ -0,0 +1,89 @@
+#-*- 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(),
+    }
+