98 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
| # -*- coding: utf-8 -*-
 | |
| # Copyright 2017 Camptocamp SA
 | |
| # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 | |
| 
 | |
| """
 | |
| 
 | |
| Collection Model
 | |
| ================
 | |
| 
 | |
| This is the base Model shared by all the Collections.
 | |
| In the context of the Connector, a collection is the Backend.
 | |
| The `_name` given to the Collection Model will be the name
 | |
| to use in the `_collection` of the Components usable for the Backend.
 | |
| 
 | |
| """
 | |
| 
 | |
| from contextlib import contextmanager
 | |
| 
 | |
| from odoo import models, api
 | |
| from ..core import WorkContext
 | |
| 
 | |
| 
 | |
| class Collection(models.AbstractModel):
 | |
|     """ The model on which components are subscribed
 | |
| 
 | |
|     It would be for instance the ``backend`` for the connectors.
 | |
| 
 | |
|     Example::
 | |
| 
 | |
|         class MagentoBackend(models.Model):
 | |
|             _name = 'magento.backend'  # name of the collection
 | |
|             _inherit = 'collection.base'
 | |
| 
 | |
| 
 | |
|         class MagentoSaleImporter(Component):
 | |
|             _name = 'magento.sale.importer'
 | |
|             _apply_on = 'magento.sale.order'
 | |
|             _collection = 'magento.backend'  # name of the collection
 | |
| 
 | |
|             def run(self, magento_id):
 | |
|                 mapper = self.component(usage='import.mapper')
 | |
|                 extra_mappers = self.many_components(
 | |
|                     usage='import.mapper.extra',
 | |
|                 )
 | |
|                 # ...
 | |
| 
 | |
|     Use it::
 | |
| 
 | |
|         >>> backend = self.env['magento.backend'].browse(1)
 | |
|         >>> with backend.work_on('magento.sale.order') as work:
 | |
|         ...     importer = work.component(usage='magento.sale.importer')
 | |
|         ...     importer.run(1)
 | |
| 
 | |
|     See also: :class:`odoo.addons.component.core.WorkContext`
 | |
| 
 | |
| 
 | |
|     """
 | |
|     _name = 'collection.base'
 | |
|     _description = 'Base Abstract Collection'
 | |
| 
 | |
|     @contextmanager
 | |
|     @api.multi
 | |
|     def work_on(self, model_name, **kwargs):
 | |
|         """ Entry-point for the components, context manager
 | |
| 
 | |
|         Start a work using the components on the model.
 | |
|         Any keyword argument will be assigned to the work context.
 | |
|         See documentation of :class:`odoo.addons.component.core.WorkContext`.
 | |
| 
 | |
|         It is a context manager, so you can attach objects and clean them
 | |
|         at the end of the work session, such as::
 | |
| 
 | |
|             @contextmanager
 | |
|             @api.multi
 | |
|             def work_on(self, model_name, **kwargs):
 | |
|                 self.ensure_one()
 | |
|                 magento_location = MagentoLocation(
 | |
|                     self.location,
 | |
|                     self.username,
 | |
|                     self.password,
 | |
|                 )
 | |
|                 # We create a Magento Client API here, so we can create the
 | |
|                 # client once (lazily on the first use) and propagate it
 | |
|                 # through all the sync session, instead of recreating a client
 | |
|                 # in each backend adapter usage.
 | |
|                 with MagentoAPI(magento_location) as magento_api:
 | |
|                     _super = super(MagentoBackend, self)
 | |
|                     # from the components we'll be able to do:
 | |
|                     # self.work.magento_api
 | |
|                     with _super.work_on(
 | |
|                             model_name, magento_api=magento_api, **kwargs
 | |
|                             ) as work:
 | |
|                         yield work
 | |
| 
 | |
|         """
 | |
|         self.ensure_one()
 | |
|         yield WorkContext(model_name=model_name, collection=self, **kwargs)
 |