Étape 5 sur 7

Utiliser views.xml pour afficher une liste

Vous avez déjà créé deux données de départ. Utilisez maintenant le premier bloc du boilerplate, c'est-à-dire le squelette de code généré, pour les afficher dans une liste Odoo très simple — sans nouveau modèle Python, sans contrôleur et sans JavaScript.

1. Pourquoi êtes-vous ici ?

À l'étape 4, vous avez vu les tags, c'est-à-dire des étiquettes, Formation · Étudiant et Formation · Formateur dans Contacts → Configuration → Contact Tags, puis leurs external IDs, c'est-à-dire leurs identifiants externes. Cela confirme que le fichier data/partner_category_data.xml les a bien créés dans la base.

Vous allez maintenant créer une view, c'est-à-dire une définition d'écran, pour choisir comment ces données existantes apparaissent dans l'interface interne d'Odoo. Une view ne crée ni ne modifie les tags. Elle ne décide pas non plus qui peut les voir : elle décrit seulement l'écran. Les droits d'accès et les record rules, c'est-à-dire les règles qui filtrent les enregistrements, restent des sujets distincts.

Trois situations réelles où une view est utile

  • Équipe commerciale : le développeur prépare une list view, ou vue liste, avec le nom, le téléphone, le commercial responsable et l'étape. Le commercial obtient une file de travail lisible, plutôt qu'une liste technique de tous les fields, c'est-à-dire de tous les champs.
  • Validation d'absences : le développeur affiche la personne, les dates et le status, ou statut, de chaque demande, avec des filtres adaptés. Le responsable voit immédiatement ce qui attend sa décision.
  • Préparation des livraisons : le développeur met la référence, le client, la date prévue et le status de la livraison en évidence. Le magasinier sait quelles opérations traiter en priorité.

Ce sera une list « statique » au sens pédagogique : vous partez de quelques lignes connues, chargées par le fichier XML de l'exercice. Ce n'est pas une page HTML statique : Odoo lit toujours les records, ou enregistrements, dans la base et les affiche dans son client web. Si quelqu'un modifie un tag, la list affichera sa nouvelle valeur.

2. Adaptez le premier bloc à votre cas

Le fichier généré views/views.xml propose un exemple de vue liste, mais son modèle training_hello.training_hello n'existe pas encore. Ne décommentez pas ce bloc. Créez plutôt un fichier adapté à un modèle qui existe déjà :

custom_addons/training_hello/views/partner_category_list.xml
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <record id="partner_category_training_list_view"
            model="ir.ui.view">
        <field name="name">training_hello.partner.category.list</field>
        <field name="model">res.partner.category</field>
        <field name="arch" type="xml">
            <list>
                <field name="name"/>
                <field name="color" optional="hide"/>
            </list>
        </field>
    </record>
</odoo>
  • model="ir.ui.view" crée une définition d'écran dans Odoo.
  • res.partner.category est le model, ou modèle de données, des tags Contacts déjà utilisé à l'étape 2.
  • <list> demande une ligne par tag ; chaque <field> choisit une colonne.
  • optional="hide" rend la couleur disponible sans encombrer le premier affichage : l'utilisateur peut l'afficher depuis les options de colonnes.
Attention à la fermeture </odoo>.

Elle ferme le fichier XML entier, pas seulement le premier record. Pour les étapes suivantes, placez les nouveaux record et le menuitem avant cette ligne de fermeture. Un élément ajouté après </odoo> provoque l'erreur XML « Extra content at the end of the document ». Ce message signifie qu'il reste du contenu après la fin du document.

3. Ajoutez l'action qui ouvre la view

Le premier record que vous avez écrit était une view : il décrit l'apparence de la list. Le record suivant vient du paragraphe commenté <!-- actions opening views on models --> du views.xml généré. Il répond à la question « que doit ouvrir Odoo quand l'utilisateur choisit cet écran ? » : c'est une ir.actions.act_window. Remplacez la ligne finale </odoo> de votre fichier par ce bloc :

custom_addons/training_hello/views/partner_category_list.xml · fin du fichier à cette étape
<record id="action_training_partner_categories"
        model="ir.actions.act_window">
    <field name="name">Training tags</field>
    <field name="res_model">res.partner.category</field>
    <field name="view_mode">list,form</field>
    <field name="view_id" ref="partner_category_training_list_view"/>
</record>
</odoo>

Décomposez l'action

  • <record id="action_training_partner_categories" model="ir.actions.act_window"> crée une action de fenêtre, ou window action. Son id est son external ID, c'est-à-dire son identifiant externe, dans ce module.
  • name est le libellé humain de l'action ; res_model indique quel model elle doit ouvrir.
  • view_mode autorise d'abord la list, puis le form lorsqu'un utilisateur ouvre une ligne.
  • view_id ref="partner_category_training_list_view" relie l'action à la list view créée juste avant. Sans ce lien, Odoo choisirait une view par défaut pour ce model.

La view dit donc comment présenter les tags ; l'action dit quoi ouvrir et avec quelle view. L'action reste volontairement générale : elle ouvre les tags autorisés par les droits de l'utilisateur. Dans une base de formation neuve, vous verrez les deux tags créés dans l'exercice. Dans une base déjà utilisée, d'autres tags Contacts peuvent aussi apparaître. C'est normal.

4. Ajoutez le menu qui lance l'action

Vous avez maintenant une view et une action, mais aucun endroit où l'utilisateur peut cliquer. Remplacez à nouveau la dernière ligne </odoo> par le bloc suivant. Il ajoute le menuitem et referme correctement le fichier :

custom_addons/training_hello/views/partner_category_list.xml · fin du fichier
<menuitem id="menu_training_partner_categories"
          name="Training tags"
          parent="training_hello_menu_root"
          action="action_training_partner_categories"
          sequence="20"/>
</odoo>

parent="training_hello_menu_root" place cette entrée sous l'application Hello Odoo. L'attribut action référence le record que vous venez d'écrire : le menu n'affiche rien par lui-même, il lance cette action.

Où apparaît ce menu ?

Ouvrez d'abord l'application Hello Odoo. L'entrée Training tags apparaît alors dans la barre violette en haut, à droite de Hello Odoo. Le sélecteur d'applications à neuf points ne liste que les applications racines : votre menuitem est un sous-menu, pas une nouvelle application.

custom_addons/training_hello/views/partner_category_list.xml · ordre final simplifié
<odoo>
    <record id="partner_category_training_list_view" ...>
        ...
    </record>

    <record id="action_training_partner_categories" ...>
        ...
    </record>

    <menuitem id="menu_training_partner_categories" ... />
</odoo>

5. Chargez la view, puis observez le résultat

Dans custom_addons/training_hello/__manifest__.py, ajoutez le nouveau fichier après les données qu'il référence :

custom_addons/training_hello/__manifest__.py · extrait de data
"data": [
    "views/hello_world_menus.xml",
    "data/partner_category_data.xml",
    "views/partner_category_list.xml",
],
  1. Enregistrez les fichiers et mettez le module Hello Odoo à niveau.
  2. Ouvrez l'application Hello Odoo.
  3. Choisissez Training tags. Repérez les deux lignes créées à l'étape 2 ; une base déjà utilisée peut aussi contenir d'autres tags.

Lors de la mise à niveau, Odoo transforme le fichier de données, la view, l'action et le menu en records dans la base de données. Quand vous cliquez sur le menu, l'action ouvre la view. Odoo lit alors les tags autorisés et construit la list. C'est ainsi que le contenu du premier bloc de views.xml est réellement utilisé.

Ce que vous venez de construire

Données de départ → list viewactionmenu. Au jour 2, vous remplacerez le model Contacts par votre propre model et vous enrichirez cet exemple. Mais le trajet restera le même.