Amorcer la création un nouveau connecteur

Nous allons voir les étapes pour amorcer la création d’un nouveau connecteur

À côté de ça, vous devriez utiliser les connecteurs existants pour avoir des exemples réels d’implémentation:

Du code boilerplate est nécessaire, donc ce document va vous guider à travers différentes étapes. Consultez également les Conventions de nommage.

Pour cet exemple nous allons imaginer que nous devons synchroniser Odoo avec une machine à café.

Odoo Manifest

Comme nous voulons synchroniser Odoo avec une machine à café, nous allons nommer notre connecteur connector_coffee

Tout d’abord, nous devons créer le module Odoo lui-même, en modifiant le fichier connector_coffee/__openerp__.py.

 # -*- coding: utf-8 -*-
 {'name': 'Coffee Connector',
  'version': '1.0.0',
  'category': 'Connector',
  'depends': ['connector',
              ],
  'author': 'Myself',
  'license': 'AGPL-3',
  'description': """
 Coffee Connector
 ================

 Connect Odoo to my coffee machine.

 Features:

 * Poor a coffee when Odoo is busy for too long
 """,
  'data': [],
  'installable': True,
  'application': False,
 }

Il y a 2 points à noter :

  • Il dépend de connector.
  • La catégorie du module doit être Connector.

Bien sûr, nous devons aussi créer le fichier __init__.py où nous plaçons les imports de nos modules Python.

Déclaration des backends

Notre module est compatible avec les machines à café :

  • Coffee 1900
  • Coffee 2900

Donc nous allons déclarer un backend coffee, l’entité générique, et un backend différent par version.

Placez ceci dans connector_coffee/backend.py:

import openerp.addons.connector.backend as backend


coffee = backend.Backend('coffee')
coffee1900 = backend.Backend(parent=coffee, version='1900')
coffee2900 = backend.Backend(parent=coffee, version='2900')

Modèle du backend

Nous avons déclaré les backends, mais nous avons besoin d’un modèle pour les configurer.

Nous créons un modèle coffee.backend qui est un _inherit de connector.backend. Dans connector_coffee/coffee_model.py:

from openerp import fields, models, api


class CoffeeBackend(models.Model):
    _name = 'coffee.backend'
    _description = 'Coffee Backend'
    _inherit = 'connector.backend'

    _backend_type = 'coffee'

    @api.model
    def _select_versions(self):
        """ Available versions

        Can be inherited to add custom versions.
        """
        return [('1900', 'Version 1900'),
                ('2900', 'Version 2900')]

    version = fields.Selection(
        selection='_select_versions',
        string='Version',
        required=True,
    )
    location = fields.Char(string='Location')
    username = fields.Char(string='Username')
    password = fields.Char(string='Password')
    default_lang_id = fields.Many2one(
        comodel_name='res.lang',
        string='Default Language',
    )

Notes :

  • Le _backend_type doit être le même que le nom du backend dans Déclaration des backends.
  • les versions doivent être les mêmes que celles déclarées dans Déclaration des backends.
  • Nous pouvons ajouter dans ce modèle autant de champs que nous voulons pour configurer notre connexion ou configuration en rapport avec le backend.

Binding abstrait

Si nous avons de nombreux Bindings (Liaisons), nous pouvons créer un modèle abstrait pour eux.

Cela peut être comme suit (dans connector_coffee/connector.py):

from openerp import models, fields


class CoffeeBinding(models.AbstractModel):
    _name = 'coffee.binding'
    _inherit = 'external.binding'
    _description = 'Coffee Binding (abstract)'

    # 'openerp_id': openerp-side id must be declared in concrete model
    backend_id = fields.Many2one(
        comodel_name='coffee.backend',
        string='Coffee Backend',
        required=True,
        ondelete='restrict',
    )
    # fields.char because 0 is a valid coffee ID
    coffee_id = fields.Char(string='ID in the Coffee Machine',
                            select=True)

Environnement

Nous aurons souvent besoin de créer un nouvel environnement avec lequel travailler. Je propose de créer une méthode auxiliaire qui le construit (dans connector_coffee/connector.py:

from openerp.addons.connector.connector import Environment


def get_environment(session, model_name, backend_id):
    """ Create an environment to work with. """
    backend_record = session.env['coffee.backend'].browse(backend_id)
    env = Environment(backend_record, session, model_name)
    lang = backend_record.default_lang_id
    lang_code = lang.code if lang else 'en_US'
    if lang_code == session.context.get('lang'):
        return env
    else:
        with env.session.change_context(lang=lang_code):
            return env

Remarquez que la partie qui concerne la définition du langage est complètement optionnelle mais elle est conservée pour l’exemple.

Points de contrôle

Record checkpoint

When new records are imported and need a review, Point de contrôle are created. You can add it like this:

backend_record.add_checkpoint(
    model='res.partner', record_id=1, message='VAT number can be missing')

Message only checkpoint

When you need to show a warning message to a user you can create a Point de contrôle. You can add it like this:

backend_record.add_checkpoint(message='VAT number can be missing')

A typical use case for this is:

  • you have a batch import of CSV file;
  • you don’t want to break a whole batch job just because some line failed;
  • you want to notify the user with a nice warning message.

Classes ConnectorUnit

Nous aurons probablement besoin de créer des synchroniseurs, des mappeurs, des adaptateurs de backend, des bindings, et peut-être nos propres types de classes ConnectorUnit

Leur implémentation peut varier énormément. Jetez un œil aux projets Connecteur Odoo Magento et Connecteur Odoo Prestashop.