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
 |