Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
9ccbb25
Extract 'components' into an individual addon
Jan 15, 2017
816dc04
Add test_component
Jan 15, 2017
52e24d3
Separate lookup by name and by usage
Jan 19, 2017
3373aa1
Various fixes in component
Jun 12, 2017
d4c6c47
Add AbstractComponent
Jun 13, 2017
3436762
Remove overrides of attributes
Jun 13, 2017
87764ec
Allow to share some components across collections
Jun 13, 2017
18c8383
Instanciate the component returned by name
Jun 13, 2017
c8ced3a
Get rid of MetaMapper
Jun 14, 2017
3ec5416
Add check to help find duplicate components
Jun 14, 2017
d19a404
Fix pep8
Jun 14, 2017
6bfe808
Add tests to component
Jun 15, 2017
e49be67
Use 2 different methods for single/many lookup
Jun 15, 2017
1fbc821
Document component
Jun 15, 2017
db24242
Fix error messages
Jun 16, 2017
d5a3113
Update documentation
Jun 17, 2017
0278581
Draft new component_event addon
Jun 17, 2017
dda8694
Hold a component registry per database
Jun 17, 2017
c5bf790
Add a cache on the components lookups
Jun 17, 2017
59f06be
Improve components classes
Jun 19, 2017
ad3d049
Continue the migration guide
Jun 19, 2017
6db23e5
Fix test: post_install
Jun 19, 2017
72c6029
Move base component in a components directory
Jun 20, 2017
cb50e90
Check that component registry is ready for events
Jun 20, 2017
9565eb1
Use self.work.env, in case self.collection is empty
Jun 20, 2017
76f81d4
Change Collection.work_on() to a context manager
Jun 22, 2017
684dd9e
Allow to build components for a specific module on demand. When a mod…
lmignon Jun 29, 2017
5830276
Simplify tests by loading modules components
Jun 30, 2017
0fb64f6
Add a new method to refine match of components
Jul 4, 2017
0ce3fc7
Add new TestCase classes to test connectors
Jul 4, 2017
eac18f3
Exclude current addon in ComponentRegistryCase setup
Jul 6, 2017
aed3eef
Set component registry to ready only during tests
Jul 6, 2017
e29b765
Add readme files
Jul 11, 2017
5830ef3
Allow to add an inheritance on an existing component
Aug 15, 2017
1f2f447
Make abstract/non-abstract inheritance more robust
Aug 15, 2017
4c458ef
Set modules uninstallable
Oct 3, 2017
395b7f0
Make addons installable
Oct 3, 2017
ebecc5f
PY3: apply automated changes by 2to3 on addons
Oct 3, 2017
61b7cf3
Fix some pylint-odoo warnings
Oct 3, 2017
c6a4b2e
OCA Transbot updated translations from Transifex
oca-transbot Jan 6, 2018
5050929
component: Fix component lookup by usage If more than one component i…
lmignon Jan 9, 2018
3de3b57
Refine lookup on specific model over generic component
Jan 25, 2018
9fe9b2e
Bump component at 11.0.1.1.0
Jan 31, 2018
af471e4
OCA Transbot updated translations from Transifex
oca-transbot Feb 17, 2018
1da12eb
component: Add missing argument in logging call
Mar 1, 2018
e5c91c1
Add SavepointComponentRegistryCase
Jun 4, 2018
6ed47bc
Exclude components created by tests from the list of addon's components
Jun 4, 2018
647cbe4
Translated using Weblate (French)
Jun 27, 2018
21ca1bc
Improve documentation of APIs
Mar 30, 2018
a195c33
Make modules uninstallable
OCA-git-bot Sep 26, 2018
c251148
Migrate component to version 12.0
Oct 2, 2018
b95e263
Add OCA development status
Oct 2, 2018
41c8503
component, component_event: tag unittest.TestCase subclasses
naglis Mar 19, 2019
c4ae7ce
Added translation using Weblate (Chinese (Simplified))
liweijie0812 Sep 1, 2019
8fcb76d
Set modules uninstallable
Oct 10, 2019
a819dd8
component: Migration to 13.0
damdam-s Oct 10, 2019
846b3fc
test_component: Migration to 13.0
damdam-s Oct 11, 2019
7eab213
connector: Use more permissive licence: AGPL-> LGPL
lmignon Oct 14, 2019
28fb79d
black, isort
lmignon Oct 23, 2019
c837932
component, component_event, test_component: Installable True
lmignon Oct 23, 2019
bf4a1f4
Fix string interpolation
Mar 24, 2020
30aae7e
component 13.0.1.0.1
OCA-git-bot Mar 24, 2020
f5d32c1
Translated using Weblate (Portuguese (Brazil))
Aug 12, 2020
f872240
MIGR 14.0 component
bealdav Oct 16, 2020
f001e1d
FIX component: add py3.8 backport to make test right
bealdav Oct 16, 2020
6645112
DOC component: update history
bealdav Oct 26, 2020
6ca655b
[FIX] development status
sbidoul Dec 12, 2020
f3e120c
component 14.0.1.0.1
OCA-git-bot Dec 12, 2020
4ac4fb6
component: allow propagation of custom registry
simahawk Nov 4, 2020
19144f2
component: SavepointComponentRegistryCase init registry on setUpClass
simahawk Nov 7, 2020
e305384
component: add test for ctx registry propagation
simahawk Nov 7, 2020
a9f25e6
component: let tests propagate registry via ctx
simahawk Nov 9, 2020
9805e65
component 14.0.1.0.2
OCA-git-bot Jan 4, 2021
4ab18ab
14.0 component: improve README
gurneyalex Apr 16, 2021
1c294b6
component: lookup propagate kw args
simahawk Dec 16, 2020
6e59b2f
component: delegate component match n filter to private methods
simahawk Feb 8, 2021
3ed3715
component 14.0.1.1.0
OCA-git-bot May 5, 2021
d953313
Initialize 15.0 branch
lmignon Nov 25, 2021
657ff0e
[MIG] component: Migration to 15.0
yankinmax Nov 25, 2021
cd2b619
[MIG][15.0] component
i-vyshnevska Dec 2, 2021
936fd92
[REF] remove explicit 'object' inheritance
florentx Jan 27, 2022
e9d8dd3
component 15.0.1.0.1
OCA-git-bot Aug 1, 2022
9b2ec21
[IMP] component: add link to doc
gurneyalex Oct 17, 2022
abb2d3e
[16.0][MIG] component + test_component: Migration to 16.0
asierneiradev Oct 4, 2022
085dfca
Translated using Weblate (Italian)
mymage Dec 28, 2022
98a9f82
component: add RegistryNotReadyError
simahawk Mar 6, 2023
ec86ca5
component: add is_component_registry_ready
simahawk Mar 6, 2023
42caa4b
component: update contributors
simahawk Mar 6, 2023
4aed9d5
component 16.0.1.1.0
OCA-git-bot Mar 7, 2023
f246891
Translated using Weblate (Spanish)
Ivorra78 Aug 2, 2023
c87927c
component: fix ComponentRegistryCase + TransactionComponentRegistryCase
simahawk Aug 12, 2023
a509e1a
component 16.0.1.1.1
OCA-git-bot Aug 17, 2023
c8cd2a4
[IMP] component: pre-commit auto fixes
nguyenminhchien Nov 30, 2023
c128c16
[MIG] component: Migration to 17.0
nguyenminhchien Nov 30, 2023
cb3e730
Translated using Weblate (Italian)
mymage Feb 26, 2024
3bb1843
[MIG] component: Migration to 18.0
thienvh332 Sep 19, 2024
bd0293c
Update translation files
weblate Oct 9, 2024
1a3ffa2
component: ease ComponentMixin setup
simahawk Mar 26, 2026
38fec9e
[IMP] component: pre-commit auto fixes
yankinmax Apr 1, 2026
22fc655
[MIG] component: Migration to 19.0
Sanazzzmi Oct 11, 2025
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
170 changes: 170 additions & 0 deletions component/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
.. 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:c9cfc8d785a837cead4bbc1ec4f356f5975a9387310b0e72f7f5e6e0ef530916
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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 <guewen.baconnier@camptocamp.com>
- Laurent Mignon <laurent.mignon@acsone.eu>
- Simone Orsi <simone.orsi@camptocamp.com>
- Thien Vo <thienvh@trobz.com>

Other credits
-------------



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"],
}
99 changes: 99 additions & 0 deletions component/builder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# 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