Définition des champs Non relationnels d’un modèle Odoo

Introduction

Champs non relationnels Odoo

Les modèles Odoo représentent, la structure d’un module. La définition d’un modèle comporte la définition de la structure des données qui seront stockées dans la base de données, avec les méthodes associées.
Dans cet article, nous allons présenter les différents types de données qui peuvent être enregistrées dans les champs non relationnels de chaque modèle, et comment les ajouter à un modèle

Méthode de déclaration des champs d’un modèle :

Avant la déclaration des modèles, on doit ajouter la ligne suivante qui permet   l’importation des modules et leurs champs :
from odoo import models, fields
Ensuite, Pour déclarer un champ quel que soit son type, dans sa classe ,  nous suivons la syntaxe générale suivante : 
champ = fields.Type('Désignation du champ', param1=True, param2=False,…))

 Où :
champ (en minuscule) : mettez ici, le nom technique du champs, il doit donc respecter la syntaxe python. 
fields (en minuscule) : c’est mot clé qui permet de déclarer le champ en question
.Type (Première lettre en majuscule) : ce champs représente le type du champs (caractère, entier, réel, booléen, un texte, un texte Html, date, une image,… ) 
Les mots clés correspondants sont (Char, Integer, Float, Boolean, Text, Html,Date, Binary,…)
'Désignation du champ' (Libre) : Mettez ici la désignation du champ qui sera affichée à l’utilisateur.
param1=True, param2=False,… : C’est les paramètres qui seront attachés à la déclaration du champ en question, comme par exemple le paramètre required= True, qui signifie que le champ est obligatoire et ne doit pas être vide, et le paramètre default="Marque" ,  qui a comme rôle de spécifier une valeur par défaut lorsqu’on va  créer l’objet en question.
C’est avec la pratique qu’on sera amené à utiliser les différents types de champs avec leurs attributs.  

Les champs ajoutés automatiquement : 

Lors de création d’un modèle, Odoo ajoute automatiquement le champ ID (L’identifiant automatique unique pour chaque objet)  et autres champs de log qui sont :
· create_date  qui désigne la date de création 
· create_uid qui désigne l’utilisateur qui a créé l’enregistrement
· write_date qui représente la dernière date de modification
· write_uid  qui préciser le dernier utilisateur qui a fait le changement 
Il faut éviter donc d’utiliser ces noms dans la désignation des champs.

Le type Sélection et le champ state : 

Pour définir les états d’un modèle donnée on doit utiliser le champ avec le nom ‘state’.
L’utilisation de ce champ est très pratique mais on ne peut pas changer le nom de ce champ, on doit garder le nom comme tel. 
Le type sélection est un ensemble de paires de valeurs qui peuvent être des chaines de caractères ou des entier) dont la première valeur du pair désigne le nom technique et la deuxième désigne la valeur affichée à l’utilisateur. 
La valeur sélectionnée sera celle enregistrée dans la base de données. 
Exemple :
 state = fields.Selection(
        [('new', 'Nouveau'),
         ('fonctional', 'Fonctionnel'),
         ('on_repair', 'En Réparation'),
         ('declassed', 'Déclassé')],
        'Etat', default="new")

Paramètre states :
Le paramètre states, nécessite l’existence du champ state dans le formulaire-même s’il est invisible- et permet de donner dynamiquement, une valeur (Vrai :True ou Faux :False)aux attributs required, readonly et invisible .
Comme exemple si on veut que lorsque l’état soit Annulée donc ‘canceld’  , on rend l’état (state) du champ qu’on vient de déclarer en mode lecture seulement,  ou invisible dans le cas où l’état est « declassed», on doit écrire le code suivant :
dern_kilometrage = fields.Float('Dernier Kilométrage',
                                    states={'on_repair': [('readonly', True)],
                                            'declassed': [('invisible', True)]
                                            },

Le type Spécial Active :

On ajoute à notre modèle un champ qu’on ne peut pas changer le nom et le type, qui est le champ active. Il doit être Booléen, et peur assurer son affichage, on met sa valeur à True, par défaut, lors de sa déclaration, de cette manière :
active = fields.Boolean('Active', default=True)

N.B : le champ active est le champ utilisé pour archiver/désarchiver un modèle. Par défaut seul les objets non archivés seront affichés 

Ajouter un champ réel (Float) avec précision configurable par l’utilisateur final :

Dans la déclaration des champs de type réel, il est possible de déclarer le nombre de chiffres après la virgule ou la précision, de la façon suivante :
champ_reel = fields.Float('Champ Réel avec Précision ',digits=(14, 4),
Dans cet exemple, le champ champ_reel nous avons précisé 14 chiffres dans la partie entière et 4 chiffres dans la partie décimal.
Dans des cas réels, Il est très pratique de laisser l’utilisateur final préciser le nombre de chiffres après la virgule, qui sera convenable pour sa propre activité.
Pour se faire, activer le mode développeur, puis allez sur congiuration|Technique|Précision Décimale, ensuite créez une nouvelle précision décimale puis donnez un nom sur l’Usage par exemple (Prix Véhicule) et précisez le nombre de chiffres après la virgule ( 3 par exemple) puis cliquer sur sauver.
Puis dans la déclaration du champ, mettez le code suivant :
prix_achat = fields.Float('Prix d’achat', digits='Prix Véhicule')

Ajouter un champ monétaire :

Le Champ de Type Monétaire est similaire à un champ réel avec la possibilité d’enregistrer le symbole monétaire.
p_v_vehicule = fields.Monetary('Prix de Vente',
# optional: currency_field='currency_id',)
On met le symbole que l’on souhaite dans le champ optionnel currecy_field, mais on peut utiliser le modèle de base d’Odoo res.currency pour définir notre symbole monétaire.
Pour se faire,
• Stockez le symbole monétaire dans le champ currency_id, de la manière suivante :
currency_id = fields.Many2one('res.currency', string='Symbole Monétaire')
• Mettez le symbole monétaire, dans la variable currency_field du champ monétaire ( p_v_vehicule) , de la façon suivante :
retail_price = fields.Monetary('Retail Price', currency_field='currency_id',)

Récapitulatif et application sur le modèle Véhicule de notre Example :

Précision décimale Odoo

Pour bien comprendre les concepts expliqués précédemment, nous revenons vers notre modèle agence.vehicule, pour l’ajouter les champs de types différents.
Pour se faire, revenez éditer le fichier et ajouter les champs suivants : (vous pouvez les mettre juste avant la fonction name_get – Consultez l’article les attriubts de base Odoo pour plus de détails )
Remarque importante :
Dans le code qu’on va utiliser, nous avons utilisé le variable prix_vente_v : pour expliquer l’utilisation de la configuration personnalisée de la précision décimale, donc n’oubliez pas d’aller sur le menu :

# Ajouter D'autre Champs pour compléter notre domaine
    notes = fields.Text('Notes Internes',
                        translate=True) # Pour permettre la traduction du champ
    state = fields.Selection(
        [('new', 'Nouveau'),
         ('fonctional', 'Fonctionnel'),
         ('on_repair', 'En Réparation'),
         ('declassed', 'Déclassé')],
        'Etat', default="new")
    description = fields.Html('Description')
    image_v = fields.Binary('Image de Véhicule')
    active = fields.Boolean('Active', default=True)
    veh_service=fields.Boolean('Véhicule de Service ?',default=False)
    nb_places = fields.Integer('Nombre de palces', default=5)
    dern_kilometrage = fields.Float('Dernier Kilométrage',
                                    digits=(14, 2), # spcifier la précision
                                    groups='base.group_user', # Le groupe (droits d'accès à ce champ)
                                    states={'on_repair': [('readonly', True)],
                                            'declassed': [('invisible', True)]
                                            },
                                    # mode lecture seul si l'état=En Réparation
                                    # invisible seul si l'état=Déclassé
                                    help='Mettez ici le Dernier relevé kilomètrique'
                                    # c'est le message d'aide de ce champ à l'utilisateur
                                    )
    prix_achat_v= fields.Float('Prix d’achat')
    currency_id = fields.Many2one('res.currency',
                                  string='Symbole Monétaire') # On sauvegarde le symblode dans ce varibale
    prix_vente_v = fields.Monetary('Pix de Vente',
                                   digits='Prix Véhicule', # Précision configurable par le end user
                                   currency_field='currency_id', # ce champ est optionnel mais recommandé )
                                   )
    #Fin de l'ajout des autres champs

Mise à jour du fichier xml

Pour visualiser l’effet de l’ajout de ces champs, on doit les ajouter dans le fichier des vues, dans en moins une vue.
Nous allons ajouter ces champs dans la vue Formulaire, qui est suffisante pour visualiser le résultat.
Pour se faire, allez dans le fichier agence_vehicule.xml, remplacez la vue Formulaire, par le code suivant (vous pouvez afficher les champs dans l’ordre que vous souhaitez) :

<record id="agence_vehicule_view_form" model="ir.ui.view">
        <field name="name">Agence Vehicule Form</field>
        <field name="model">agence.vehicule</field>
        <field name="arch" type="xml">
            <form>
            <sheet>
                <group>
                    <group>
                        <field name="marque"/>
                        <field name="modele"/>
                        <field name="matricule"/>
                        <field name="designation_vehicule"/>
                        <field name="chaffeur_ids" widget="many2many_tags"/>
                        <field name="prix_achat_v"/>
                        <field name="currency_id"/>
                        <field name="prix_vente_v"/>
                            <field name="notes"/>
                        <field name="description"/>
                    </group>
                    <group>
                        <field name="active"/>
                        <field name="veh_service"/>
         <field name="nb_places"/>
                        <field name="state"/>
                        <field name="dern_kilometrage"/>
                        <field name="image_v" widget="image" class="oe_avatar"/>
                        <field name="date_achat"/>
                    </group>
                </group>
            </sheet>
            </form>
        </field>
    </record>

Redémarrage du service Odoo et Mise à jour du module ‘agence_lv’

Pour visualiser les changements effectués, nous devons redémarrer le service Odoo et mettre à jour notre module.
Après redémarrage du service Odoo et mise à jour du module, la vue formulaire sera affichée comme dans l’image suivante.

Champs non relationnels Odoo

Conclusion

Dans cet article, nous avons vu comment ajouter les champs non relationnels à un modèle.
Nous avons vu également, comment configurer les autres attributs liés à ces champs, et les champs spéciale, comme le champ state et active.
Pour visualiser le résultat, nous avons mis à jour la vue formulaire afin de pouvoir tester les différents concepts cités.
Dans le prochain article, nous abordons le concept relation entre les modèles, en introduisant les champs relationnels.

Télécharger gratuitement votre  guide odoo ! 

Télécharger Gratuitement votre guide Odoo

Découvrez comment , Odoo  est une vraie opportunité pour les entreprises et les développeurs !


Télécharger !