Connexion module formation via API XML-RPC

8 février 2023 par
Connexion module formation via API XML-RPC
Aunéor Conseil SARL, Angelo LORBER

Afin de pouvoir facilement interconnecter un serveur Odoo à une application/un site externe, Odoo intègre nativement une API XMLRPC.

Via cette API, on peut facilement accéder aux différents modèles et champs d'Odoo, lires les données, les modifier, en créer ... Elle peut être utilisé dans de nombreux langages tels que le Python, Ruby, PHP et Java. Odoo dispose d'une page de documentation complète à ce sujet:


Cette API fonctionne avec le module formation. Module actuellement disponible sur Odoo Apps que nous avons développé pour faciliter la gestion des formation:

Odoo • Image et Texte

Gestion Formation

Gagnez du temps dans la gestion administrative et pédagogique de la formation. Facilitez-vous la vie en trouvant facilement vos formateurs et en générant automatiquement les documents légaux. Partagez l'information avec vos clients et stagiaires.

Dans cet article nous allons voir différentes requêtes que l'on peut faire via l'API XMLRPC pour interagir avec le module gestion de formation. Comment récupérer la liste des formations, en créer, lister les formateurs ou encore ajouter des participants ...

Attention, l'API XMLRPC d'Odoo est une API d'assez bas niveau. Elle permet d'appeler directement des méthodes publique du code python. Pour pouvoir manipuler correctement cette API des connaissances techniques sont requises. Il est aussi fortement conseillé d'avoir des bases de python et dans la conception de modules Odoo. Cela permettra de rechercher les méthodes que l'on peut appeler via l'API ainsi que les différents modèles et champs à manipuler.

Initialisation



import json
import xmlrpc.client

# Paramètres de connexion à l'instance Odoo
url = "https://demo.formation-16.auneor-tech.dev"
db = "demo"
username = 'admin'
password = 'XXXXXXXXXXXXXXXXXXX' # Mot de passe ou clef API à générer dans Odoo

# Connexion à l'instance Odoo via XML-RPC
common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url))
uid = common.authenticate(db, username, password, {})
models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url))

Lecture de données de formations

Bien que les formations soient gérées dans un module à part, elles héritent les fonctionnalités du module évènement. Les formations sont donc des objets de type "event.event" dont le "type_event" est fixé à "formation".

On peut les rechercher, et lire les informations saisies dessus ainsi:



# Recherche des évènements de type formation
training_ids = models.execute_kw(
    db, uid, password, 
    'event.event', 'search', 
    [[['type_event', '=', 'formation']]]
)

# Affichage de l'ID des formations trouvées
print(training_ids) # [9]
training_id = 9

# Récupération des informations de la formation
training_datas = models.execute_kw(
    db, uid, password, 
    'event.event', 'read', 
    [training_id], 
    {'fields': ['name', 'organizer_id', 'user_id']}
)

# Affichage des informations de la formation
print(json.dumps(training_datas, indent=4))
# [
#     {
#         "id": 9,
#         "name": "Test",
#         "organizer_id": [
#             1,
#             "YourCompany"
#         ],
#         "user_id": [
#             2,
#             "Mitchell Admin"
#         ]
#     }
# ]

Odoo • Texte et Image

Plusieurs notions ont été ajoutées aux évènements de type formation, tel que la saisie des dates de session. Un formation est liée à plusieurs sessions, qui comportent chacune une ou plusieurs dates de sessions.

Voici par exemple comment lister les sessions de notre évènement:



# Récupération des informations sur les sessions liées à la formation avec leurs durées
sessions = models.execute_kw(
    db, uid, password, 
    'event.session', 'search_read', 
    [[('formation_id', '=', training_id)]],
    {'fields': ['name', 'date_start', 'date_end', 'duration']}
)

# Affichage du résultat
print(json.dumps(sessions, indent=4))
# Résultat:
# [
#     {
#         "id": 1,
#         "name": "Session",
#         "date_start": "2023-01-16 08:00:00",
#         "date_end": "2023-01-20 16:00:00",
#         "duration": 40.0
#     }
# ]

# Récupération des dates de formation
dates = models.execute_kw(
    db, uid, password, 
    'event.session.date', 'search_read', 
    [[['formation_id', '=', training_id]]],
    {'fields': ['date_start', 'date_end', 'duration']}
)

# Affichage des dates de sessions
print(json.dumps(dates, indent=4))
# Résultat:
# [
#     {
#         "id": 1,
#         "date_start": "2023-01-16 08:00:00",
#         "date_end": "2023-01-16 16:00:00",
#         "duration": 8.0
#     },
#     {
#         "id": 2,
#         "date_start": "2023-01-17 08:00:00",
#         "date_end": "2023-01-17 16:00:00",
#         "duration": 8.0
#     },
#     {
#         "id": 3,
#         "date_start": "2023-01-18 08:00:00",
#         "date_end": "2023-01-18 16:00:00",
#         "duration": 8.0
#     },
#     {
#         "id": 4,
#         "date_start": "2023-01-19 08:00:00",
#         "date_end": "2023-01-19 16:00:00",
#         "duration": 8.0
#     },
#     {
#         "id": 5,
#         "date_start": "2023-01-20 08:00:00",
#         "date_end": "2023-01-20 16:00:00",
#         "duration": 8.0
#     }
# ]
Odoo • Texte et Image

Création d'une formation


# Création de la formation
new_training_id = models.execute_kw(
    db, uid, password, 
    'event.event', 'create', 
    [{
        'name': 'Test Event XMLRPC', 
        'type_event': 'formation', 
        'action_formation': 'a',
    }]
)

# Création de deux sessions
session_ids = models.execute_kw(
    db, uid, password, 
    'event.session', 'create', 
    [[{
        'name': 'Session A', 
        'formation_id': new_training_id,
    },
    {
        'name': 'Session B', 
        'formation_id': new_training_id,
    }]]
)

# Création des jours de sessions
session_dates_ids = models.execute_kw(
    db, uid, password, 
    'event.session.date', 'create', 
    [[{
        'session_id': session_ids[0], 
        'date_start': "2023-01-20 09:00:00",
        'date_end': "2023-01-20 12:00:00",
    },
    {
        'session_id': session_ids[0], 
        'date_start': "2023-01-20 14:00:00",
        'date_end': "2023-01-20 17:00:00",
    },
    {
        'session_id': session_ids[1], 
        'date_start': "2023-01-20 09:00:00",
        'date_end': "2023-01-20 12:00:00",
    },
    {
        'session_id': session_ids[1], 
        'date_start': "2023-01-20 14:00:00",
        'date_end': "2023-01-20 17:00:00",
    }]]
)

# Vérifions que les jours de sessions ont bien été créés
dates = models.execute_kw(
    db, uid, password, 
    'event.session.date', 'search_read', 
    [[['formation_id', '=', new_training_id]]],
    {'fields': ['date_start', 'date_end', 'duration']}
)
print(json.dumps(dates, indent=4))
# Résultat:
# [
#     {
#         "id": 10,
#         "date_start": "2023-01-20 09:00:00",
#         "date_end": "2023-01-20 12:00:00",
#         "duration": 3.0
#     },
#     {
#         "id": 11,
#         "date_start": "2023-01-20 14:00:00",
#         "date_end": "2023-01-20 17:00:00",
#         "duration": 3.0
#     },
#     {
#         "id": 12,
#         "date_start": "2023-01-25 09:00:00",
#         "date_end": "2023-01-25 12:00:00",
#         "duration": 3.0
#     },
#     {
#         "id": 13,
#         "date_start": "2023-01-25 14:00:00",
#         "date_end": "2023-01-25 17:00:00",
#         "duration": 3.0
#     },
# ]

Odoo • Texte et Image
Odoo • Texte et Image

Ajout de participants


# Ajout de participants à la formation
registration_ids = models.execute_kw(
    db, uid, password, 
    'event.registration', 'create', 
    [[{
        'event_id': new_training_id, 
        'partner_id': 26,  # Saisir l'id du contact Odoo
    },
    {
        'event_id': new_training_id, 
        'partner_id': 27,  # Saisir l'id du contact Odoo
    },
    {
        'event_id': new_training_id, 
        'partner_id': 33,  # Saisir l'id du contact Odoo
    }]]
)

# Inscription des participants aux différents jours de sessions
# Uniquement 2 participants sur les deux premières sessions
models.execute_kw(
    db, uid, password, 
    'event.session.date', 'write', 
    [
        session_dates_ids[0:2],
        {'session_registration_ids': [
            (0, 0, {
                'registration_id': registration_ids[0],
                'state': 'done',
            }),
            (0, 0, {
                'registration_id': registration_ids[1],
                'state': 'done',
            })
        ]}
    ]
)
# Tous le monde sur les autres sessions
models.execute_kw(
    db, uid, password, 
    'event.session.date', 'write', 
    [
        session_dates_ids[2:],
        {'session_registration_ids': [
            (0, 0, {
                'registration_id': registration_ids[0],
                'state': 'done',
            }),
            (0, 0, {
                'registration_id': registration_ids[1],
                'state': 'done',
            }),
            (0, 0, {
                'registration_id': registration_ids[2],
                'state': 'done',
            })
        ]}
    ]
)

Odoo • Texte et Image
Odoo • Texte et Image
Odoo • Texte et Image

Ajout des formateurs


# Saisi des formateurs sur la formation
former_ids = models.execute_kw(
    db, uid, password, 
    'training_management.former', 'create', 
    [[{
        'event_id': new_training_id, 
        'partner_id': 67,  # Id du contact Odoo à ajouter en formateur
    },
    {
        'event_id': new_training_id, 
        'partner_id': 68,  # Id du contact Odoo à ajouter en formateur
    }]]
)

# Ajout des formateurs sur les jours de sessions
# Les deux sur le 1er jour
models.execute_kw(
    db, uid, password, 
    'event.session.date', 'write', 
    [
        session_dates_ids[0:2],
        {'former_ids': [(6, 0, former_ids)]}
    ]
)
# Uniquement 1 sur la 2nde journée
models.execute_kw(
    db, uid, password, 
    'event.session.date', 'write', 
    [
        session_dates_ids[2:],
        {'former_ids': [(6, 0, [former_ids[0]])]}
    ]
)

Odoo • Texte et Image
Odoo • Texte et Image
Odoo • Texte et Image

Limitations


                    Pour se connecter via l'API, il est nécessaire de s'authentifier avec un compte utilisateur d'Odoo. Les droits d'accès configurés sur ce compte son contrôlés lors de l'execution de chaque requêtes faites par XMLRPC.

                    Seul les méthodes publiques sont disponibles (ne commençant pas par "_"), certaines actions ne sont donc pas possible sans modifier le code. Globalement, la quasi totalité des méthodes utiles sont disponibles (write, create, unlink, les actions des boutons ...). Ce sont généralement uniquement des méthodes internes qui pourraient générer des incohérences qui ne sont pas disponibles.

                    N'hésitez pas à nous contacter pour des demandes d'assistance, d'accompagnement ou de développements spécifiques.