Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
5bfbb47
Extract 'components' into an individual addon
guewen Jan 15, 2017
1fed850
Add test_component
guewen Jan 15, 2017
ad773d7
Separate lookup by name and by usage
guewen Jan 19, 2017
c695668
Various fixes in component
guewen Jun 12, 2017
013455e
Add AbstractComponent
guewen Jun 13, 2017
19fa6d9
Remove overrides of attributes
guewen Jun 13, 2017
4c306e5
Allow to share some components across collections
guewen Jun 13, 2017
83a9972
Instanciate the component returned by name
guewen Jun 13, 2017
01bd871
Get rid of MetaMapper
guewen Jun 14, 2017
799ca52
Add check to help find duplicate components
guewen Jun 14, 2017
7aad830
Fix pep8
guewen Jun 14, 2017
1ca7340
Add tests to component
guewen Jun 15, 2017
714c7c6
Use 2 different methods for single/many lookup
guewen Jun 15, 2017
7ea9953
Document component
guewen Jun 15, 2017
d2e8d95
Fix error messages
guewen Jun 16, 2017
15d4e7f
Update documentation
guewen Jun 17, 2017
ffa64f0
Draft new component_event addon
guewen Jun 17, 2017
f9425db
Hold a component registry per database
guewen Jun 17, 2017
8e55fce
Add a cache on the components lookups
guewen Jun 17, 2017
0c3c56a
Improve components classes
guewen Jun 19, 2017
2df9400
Continue the migration guide
guewen Jun 19, 2017
d490c4b
Fix test: post_install
guewen Jun 19, 2017
7ab88f8
Move base component in a components directory
guewen Jun 20, 2017
df912b6
Check that component registry is ready for events
guewen Jun 20, 2017
edc0106
Use self.work.env, in case self.collection is empty
guewen Jun 20, 2017
77d1114
Change Collection.work_on() to a context manager
guewen Jun 22, 2017
cb3cd28
Allow to build components for a specific module on demand. When a mod…
lmignon Jun 29, 2017
f2a5dff
Simplify tests by loading modules components
guewen Jun 30, 2017
54ffecc
Add a new method to refine match of components
guewen Jul 4, 2017
1901735
Add new TestCase classes to test connectors
guewen Jul 4, 2017
13ab86d
Exclude current addon in ComponentRegistryCase setup
guewen Jul 6, 2017
ed26022
Set component registry to ready only during tests
guewen Jul 6, 2017
20c30aa
Add readme files
guewen Jul 11, 2017
0ee0f98
Allow to add an inheritance on an existing component
guewen Aug 15, 2017
6a8bd8f
Make abstract/non-abstract inheritance more robust
guewen Aug 15, 2017
3be9035
Set modules uninstallable
guewen Oct 3, 2017
571c59d
Make addons installable
guewen Oct 3, 2017
fb1c40c
PY3: apply automated changes by 2to3 on addons
guewen Oct 3, 2017
2798d1c
Fix some pylint-odoo warnings
guewen Oct 3, 2017
6e834f7
OCA Transbot updated translations from Transifex
oca-transbot Jan 6, 2018
fccf39c
component: Fix component lookup by usage If more than one component i…
lmignon Jan 9, 2018
175c3fb
Refine lookup on specific model over generic component
guewen Jan 25, 2018
28ea8bd
Bump component at 11.0.1.1.0
guewen Jan 31, 2018
e72b0e2
OCA Transbot updated translations from Transifex
oca-transbot Feb 17, 2018
a419236
component: Add missing argument in logging call
Mar 1, 2018
f1f5354
Add SavepointComponentRegistryCase
guewen Jun 4, 2018
5e02513
Exclude components created by tests from the list of addon's components
guewen Jun 4, 2018
773af5a
Update component.pot
oca-travis Jun 23, 2018
2bdeb8d
Translated using Weblate (French)
guewen Jun 27, 2018
eb0b739
Improve documentation of APIs
guewen Mar 30, 2018
698cd53
Make modules uninstallable
OCA-git-bot Sep 26, 2018
aa313bf
Migrate component to version 12.0
guewen Oct 2, 2018
dd82f0a
Add OCA development status
guewen Oct 2, 2018
2e7b46b
README.rst
OCA-git-bot Nov 9, 2018
aeb02ab
Update component.pot
oca-travis Nov 9, 2018
0a8ab5a
Update translation files
oca-transbot Dec 9, 2018
27b350d
component, component_event: tag unittest.TestCase subclasses
naglis Mar 19, 2019
190f63b
icon.png
OCA-git-bot Apr 3, 2019
af0bbfb
README.rst
OCA-git-bot Jul 29, 2019
968d075
Added translation using Weblate (Chinese (Simplified))
liweijie0812 Sep 1, 2019
74edbc4
Translated using Weblate (Chinese (Simplified))
liweijie0812 Sep 1, 2019
638df36
Set modules uninstallable
guewen Oct 10, 2019
84d0b23
component: Migration to 13.0
damdam-s Oct 10, 2019
a5d80a3
test_component: Migration to 13.0
damdam-s Oct 11, 2019
98a566c
connector: Use more permissive licence: AGPL-> LGPL
lmignon Oct 14, 2019
7b1ead8
black, isort
lmignon Oct 23, 2019
3dc9126
component, component_event, test_component: Installable True
lmignon Oct 23, 2019
7f2c2fe
Update component.pot
oca-travis Oct 30, 2019
c9a0819
README.rst
OCA-git-bot Oct 30, 2019
c028371
Fix string interpolation
guewen Mar 24, 2020
fb76340
component 13.0.1.0.1
OCA-git-bot Mar 24, 2020
4ccc476
Translated using Weblate (Portuguese (Brazil))
Aug 12, 2020
7ed045c
MIGR 14.0 component
bealdav Oct 16, 2020
e858af2
FIX component: add py3.8 backport to make test right
bealdav Oct 16, 2020
a3559aa
DOC component: update history
bealdav Oct 26, 2020
13ee448
[UPD] Update component.pot
oca-travis Oct 26, 2020
f031055
[UPD] README.rst
OCA-git-bot Oct 26, 2020
b2aed9e
[FIX] development status
sbidoul Dec 12, 2020
108ed26
[UPD] README.rst
OCA-git-bot Dec 12, 2020
f70710f
component 14.0.1.0.1
OCA-git-bot Dec 12, 2020
e36b9b2
component: allow propagation of custom registry
simahawk Nov 4, 2020
9b5c713
component: SavepointComponentRegistryCase init registry on setUpClass
simahawk Nov 7, 2020
1d84d68
component: add test for ctx registry propagation
simahawk Nov 7, 2020
76261e9
component: let tests propagate registry via ctx
simahawk Nov 9, 2020
a6b0c65
component 14.0.1.0.2
OCA-git-bot Jan 4, 2021
681ab1a
14.0 component: improve README
gurneyalex Apr 16, 2021
730a63d
component: lookup propagate kw args
simahawk Dec 16, 2020
bc7b0a6
component: delegate component match n filter to private methods
simahawk Feb 8, 2021
3b5b97e
component 14.0.1.1.0
OCA-git-bot May 5, 2021
2508140
[UPD] README.rst
OCA-git-bot Jun 5, 2021
cd2817a
Initialize 15.0 branch
lmignon Nov 25, 2021
460cdc1
[MIG] component: Migration to 15.0
yankinmax Nov 25, 2021
e1f16b8
[UPD] Update component.pot
Nov 29, 2021
442cd5d
[UPD] README.rst
OCA-git-bot Nov 29, 2021
26d46ff
[MIG][15.0] component
i-vyshnevska Dec 2, 2021
56d4349
[REF] remove explicit 'object' inheritance
florentx Jan 27, 2022
890f74b
component 15.0.1.0.1
OCA-git-bot Aug 1, 2022
e8fa290
[IMP] component: add link to doc
gurneyalex Oct 17, 2022
ce45bb1
[16.0][MIG] component + test_component: Migration to 16.0
asierneiradev Oct 4, 2022
746368f
[UPD] README.rst
OCA-git-bot Dec 1, 2022
63ca4f0
Update translation files
weblate Dec 1, 2022
688184e
Translated using Weblate (Italian)
mymage Dec 28, 2022
5bb6486
component: add RegistryNotReadyError
simahawk Mar 6, 2023
94f84cc
component: add is_component_registry_ready
simahawk Mar 6, 2023
b4f0ad4
component: update contributors
simahawk Mar 6, 2023
ba53fe8
[UPD] README.rst
OCA-git-bot Mar 7, 2023
1eb5ac5
component 16.0.1.1.0
OCA-git-bot Mar 7, 2023
b96a0b0
Translated using Weblate (Spanish)
Ivorra78 Aug 2, 2023
11922dc
component: fix ComponentRegistryCase + TransactionComponentRegistryCase
simahawk Aug 12, 2023
0f3e636
component 16.0.1.1.1
OCA-git-bot Aug 17, 2023
5c65a97
[UPD] README.rst
OCA-git-bot Sep 3, 2023
36765a0
[IMP] component: pre-commit auto fixes
nguyenminhchien Nov 30, 2023
a37c0ce
[MIG] component: Migration to 17.0
nguyenminhchien Nov 30, 2023
ba655f4
[UPD] Update component.pot
Dec 8, 2023
838a4ed
[BOT] post-merge updates
OCA-git-bot Dec 8, 2023
a77cee7
Translated using Weblate (Italian)
mymage Feb 26, 2024
9945306
[MIG] component: Migration to 18.0
thienvh332 Sep 19, 2024
13ad653
[UPD] Update component.pot
Oct 9, 2024
d9c5a06
[BOT] post-merge updates
OCA-git-bot Oct 9, 2024
eb20623
Update translation files
weblate Oct 9, 2024
d5707aa
[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
171 changes: 171 additions & 0 deletions component/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
.. 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]>

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

The migration of this module from 18.0 to 19.0 was financially supported
by Camptocamp.

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