Source code for odoo.addons.component_event.models.base
# -*- coding: utf-8 -*-
# Copyright 2017 Camptocamp SA
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.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
[docs]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([])
if not comp_registry.get('base.event.collecter'):
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)
self._event('on_record_create').notify(record, fields=vals.keys())
return record
@api.multi
def write(self, vals):
result = super(Base, self).write(vals)
fields = 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