154 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
.. _bootstrap-connector:
 | 
						|
 | 
						|
 | 
						|
########################
 | 
						|
Boostrapping a connector
 | 
						|
########################
 | 
						|
 | 
						|
We'll see the steps to bootstrap a new connector.
 | 
						|
 | 
						|
Besides that, you may want to use the existing connectors to have some
 | 
						|
real implementation examples:
 | 
						|
 | 
						|
* `Odoo Magento Connector`_
 | 
						|
* `Odoo Prestashop Connector`_
 | 
						|
 | 
						|
Be aware that the connector API has changed in Odoo 10.0, so the examples
 | 
						|
might be outdated.
 | 
						|
 | 
						|
Some boilerplate is necessary, so this document will guide you through
 | 
						|
some steps. Please also take a look on the :ref:`naming-convention`.
 | 
						|
 | 
						|
For the sake of the example, we'll imagine we have to synchronize
 | 
						|
Odoo with a coffee machine.
 | 
						|
 | 
						|
*************
 | 
						|
Odoo Manifest
 | 
						|
*************
 | 
						|
 | 
						|
As we want to synchronize Odoo with a coffee machine, we'll name
 | 
						|
our connector connector_coffee.
 | 
						|
 | 
						|
First, we need to create the Odoo addons itself, editing the
 | 
						|
``connector_coffee/__manifest__.py`` manifest.
 | 
						|
 | 
						|
 | 
						|
.. code-block:: python
 | 
						|
   :emphasize-lines: 4,5
 | 
						|
 | 
						|
    # -*- 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,
 | 
						|
    }
 | 
						|
 | 
						|
Nothing special but 2 things to note:
 | 
						|
 | 
						|
* It depends from ``connector``. ``connector`` itself depends from
 | 
						|
  ``queue_job``, ``component`` and ``component_event``. ``queue_job`` is in the
 | 
						|
  `OCA/queue`_ repository.
 | 
						|
* The module category should be ``Connector``.
 | 
						|
 | 
						|
Of course, we also need to create the ``__init__.py`` file where we will
 | 
						|
put the imports of our python modules.
 | 
						|
 | 
						|
.. _OCA/queue: https://github.com/OCA/queue
 | 
						|
 | 
						|
 | 
						|
*************
 | 
						|
Backend Model
 | 
						|
*************
 | 
						|
 | 
						|
Reference: :ref:`api-backend-model`
 | 
						|
 | 
						|
We need to create a Backend representing the external service.  Every record we
 | 
						|
synchronize will be linked with a record of ``coffee.backend``.  This backend
 | 
						|
is our *collection* of Components.
 | 
						|
 | 
						|
The ``coffee.backend`` model is an ``_inherit`` of ``connector.backend``. In
 | 
						|
``connector_coffee/models/coffee_binding.py``::
 | 
						|
 | 
						|
    from odoo import api, fields, models
 | 
						|
 | 
						|
 | 
						|
    class CoffeeBackend(models.Model):
 | 
						|
        _name = 'coffee.backend'
 | 
						|
        _description = 'Coffee Backend'
 | 
						|
        _inherit = 'connector.backend'
 | 
						|
 | 
						|
        location = fields.Char(string='Location')
 | 
						|
        username = fields.Char(string='Username')
 | 
						|
        password = fields.Char(string='Password')
 | 
						|
 | 
						|
Notes:
 | 
						|
 | 
						|
* We can other fields for the configuration of the connection or the
 | 
						|
  synchronizations.
 | 
						|
 | 
						|
****************
 | 
						|
Abstract Binding
 | 
						|
****************
 | 
						|
 | 
						|
Reference: :ref:`api-binding-model`
 | 
						|
 | 
						|
In order to share common features between all the bindings (see
 | 
						|
:ref:`binding`), create an abstract binding model.
 | 
						|
 | 
						|
It can be as follows (in ``connector_coffee/models/coffee_binding.py``)::
 | 
						|
 | 
						|
    from odoo import models, fields
 | 
						|
 | 
						|
 | 
						|
    class CoffeeBinding(models.AbstractModel):
 | 
						|
        _name = 'coffee.binding'
 | 
						|
        _inherit = 'external.binding'
 | 
						|
        _description = 'Coffee Binding (abstract)'
 | 
						|
 | 
						|
        # odoo_id = odoo-side id must be declared in concrete model
 | 
						|
        backend_id = fields.Many2one(
 | 
						|
            comodel_name='coffee.backend',
 | 
						|
            string='Coffee Backend',
 | 
						|
            required=True,
 | 
						|
            ondelete='restrict',
 | 
						|
        )
 | 
						|
        coffee_id = fields.Integer(string='ID in the Coffee Machine',
 | 
						|
                                   index=True)
 | 
						|
 | 
						|
Notes:
 | 
						|
 | 
						|
* This model inherit from ``external.binding``
 | 
						|
* Any number of fields or methods can be added
 | 
						|
 | 
						|
 | 
						|
**********
 | 
						|
Components
 | 
						|
**********
 | 
						|
 | 
						|
Reference: :ref:`api-component`
 | 
						|
 | 
						|
We'll probably need to create synchronizers, mappers, backend adapters,
 | 
						|
binders and maybe our own kind of components.
 | 
						|
 | 
						|
Their implementation can vary from a project to another. Have a look on the
 | 
						|
`Odoo Magento Connector`_ and `Odoo Prestashop Connector`_ projects.
 | 
						|
 | 
						|
 | 
						|
.. _`Odoo Magento Connector`: https://github.com/OCA/connector-magento
 | 
						|
.. _`Odoo Prestashop Connector`: https://github.com/OCA/connector-prestashop
 |