113 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
| # -*- coding: utf-8 -*-
 | |
| # Copyright 2013-2017 Camptocamp SA
 | |
| # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 | |
| 
 | |
| """
 | |
| 
 | |
| Synchronizer
 | |
| ============
 | |
| 
 | |
| A synchronizer orchestrates a synchronization with a backend.  It can be a
 | |
| record's import or export, a deletion of something, or anything else.  For
 | |
| instance, it will use the mappings to convert the data between both systems,
 | |
| the backend adapters to read or write data on the backend and the binders to
 | |
| create the link between them.
 | |
| 
 | |
| """
 | |
| 
 | |
| from odoo.addons.component.core import AbstractComponent
 | |
| 
 | |
| 
 | |
| class Synchronizer(AbstractComponent):
 | |
|     """ Base class for synchronizers """
 | |
| 
 | |
|     _name = 'base.synchronizer'
 | |
|     _inherit = 'base.connector'
 | |
| 
 | |
|     _base_mapper_usage = 'mapper'
 | |
|     _base_backend_adapter_usage = 'backend.adapter'
 | |
| 
 | |
|     def __init__(self, work_context):
 | |
|         super(Synchronizer, self).__init__(work_context)
 | |
|         self._backend_adapter = None
 | |
|         self._binder = None
 | |
|         self._mapper = None
 | |
| 
 | |
|     def run(self):
 | |
|         """ Run the synchronization """
 | |
|         raise NotImplementedError
 | |
| 
 | |
|     @property
 | |
|     def mapper(self):
 | |
|         """ Return an instance of ``Mapper`` for the synchronization.
 | |
| 
 | |
|         The instanciation is delayed because some synchronisations do
 | |
|         not need such an unit and the unit may not exist.
 | |
| 
 | |
|         It looks for a Component with ``_usage`` being equal to
 | |
|         ``_base_mapper_usage``.
 | |
| 
 | |
|         :rtype: :py:class:`odoo.addons.component.core.Component`
 | |
|         """
 | |
|         if self._mapper is None:
 | |
|             self._mapper = self.component(usage=self._base_mapper_usage)
 | |
|         return self._mapper
 | |
| 
 | |
|     @property
 | |
|     def binder(self):
 | |
|         """ Return an instance of ``Binder`` for the synchronization.
 | |
| 
 | |
|         The instanciation is delayed because some synchronisations do
 | |
|         not need such an unit and the unit may not exist.
 | |
| 
 | |
|         :rtype: :py:class:`odoo.addons.component.core.Component`
 | |
|         """
 | |
|         if self._binder is None:
 | |
|             self._binder = self.binder_for()
 | |
|         return self._binder
 | |
| 
 | |
|     @property
 | |
|     def backend_adapter(self):
 | |
|         """ Return an instance of ``BackendAdapter`` for the
 | |
|         synchronization.
 | |
| 
 | |
|         The instanciation is delayed because some synchronisations do
 | |
|         not need such an unit and the unit may not exist.
 | |
| 
 | |
|         It looks for a Component with ``_usage`` being equal to
 | |
|         ``_base_backend_adapter_usage``.
 | |
| 
 | |
|         :rtype: :py:class:`odoo.addons.component.core.Component`
 | |
|         """
 | |
|         if self._backend_adapter is None:
 | |
|             self._backend_adapter = self.component(
 | |
|                 usage=self._base_backend_adapter_usage
 | |
|             )
 | |
|         return self._backend_adapter
 | |
| 
 | |
| 
 | |
| class Exporter(AbstractComponent):
 | |
|     """ Synchronizer for exporting data from Odoo to a backend """
 | |
| 
 | |
|     _name = 'base.exporter'
 | |
|     _inherit = 'base.synchronizer'
 | |
|     _usage = 'exporter'
 | |
|     _base_mapper_usage = 'export.mapper'
 | |
| 
 | |
| 
 | |
| class Importer(AbstractComponent):
 | |
|     """ Synchronizer for importing data from a backend to Odoo """
 | |
| 
 | |
|     _name = 'base.importer'
 | |
|     _inherit = 'base.synchronizer'
 | |
|     _usage = 'importer'
 | |
|     _base_mapper_usage = 'import.mapper'
 | |
| 
 | |
| 
 | |
| class Deleter(AbstractComponent):
 | |
|     """ Synchronizer for deleting a record on the backend """
 | |
| 
 | |
|     _name = 'base.deleter'
 | |
|     _inherit = 'base.synchronizer'
 | |
|     _usage = 'deleter'
 |