112 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
| # -*- coding: utf-8 -*-
 | |
| # Copyright 2017 Camptocamp SA
 | |
| # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 | |
| 
 | |
| """
 | |
| Base Model
 | |
| ==========
 | |
| 
 | |
| Extend the 'base' Odoo Model to add Events related features.
 | |
| 
 | |
| 
 | |
| """
 | |
| 
 | |
| from odoo import api, models
 | |
| from odoo.addons.component.core import _component_databases
 | |
| from ..components.event import CollectedEvents
 | |
| from ..core import EventWorkContext
 | |
| 
 | |
| 
 | |
| class Base(models.AbstractModel):
 | |
|     """ The base model, which is implicitly inherited by all models.
 | |
| 
 | |
|     Add an :meth:`_event` method to all Models. This method allows to
 | |
|     trigger events.
 | |
| 
 | |
|     It also notifies the following events:
 | |
| 
 | |
|     * ``on_record_create(self, record, fields=None)``
 | |
|     * ``on_record_write(self, record, fields=none)``
 | |
|     * ``on_record_unlink(self, record)``
 | |
| 
 | |
|     ``on_record_unlink`` is notified just *before* the unlink is done.
 | |
| 
 | |
|     """
 | |
|     _inherit = 'base'
 | |
| 
 | |
|     def _event(self, name, collection=None, components_registry=None):
 | |
|         """ Collect events for notifications
 | |
| 
 | |
|         Usage::
 | |
| 
 | |
|             @api.multi
 | |
|             def button_do_something(self):
 | |
|                 for record in self:
 | |
|                     # do something
 | |
|                     self._event('on_do_something').notify('something')
 | |
| 
 | |
|         With this line, every listener having a ``on_do_something`` method
 | |
|         with be called and receive 'something' as argument.
 | |
| 
 | |
|         See: :mod:`..components.event`
 | |
| 
 | |
|         :param name: name of the event, start with 'on_'
 | |
|         :param collection: optional collection  to filter on, only
 | |
|                            listeners with similar ``_collection`` will be
 | |
|                            notified
 | |
|         :param components_registry: component registry for lookups,
 | |
|                                     mainly used for tests
 | |
|         :type components_registry:
 | |
|             :class:`odoo.addons.components.core.ComponentRegistry`
 | |
| 
 | |
| 
 | |
|         """
 | |
|         dbname = self.env.cr.dbname
 | |
|         comp_registry = (
 | |
|             components_registry or _component_databases.get(dbname)
 | |
|         )
 | |
|         if not comp_registry or not comp_registry.ready:
 | |
|             # No event should be triggered before the registry has been loaded
 | |
|             # This is a very special case, when the odoo registry is being
 | |
|             # built, it calls odoo.modules.loading.load_modules().
 | |
|             # This function might trigger events (by writing on records, ...).
 | |
|             # But at this point, the component registry is not guaranteed
 | |
|             # to be ready, and anyway we should probably not trigger events
 | |
|             # during the initialization. Hence we return an empty list of
 | |
|             # events, the 'notify' calls will do nothing.
 | |
|             return CollectedEvents([])
 | |
| 
 | |
|         model_name = self._name
 | |
|         if collection is not None:
 | |
|             work = EventWorkContext(collection=collection,
 | |
|                                     model_name=model_name,
 | |
|                                     components_registry=components_registry)
 | |
|         else:
 | |
|             work = EventWorkContext(env=self.env, model_name=model_name,
 | |
|                                     components_registry=components_registry)
 | |
| 
 | |
|         collecter = work._component_class_by_name('base.event.collecter')(work)
 | |
|         return collecter.collect_events(name)
 | |
| 
 | |
|     @api.model
 | |
|     def create(self, vals):
 | |
|         record = super(Base, self).create(vals)
 | |
|         fields = list(vals.keys())
 | |
|         self._event('on_record_create').notify(record, fields=fields)
 | |
|         return record
 | |
| 
 | |
|     @api.multi
 | |
|     def write(self, vals):
 | |
|         result = super(Base, self).write(vals)
 | |
|         fields = list(vals.keys())
 | |
|         for record in self:
 | |
|             self._event('on_record_write').notify(record, fields=fields)
 | |
|         return result
 | |
| 
 | |
|     @api.multi
 | |
|     def unlink(self):
 | |
|         for record in self:
 | |
|             self._event('on_record_unlink').notify(record)
 | |
|         result = super(Base, self).unlink()
 | |
|         return result
 |