Créer un module

Avant de créer votre premier module, il est nécessaire de créer un projet Odoo.sh et de connaître l’URL du dépôt GitHub.

Glossaire

  • ~/src est le répertoire où se trouvent les dépôts Git liés à vos projets Odoo.

  • odoo est l’utilisateur GitHub.

  • odoo-addons est le dépôt GitHub.

  • feature-1 est le nom d’une branche de développement.

  • main est le nom de la branche de production.

  • my_module est le nom du module.

Remplacer ces valeurs si nécessaire.

Créer la branche de développement

Depuis la vue Branches :

  • Dans le panneau de navigation des branches, cliquer sur le bouton + (Nouvelle branche de développement) à côté de Développement.

  • Sous Fork, sélectionner la branche main.

  • Sous To, saisir feature-1.

Créer une branche de développement par bifurcation de la branche de production sur Odoo.sh

Une fois la compilation prête, accéder à l”éditeur et au code de la branche de développement depuis le dossier ~/src/user.

Créer la structure du module

Échafaudage

Bien que cela ne soit pas requis, l’échafaudage évite la corvée de définir la structure de base d’un module Odoo. Échafauder un nouveau module à l’aide de l’exécutable odoo-bin.

Depuis le terminal de l”éditeur, exécuter :

odoo-bin scaffold my_module ~/src/user/

Astuce

Si vous ne souhaitez pas installer Odoo sur votre ordinateur, vous pouvez également télécharger ce modèle de structure de module. Remplacer chaque occurrence de my_module par le nom de votre choix.

La structure ci-dessous sera générée :

my_module
├── __init__.py
├── __manifest__.py
├── controllers
│   ├── __init__.py
│   └── controllers.py
├── demo
│   └── demo.xml
├── models
│   ├── __init__.py
│   └── models.py
├── security
│   ├── ir.model.access.csv
│   └── models.py
└── views
    ├── templates.xml
    └── views.xml

Avertissement

Utiliser uniquement des caractères alphanumériques (a-z, 0-9) ou des traits de soulignement (_) lors de la dénomination de votre module, car son nom est utilisé pour les classes Python, et les noms de classe contenant des caractères spéciaux autres que des traits de soulignement ne sont pas valides en Python.

Décommenter les fichiers suivants :

  • models/models.py un exemple de modèle avec ses champs

  • views/views.xml une vue liste et une vue formulaire, avec les menus les ouvrant

  • demo/demo.xml des enregistrements de démonstration pour le modèle d’exemple

  • controllers/controllers.py un exemple de contrôleur implémentant quelques routes

  • views/templates.xml deux exemples de vues qweb utilisées par les routes du contrôleur

  • __manifest__.py le manifeste de votre module, incluant son titre, sa description et les fichiers de données à charger. Décommenter le fichier de données de la liste de contrôle d’accès :

    # 'security/ir.model.access.csv',
    

Manuellement

Pour créer votre structure de module manuellement, suivre le tutoriel Server framework 101 pour comprendre la structure d’un module et le contenu de chaque fichier.

Pousser sur la branche de développement

  1. Indexer les modifications à committer en exécutant :

    git add my_module
    
  2. Committer vos modifications en exécutant :

    git commit -m "My first module"
    
  3. Pousser vos modifications vers votre dépôt distant en exécutant :

    Depuis le terminal de l”éditeur, exécuter :

    git push https HEAD:feature-1
    

Tester le module

La branche devrait apparaître sous la section Développement du panneau de navigation de la vue Branches.

Exemple de branche de développement

Cliquer sur le nom de la branche pour afficher son historique, y compris les modifications que vous venez de pousser. Une fois la base de données prête, cliquer sur Connexion pour y accéder.

Le bouton de connexion pour accéder à une base de données

Si votre projet Odoo.sh est configuré pour installer automatiquement le module, il apparaîtra directement sur le tableau de bord de la base de données. Sinon, il sera disponible à l’installation sous l’application Apps.

Le nouveau module sur le tableau de bord de la base de données

Tester avec les données de production

Note

Une base de données de production est requise pour cette étape. Si vous n’en avez pas encore, en créer une.

Une fois que vous avez testé le module dans une version de développement avec les données de démonstration et que vous pensez qu’il est prêt, vous pouvez le tester avec les données de production en utilisant une branche de préproduction.

Vous pouvez :

  • Convertir votre branche de développement en branche de préproduction en la faisant glisser et en la déposant dans la section Préproduction.

  • La fusionner dans une branche de préproduction existante en la faisant glisser et en la déposant sur cette branche.

  • Utiliser la commande git merge pour fusionner vos branches.

Ceci crée une nouvelle version de préproduction qui duplique la base de données de production et l’exécute sur un serveur mis à jour avec les dernières modifications de votre branche.

Une fois la base de données prête, cliquer sur Connexion pour y accéder.

Installer le module

Installer le module depuis l’application Apps. Comme le module peut ne pas apparaître directement dans la liste des applications, mettre à jour la liste des applications en activant le mode développeur et en cliquant sur Mettre à jour la liste des apps ‣ Mettre à jour.

Note

Le module n’est pas installé automatiquement, car l’objectif de la version de préproduction est de tester le comportement de vos modifications comme elles le seraient sur la base de données de production, vous ne voudriez donc pas qu’un module soit installé automatiquement.

Déployer en production

Une fois que vous avez testé le module dans une branche de préproduction avec les données de production et que vous pensez qu’il est prêt pour la production, vous pouvez fusionner votre branche dans la branche de production en :

  • Faisant glisser et en déposant la branche de préproduction sur la branche de production.

  • Utilisant la commande git merge pour fusionner vos branches.

Ceci fusionne les dernières modifications de la branche de préproduction dans la branche de production et met à jour le serveur de production avec celles-ci.

Une fois la base de données prête, cliquer sur Connecter pour y accéder.

Installer le module

Installer le module depuis l’application Apps. Comme le module peut ne pas apparaître directement dans la liste des applications, mettre à jour la liste des applications en activant le mode développeur et en cliquant sur Mettre à jour la liste des apps ‣ Mettre à jour.

Ajouter un changement

Cette section explique comment ajouter une modification dans votre module en ajoutant un nouveau champ dans un modèle et en le déployant.

  1. Depuis l’éditeur ou depuis votre ordinateur, ouvrir le dossier du module ~/src/odoo-addons/my_module, puis ouvrir le fichier models/models.py pour l’éditer. Après le champ description :

    description = fields.Text()
    

    ajouter un champ datetime :

    start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now())
    
  2. Ouvrir le fichier views/views.xml et après :

    <field name="value2"/>
    

    ajouter :

    <field name="start_datetime"/>
    
  3. Ces modifications altèrent la structure de la base de données en ajoutant une colonne à une table et en modifiant une vue. Pour être appliquées à une base de données existante, telle que votre base de données de production, ces modifications nécessitent la mise à jour du module. Si vous souhaitez que la mise à jour soit effectuée automatiquement par la plateforme Odoo.sh lorsque vous poussez vos modifications, augmenter la version du module dans son manifeste en ouvrant __manifest__.py et en remplaçant :

    'version': '0.1',
    

    par :

    'version': '0.2',
    

    La plateforme détectera un changement de version et déclenchera la mise à jour du module lors du déploiement de la nouvelle révision.

  4. Ensuite, pousser les modifications.

  5. Une fois que vous avez testé vos modifications, vous pouvez les fusionner dans la branche de production, par exemple, en glissant-déposant la branche sur la branche de production dans l’interface Odoo.sh. Puisque vous avez augmenté la version du module dans le manifeste, la plateforme mettra automatiquement à jour le module, et votre nouveau champ sera disponible immédiatement. Sinon, vous pouvez manuellement mettre à jour le module dans la liste des applications.

Utiliser une bibliothèque Python externe

Si vous souhaitez utiliser une bibliothèque Python externe qui n’est pas installée par défaut, vous pouvez définir un fichier requirements.txt listant les bibliothèques externes dont vos modules dépendent. La plateforme utilisera ce fichier pour installer automatiquement les bibliothèques Python dont votre projet a besoin.

Note

  • Il n’est pas possible d’installer ou de mettre à niveau des paquets système sur les bases de données Odoo.sh (par exemple, les paquets apt). Cependant, sous certaines conditions, les paquets peuvent être considérés pour l’installation. Cela s’applique également aux modules Python qui nécessitent des paquets système pour la compilation et aux modules Odoo tiers.

  • Les extensions PostgreSQL ne sont pas prises en charge sur Odoo.sh, il n’est donc pas possible d’installer des extensions (telles que PostGIS, ltree, …) dans les bases de données Odoo.sh.

Par exemple, pour utiliser la bibliothèque Unidecode dans votre module :

  1. Créer un fichier requirements.txt dans le dossier racine de votre dépôt :

    • Depuis l’éditeur Odoo.sh, créer et ouvrir le fichier ~/src/user/requirements.txt.

    • Depuis votre ordinateur, créer et ouvrir le fichier ~/src/odoo-addons/requirements.txt.

  2. Ajouter au fichier :

    unidecode
    
  3. Vous pouvez maintenant utiliser la bibliothèque dans votre module, par exemple, pour supprimer les accents des caractères dans le champ nom de votre modèle. Pour ce faire, ouvrir le fichier models/models.py et avant :

    from odoo import models, fields, api
    

    ajouter :

    from unidecode import unidecode
    
  4. Après :

    start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now())
    

    ajouter :

    @api.model
    def create(self, values):
        if 'name' in values:
            values['name'] = unidecode(values['name'])
        return super(my_module, self).create(values)
    
    def write(self, values):
        if 'name' in values:
            values['name'] = unidecode(values['name'])
        return super(my_module, self).write(values)
    
  5. Augmenter la version du module pour installer la dépendance Python en modifiant le manifeste du module __manifest__.py.

  6. Ensuite, pousser les modifications.

    Astuce

    Ajouter le fichier requirements.txt à l’index en exécutant git add requirements.txt.