Étape 2 sur 3 · environ 35 min

Laissez Odoo attribuer chaque nouvelle note

Vous avez vu l’utilisateur associé à une requête. Ajoutez maintenant ce propriétaire dans la base. Dans cette première version, Odoo prendra l’utilisateur courant comme valeur par défaut.

1. Ajoutez seulement le propriétaire

Votre modèle du Jour 2 fonctionne déjà. Conservez ce que vous avez écrit et ajoutez seulement user_id après category_id. Si votre fichier n'a pas changé depuis le Jour 2, vous pouvez aussi le remplacer par cette version complète.

custom_addons/training_hello/models/training_note.py · version simple
from odoo import fields, models


class TrainingNote(models.Model):
    _name = "training.note"
    _description = "note de notre formation"
    _order = "id asc"

    _rec_name = "title"

    title = fields.Char(string="Titre par défaut", required=True)
    body = fields.Text(string="Contenu par défaut")
    category_id = fields.Many2one("training.note.category", string="Catégorie", ondelete="set null")

    user_id = fields.Many2one(
        "res.users",
        string="Propriétaire",
        required=True,
        default=lambda self: self.env.user,
    )

2. Repérez ce qui change par rapport au Jour 2

  • user_id est le seul nouveau champ. C'est une relation Many2one vers res.users, le modèle des utilisateurs Odoo.
  • string="Propriétaire" est le libellé qui sera affiché plus tard dans les views.
  • required=True empêche une note sans propriétaire.
  • default=lambda self: self.env.user utilise l'utilisateur courant lorsque le code de création ne fournit pas de propriétaire.
  • Il n'y a ni import api, ni @api.model, ni méthode create() ou write() dans cette version.

lambda self: self.env.user est une petite fonction anonyme Python : Odoo l'appelle au moment de créer une note. Elle est proche d'une fonction fléchée JavaScript par sa forme courte, mais ce n'est pas la même syntaxe.

3. Comprenez l'identité portée par env.user

Chaque appel à l'ORM garde notamment la base utilisée et l'utilisateur authentifié. self.env.user est cet utilisateur Odoo ; self.env.user.id est son identifiant.

Origine de la créationComment Odoo établit l'identitéValeur utilisée par le modèle
Session dans l'interface Odoo, y compris une vue standard, QWeb ou OwlOdoo authentifie le compte associé à la session du navigateur.env.user est ce compte connecté.
API du Jour 4 avec auth="bearer"Odoo vérifie la clé de l'en-tête Authorization et retrouve l'utilisateur Odoo qui possède cette clé.request.env.user, puis self.env.user dans le modèle, désignent cet utilisateur.

Une clé d'API identifie un utilisateur pour cet appel. Elle n'ajoute aucun droit et ne contourne aucune règle sur les enregistrements. La route du Jour 4 utilise l'environnement normal de request.env["training.note"], sans élévation de privilèges.

4. Créez sans envoyer de propriétaire

Les formulaires, le composant Owl et le POST présentés dans ce parcours n'envoient pas user_id. Lorsqu'ils créent une note, Odoo utilise donc le défaut et place l'utilisateur de la session ou de la clé API dans le champ.

Le POST du Jour 4 accepte uniquement title et body. Une fois la clé authentifiée, l'appel crée une note sans user_id : la valeur par défaut est donc l'utilisateur de cette clé.

Corps JSON accepté par l'API du Jour 4
{
  "title": "Contrôle depuis l'API",
  "body": "Odoo connaît déjà l'utilisateur de la clé."
}

5. Redémarrez Odoo et mettez le module à niveau

  1. Action qui redémarre Odoo : redémarrez le processus local, puis attendez que les journaux indiquent que le serveur est prêt. Le redémarrage charge la modification Python.
  2. Action qui modifie la base d'exercice : dans Applications, ouvrez Hello Odoo et choisissez Mettre à niveau. Cette mise à niveau ajoute la colonne user_id et sa contrainte à la table training_note.

Résultat attendu : le redémarrage et la mise à niveau se terminent sans erreur. Actualiser seulement le navigateur ne suffit pas : vous avez changé du code Python et la structure de la base.

Ne vous servez pas des anciennes notes pour le test

Elles existaient avant le champ user_id. La mise à niveau leur donne une valeur pour satisfaire le champ obligatoire, mais cette valeur ne raconte pas qui les a créées. Dans la suite, créez de nouvelles notes avec Alex et Sam.

6. Préparez le test à deux utilisateurs

Créez maintenant une nouvelle note dans Odoo, avec le titre Contrôle du propriétaire. À ce stade, la fiche ne montre pas encore le propriétaire : vous l'ajouterez aux vues dans la section 3.

Ne cherchez pas cette valeur dans PostgreSQL. Le test utile arrive dans la section suivante : Alex et Sam créeront chacun une note, puis vous constaterez que chaque note appartient au compte qui l'a créée. C'est cette comparaison qui vérifiera le comportement du modèle dans une vraie session Odoo.

Point de contrôle — préparez le modèle et la note

Dans training_note.py, retrouvez le seul ajout user_id, avec required=True et le défaut fondé sur self.env.user. Il ne doit pas y avoir de create() ou de write() ajoutés pour cet exercice. Enfin, enregistrez la note Contrôle du propriétaire : les deux utilisateurs de la section suivante fourniront la vérification visible.