Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
4f3b897
Extract 'components' into an individual addon
Jan 15, 2017
1f701b6
Add test_component
Jan 15, 2017
10c5bf7
Separate lookup by name and by usage
Jan 19, 2017
caf7f93
Various fixes in component
Jun 12, 2017
3a89d3e
Add AbstractComponent
Jun 13, 2017
9979690
Remove overrides of attributes
Jun 13, 2017
2d922b2
Allow to share some components across collections
Jun 13, 2017
2021106
Instanciate the component returned by name
Jun 13, 2017
36a3b71
Get rid of MetaMapper
Jun 14, 2017
dc4a20d
Add check to help find duplicate components
Jun 14, 2017
03c5709
Fix pep8
Jun 14, 2017
7c6d098
Add tests to component
Jun 15, 2017
f2415d4
Use 2 different methods for single/many lookup
Jun 15, 2017
0b62ce0
Document component
Jun 15, 2017
18b4327
Fix error messages
Jun 16, 2017
d3cfdf1
Update documentation
Jun 17, 2017
e31d832
Draft new component_event addon
Jun 17, 2017
cc00a32
Hold a component registry per database
Jun 17, 2017
d71d9c6
Add a cache on the components lookups
Jun 17, 2017
8c3d466
Improve components classes
Jun 19, 2017
676fd75
Continue the migration guide
Jun 19, 2017
49d1c2c
Fix test: post_install
Jun 19, 2017
1981efc
Move base component in a components directory
Jun 20, 2017
440aef1
Check that component registry is ready for events
Jun 20, 2017
c405df2
Use self.work.env, in case self.collection is empty
Jun 20, 2017
35f9b81
Change Collection.work_on() to a context manager
Jun 22, 2017
a8d4877
Allow to build components for a specific module on demand. When a mod…
lmignon Jun 29, 2017
b21f761
Simplify tests by loading modules components
Jun 30, 2017
d0102ef
Add a new method to refine match of components
Jul 4, 2017
b95760a
Add new TestCase classes to test connectors
Jul 4, 2017
91a47c3
Exclude current addon in ComponentRegistryCase setup
Jul 6, 2017
a3f1847
Set component registry to ready only during tests
Jul 6, 2017
0d0646a
Add readme files
Jul 11, 2017
d206b6c
Allow to add an inheritance on an existing component
Aug 15, 2017
3b91712
Make abstract/non-abstract inheritance more robust
Aug 15, 2017
ca44417
Set modules uninstallable
Oct 3, 2017
77aa9e9
Make addons installable
Oct 3, 2017
a505428
PY3: apply automated changes by 2to3 on addons
Oct 3, 2017
f3e977f
Fix some pylint-odoo warnings
Oct 3, 2017
f4f0670
OCA Transbot updated translations from Transifex
oca-transbot Jan 6, 2018
4d46dd4
component: Fix component lookup by usage If more than one component i…
lmignon Jan 9, 2018
7be6c44
Refine lookup on specific model over generic component
Jan 25, 2018
2eeb21e
Bump component at 11.0.1.1.0
Jan 31, 2018
89b5f11
OCA Transbot updated translations from Transifex
oca-transbot Feb 17, 2018
42987c9
component: Add missing argument in logging call
Mar 1, 2018
f56d216
Add SavepointComponentRegistryCase
Jun 4, 2018
c24f572
Exclude components created by tests from the list of addon's components
Jun 4, 2018
f9e8c07
Update component.pot
oca-travis Jun 23, 2018
2e32e52
Translated using Weblate (French)
Jun 27, 2018
bc2a9b9
Improve documentation of APIs
Mar 30, 2018
e76a6a5
Make modules uninstallable
OCA-git-bot Sep 26, 2018
fe9ab7f
Migrate component to version 12.0
Oct 2, 2018
4db7bc6
Add OCA development status
Oct 2, 2018
1632446
README.rst
OCA-git-bot Nov 9, 2018
8a09e26
Update component.pot
oca-travis Nov 9, 2018
137c971
Update translation files
oca-transbot Dec 9, 2018
dd60588
component, component_event: tag unittest.TestCase subclasses
naglis Mar 19, 2019
8c30b23
icon.png
OCA-git-bot Apr 3, 2019
6b155ca
README.rst
OCA-git-bot Jul 29, 2019
418efca
Added translation using Weblate (Chinese (Simplified))
liweijie0812 Sep 1, 2019
ed32d7a
Translated using Weblate (Chinese (Simplified))
liweijie0812 Sep 1, 2019
1f0cae9
Set modules uninstallable
Oct 10, 2019
0a8baa2
component: Migration to 13.0
damdam-s Oct 10, 2019
7ccd151
test_component: Migration to 13.0
damdam-s Oct 11, 2019
6393b80
connector: Use more permissive licence: AGPL-> LGPL
lmignon Oct 14, 2019
3f49eac
black, isort
lmignon Oct 23, 2019
816122b
component, component_event, test_component: Installable True
lmignon Oct 23, 2019
abdb51c
Update component.pot
oca-travis Oct 30, 2019
4e48713
README.rst
OCA-git-bot Oct 30, 2019
020dbb1
Fix string interpolation
Mar 24, 2020
4182ccd
component 13.0.1.0.1
OCA-git-bot Mar 24, 2020
c9697db
Translated using Weblate (Portuguese (Brazil))
Aug 12, 2020
1dcbc7e
MIGR 14.0 component
bealdav Oct 16, 2020
bc07689
FIX component: add py3.8 backport to make test right
bealdav Oct 16, 2020
fe53a11
DOC component: update history
bealdav Oct 26, 2020
7c69082
[UPD] Update component.pot
oca-travis Oct 26, 2020
9b0c6d3
[UPD] README.rst
OCA-git-bot Oct 26, 2020
273c533
[FIX] development status
sbidoul Dec 12, 2020
8db23ec
[UPD] README.rst
OCA-git-bot Dec 12, 2020
9cbad2c
component 14.0.1.0.1
OCA-git-bot Dec 12, 2020
5a4456d
component: allow propagation of custom registry
simahawk Nov 4, 2020
ecf982d
component: SavepointComponentRegistryCase init registry on setUpClass
simahawk Nov 7, 2020
31813af
component: add test for ctx registry propagation
simahawk Nov 7, 2020
fb0c039
component: let tests propagate registry via ctx
simahawk Nov 9, 2020
ba2d0f5
component 14.0.1.0.2
OCA-git-bot Jan 4, 2021
cd9c0df
14.0 component: improve README
gurneyalex Apr 16, 2021
889d7aa
component: lookup propagate kw args
simahawk Dec 16, 2020
3ff1489
component: delegate component match n filter to private methods
simahawk Feb 8, 2021
0f2c9b7
component 14.0.1.1.0
OCA-git-bot May 5, 2021
d5761a4
[UPD] README.rst
OCA-git-bot Jun 5, 2021
130728d
Initialize 15.0 branch
lmignon Nov 25, 2021
ff88f9a
[MIG] component: Migration to 15.0
yankinmax Nov 25, 2021
bb11205
[UPD] Update component.pot
Nov 29, 2021
19a085f
[UPD] README.rst
OCA-git-bot Nov 29, 2021
3099a6a
[MIG][15.0] component
i-vyshnevska Dec 2, 2021
7226849
[REF] remove explicit 'object' inheritance
florentx Jan 27, 2022
3cef816
component 15.0.1.0.1
OCA-git-bot Aug 1, 2022
f226d9d
[IMP] component: add link to doc
gurneyalex Oct 17, 2022
07e7c21
[16.0][MIG] component + test_component: Migration to 16.0
asierneiradev Oct 4, 2022
7cbf652
[UPD] README.rst
OCA-git-bot Dec 1, 2022
e381509
Update translation files
weblate Dec 1, 2022
aa191b9
Translated using Weblate (Italian)
mymage Dec 28, 2022
251f5a9
component: add RegistryNotReadyError
simahawk Mar 6, 2023
be16925
component: add is_component_registry_ready
simahawk Mar 6, 2023
eb14b57
component: update contributors
simahawk Mar 6, 2023
c35120e
[UPD] README.rst
OCA-git-bot Mar 7, 2023
c8c661c
component 16.0.1.1.0
OCA-git-bot Mar 7, 2023
19cb846
Translated using Weblate (Spanish)
Ivorra78 Aug 2, 2023
071c2e9
component: fix ComponentRegistryCase + TransactionComponentRegistryCase
simahawk Aug 12, 2023
1b26e73
component 16.0.1.1.1
OCA-git-bot Aug 17, 2023
2b1a15b
[UPD] README.rst
OCA-git-bot Sep 3, 2023
f98e5e0
[IMP] component: pre-commit auto fixes
nguyenminhchien Nov 30, 2023
d36b316
[MIG] component: Migration to 17.0
nguyenminhchien Nov 30, 2023
208acea
[UPD] Update component.pot
Dec 8, 2023
f059e14
[BOT] post-merge updates
OCA-git-bot Dec 8, 2023
630ca0f
Translated using Weblate (Italian)
mymage Feb 26, 2024
fbfc935
[MIG] component: Migration to 18.0
thienvh332 Sep 19, 2024
ef6b41d
[UPD] Update component.pot
Oct 9, 2024
ab49feb
[BOT] post-merge updates
OCA-git-bot Oct 9, 2024
96bbe6b
Update translation files
weblate Oct 9, 2024
7bfa281
[IMP] component: pre-commit auto fixes
sergijPf Mar 12, 2026
807e0e1
[MIG] component: Migration to 19.0
sergijPf Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
165 changes: 165 additions & 0 deletions component/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association

==========
Components
==========

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:2785951ba7cf6288c667291264099df031ca3d90d9c79c04a2d5cddec6c85641
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
:alt: Production/Stable
.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fconnector-lightgray.png?logo=github
:target: https://github.com/OCA/connector/tree/19.0/component
:alt: OCA/connector
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/connector-19-0/connector-19-0-component
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/connector&target_branch=19.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module implements a component system and is a base block for the
Connector Framework. It can be used without using the full Connector
though.

Documentation: http://odoo-connector.com/

You may also want to check the `Introduction to Odoo
Components <https://dev.to/guewen/introduction-to-odoo-components-bn0>`__
by @guewen.

**Table of contents**

.. contents::
:local:

Usage
=====

As a developer, you have access to a component system. You can find the
documentation in the code or on http://odoo-connector.com

In a nutshell, you can create components:

::

from odoo.addons.component.core import Component

class MagentoPartnerAdapter(Component):
_name = 'magento.partner.adapter'
_inherit = 'magento.adapter'

_usage = 'backend.adapter'
_collection = 'magento.backend'
_apply_on = ['res.partner']

And later, find the component you need at runtime (dynamic dispatch at
component level):

::

def run(self, external_id):
backend_adapter = self.component(usage='backend.adapter')
external_data = backend_adapter.read(external_id)

In order for tests using components to work, you will need to use the
base class provided by \`odoo.addons.component.tests.common\`:

- TransactionComponentCase

There are also some specific base classes for testing the component
registry, using the ComponentRegistryCase as a base class. See the
docstrings in tests/common.py.

Changelog
=========

16.0.1.0.0 (2022-10-04)
-----------------------

- [MIGRATION] from 15.0

15.0.1.0.0 (2021-11-25)
-----------------------

- [MIGRATION] from 14.0

14.0.1.0.0 (2020-10-22)
-----------------------

- [MIGRATION] from 13.0

13.0.1.0.0 (2019-10-23)
-----------------------

- [MIGRATION] from 12.0

12.0.1.0.0 (2018-10-02)
-----------------------

- [MIGRATION] from 11.0 branched at rev. 324e006

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/connector/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/connector/issues/new?body=module:%20component%0Aversion:%2019.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Camptocamp

Contributors
------------

- Guewen Baconnier <[email protected]>
- Laurent Mignon <[email protected]>
- Simone Orsi <[email protected]>
- Thien Vo <[email protected]>

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

.. |maintainer-guewen| image:: https://github.com/guewen.png?size=40px
:target: https://github.com/guewen
:alt: guewen

Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-guewen|

This module is part of the `OCA/connector <https://github.com/OCA/connector/tree/19.0/component>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
5 changes: 5 additions & 0 deletions component/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from . import core

from . import components
from . import builder
from . import models
22 changes: 22 additions & 0 deletions component/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copyright 2017 Camptocamp SA
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)

{
"name": "Components",
"summary": "Add capabilities to register and use decoupled components,"
" as an alternative to model classes",
"version": "19.0.1.0.0",
"author": "Camptocamp,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/connector",
"license": "LGPL-3",
"category": "Generic Modules",
"depends": ["base"],
"external_dependencies": {
"python": [
"cachetools",
]
},
"installable": True,
"development_status": "Production/Stable",
"maintainers": ["guewen"],
}
96 changes: 96 additions & 0 deletions component/builder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# Copyright 2019 Camptocamp SA
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)

"""

Components Builder
==================

Build the components at the build of a registry.

"""

from odoo import models
from odoo.modules.module_graph import ModuleGraph

from .core import DEFAULT_CACHE_SIZE, ComponentRegistry, _component_databases


class ComponentBuilder(models.AbstractModel):
"""Build the component classes

And register them in a global registry.

Every time an Odoo registry is built, the know components are cleared and
rebuilt as well. The Component classes are built using the same mechanism
than Odoo's Models: a final class is created, taking every Components with
a ``_name`` and applying Components with an ``_inherits`` upon them.

The final Component classes are registered in global registry.

This class is an Odoo model, allowing us to hook the build of the
components at the end of the Odoo's registry loading, using
``_register_hook``. This method is called after all modules are loaded, so
we are sure that we have all the components Classes and in the correct
order.

"""

_name = "component.builder"
_description = "Component Builder"

_components_registry_cache_size = DEFAULT_CACHE_SIZE

def _register_hook(self):
# This method is called by Odoo when the registry is built,
# so in case the registry is rebuilt (cache invalidation, ...),
# we have to to rebuild the components. We use a new
# registry so we have an empty cache and we'll add components in it.
components_registry = self._init_global_registry()
self.build_registry(components_registry)
components_registry.ready = True

def _init_global_registry(self):
components_registry = ComponentRegistry(
cachesize=self._components_registry_cache_size
)
_component_databases[self.env.cr.dbname] = components_registry
return components_registry

def build_registry(self, components_registry, states=None, exclude_addons=None):
if not states:
states = ("installed", "to upgrade")
# lookup all the installed (or about to be) addons and generate
# the graph, so we can load the components following the order
# of the addons' dependencies

query = "SELECT name FROM ir_module_module WHERE state IN %s "
params = [tuple(states)]
if exclude_addons:
query += " AND name NOT IN %s "
params.append(tuple(exclude_addons))
self.env.cr.execute(query, params)

module_list = [name for (name,) in self.env.cr.fetchall()]
graph = ModuleGraph(self.env.cr)
graph.extend(module_list)

for module in graph:
self.load_components(module.name, components_registry=components_registry)

def load_components(self, module, components_registry=None):
"""Build every component known by MetaComponent for an odoo module

The final component (composed by all the Component classes in this
module) will be pushed into the registry.

:param module: the name of the addon for which we want to load
the components
:type module: str | unicode
:param registry: the registry in which we want to put the Component
:type registry: :py:class:`~.core.ComponentRegistry`
"""
components_registry = (
components_registry or _component_databases[self.env.cr.dbname]
)
components_registry.load_components(module)
1 change: 1 addition & 0 deletions component/components/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import base
15 changes: 15 additions & 0 deletions component/components/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Copyright 2017 Camptocamp SA
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)

from ..core import AbstractComponent


class BaseComponent(AbstractComponent):
"""This is the base component for every component

It is implicitely inherited by all components.

All your base are belong to us
"""

_name = "base"
Loading
Loading