Initial commit: OCA Technical packages (595 packages)
47
odoo-bringout-oca-connector-connector/README.md
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
# Connector
|
||||
|
||||
Odoo addon: connector
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install odoo-bringout-oca-connector-connector
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
|
||||
This addon depends on:
|
||||
- mail
|
||||
- queue_job
|
||||
- component
|
||||
- component_event
|
||||
|
||||
## Manifest Information
|
||||
|
||||
- **Name**: Connector
|
||||
- **Version**: 16.0.1.0.0
|
||||
- **Category**: Generic Modules
|
||||
- **License**: LGPL-3
|
||||
- **Installable**: True
|
||||
|
||||
## Source
|
||||
|
||||
Based on [OCA/connector](https://github.com/OCA/connector) branch 16.0, addon `connector`.
|
||||
|
||||
## License
|
||||
|
||||
This package maintains the original LGPL-3 license from the upstream Odoo project.
|
||||
|
||||
## Documentation
|
||||
|
||||
- Overview: doc/OVERVIEW.md
|
||||
- Architecture: doc/ARCHITECTURE.md
|
||||
- Models: doc/MODELS.md
|
||||
- Controllers: doc/CONTROLLERS.md
|
||||
- Wizards: doc/WIZARDS.md
|
||||
- Install: doc/INSTALL.md
|
||||
- Usage: doc/USAGE.md
|
||||
- Configuration: doc/CONFIGURATION.md
|
||||
- Dependencies: doc/DEPENDENCIES.md
|
||||
- Troubleshooting: doc/TROUBLESHOOTING.md
|
||||
- FAQ: doc/FAQ.md
|
||||
168
odoo-bringout-oca-connector-connector/connector/README.rst
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
=========
|
||||
Connector
|
||||
=========
|
||||
|
||||
..
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:89e6132419a9388e31f1e1919ac881f45189d2c51e4bd383a41174d51c984b60
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
|
||||
:target: https://odoo-community.org/page/development-status
|
||||
:alt: Beta
|
||||
.. |badge2| image:: https://img.shields.io/badge/licence-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/16.0/connector
|
||||
:alt: OCA/connector
|
||||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
||||
:target: https://translation.odoo-community.org/projects/connector-16-0/connector-16-0-connector
|
||||
: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=16.0
|
||||
:alt: Try me on Runboat
|
||||
|
||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||
|
||||
This is a framework designed to build connectors with external systems,
|
||||
usually called ``Backends`` in the documentation.
|
||||
|
||||
Documentation: http://odoo-connector.com
|
||||
|
||||
It features:
|
||||
|
||||
* A jobs queue
|
||||
|
||||
In which the connectors can push functions (synchronization tasks)
|
||||
to be executed later.
|
||||
|
||||
* An event pattern
|
||||
|
||||
The connectors can subscribe listener functions on the events,
|
||||
executed when the events are fired.
|
||||
|
||||
* Connector base classes
|
||||
|
||||
Called ``ConnectorUnit``.
|
||||
|
||||
Include base classes for the use in connectors, ready to be extended:
|
||||
|
||||
* ``Synchronizer``: flow of an import or export
|
||||
* ``Mapper``: transform a record according to mapping rules
|
||||
* ``Binder``: link external IDs with local IDS
|
||||
* ``BackendAdapter``: adapter interface for the exchanges with the backend
|
||||
* But ``ConnectorUnit`` can be extended to accomplish any task
|
||||
|
||||
* A multi-backend support
|
||||
|
||||
Each ``ConnectorUnit`` can be registered amongst a backend type (eg.
|
||||
Magento) and a backend version (allow to have a different ``Mapper``
|
||||
for each backend's version for instance)
|
||||
|
||||
It is used for example used to connect Magento_ and Prestashop_, but
|
||||
also used with Solr, CMIS, ...
|
||||
|
||||
.. _Magento: http://odoo-magento-connector.com
|
||||
.. _Prestashop: https://github.com/OCA/connector-prestashop
|
||||
|
||||
**Table of contents**
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
This module does nothing on its own. It is a ground for developing
|
||||
advanced connector modules. For further information, please go on:
|
||||
http://odoo-connector.com
|
||||
|
||||
Changelog
|
||||
=========
|
||||
|
||||
.. [ The change log. The goal of this file is to help readers
|
||||
understand changes between version. The primary audience is
|
||||
end users and integrators. Purely technical changes such as
|
||||
code refactoring must not be mentioned here.
|
||||
|
||||
This file may contain ONE level of section titles, underlined
|
||||
with the ~ (tilde) character. Other section markers are
|
||||
forbidden and will likely break the structure of the README.rst
|
||||
or other documents where this fragment is included. ]
|
||||
|
||||
Next
|
||||
~~~~
|
||||
|
||||
12.0.1.0.0 (2018-11-26)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* [MIGRATION] from 12.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:%20connector%0Aversion:%2016.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 at Camptocamp
|
||||
* Alexandre Fayolle at Camptocamp
|
||||
* Benoit Guillot at Akretion
|
||||
* Nicolas Bessi at Camptocamp
|
||||
* Joël Grand-Guillaume at Camptocamp
|
||||
* Arthur Vuillard at Akretion
|
||||
* Sebastien Beau at Akretion
|
||||
* Laurent Mignon at Acsone
|
||||
* Leonardo Pistone at Camptocamp
|
||||
* David Béal at Akretion
|
||||
* Christophe Combelles at Anybox
|
||||
* Stéphane Bidoul at Acsone
|
||||
* Malte Jacobi at IBO / HTW
|
||||
* Laetitia Gangloff at Acsone
|
||||
* David Lefever at Taktik S.A.
|
||||
* Jos de Graeve at Apertoso NV
|
||||
* Jean-Sébastien Suzanne at Anybox
|
||||
* Leonardo Donelli at MONK Software
|
||||
* Mathias Colpaert
|
||||
* Yannick Vaucher at Camptocamp
|
||||
* Nicolas Piganeau at NDP Systèmes
|
||||
* Florent Thomas at Mind And Go
|
||||
* Matthieu Dietrich at Camptocamp
|
||||
* Olivier Laurent at Acsone
|
||||
* Eric Antones at NuoBiT Solutions S.L.
|
||||
* Asier Neira at Factor Libre S.L.
|
||||
|
||||
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.
|
||||
|
||||
This module is part of the `OCA/connector <https://github.com/OCA/connector/tree/16.0/connector>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
from . import components
|
||||
from . import models
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# Copyright 2013 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
{
|
||||
"name": "Connector",
|
||||
"version": "16.0.1.0.0",
|
||||
"author": "Camptocamp,Odoo Community Association (OCA)",
|
||||
"website": "https://github.com/OCA/connector",
|
||||
"license": "LGPL-3",
|
||||
"category": "Generic Modules",
|
||||
"depends": ["mail", "queue_job", "component", "component_event"],
|
||||
"data": [
|
||||
"security/connector_security.xml",
|
||||
"views/connector_menu.xml",
|
||||
"views/res_partner_views.xml",
|
||||
],
|
||||
"installable": True,
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
from . import core
|
||||
from . import backend_adapter
|
||||
from . import binder
|
||||
from . import mapper
|
||||
from . import listener
|
||||
from . import locker
|
||||
from . import synchronizer
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
# Copyright 2013 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
"""
|
||||
|
||||
Backend Adapter
|
||||
===============
|
||||
|
||||
An external adapter has a common interface to speak with the backend.
|
||||
It translates the basic orders (search, read, write) to the protocol
|
||||
used by the backend.
|
||||
|
||||
"""
|
||||
|
||||
from odoo.addons.component.core import AbstractComponent
|
||||
|
||||
|
||||
class BackendAdapter(AbstractComponent):
|
||||
"""Base Backend Adapter for the connectors"""
|
||||
|
||||
_name = "base.backend.adapter"
|
||||
_inherit = "base.connector"
|
||||
_usage = "backend.adapter"
|
||||
|
||||
|
||||
# pylint: disable=W8106
|
||||
class CRUDAdapter(AbstractComponent):
|
||||
"""Base External Adapter specialized in the handling
|
||||
of records on external systems.
|
||||
|
||||
This is an empty shell, Components can inherit and implement their own
|
||||
implementation for the methods.
|
||||
|
||||
"""
|
||||
|
||||
_name = "base.backend.adapter.crud"
|
||||
_inherit = "base.backend.adapter"
|
||||
_usage = "backend.adapter"
|
||||
|
||||
def search(self, *args, **kwargs):
|
||||
"""Search records according to some criterias
|
||||
and returns a list of ids"""
|
||||
raise NotImplementedError
|
||||
|
||||
def read(self, *args, **kwargs):
|
||||
"""Returns the information of a record"""
|
||||
raise NotImplementedError
|
||||
|
||||
def search_read(self, *args, **kwargs):
|
||||
"""Search records according to some criterias
|
||||
and returns their information"""
|
||||
raise NotImplementedError
|
||||
|
||||
def create(self, *args, **kwargs):
|
||||
"""Create a record on the external system"""
|
||||
raise NotImplementedError
|
||||
|
||||
def write(self, *args, **kwargs):
|
||||
"""Update records on the external system"""
|
||||
raise NotImplementedError
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
"""Delete a record on the external system"""
|
||||
raise NotImplementedError
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
# Copyright 2013 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
"""
|
||||
Binders
|
||||
=======
|
||||
|
||||
Binders are components that know how to find the external ID for an
|
||||
Odoo ID, how to find the Odoo ID for an external ID and how to
|
||||
create the binding between them.
|
||||
|
||||
"""
|
||||
|
||||
from odoo import fields, models, tools
|
||||
|
||||
from odoo.addons.component.core import AbstractComponent
|
||||
|
||||
|
||||
class Binder(AbstractComponent):
|
||||
"""For one record of a model, capable to find an external or
|
||||
internal id, or create the binding (link) between them
|
||||
|
||||
This is a default implementation that can be inherited or reimplemented
|
||||
in the connectors.
|
||||
|
||||
This implementation assumes that binding models are ``_inherits`` of
|
||||
the models they are binding.
|
||||
|
||||
"""
|
||||
|
||||
_name = "base.binder"
|
||||
_inherit = "base.connector"
|
||||
_usage = "binder"
|
||||
|
||||
_external_field = "external_id" # override in sub-classes
|
||||
_backend_field = "backend_id" # override in sub-classes
|
||||
_odoo_field = "odoo_id" # override in sub-classes
|
||||
_sync_date_field = "sync_date" # override in sub-classes
|
||||
|
||||
def to_internal(self, external_id, unwrap=False):
|
||||
"""Give the Odoo recordset for an external ID
|
||||
|
||||
:param external_id: external ID for which we want
|
||||
the Odoo ID
|
||||
:param unwrap: if True, returns the normal record
|
||||
else return the binding record
|
||||
:return: a recordset, depending on the value of unwrap,
|
||||
or an empty recordset if the external_id is not mapped
|
||||
:rtype: recordset
|
||||
"""
|
||||
context = self.env.context
|
||||
bindings = self.model.with_context(active_test=False).search(
|
||||
[
|
||||
(self._external_field, "=", tools.ustr(external_id)),
|
||||
(self._backend_field, "=", self.backend_record.id),
|
||||
]
|
||||
)
|
||||
if not bindings:
|
||||
if unwrap:
|
||||
return self.model.browse()[self._odoo_field]
|
||||
return self.model.browse()
|
||||
bindings.ensure_one()
|
||||
if unwrap:
|
||||
bindings = bindings[self._odoo_field]
|
||||
bindings = bindings.with_context(**context)
|
||||
return bindings
|
||||
|
||||
def to_external(self, binding, wrap=False):
|
||||
"""Give the external ID for an Odoo binding ID
|
||||
|
||||
:param binding: Odoo binding for which we want the external id
|
||||
:param wrap: if True, binding is a normal record, the
|
||||
method will search the corresponding binding and return
|
||||
the external id of the binding
|
||||
:return: external ID of the record
|
||||
"""
|
||||
if isinstance(binding, models.BaseModel):
|
||||
binding.ensure_one()
|
||||
else:
|
||||
binding = self.model.browse(binding)
|
||||
if wrap:
|
||||
binding = self.model.with_context(active_test=False).search(
|
||||
[
|
||||
(self._odoo_field, "=", binding.id),
|
||||
(self._backend_field, "=", self.backend_record.id),
|
||||
]
|
||||
)
|
||||
if not binding:
|
||||
return None
|
||||
binding.ensure_one()
|
||||
return binding[self._external_field]
|
||||
return binding[self._external_field]
|
||||
|
||||
def bind(self, external_id, binding):
|
||||
"""Create the link between an external ID and an Odoo ID
|
||||
|
||||
:param external_id: external id to bind
|
||||
:param binding: Odoo record to bind
|
||||
:type binding: int
|
||||
"""
|
||||
# Prevent False, None, or "", but not 0
|
||||
assert (
|
||||
external_id or external_id == 0
|
||||
) and binding, "external_id or binding missing, " "got: %s, %s" % (
|
||||
external_id,
|
||||
binding,
|
||||
)
|
||||
# avoid to trigger the export when we modify the `external_id`
|
||||
now_fmt = fields.Datetime.now()
|
||||
if isinstance(binding, models.BaseModel):
|
||||
binding.ensure_one()
|
||||
else:
|
||||
binding = self.model.browse(binding)
|
||||
binding.with_context(connector_no_export=True).write(
|
||||
{
|
||||
self._external_field: tools.ustr(external_id),
|
||||
self._sync_date_field: now_fmt,
|
||||
}
|
||||
)
|
||||
|
||||
def unwrap_binding(self, binding):
|
||||
"""For a binding record, gives the normal record.
|
||||
|
||||
Example: when called with a ``magento.product.product`` id,
|
||||
it will return the corresponding ``product.product`` id.
|
||||
|
||||
:param browse: when True, returns a browse_record instance
|
||||
rather than an ID
|
||||
"""
|
||||
if isinstance(binding, models.BaseModel):
|
||||
binding.ensure_one()
|
||||
else:
|
||||
binding = self.model.browse(binding)
|
||||
|
||||
return binding[self._odoo_field]
|
||||
|
||||
def unwrap_model(self):
|
||||
"""For a binding model, gives the normal model.
|
||||
|
||||
Example: when called on a binder for ``magento.product.product``,
|
||||
it will return ``product.product``.
|
||||
"""
|
||||
try:
|
||||
column = self.model._fields[self._odoo_field]
|
||||
except KeyError as err:
|
||||
raise ValueError(
|
||||
"Cannot unwrap model %s, because it has no %s fields"
|
||||
% (self.model._name, self._odoo_field)
|
||||
) from err
|
||||
return column.comodel_name
|
||||
|
|
@ -0,0 +1,136 @@
|
|||
# Copyright 2017 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
"""
|
||||
|
||||
Base Component
|
||||
==============
|
||||
|
||||
The connector proposes a 'base' Component, which can be used in
|
||||
the ``_inherit`` of your own components. This is not a
|
||||
requirement. It is already inherited by every component
|
||||
provided by the Connector.
|
||||
|
||||
Components are organized according to different usages. The connector suggests
|
||||
5 main kinds of Components. Each might have a few different usages. You can be
|
||||
as creative as you want when it comes to creating new ones though.
|
||||
|
||||
One "usage" is responsible for a specific work, and alongside with the
|
||||
collection (the backend) and the model, the usage will be used to find the
|
||||
needed component for a task.
|
||||
|
||||
Some of the Components have an implementation in the ``Connector`` addon, but
|
||||
some are empty shells that need to be implemented in the different connectors.
|
||||
|
||||
The usual categories are:
|
||||
|
||||
:py:class:`~connector.components.binder.Binder`
|
||||
The ``binders`` give the external ID or Odoo ID from respectively an
|
||||
Odoo ID or an external ID. A default implementation is available.
|
||||
|
||||
Most common usages:
|
||||
|
||||
* ``binder``
|
||||
|
||||
:py:class:`~connector.components.mapper.Mapper`
|
||||
The ``mappers`` transform a external record into an Odoo record or
|
||||
conversely.
|
||||
|
||||
Most common usages:
|
||||
|
||||
* ``import.mapper``
|
||||
* ``export.mapper``
|
||||
|
||||
:py:class:`~connector.components.backend_adapter.BackendAdapter`
|
||||
The ``backend.adapters`` implements the discussion with the ``backend's``
|
||||
APIs. They usually adapt their APIs to a common interface (CRUD).
|
||||
|
||||
Most common usages:
|
||||
|
||||
* ``backend.adapter``
|
||||
|
||||
:py:class:`~connector.components.synchronizer.Synchronizer`
|
||||
A ``synchronizer`` is the main piece of a synchronization. It
|
||||
orchestrates the flow of a synchronization and use the other
|
||||
Components
|
||||
|
||||
Most common usages:
|
||||
|
||||
* ``record.importer``
|
||||
* ``record.exporter``
|
||||
* ``batch.importer``
|
||||
* ``batch.exporter``
|
||||
|
||||
The possibilities for components do not stop there, look at the
|
||||
:class:`~connector.components.locker.RecordLocker` for an example of
|
||||
single-purpose, decoupled component.
|
||||
|
||||
|
||||
"""
|
||||
|
||||
from odoo.addons.component.core import AbstractComponent
|
||||
from odoo.addons.queue_job.exception import RetryableJobError
|
||||
|
||||
from ..database import pg_try_advisory_lock
|
||||
|
||||
|
||||
class BaseConnectorComponent(AbstractComponent):
|
||||
"""Base component for the connector
|
||||
|
||||
Is inherited by every components of the Connector (Binder, Mapper, ...)
|
||||
and adds a few methods which are of common usage in the connectors.
|
||||
|
||||
"""
|
||||
|
||||
_name = "base.connector"
|
||||
|
||||
@property
|
||||
def backend_record(self):
|
||||
"""Backend record we are working with"""
|
||||
# backward compatibility
|
||||
return self.work.collection
|
||||
|
||||
def binder_for(self, model=None):
|
||||
"""Shortcut to get Binder for a model
|
||||
|
||||
Equivalent to: ``self.component(usage='binder', model_name='xxx')``
|
||||
|
||||
"""
|
||||
return self.component(usage="binder", model_name=model)
|
||||
|
||||
def advisory_lock_or_retry(self, lock, retry_seconds=1):
|
||||
"""Acquire a Postgres transactional advisory lock or retry job
|
||||
|
||||
When the lock cannot be acquired, it raises a
|
||||
:exc:`odoo.addons.queue_job.exception.RetryableJobError` so the job
|
||||
is retried after n ``retry_seconds``.
|
||||
|
||||
Usage example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
lock_name = 'import_record({}, {}, {}, {})'.format(
|
||||
self.backend_record._name,
|
||||
self.backend_record.id,
|
||||
self.model._name,
|
||||
self.external_id,
|
||||
)
|
||||
self.advisory_lock_or_retry(lock_name, retry_seconds=2)
|
||||
|
||||
See :func:`odoo.addons.connector.connector.pg_try_advisory_lock` for
|
||||
details.
|
||||
|
||||
:param lock: The lock name. Can be anything convertible to a
|
||||
string. It needs to represent what should not be synchronized
|
||||
concurrently, usually the string will contain at least: the
|
||||
action, the backend name, the backend id, the model name, the
|
||||
external id
|
||||
:param retry_seconds: number of seconds after which a job should
|
||||
be retried when the lock cannot be acquired.
|
||||
"""
|
||||
if not pg_try_advisory_lock(self.env, lock):
|
||||
raise RetryableJobError(
|
||||
"Could not acquire advisory lock",
|
||||
seconds=retry_seconds,
|
||||
ignore_retry=True,
|
||||
)
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
# Copyright 2013 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
"""
|
||||
Listeners
|
||||
=========
|
||||
|
||||
Listeners are Components notified when events happen.
|
||||
Documentation in :mod:`odoo.addons.component_event.components.event`
|
||||
|
||||
The base listener for the connectors add a method
|
||||
:meth:`ConnectorListener.no_connector_export` which can be used with
|
||||
:func:`odoo.addons.component_event.skip_if`.
|
||||
|
||||
|
||||
"""
|
||||
|
||||
from odoo.addons.component.core import AbstractComponent
|
||||
|
||||
|
||||
class ConnectorListener(AbstractComponent):
|
||||
"""Base Backend Adapter for the connectors"""
|
||||
|
||||
_name = "base.connector.listener"
|
||||
_inherit = ["base.connector", "base.event.listener"]
|
||||
|
||||
def no_connector_export(self, record):
|
||||
"""Return if the 'connector_no_export' has been set in context
|
||||
|
||||
To be used with :func:`odoo.addons.component_event.skip_if`
|
||||
on Events::
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
from odoo.addons.component_event import skip_if
|
||||
|
||||
|
||||
class MyEventListener(Component):
|
||||
_name = 'my.event.listener'
|
||||
_inherit = 'base.connector.event.listener'
|
||||
_apply_on = ['magento.res.partner']
|
||||
|
||||
@skip_if(lambda: self, record, *args, **kwargs:
|
||||
self.no_connector_export(record))
|
||||
def on_record_write(self, record, fields=None):
|
||||
record.with_delay().export_record()
|
||||
|
||||
"""
|
||||
return record.env.context.get("no_connector_export") or record.env.context.get(
|
||||
"connector_no_export"
|
||||
)
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
# Copyright 2018 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
import logging
|
||||
|
||||
import psycopg2
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
from ..exception import RetryableJobError
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class RecordLocker(Component):
|
||||
"""Component allowing to lock record(s) for the current transaction
|
||||
|
||||
Example of usage::
|
||||
|
||||
self.component('record.locker').lock(self.records)
|
||||
|
||||
See the definition of :meth:`~lock` for details.
|
||||
"""
|
||||
|
||||
_name = "base.record.locker"
|
||||
_inherit = ["base.connector"]
|
||||
_usage = "record.locker"
|
||||
|
||||
def lock(self, records, seconds=None, ignore_retry=True):
|
||||
"""Lock the records.
|
||||
|
||||
Lock the record so we are sure that only one job is running for this
|
||||
record(s) if concurrent jobs have to run a job for the same record(s).
|
||||
When concurrent jobs try to work on the same record(s), the first one
|
||||
will lock and proceed, the others will fail to acquire it and will be
|
||||
retried later
|
||||
(:exc:`~odoo.addons.queue_job.exception.RetryableJobError` is raised).
|
||||
|
||||
The lock is using a ``FOR UPDATE NOWAIT`` so any concurrent transaction
|
||||
trying FOR UPDATE/UPDATE will be rejected until the current transaction
|
||||
is committed or rollbacked.
|
||||
|
||||
A classical use case for this is to prevent concurrent exports.
|
||||
|
||||
The following parameters are forwarded to the exception
|
||||
:exc:`~odoo.addons.queue_job.exception.RetryableJobError`
|
||||
|
||||
:param seconds: In case of retry because the lock cannot be acquired,
|
||||
in how many seconds it must be retried. If not set,
|
||||
the queue_job configuration is used.
|
||||
:param ignore_retry: If True, the retry counter of the job will not be
|
||||
increased.
|
||||
"""
|
||||
sql = "SELECT id FROM %s WHERE ID IN %%s FOR UPDATE NOWAIT" % self.model._table
|
||||
try:
|
||||
self.env.cr.execute(sql, (tuple(records.ids),), log_exceptions=False)
|
||||
except psycopg2.OperationalError as err:
|
||||
_logger.info(
|
||||
"A concurrent job is already working on the same "
|
||||
"record (%s with one id in %s). Job delayed later.",
|
||||
self.model._name,
|
||||
tuple(records.ids),
|
||||
)
|
||||
raise RetryableJobError(
|
||||
"A concurrent job is already working on the same record "
|
||||
"(%s with one id in %s). The job will be retried later."
|
||||
% (self.model._name, tuple(records.ids)),
|
||||
seconds=seconds,
|
||||
ignore_retry=ignore_retry,
|
||||
) from err
|
||||
1054
odoo-bringout-oca-connector-connector/connector/components/mapper.py
Normal file
|
|
@ -0,0 +1,446 @@
|
|||
# Copyright 2013 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
"""
|
||||
|
||||
Synchronizer
|
||||
============
|
||||
|
||||
A synchronizer orchestrates a synchronization with a backend. It's the actor
|
||||
who runs the flow and glues the logic of an import or export (or else).
|
||||
It uses other components for specialized tasks.
|
||||
|
||||
For instance, it will use the mappings to convert the data between both
|
||||
systems, the backend adapters to read or write data on the backend and the
|
||||
binders to create the link between them.
|
||||
|
||||
"""
|
||||
import logging
|
||||
from contextlib import contextmanager
|
||||
|
||||
import psycopg2
|
||||
|
||||
import odoo
|
||||
from odoo import _
|
||||
|
||||
from odoo.addons.component.core import AbstractComponent
|
||||
|
||||
from ..exception import IDMissingInBackend, RetryableJobError
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Synchronizer(AbstractComponent):
|
||||
"""Base class for synchronizers"""
|
||||
|
||||
_name = "base.synchronizer"
|
||||
_inherit = "base.connector"
|
||||
|
||||
#: usage of the component used as mapper, can be customized in sub-classes
|
||||
_base_mapper_usage = "mapper"
|
||||
#: usage of the component used as backend adapter,
|
||||
#: can be customized in sub-classes
|
||||
_base_backend_adapter_usage = "backend.adapter"
|
||||
|
||||
def __init__(self, work_context):
|
||||
super(Synchronizer, self).__init__(work_context)
|
||||
self._backend_adapter = None
|
||||
self._binder = None
|
||||
self._mapper = None
|
||||
|
||||
def run(self):
|
||||
"""Run the synchronization"""
|
||||
raise NotImplementedError
|
||||
|
||||
@property
|
||||
def mapper(self):
|
||||
"""Return an instance of ``Mapper`` for the synchronization.
|
||||
|
||||
The instantiation is delayed because some synchronizations do
|
||||
not need such an unit and the unit may not exist.
|
||||
|
||||
It looks for a Component with ``_usage`` being equal to
|
||||
``_base_mapper_usage``.
|
||||
|
||||
:rtype: :py:class:`odoo.addons.component.core.Component`
|
||||
"""
|
||||
if self._mapper is None:
|
||||
self._mapper = self.component(usage=self._base_mapper_usage)
|
||||
return self._mapper
|
||||
|
||||
@property
|
||||
def binder(self):
|
||||
"""Return an instance of ``Binder`` for the synchronization.
|
||||
|
||||
The instantiations is delayed because some synchronizations do
|
||||
not need such an unit and the unit may not exist.
|
||||
|
||||
:rtype: :py:class:`odoo.addons.component.core.Component`
|
||||
"""
|
||||
if self._binder is None:
|
||||
self._binder = self.binder_for()
|
||||
return self._binder
|
||||
|
||||
@property
|
||||
def backend_adapter(self):
|
||||
"""Return an instance of ``BackendAdapter`` for the
|
||||
synchronization.
|
||||
|
||||
The instantiations is delayed because some synchronizations do
|
||||
not need such an unit and the unit may not exist.
|
||||
|
||||
It looks for a Component with ``_usage`` being equal to
|
||||
``_base_backend_adapter_usage``.
|
||||
|
||||
:rtype: :py:class:`odoo.addons.component.core.Component`
|
||||
"""
|
||||
if self._backend_adapter is None:
|
||||
self._backend_adapter = self.component(
|
||||
usage=self._base_backend_adapter_usage
|
||||
)
|
||||
return self._backend_adapter
|
||||
|
||||
|
||||
class Exporter(AbstractComponent):
|
||||
"""Synchronizer for exporting data from Odoo to a backend"""
|
||||
|
||||
_name = "base.exporter"
|
||||
_inherit = "base.synchronizer"
|
||||
_usage = "exporter"
|
||||
#: usage of the component used as mapper, can be customized in sub-classes
|
||||
_base_mapper_usage = "export.mapper"
|
||||
|
||||
|
||||
class GenericExporter(AbstractComponent):
|
||||
"""Generic Synchronizer for exporting data from Odoo to a backend"""
|
||||
|
||||
_name = "generic.exporter"
|
||||
_inherit = "base.exporter"
|
||||
_default_binding_field = None
|
||||
|
||||
def __init__(self, working_context):
|
||||
super(GenericExporter, self).__init__(working_context)
|
||||
self.binding = None
|
||||
self.external_id = None
|
||||
|
||||
def _should_import(self):
|
||||
return False
|
||||
|
||||
def _delay_import(self):
|
||||
"""Schedule an import of the record.
|
||||
|
||||
Adapt in the sub-classes when the model is not imported
|
||||
using ``import_record``.
|
||||
"""
|
||||
# force is True because the sync_date will be more recent
|
||||
# so the import would be skipped
|
||||
assert self.external_id
|
||||
self.binding.with_delay().import_record(
|
||||
self.backend_record, self.external_id, force=True
|
||||
)
|
||||
|
||||
def run(self, binding, *args, **kwargs):
|
||||
"""Run the synchronization
|
||||
|
||||
:param binding: binding record to export
|
||||
"""
|
||||
self.binding = binding
|
||||
|
||||
self.external_id = self.binder.to_external(self.binding)
|
||||
try:
|
||||
should_import = self._should_import()
|
||||
except IDMissingInBackend:
|
||||
self.external_id = None
|
||||
should_import = False
|
||||
if should_import:
|
||||
self._delay_import()
|
||||
|
||||
result = self._run(*args, **kwargs)
|
||||
|
||||
self.binder.bind(self.external_id, self.binding)
|
||||
# Commit so we keep the external ID when there are several
|
||||
# exports (due to dependencies) and one of them fails.
|
||||
# The commit will also release the lock acquired on the binding
|
||||
# record
|
||||
if not odoo.tools.config["test_enable"]:
|
||||
self.env.cr.commit() # pylint: disable=E8102
|
||||
|
||||
self._after_export()
|
||||
return result
|
||||
|
||||
def _run(self, fields=None):
|
||||
"""Flow of the synchronization, implemented in inherited classes"""
|
||||
assert self.binding
|
||||
|
||||
if not self.external_id:
|
||||
fields = None # should be created with all the fields
|
||||
|
||||
if self._has_to_skip():
|
||||
return
|
||||
|
||||
# export the missing linked resources
|
||||
self._export_dependencies()
|
||||
|
||||
# prevent other jobs to export the same record
|
||||
# will be released on commit (or rollback)
|
||||
self._lock()
|
||||
|
||||
map_record = self._map_data()
|
||||
|
||||
if self.external_id:
|
||||
record = self._update_data(map_record, fields=fields)
|
||||
if not record:
|
||||
return _("Nothing to export.")
|
||||
self._update(record)
|
||||
else:
|
||||
record = self._create_data(map_record, fields=fields)
|
||||
if not record:
|
||||
return _("Nothing to export.")
|
||||
self.external_id = self._create(record)
|
||||
return _("Record exported with ID %s on Backend.") % self.external_id
|
||||
|
||||
def _after_export(self):
|
||||
"""Can do several actions after exporting a record on the backend"""
|
||||
|
||||
def _lock(self):
|
||||
"""Lock the binding record.
|
||||
|
||||
Lock the binding record so we are sure that only one export
|
||||
job is running for this record if concurrent jobs have to export the
|
||||
same record.
|
||||
|
||||
When concurrent jobs try to export the same record, the first one
|
||||
will lock and proceed, the others will fail to lock and will be
|
||||
retried later.
|
||||
|
||||
This behavior works also when the export becomes multilevel
|
||||
with :meth:`_export_dependencies`. Each level will set its own lock
|
||||
on the binding record it has to export.
|
||||
|
||||
"""
|
||||
sql = "SELECT id FROM %s WHERE ID = %%s FOR UPDATE NOWAIT" % self.model._table
|
||||
try:
|
||||
self.env.cr.execute(sql, (self.binding.id,), log_exceptions=False)
|
||||
except psycopg2.OperationalError as err:
|
||||
_logger.info(
|
||||
"A concurrent job is already exporting the same "
|
||||
"record (%s with id %s). Job delayed later.",
|
||||
self.model._name,
|
||||
self.binding.id,
|
||||
)
|
||||
raise RetryableJobError(
|
||||
"A concurrent job is already exporting the same record "
|
||||
"(%s with id %s). The job will be retried later."
|
||||
% (self.model._name, self.binding.id)
|
||||
) from err
|
||||
|
||||
def _has_to_skip(self):
|
||||
"""Return True if the export can be skipped"""
|
||||
return False
|
||||
|
||||
@contextmanager
|
||||
def _retry_unique_violation(self):
|
||||
"""Context manager: catch Unique constraint error and retry the
|
||||
job later.
|
||||
|
||||
When we execute several jobs workers concurrently, it happens
|
||||
that 2 jobs are creating the same record at the same time (binding
|
||||
record created by :meth:`_export_dependency`), resulting in:
|
||||
|
||||
IntegrityError: duplicate key value violates unique
|
||||
constraint "my_backend_product_product_odoo_uniq"
|
||||
DETAIL: Key (backend_id, odoo_id)=(1, 4851) already exists.
|
||||
|
||||
In that case, we'll retry the import just later.
|
||||
|
||||
.. warning:: The unique constraint must be created on the
|
||||
binding record to prevent 2 bindings to be created
|
||||
for the same External record.
|
||||
|
||||
"""
|
||||
try:
|
||||
yield
|
||||
except psycopg2.IntegrityError as err:
|
||||
if err.pgcode == psycopg2.errorcodes.UNIQUE_VIOLATION:
|
||||
raise RetryableJobError(
|
||||
"A database error caused the failure of the job:\n"
|
||||
"%s\n\n"
|
||||
"Likely due to 2 concurrent jobs wanting to create "
|
||||
"the same record. The job will be retried later." % err
|
||||
) from err
|
||||
else:
|
||||
raise
|
||||
|
||||
def _export_dependency(
|
||||
self,
|
||||
relation,
|
||||
binding_model,
|
||||
component_usage="record.exporter",
|
||||
binding_field=None,
|
||||
binding_extra_vals=None,
|
||||
):
|
||||
"""
|
||||
Export a dependency. The exporter class is a subclass of
|
||||
``GenericExporter``. If a more precise class need to be defined,
|
||||
it can be passed to the ``exporter_class`` keyword argument.
|
||||
|
||||
.. warning:: a commit is done at the end of the export of each
|
||||
dependency. The reason for that is that we pushed a record
|
||||
on the backend and we absolutely have to keep its ID.
|
||||
|
||||
So you *must* take care not to modify the Odoo
|
||||
database during an export, excepted when writing
|
||||
back the external ID or eventually to store
|
||||
external data that we have to keep on this side.
|
||||
|
||||
You should call this method only at the beginning
|
||||
of the exporter synchronization,
|
||||
in :meth:`~._export_dependencies`.
|
||||
|
||||
:param relation: record to export if not already exported
|
||||
:type relation: :py:class:`odoo.models.BaseModel`
|
||||
:param binding_model: name of the binding model for the relation
|
||||
:type binding_model: str | unicode
|
||||
:param component_usage: 'usage' to look for to find the Component to
|
||||
for the export, by default 'record.exporter'
|
||||
:type exporter: str | unicode
|
||||
:param binding_field: name of the one2many field on a normal
|
||||
record that points to the binding record
|
||||
(default: my_backend_bind_ids).
|
||||
It is used only when the relation is not
|
||||
a binding but is a normal record.
|
||||
:type binding_field: str | unicode
|
||||
:binding_extra_vals: In case we want to create a new binding
|
||||
pass extra values for this binding
|
||||
:type binding_extra_vals: dict
|
||||
"""
|
||||
if binding_field is None:
|
||||
binding_field = self._default_binding_field
|
||||
if not relation:
|
||||
return
|
||||
rel_binder = self.binder_for(binding_model)
|
||||
# wrap is typically True if the relation is for instance a
|
||||
# 'product.product' record but the binding model is
|
||||
# 'my_bakend.product.product'
|
||||
wrap = relation._name != binding_model
|
||||
|
||||
if wrap and hasattr(relation, binding_field):
|
||||
domain = [
|
||||
("odoo_id", "=", relation.id),
|
||||
("backend_id", "=", self.backend_record.id),
|
||||
]
|
||||
binding = self.env[binding_model].search(domain)
|
||||
if binding:
|
||||
assert len(binding) == 1, (
|
||||
"only 1 binding for a backend is " "supported in _export_dependency"
|
||||
)
|
||||
# we are working with a unwrapped record (e.g.
|
||||
# product.category) and the binding does not exist yet.
|
||||
# Example: I created a product.product and its binding
|
||||
# my_backend.product.product and we are exporting it, but we need
|
||||
# to create the binding for the product.category on which it
|
||||
# depends.
|
||||
else:
|
||||
bind_values = {
|
||||
"backend_id": self.backend_record.id,
|
||||
"odoo_id": relation.id,
|
||||
}
|
||||
if binding_extra_vals:
|
||||
bind_values.update(binding_extra_vals)
|
||||
# If 2 jobs create it at the same time, retry
|
||||
# one later. A unique constraint (backend_id,
|
||||
# odoo_id) should exist on the binding model
|
||||
with self._retry_unique_violation():
|
||||
binding = (
|
||||
self.env[binding_model]
|
||||
.with_context(connector_no_export=True)
|
||||
.sudo()
|
||||
.create(bind_values)
|
||||
)
|
||||
# Eager commit to avoid having 2 jobs
|
||||
# exporting at the same time. The constraint
|
||||
# will pop if an other job already created
|
||||
# the same binding. It will be caught and
|
||||
# raise a RetryableJobError.
|
||||
if not odoo.tools.config["test_enable"]:
|
||||
self.env.cr.commit() # pylint: disable=E8102
|
||||
else:
|
||||
# If my_backend_bind_ids does not exist we are typically in a
|
||||
# "direct" binding (the binding record is the same record).
|
||||
# If wrap is True, relation is already a binding record.
|
||||
binding = relation
|
||||
|
||||
if not rel_binder.to_external(binding):
|
||||
exporter = self.component(usage=component_usage, model_name=binding_model)
|
||||
exporter.run(binding)
|
||||
|
||||
def _export_dependencies(self):
|
||||
"""Export the dependencies for the record"""
|
||||
return
|
||||
|
||||
def _map_data(self):
|
||||
"""Returns an instance of
|
||||
:py:class:`~odoo.addons.connector.components.mapper.MapRecord`
|
||||
|
||||
"""
|
||||
return self.mapper.map_record(self.binding)
|
||||
|
||||
def _validate_create_data(self, data):
|
||||
"""Check if the values to import are correct
|
||||
|
||||
Pro-actively check before the ``Model.create`` if some fields
|
||||
are missing or invalid
|
||||
|
||||
Raise `InvalidDataError`
|
||||
"""
|
||||
return
|
||||
|
||||
def _validate_update_data(self, data):
|
||||
"""Check if the values to import are correct
|
||||
|
||||
Pro-actively check before the ``Model.update`` if some fields
|
||||
are missing or invalid
|
||||
|
||||
Raise `InvalidDataError`
|
||||
"""
|
||||
return
|
||||
|
||||
def _create_data(self, map_record, fields=None, **kwargs):
|
||||
"""Get the data to pass to :py:meth:`_create`"""
|
||||
return map_record.values(for_create=True, fields=fields, **kwargs)
|
||||
|
||||
def _create(self, data):
|
||||
"""Create the External record"""
|
||||
# special check on data before export
|
||||
self._validate_create_data(data)
|
||||
return self.backend_adapter.create(data)
|
||||
|
||||
def _update_data(self, map_record, fields=None, **kwargs):
|
||||
"""Get the data to pass to :py:meth:`_update`"""
|
||||
return map_record.values(fields=fields, **kwargs)
|
||||
|
||||
def _update(self, data):
|
||||
"""Update an External record"""
|
||||
assert self.external_id
|
||||
# special check on data before export
|
||||
self._validate_update_data(data)
|
||||
self.backend_adapter.write(self.external_id, data)
|
||||
|
||||
|
||||
class Importer(AbstractComponent):
|
||||
"""Synchronizer for importing data from a backend to Odoo"""
|
||||
|
||||
_name = "base.importer"
|
||||
_inherit = "base.synchronizer"
|
||||
_usage = "importer"
|
||||
#: usage of the component used as mapper, can be customized in sub-classes
|
||||
_base_mapper_usage = "import.mapper"
|
||||
|
||||
|
||||
class Deleter(AbstractComponent):
|
||||
"""Synchronizer for deleting a record on the backend"""
|
||||
|
||||
_name = "base.deleter"
|
||||
_inherit = "base.synchronizer"
|
||||
#: usage of the component used as mapper, can be customized in sub-classes
|
||||
_usage = "deleter"
|
||||
78
odoo-bringout-oca-connector-connector/connector/database.py
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
# Copyright 2013 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
import hashlib
|
||||
import logging
|
||||
import struct
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def pg_try_advisory_lock(env, lock):
|
||||
"""Try to acquire a Postgres transactional advisory lock.
|
||||
|
||||
The function tries to acquire a lock, returns a boolean indicating
|
||||
if it could be obtained or not. An acquired lock is released at the
|
||||
end of the transaction.
|
||||
|
||||
A typical use is to acquire a lock at the beginning of an importer
|
||||
to prevent 2 jobs to do the same import at the same time. Since the
|
||||
record doesn't exist yet, we can't put a lock on a record, so we put
|
||||
an advisory lock.
|
||||
|
||||
Example:
|
||||
- Job 1 imports Partner A
|
||||
- Job 2 imports Partner B
|
||||
- Partner A has a category X which happens not to exist yet
|
||||
- Partner B has a category X which happens not to exist yet
|
||||
- Job 1 import category X as a dependency
|
||||
- Job 2 import category X as a dependency
|
||||
|
||||
Since both jobs are executed concurrently, they both create a record
|
||||
for category X so we have duplicated records. With this lock:
|
||||
|
||||
- Job 1 imports Partner A, it acquires a lock for this partner
|
||||
- Job 2 imports Partner B, it acquires a lock for this partner
|
||||
- Partner A has a category X which happens not to exist yet
|
||||
- Partner B has a category X which happens not to exist yet
|
||||
- Job 1 import category X as a dependency, it acquires a lock for
|
||||
this category
|
||||
- Job 2 import category X as a dependency, try to acquire a lock
|
||||
but can't, Job 2 is retried later, and when it is retried, it
|
||||
sees the category X created by Job 1.
|
||||
|
||||
The lock is acquired until the end of the transaction.
|
||||
|
||||
Usage example:
|
||||
|
||||
::
|
||||
|
||||
lock_name = 'import_record({}, {}, {}, {})'.format(
|
||||
self.backend_record._name,
|
||||
self.backend_record.id,
|
||||
self.model._name,
|
||||
self.external_id,
|
||||
)
|
||||
if pg_try_advisory_lock(lock_name):
|
||||
# do sync
|
||||
else:
|
||||
raise RetryableJobError('Could not acquire advisory lock',
|
||||
seconds=2,
|
||||
ignore_retry=True)
|
||||
|
||||
:param env: the Odoo Environment
|
||||
:param lock: The lock name. Can be anything convertible to a
|
||||
string. It needs to represents what should not be synchronized
|
||||
concurrently so usually the string will contain at least: the
|
||||
action, the backend type, the backend id, the model name, the
|
||||
external id
|
||||
:return True/False whether lock was acquired.
|
||||
"""
|
||||
hasher = hashlib.sha1(str(lock).encode())
|
||||
# pg_lock accepts an int8 so we build an hash composed with
|
||||
# contextual information and we throw away some bits
|
||||
int_lock = struct.unpack("q", hasher.digest()[:8])
|
||||
|
||||
env.cr.execute("SELECT pg_try_advisory_xact_lock(%s);", (int_lock,))
|
||||
acquired = env.cr.fetchone()[0]
|
||||
return acquired
|
||||
153
odoo-bringout-oca-connector-connector/connector/doc/Makefile
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Connectors.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Connectors.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/Connectors"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Connectors"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/09_datamodel.png
vendored
Normal file
|
After Width: | Height: | Size: 375 KiB |
3
odoo-bringout-oca-connector-connector/connector/doc/_static/connector_style.css
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
.navbar span.navbar-text {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/akretion_logo.png
vendored
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/c2c_square_baseline_192.jpg
vendored
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/logo-debonix.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/magentoerpconnect.png
vendored
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/magentoerpconnect150.png
vendored
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/prestashoperpconnect.png
vendored
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/prestashoperpconnect150.png
vendored
Normal file
|
After Width: | Height: | Size: 15 KiB |
20
odoo-bringout-oca-connector-connector/connector/doc/_templates/layout.html
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{% extends "!layout.html" %} {%- block extrahead %} {{ super() }}
|
||||
<script>
|
||||
(function (i, s, o, g, r, a, m) {
|
||||
i["GoogleAnalyticsObject"] = r;
|
||||
(i[r] =
|
||||
i[r] ||
|
||||
function () {
|
||||
(i[r].q = i[r].q || []).push(arguments);
|
||||
}),
|
||||
(i[r].l = 1 * new Date());
|
||||
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
|
||||
a.async = 1;
|
||||
a.src = g;
|
||||
m.parentNode.insertBefore(a, m);
|
||||
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
|
||||
|
||||
ga("create", "UA-7628916-3", "odoo-connector.com");
|
||||
ga("send", "pageview");
|
||||
</script>
|
||||
{% endblock %}
|
||||
28
odoo-bringout-oca-connector-connector/connector/doc/_templates/navbar.html
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
{% extends "!navbar.html" %} {% block navbartoc %}
|
||||
<li class="dropdown">
|
||||
<a
|
||||
role="button"
|
||||
id="dLabelTranslations"
|
||||
data-toggle="dropdown"
|
||||
data-target="#"
|
||||
href="#"
|
||||
>Translations<b class="caret"></b
|
||||
></a>
|
||||
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabelTranslations">
|
||||
<li><a class="reference" href="http://odoo-connector.com">English</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/fr">French</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown">
|
||||
<a role="button" id="dLabelVersions" data-toggle="dropdown" data-target="#" href="#"
|
||||
>Version<b class="caret"></b
|
||||
></a>
|
||||
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabeVersions">
|
||||
<li><a class="reference" href="http://odoo-connector.com/8.0">8.0</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/9.0">9.0</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/10.0">10.0</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/11.0">11.0</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/12.0">12.0</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
{{ super() }} {% endblock %}
|
||||
3
odoo-bringout-oca-connector-connector/connector/doc/_themes/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
*.pyc
|
||||
*.pyo
|
||||
.DS_Store
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
######
|
||||
Models
|
||||
######
|
||||
|
||||
.. _api-backend-model:
|
||||
|
||||
*************
|
||||
Backend Model
|
||||
*************
|
||||
|
||||
|
||||
.. autoclass:: connector.models.backend_model.ConnectorBackend
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
.. _api-binding-model:
|
||||
|
||||
*************
|
||||
Binding Model
|
||||
*************
|
||||
|
||||
.. autoclass:: connector.models.backend_model.ExternalBinding
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
########
|
||||
Channels
|
||||
########
|
||||
|
||||
This is the API documentation for the job channels and the
|
||||
scheduling mechanisms of the job runner.
|
||||
|
||||
These classes are not intended for use by module developers.
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.jobrunner.channels
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
.. _api-component:
|
||||
|
||||
##########
|
||||
Components
|
||||
##########
|
||||
|
||||
Components are the blocks allowing to build a flexible and
|
||||
well decoupled code. They are based on the ``component`` addon, which
|
||||
can as well be used separately.
|
||||
|
||||
|
||||
***************
|
||||
Core Components
|
||||
***************
|
||||
|
||||
.. automodule:: connector.components.core
|
||||
:members:
|
||||
:undoc-members:
|
||||
:exclude-members: _module
|
||||
:show-inheritance:
|
||||
:private-members:
|
||||
|
||||
|
||||
********************
|
||||
Connector Components
|
||||
********************
|
||||
|
||||
.. automodule:: connector.components.binder
|
||||
:members:
|
||||
:undoc-members:
|
||||
:exclude-members: _module
|
||||
:show-inheritance:
|
||||
:private-members:
|
||||
|
||||
.. automodule:: connector.components.mapper
|
||||
:members:
|
||||
:member-order: groupwise
|
||||
:exclude-members: MappingDefinition, Mapper, ImportMapper, ExportMapper, MapChild, ImportMapChild, ExportMapChild
|
||||
:show-inheritance:
|
||||
|
||||
.. autoclass:: Mapper
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: ImportMapper
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: ExportMapper
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: MapChild
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: ImportMapChild
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: ExportMapChild
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
|
||||
.. automodule:: connector.components.backend_adapter
|
||||
:members:
|
||||
:show-inheritance:
|
||||
:exclude-members: BackendAdapter, CRUDAdapter
|
||||
|
||||
.. autoclass:: BackendAdapter
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: CRUDAdapter
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. automodule:: connector.components.synchronizer
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:exclude-members: _module
|
||||
:private-members:
|
||||
|
||||
.. automodule:: connector.components.listener
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:exclude-members: _module
|
||||
:private-members:
|
||||
|
||||
.. automodule:: connector.components.locker
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:exclude-members: _module
|
||||
:private-members:
|
||||
|
||||
***************************
|
||||
Components Collection Model
|
||||
***************************
|
||||
|
||||
.. automodule:: odoo.addons.component.models.collection
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
|
||||
*********************
|
||||
Components Exceptions
|
||||
*********************
|
||||
|
||||
.. automodule:: odoo.addons.component.exception
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
********************
|
||||
Components Internals
|
||||
********************
|
||||
|
||||
Low-level APIs of the Components.
|
||||
|
||||
.. automodule:: odoo.addons.component.core
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
.. automodule:: odoo.addons.component.builder
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
.. _api-event:
|
||||
|
||||
######
|
||||
Events
|
||||
######
|
||||
|
||||
Events is an implementation of an Observer pattern for Odoo.
|
||||
|
||||
|
||||
**********
|
||||
Components
|
||||
**********
|
||||
|
||||
.. automodule:: odoo.addons.component_event.components.event
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
|
||||
**********************
|
||||
Odoo Models Extensions
|
||||
**********************
|
||||
|
||||
.. automodule:: odoo.addons.component_event.models.base
|
||||
|
||||
.. autoclass:: Base
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
Exceptions
|
||||
==========
|
||||
|
||||
.. automodule:: connector.exception
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
.. _api-queue:
|
||||
|
||||
#####
|
||||
Queue
|
||||
#####
|
||||
|
||||
Models
|
||||
******
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.models.base
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.models.queue_job
|
||||
|
||||
.. autoclass:: QueueJob
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
|
||||
***
|
||||
Job
|
||||
***
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.job
|
||||
|
||||
Decorators
|
||||
==========
|
||||
|
||||
.. autofunction:: job
|
||||
.. autofunction:: related_action
|
||||
|
||||
Internals
|
||||
=========
|
||||
|
||||
.. autoclass:: DelayableRecordset
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoclass:: Job
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
27
odoo-bringout-oca-connector-connector/connector/doc/bazaar
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# This viminfo file was generated by Vim 7.4.
|
||||
# You may edit it if you're careful!
|
||||
|
||||
# Value of 'encoding' when this file was written
|
||||
*encoding=utf-8
|
||||
|
||||
|
||||
# hlsearch on (H) or off (h):
|
||||
~h
|
||||
# Command Line History (newest to oldest):
|
||||
:q!
|
||||
|
||||
# Search String History (newest to oldest):
|
||||
|
||||
# Expression History (newest to oldest):
|
||||
|
||||
# Input Line History (newest to oldest):
|
||||
|
||||
# Input Line History (newest to oldest):
|
||||
|
||||
# Registers:
|
||||
|
||||
# File marks:
|
||||
|
||||
# Jumplist (newest first):
|
||||
|
||||
# History of marks within files (newest to oldest):
|
||||
376
odoo-bringout-oca-connector-connector/connector/doc/conf.py
Normal file
|
|
@ -0,0 +1,376 @@
|
|||
#
|
||||
# Connectors documentation build configuration file, created by
|
||||
# sphinx-quickstart on Mon Feb 4 11:35:44 2013.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
# flake8: noqa
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
import sphinx_bootstrap_theme
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
sys.path.append(os.path.abspath("_themes"))
|
||||
|
||||
MANIFEST_FILES = ["__manifest__.py", "__odoo__.py", "__openerp__.py"]
|
||||
|
||||
|
||||
def is_module(path):
|
||||
"""return False if the path doesn't contain an odoo module, and the full
|
||||
path to the module manifest otherwise"""
|
||||
|
||||
if not os.path.isdir(path):
|
||||
return False
|
||||
files = os.listdir(path)
|
||||
filtered = [x for x in files if x in (MANIFEST_FILES + ["__init__.py"])]
|
||||
if len(filtered) == 2 and "__init__.py" in filtered:
|
||||
return os.path.join(path, next(x for x in filtered if x != "__init__.py"))
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def is_installable_module(path):
|
||||
"""return False if the path doesn't contain an installable odoo module,
|
||||
and the full path to the module manifest otherwise"""
|
||||
manifest_path = is_module(path)
|
||||
if manifest_path:
|
||||
manifest = ast.literal_eval(open(manifest_path).read())
|
||||
if manifest.get("installable", True):
|
||||
return manifest_path
|
||||
return False
|
||||
|
||||
|
||||
if os.environ.get("TRAVIS_BUILD_DIR") and os.environ.get("VERSION"):
|
||||
# build from travis
|
||||
repos_home = os.environ["HOME"]
|
||||
deps_path = os.path.join(repos_home, "dependencies")
|
||||
odoo_folder = "odoo-" + os.environ.get("VERSION")
|
||||
odoo_root = os.path.join(repos_home, odoo_folder)
|
||||
build_path = os.environ["TRAVIS_BUILD_DIR"]
|
||||
else:
|
||||
# build from dev
|
||||
odoo_root = os.path.abspath("../../../../src")
|
||||
deps_path = os.path.abspath("../../..")
|
||||
build_path = os.path.abspath("../..")
|
||||
|
||||
addons_paths = []
|
||||
|
||||
|
||||
def add_path(*paths):
|
||||
addons_paths.append(os.path.join(*paths))
|
||||
|
||||
|
||||
add_path(odoo_root, "odoo", "addons")
|
||||
add_path(odoo_root, "addons")
|
||||
add_path(build_path)
|
||||
|
||||
deps_repos = [
|
||||
repo
|
||||
for repo in os.listdir(deps_path)
|
||||
if os.path.isdir(os.path.join(deps_path, repo)) and not repo.startswith(".")
|
||||
]
|
||||
|
||||
for repo in deps_repos:
|
||||
add_path(deps_path, repo)
|
||||
|
||||
addons = [
|
||||
x
|
||||
for x in os.listdir(build_path)
|
||||
if not x.startswith((".", "__")) and is_installable_module(x)
|
||||
]
|
||||
|
||||
|
||||
# sphinxodoo.ext.autodoc variables
|
||||
sphinxodoo_root_path = odoo_root
|
||||
sphinxodoo_addons = addons
|
||||
sphinxodoo_addons_path = addons_paths
|
||||
sys.path.append(build_path)
|
||||
|
||||
|
||||
# -- General configuration -----------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
# needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = [
|
||||
"sphinx.ext.autodoc",
|
||||
"sphinx.ext.intersphinx",
|
||||
"sphinx.ext.todo",
|
||||
"sphinx.ext.viewcode",
|
||||
"sphinxodoo.ext.autodoc",
|
||||
]
|
||||
|
||||
todo_include_todos = False
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ["_templates"]
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = ".rst"
|
||||
|
||||
# The encoding of source files.
|
||||
# source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = "index"
|
||||
|
||||
# autodoc options
|
||||
autodoc_member_order = "bysource"
|
||||
|
||||
# General information about the project.
|
||||
project = "Connector"
|
||||
copyright = "2013, Camptocamp SA" # pylint: disable=W0622
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = ""
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = ""
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
language = "en"
|
||||
locale_dirs = ["locale"]
|
||||
gettext_compact = True
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
# today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
# today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
exclude_patterns = ["_build"]
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||
# default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
# add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
# add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
# show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = "sphinx"
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
# modindex_common_prefix = []
|
||||
|
||||
|
||||
# -- Options for HTML output ---------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = "bootstrap"
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
html_theme_options = {
|
||||
# Navigation bar title. (Default: ``project`` value)
|
||||
"navbar_title": "Odoo Connector",
|
||||
# Tab name for entire site. (Default: "Site")
|
||||
"navbar_site_name": "Site",
|
||||
# Global TOC depth for "site" navbar tab. (Default: 1)
|
||||
# Switching to -1 shows all levels.
|
||||
"globaltoc_depth": 2,
|
||||
# Include hidden TOCs in Site navbar?
|
||||
#
|
||||
# Note: If this is "false", you cannot have mixed ``:hidden:`` and
|
||||
# non-hidden ``toctree`` directives in the same page, or else the build
|
||||
# will break.
|
||||
#
|
||||
# Values: "true" (default) or "false"
|
||||
"globaltoc_includehidden": "true",
|
||||
# HTML navbar class (Default: "navbar") to attach to <div> element.
|
||||
# For black navbar, do "navbar navbar-inverse"
|
||||
"navbar_class": "navbar",
|
||||
# Fix navigation bar to top of page?
|
||||
# Values: "true" (default) or "false"
|
||||
"navbar_fixed_top": "true",
|
||||
# Location of link to source.
|
||||
# Options are "nav" (default), "footer" or anything else to exclude.
|
||||
"source_link_position": "footer",
|
||||
# Bootswatch (http://bootswatch.com/) theme.
|
||||
#
|
||||
# Options are nothing with "" (default) or the name of a valid theme
|
||||
# such as "amelia" or "cosmo".
|
||||
#
|
||||
# Note that this is served off CDN, so won't be available offline.
|
||||
"bootswatch_theme": "united",
|
||||
}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
# html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
# html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
# html_logo = None
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
# html_favicon = None
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ["_static"]
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
# html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
# html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
# html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
# html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
# html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
# html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
# html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
# html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
# html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
# html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
# html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
# html_file_suffix = None
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = "connector-doc"
|
||||
|
||||
|
||||
# -- Options for LaTeX output --------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#'papersize': 'letterpaper',
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#'pointsize': '10pt',
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#'preamble': '',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||
latex_documents = [
|
||||
("index", "Connector.tex", "Connector Documentation", "Camptocamp SA", "manual")
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
# latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
# latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
# latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
# latex_show_urls = False
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
# latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
# latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output --------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [("index", "connector", "Connector Documentation", ["Camptocamp SA"], 1)]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
# man_show_urls = False
|
||||
|
||||
|
||||
# -- Options for Texinfo output ------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(
|
||||
"index",
|
||||
"Connector",
|
||||
"Connector Documentation",
|
||||
"Camptocamp SA",
|
||||
"Connector",
|
||||
"Framework for Odoo Connectors.",
|
||||
"Miscellaneous",
|
||||
)
|
||||
]
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
# texinfo_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
# texinfo_domain_indices = True
|
||||
|
||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||
# texinfo_show_urls = 'footnote'
|
||||
|
||||
|
||||
# Example configuration for intersphinx: refer to the Python standard library.
|
||||
intersphinx_mapping = {
|
||||
"http://docs.python.org/": None,
|
||||
"odooweb": ("https://www.odoo.com/documentation/10.0/", None),
|
||||
"odoodev": ("https://www.odoo.com/documentation/10.0/", None),
|
||||
"connectormagento": ("http://www.odoo-magento-connector.com", None),
|
||||
}
|
||||
|
|
@ -0,0 +1,152 @@
|
|||
.. _bootstrap-connector:
|
||||
|
||||
|
||||
########################
|
||||
Boostrapping a connector
|
||||
########################
|
||||
|
||||
We'll see the steps to bootstrap a new connector.
|
||||
|
||||
Besides that, you may want to use the existing connectors to have some
|
||||
real implementation examples:
|
||||
|
||||
* `Odoo Magento Connector`_
|
||||
* `Odoo Prestashop Connector`_
|
||||
|
||||
Be aware that the connector API has changed in Odoo 10.0, so the examples
|
||||
might be outdated.
|
||||
|
||||
Some boilerplate is necessary, so this document will guide you through
|
||||
some steps. Please also take a look on the :ref:`naming-convention`.
|
||||
|
||||
For the sake of the example, we'll imagine we have to synchronize
|
||||
Odoo with a coffee machine.
|
||||
|
||||
*************
|
||||
Odoo Manifest
|
||||
*************
|
||||
|
||||
As we want to synchronize Odoo with a coffee machine, we'll name
|
||||
our connector connector_coffee.
|
||||
|
||||
First, we need to create the Odoo addons itself, editing the
|
||||
``connector_coffee/__manifest__.py`` manifest.
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
:emphasize-lines: 3,4
|
||||
|
||||
{'name': 'Coffee Connector',
|
||||
'version': '1.0.0',
|
||||
'category': 'Connector',
|
||||
'depends': ['connector',
|
||||
],
|
||||
'author': 'Myself',
|
||||
'license': 'LGPL-3',
|
||||
'description': """
|
||||
Coffee Connector
|
||||
================
|
||||
|
||||
Connect Odoo to my coffee machine.
|
||||
|
||||
Features:
|
||||
|
||||
* Pour a coffee when Odoo is busy for too long
|
||||
""",
|
||||
'data': [],
|
||||
'installable': True,
|
||||
}
|
||||
|
||||
Nothing special but 2 things to note:
|
||||
|
||||
* It depends from ``connector``. ``connector`` itself depends from
|
||||
``queue_job``, ``component`` and ``component_event``. ``queue_job`` is in the
|
||||
`OCA/queue`_ repository.
|
||||
* The module category should be ``Connector``.
|
||||
|
||||
Of course, we also need to create the ``__init__.py`` file where we will
|
||||
put the imports of our python modules.
|
||||
|
||||
.. _OCA/queue: https://github.com/OCA/queue
|
||||
|
||||
|
||||
*************
|
||||
Backend Model
|
||||
*************
|
||||
|
||||
Reference: :ref:`api-backend-model`
|
||||
|
||||
We need to create a Backend representing the external service. Every record we
|
||||
synchronize will be linked with a record of ``coffee.backend``. This backend
|
||||
is our *collection* of Components.
|
||||
|
||||
The ``coffee.backend`` model is an ``_inherit`` of ``connector.backend``. In
|
||||
``connector_coffee/models/coffee_binding.py``::
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class CoffeeBackend(models.Model):
|
||||
_name = 'coffee.backend'
|
||||
_description = 'Coffee Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
location = fields.Char(string='Location')
|
||||
username = fields.Char(string='Username')
|
||||
password = fields.Char(string='Password')
|
||||
|
||||
Notes:
|
||||
|
||||
* We can other fields for the configuration of the connection or the
|
||||
synchronizations.
|
||||
|
||||
****************
|
||||
Abstract Binding
|
||||
****************
|
||||
|
||||
Reference: :ref:`api-binding-model`
|
||||
|
||||
In order to share common features between all the bindings (see
|
||||
:ref:`binding`), create an abstract binding model.
|
||||
|
||||
It can be as follows (in ``connector_coffee/models/coffee_binding.py``)::
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class CoffeeBinding(models.AbstractModel):
|
||||
_name = 'coffee.binding'
|
||||
_inherit = 'external.binding'
|
||||
_description = 'Coffee Binding (abstract)'
|
||||
|
||||
# odoo_id = odoo-side id must be declared in concrete model
|
||||
backend_id = fields.Many2one(
|
||||
comodel_name='coffee.backend',
|
||||
string='Coffee Backend',
|
||||
required=True,
|
||||
ondelete='restrict',
|
||||
)
|
||||
coffee_id = fields.Integer(string='ID in the Coffee Machine',
|
||||
index=True)
|
||||
|
||||
Notes:
|
||||
|
||||
* This model inherit from ``external.binding``
|
||||
* Any number of fields or methods can be added
|
||||
|
||||
|
||||
**********
|
||||
Components
|
||||
**********
|
||||
|
||||
Reference: :ref:`api-component`
|
||||
|
||||
We'll probably need to create synchronizers, mappers, backend adapters,
|
||||
binders and maybe our own kind of components.
|
||||
|
||||
Their implementation can vary from a project to another. Have a look on the
|
||||
`Odoo Magento Connector`_ and `Odoo Prestashop Connector`_ projects.
|
||||
|
||||
|
||||
.. _`Odoo Magento Connector`: https://github.com/OCA/connector-magento
|
||||
.. _`Odoo Prestashop Connector`: https://github.com/OCA/connector-prestashop
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
.. _code-overview:
|
||||
|
||||
#############
|
||||
Code Overview
|
||||
#############
|
||||
|
||||
Some simple code examples.
|
||||
|
||||
***************************
|
||||
Trigger and listen an event
|
||||
***************************
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class AccountInvoice(models.Model):
|
||||
_inherit = 'account.invoice'
|
||||
|
||||
@api.multi
|
||||
def action_invoice_paid(self):
|
||||
res = super(AccountInvoice, self).action_invoice_paid()
|
||||
for record in self:
|
||||
self._event('on_invoice_paid').notify(record)
|
||||
return res
|
||||
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
|
||||
class MyEventListener(Component):
|
||||
_name = 'my.event.listener'
|
||||
_inherit = 'base.event.listener'
|
||||
|
||||
def on_invoice_paid(self, record):
|
||||
_logger.info('invoice %s has been paid!', record.name)
|
||||
|
||||
Ref: :ref:`api-event`
|
||||
|
||||
|
||||
*************************
|
||||
Delay an Asynchronous Job
|
||||
*************************
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.queue_job.job import job
|
||||
|
||||
|
||||
class AccountInvoice(models.Model):
|
||||
_inherit = 'account.invoice'
|
||||
|
||||
@job
|
||||
@api.multi
|
||||
def export_payment(self):
|
||||
self.ensure_one()
|
||||
_logger.info("I'm exporting the payment for %s", self.name)
|
||||
|
||||
@api.multi
|
||||
def action_invoice_paid(self):
|
||||
res = super(AccountInvoice, self).action_invoice_paid()
|
||||
for record in self:
|
||||
record.with_delay(priority=5).export_payment()
|
||||
return res
|
||||
|
||||
Ref: :ref:`api-queue`
|
||||
|
||||
********************
|
||||
Work with components
|
||||
********************
|
||||
|
||||
This is a highly simplified version of a micro-connector, without using
|
||||
events or jobs, for the sake of the example.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import AbstractComponent
|
||||
|
||||
|
||||
class MagentoBackend(models.Model):
|
||||
_name = 'magento.backend'
|
||||
_description = 'Magento Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
location = fields.Char(string='Location', required=True)
|
||||
username = fields.Char(string='Username')
|
||||
password = fields.Char(string='Password')
|
||||
|
||||
def import_partner(self, external_id):
|
||||
with self.work_on(model_name='magento.res.partner') as work:
|
||||
importer = work.component(usage='record.importer')
|
||||
# returns an instance of PartnerImporter, which has been
|
||||
# found with:the collection name (magento.backend, the model,
|
||||
# and the usage).
|
||||
importer.run(partner_id)
|
||||
|
||||
# the next 2 components are abstract and are used by inheritance
|
||||
# by the others
|
||||
class BaseMagentoConnectorComponent(AbstractComponent):
|
||||
# same inheritance than Odoo models
|
||||
_name = 'base.magento.connector'
|
||||
_inherit = 'base.connector'
|
||||
# subscribe to:
|
||||
_collection = 'magento.backend'
|
||||
# the collection will be inherited to the components below,
|
||||
# because they inherit from this component
|
||||
|
||||
|
||||
class GenericAdapter(AbstractComponent):
|
||||
# same inheritance than Odoo models
|
||||
_name = 'magento.adapter'
|
||||
_inherit = ['base.backend.adapter', 'base.magento.connector']
|
||||
# usage is used for lookups of components
|
||||
_usage = 'backend.adapter'
|
||||
|
||||
_magento_model = None
|
||||
|
||||
def _call(self, *args, **kwargs):
|
||||
location = self.backend_record.location
|
||||
# use client API
|
||||
|
||||
def read(self, fields=None):
|
||||
""" Search records according to some criterias
|
||||
and returns a list of ids
|
||||
|
||||
:rtype: list
|
||||
"""
|
||||
return self._call('%s.info' % self._magento_model, fields)
|
||||
|
||||
|
||||
# these are the components we need for our synchronization
|
||||
class PartnerAdapter(Component):
|
||||
_name = 'magento.partner.adapter'
|
||||
_inherit = 'magento.adapter'
|
||||
_apply_on = ['magento.res.partner']
|
||||
_magento_model = 'customer'
|
||||
|
||||
|
||||
class PartnerMapper(Component):
|
||||
_name = 'magento.partner.import.mapper'
|
||||
_inherit = 'magento.import.mapper' # parent component omitted for brevity
|
||||
_apply_on = ['magento.res.partner']
|
||||
_usage = 'import.mapper'
|
||||
|
||||
|
||||
class PartnerBinder(Component):
|
||||
_name = 'magento.partner.binder'
|
||||
_inherit = 'magento.binder' # parent component omitted for brevity
|
||||
_apply_on = ['magento.res.partner']
|
||||
_usage = 'binder'
|
||||
|
||||
|
||||
class PartnerImporter(Component):
|
||||
_name = 'magento.partner.importer'
|
||||
_inherit = 'magento.importer' # parent component omitted for brevity
|
||||
_apply_on = ['magento.res.partner']
|
||||
_usage = 'record.importer'
|
||||
|
||||
def run(self, external_id):
|
||||
# get the components we need for the sync
|
||||
|
||||
# this one knows how to speak to magento
|
||||
backend_adapter = self.component(usage='backend.adapter')
|
||||
# this one knows how to convert magento data to odoo data
|
||||
mapper = self.component(usage='import.mapper')
|
||||
# this one knows how to link magento/odoo records
|
||||
binder = self.component(usage='binder')
|
||||
|
||||
# read external data from magento
|
||||
external_data = backend_adapter.read(external_id)
|
||||
# convert to odoo data
|
||||
internal_data = mapper.map_record(external_data).values()
|
||||
# find if the magento id already exists in odoo
|
||||
binding = binder.to_internal(external_id)
|
||||
if binding:
|
||||
# if yes, we update it
|
||||
binding.write(internal_data)
|
||||
else:
|
||||
# or we create it
|
||||
binding = self.model.create(internal_data)
|
||||
# finally, we bind both, so the next time we import
|
||||
# the record, we'll update the same record instead of
|
||||
# creating a new one
|
||||
binder.bind(external_id, binding)
|
||||
|
||||
|
||||
Ref: :ref:`api-component`
|
||||
|
|
@ -0,0 +1,242 @@
|
|||
.. _concepts:
|
||||
|
||||
##################
|
||||
Connector Concepts
|
||||
##################
|
||||
|
||||
The framework to develop connectors is decoupled in small pieces of
|
||||
codes interacting together. Each of them can be used or not in an
|
||||
implementation.
|
||||
|
||||
An example of implementation is the `Odoo Magento Connector`_.
|
||||
|
||||
This document describes them from a high-level point of view and gives
|
||||
pointers to more concrete 'how-to' or small tutorials.
|
||||
|
||||
.. _`Odoo Magento Connector`: http://www.odoo-magento-connector.com
|
||||
|
||||
******
|
||||
Events
|
||||
******
|
||||
|
||||
Reference: :ref:`api-event`
|
||||
|
||||
Events are hooks in Odoo on which we can plug some actions. They are
|
||||
based on an Observer pattern.
|
||||
|
||||
The same event can be shared across several connectors, easing their
|
||||
implementation.
|
||||
For instance, the module connector_ecommerce_ which extends the
|
||||
framework with common e-commerce capabilities, adds its own events
|
||||
common to e-commerce.
|
||||
|
||||
A connectors developer is mostly interested by:
|
||||
|
||||
* adding and listening to events (see :ref:`api-event`)
|
||||
|
||||
.. _jobs-queue:
|
||||
|
||||
**********
|
||||
Jobs Queue
|
||||
**********
|
||||
|
||||
Reference: :ref:`api-queue`
|
||||
|
||||
This feature is part of a standalone addon, but is a prerequisite for
|
||||
the connector framework.
|
||||
|
||||
The module is ``queue_job`` in https://github.com/OCA/queue.
|
||||
|
||||
A connectors developer is mostly interested by:
|
||||
|
||||
* Delay a job (see the decorator :py:func:`~odoo.addons.queue_job.job.job`)
|
||||
|
||||
|
||||
*******
|
||||
Backend
|
||||
*******
|
||||
|
||||
Reference: :ref:`api-backend-model`
|
||||
|
||||
The Backend Model is what represents the external service / system we
|
||||
synchronize with. The name on the backend indicates what is the collection the
|
||||
Components will be registered into. Put another way: every backend has its own
|
||||
collection of Components.
|
||||
|
||||
It must use an ``_inherit`` on ``connector.backend``.
|
||||
|
||||
``connector.backend`` inherits
|
||||
:class:`odoo.addons.component.models.collection.Collection` which has a
|
||||
:meth:`odoo.addons.component.models.collection.Collection.work_on` that will be
|
||||
used as entrypoint for the component system. This method returns a
|
||||
:class:`~odoo.addons.component.core.WorkContext`
|
||||
|
||||
***********
|
||||
WorkContext
|
||||
***********
|
||||
|
||||
Reference: :class:`~odoo.addons.component.core.WorkContext`
|
||||
|
||||
A :class:`~odoo.addons.component.core.WorkContext` is the work environment or
|
||||
context that will be passed transversally through all the components. This is
|
||||
also the entrypoint to the component system.
|
||||
|
||||
A connectors developer is mostly interested by:
|
||||
|
||||
* Get a Component from a WorkContext (:py:meth:`~odoo.addons.component.core.WorkContext.component`)
|
||||
|
||||
*********
|
||||
Component
|
||||
*********
|
||||
|
||||
Reference: :ref:`api-component`
|
||||
|
||||
:py:class:`~odoo.addons.component.core.Component` are pluggable classes used
|
||||
for the synchronizations with the external systems (or anything!)
|
||||
|
||||
The Components system has been extracted in a standalone addon (``component``),
|
||||
which means it can really be used in a totally different way.
|
||||
|
||||
The connector defines some base components, which you can find below. Note
|
||||
that you can and are encouraged to define your own Components as well.
|
||||
|
||||
Mappings
|
||||
========
|
||||
|
||||
The base class is :py:class:`connector.components.mapper.Mapper`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.import.mapper'``
|
||||
* ``_inherit = 'base.export.mapper'``
|
||||
|
||||
And the usages for the lookups are:
|
||||
|
||||
* ``import.mapper``
|
||||
* ``export.mapper``
|
||||
|
||||
A mapping translates an external record to an Odoo record and
|
||||
conversely.
|
||||
|
||||
It supports:
|
||||
|
||||
direct mappings
|
||||
Fields *a* is written in field *b*.
|
||||
|
||||
method mappings
|
||||
A method is used to convert one or many fields to one or many
|
||||
fields, with transformation.
|
||||
It can be filtered, for example only applied when the record is
|
||||
created or when the source fields are modified.
|
||||
|
||||
submapping
|
||||
a sub-record (lines of a sale order) is converted using another
|
||||
Mapper
|
||||
|
||||
See the documentation of the class for more details.
|
||||
|
||||
Synchronizers
|
||||
=============
|
||||
|
||||
The base class is :py:class:`connector.components.synchronizer.Synchronizer`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.importer'``
|
||||
* ``_inherit = 'base.exporter'``
|
||||
|
||||
And the usages for the lookups are:
|
||||
|
||||
* ``importer``
|
||||
* ``exporter``
|
||||
|
||||
However, in your implementation, it is advised to use more refined usages such
|
||||
as:
|
||||
|
||||
* ``record.importer``
|
||||
* ``record.exporter``
|
||||
* ``batch.importer``
|
||||
* ``batch.exporter``
|
||||
* ..
|
||||
|
||||
A synchronizer orchestrates a synchronization with a backend. It can be a
|
||||
record's import or export, a deletion of something, or anything else. For
|
||||
instance, it will use the mappings to convert the data between both systems,
|
||||
the backend adapters to read or write data on the backend and the binders to
|
||||
create the link between them.
|
||||
|
||||
Backend Adapters
|
||||
================
|
||||
|
||||
The base class is
|
||||
:py:class:`connector.components.backend_adapter.BackendAdapter`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.backend.adapter'``
|
||||
* ``_inherit = 'base.backend.adapter.crud'``
|
||||
|
||||
And the usages for the lookups are:
|
||||
|
||||
* ``backend.adapter``
|
||||
|
||||
An external adapter has a common interface to speak with the backend.
|
||||
It translates the basic orders (search, read, write) to the protocol
|
||||
used by the backend.
|
||||
|
||||
Binders
|
||||
=======
|
||||
|
||||
The base class is
|
||||
:py:class:`connector.components.binder.Binder`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.binder'``
|
||||
|
||||
And the usages for the lookups are:
|
||||
|
||||
* ``binder``
|
||||
|
||||
Binders are components that know how to find the external ID for an
|
||||
Odoo ID, how to find the Odoo ID for an external ID and how to
|
||||
create the binding between them. A default implementation is
|
||||
available and can be inherited if needed.
|
||||
|
||||
Listeners
|
||||
=========
|
||||
|
||||
The base class is
|
||||
:py:class:`connector.components.listener.ConnectorListener`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.connector.listener'``
|
||||
|
||||
This is where you will register your event listeners.
|
||||
See :mod:`addons.component_event.components.event`.
|
||||
|
||||
|
||||
.. _binding:
|
||||
|
||||
********
|
||||
Bindings
|
||||
********
|
||||
|
||||
Reference: :ref:`api-binding-model`
|
||||
|
||||
A binding represents the link of a record between Odoo and a backend.
|
||||
|
||||
The proposed implementation for the connectors widely use the
|
||||
`_inherits` capabilities.
|
||||
|
||||
Say we import a customer from *Magento*.
|
||||
|
||||
We create a `magento.res.partner` model, which `_inherits`
|
||||
`res.partner`.
|
||||
|
||||
This model, called a *binding* model, knows the ID of the partner in
|
||||
Odoo, the ID in Magento and the relation to the backend model.
|
||||
|
||||
It also stores all the necessary metadata related to this customer
|
||||
coming from Magento.
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
.. _jobrunner:
|
||||
|
||||
|
||||
#######################################
|
||||
Configuring channels and the job runner
|
||||
#######################################
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.jobrunner.runner
|
||||
|
||||
|
||||
What is a channel?
|
||||
------------------
|
||||
|
||||
.. autoclass:: odoo.addons.queue_job.jobrunner.channels.Channel
|
||||
:noindex:
|
||||
|
||||
How to configure Channels?
|
||||
--------------------------
|
||||
|
||||
The ``ODOO_QUEUE_JOB_CHANNELS`` environment variable must be
|
||||
set before starting Odoo in order to enable the job runner
|
||||
and configure the capacity of the channels.
|
||||
|
||||
The general syntax is ``channel(.subchannel)*(:capacity(:key(=value)?)*)?,...``.
|
||||
|
||||
Intermediate subchannels which are not configured explicitly are autocreated
|
||||
with an unlimited capacity (except the root channel which if not configured gets
|
||||
a default capacity of 1).
|
||||
|
||||
A delay in seconds between jobs can be set at the channel level with
|
||||
the ``throttle`` key.
|
||||
|
||||
Example ``ODOO_QUEUE_JOB_CHANNELS``:
|
||||
|
||||
* ``root:4``: allow up to 4 concurrent jobs in the root channel.
|
||||
* ``root:4,root.sub:2``: allow up to 4 concurrent jobs in the root channel and
|
||||
up to 2 concurrent jobs in the channel named ``root.sub``.
|
||||
* ``sub:2``: the same.
|
||||
* ``root:4:throttle=2``: wait at least 2 seconds before starting the next job
|
||||
|
|
@ -0,0 +1,900 @@
|
|||
.. _migration-guide:
|
||||
|
||||
########################################
|
||||
Migration Guide to the new Connector API
|
||||
########################################
|
||||
|
||||
During the year 2017, the connector evolved greatly.
|
||||
We can recognize three different aspect of the framework, they all have been
|
||||
rewritten:
|
||||
|
||||
* The Job Queue API (:ref:`api-queue`)
|
||||
* The Event API (:ref:`api-event`)
|
||||
* The ``ConnectorUnit`` API, which is the core of the composability
|
||||
of the Connector. It has been replaced by a standalone addon
|
||||
called ``component``. (:ref:`api-component`)
|
||||
|
||||
The Connector has been splitted in different addons:
|
||||
|
||||
* ``queue_job`` in https://github.com/OCA/queue
|
||||
* ``component`` in the same repository
|
||||
* ``component_event`` in the same repository
|
||||
* ``connector`` uses the 3 addons and the parts specifics to the connectors
|
||||
|
||||
This guide will show how to migrate from the old API to the new one.
|
||||
|
||||
The previous API will stay until the migration to Odoo 11.0.
|
||||
|
||||
.. contents:: Sections:
|
||||
:local:
|
||||
:backlinks: top
|
||||
:depth: 2
|
||||
|
||||
**************
|
||||
Migrating Jobs
|
||||
**************
|
||||
|
||||
Jobs are now more integrated within the Odoo API. They are no longer
|
||||
standalone functions but are applied on methods of Models. Another change is
|
||||
that they have been extracted into their own addon, so obviously the Python
|
||||
paths change.
|
||||
|
||||
Declaration of a job
|
||||
====================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.queue.job import job, related_action
|
||||
from ..related_action import unwrap_binding, link
|
||||
|
||||
# function at module-level
|
||||
@job(default_channel='root.magento')
|
||||
@related_action(action=link)
|
||||
def import_record(session, model_name, backend_id, magento_id, force=False):
|
||||
""" Import a record from Magento """
|
||||
# ...
|
||||
|
||||
@job(default_channel='root.magento')
|
||||
@related_action(action=unwrap_binding)
|
||||
def export_record(session, model_name, binding_id, fields=None):
|
||||
""" Import a record from Magento """
|
||||
# ...
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.queue_job.job import job, related_action
|
||||
from odoo import api, models
|
||||
|
||||
|
||||
class MagentoBinding(models.AbstractModel):
|
||||
_name = 'magento.binding'
|
||||
_inherit = 'external.binding'
|
||||
_description = 'Magento Binding (abstract)'
|
||||
|
||||
@job(default_channel='root.magento')
|
||||
@related_action(action='related_action_magento_link')
|
||||
@api.model
|
||||
def import_record(self, backend, external_id, force=False):
|
||||
""" Import a Magento record """
|
||||
backend.ensure_one()
|
||||
# ...
|
||||
|
||||
@job(default_channel='root.magento')
|
||||
@related_action(action='related_action_unwrap_binding')
|
||||
@api.multi
|
||||
def export_record(self, fields=None):
|
||||
""" Export a record on Magento """
|
||||
self.ensure_one()
|
||||
# ...
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The job is declared on the generic abstract binding model from which all
|
||||
bindings inherit. This is not a requirement, but for this kind of job it is
|
||||
the perfect fit.
|
||||
* ``session``, ``model_name`` and ``binding_id`` are no longer required as they
|
||||
are already known in ``self``. Jobs can be used as well on ``@api.multi`` and
|
||||
``@api.model``.
|
||||
* Passing arguments as records is supported, in the new version of
|
||||
``import_record``, no need to browse on the backend if a record was passed
|
||||
* The action of a related action is now the name of a method on the
|
||||
``queue.job`` model.
|
||||
* If you need to share a job between several models, put them in an
|
||||
AbstractModel and add an ``_inherit`` on the models.
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :meth:`odoo.addons.queue_job.job.job`
|
||||
* :meth:`odoo.addons.queue_job.job.related_action`
|
||||
|
||||
|
||||
Invocation of a job
|
||||
===================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.session import ConnectorSession
|
||||
from .unit.export_synchronizer import export_record
|
||||
|
||||
|
||||
class MyBinding(models.Model):
|
||||
_name = 'my.binding'
|
||||
_inherit = 'magento.binding'
|
||||
|
||||
@api.multi
|
||||
def button_trigger_export_sync(self):
|
||||
session = ConnectorSession.from_env(self.env)
|
||||
export_record(session, binding._name, self.id, fields=['name'])
|
||||
|
||||
@api.multi
|
||||
def button_trigger_export_async(self):
|
||||
session = ConnectorSession.from_env(self.env)
|
||||
export_record.delay(session, self._name, self.id,
|
||||
fields=['name'], priority=12)
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class MyBinding(models.Model):
|
||||
_name = 'my.binding'
|
||||
|
||||
@api.multi
|
||||
def button_trigger_export_sync(self):
|
||||
self.export_record(fields=['name'])
|
||||
|
||||
@api.multi
|
||||
def button_trigger_export_async(self):
|
||||
self.with_delay(priority=12).export_record(fields=['name'])
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* No more imports are needed for the invocation
|
||||
* ``ConnectorSession`` is now dead
|
||||
* Arguments for the job (such as ``priority``) are no longer mixed with the
|
||||
arguments passed to the method
|
||||
* When the job is called on a "browse" record, the job will be executed
|
||||
on an instance of this record:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> binding = self.env['my.binding'].browse(1)
|
||||
>>> binding.button_trigger_export_async()
|
||||
|
||||
In the execution of the job:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
@job
|
||||
def export_record(self, fields=None):
|
||||
print self
|
||||
print fields
|
||||
# =>
|
||||
# my.binding,1
|
||||
# ['name']
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :meth:`odoo.addons.queue_job.job.job`
|
||||
* :meth:`odoo.addons.queue_job.models.base.Base.with_delay`
|
||||
|
||||
****************
|
||||
Migrating Events
|
||||
****************
|
||||
|
||||
Events are now handled by the ``component_event`` addon.
|
||||
|
||||
Triggering an event
|
||||
===================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
First you had to create an :class:`~odoo.addons.connector.event.Event` instance:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
on_record_create = Event()
|
||||
|
||||
And then import and trigger it, passing a lot of arguments to it:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.event import on_record_create
|
||||
|
||||
class Base(models.AbstractModel):
|
||||
""" The base model, which is implicitly inherited by all models. """
|
||||
_inherit = 'base'
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
record = super(Base, self).create(vals)
|
||||
on_record_create.fire(self.env, self._name, record.id, vals)
|
||||
return record
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class Base(models.AbstractModel):
|
||||
_inherit = 'base'
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
record = super(Base, self).create(vals)
|
||||
self._event('on_record_create').notify(record, fields=vals.keys())
|
||||
return record
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* No more imports are needed for the invocation
|
||||
Only the arguments you want to pass should be passed to
|
||||
:meth:`odoo.addons.component_event.components.event.CollectedEvents.notify`.
|
||||
* The name of the event must start with ``'on_'``
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :mod:`odoo.addons.component_event.components.event`
|
||||
|
||||
|
||||
Listening to an event
|
||||
=====================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.event import on_record_create
|
||||
|
||||
@on_record_create
|
||||
def delay_export(env, model_name, record_id, vals):
|
||||
if session.context.get('connector_no_export'):
|
||||
return
|
||||
fields = vals.keys()
|
||||
export_record.delay(session, model_name, record_id, fields=fields)
|
||||
|
||||
@on_something
|
||||
def do_anything(env, model_name, record_id):
|
||||
# ...
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
from odoo.addons.component_event import skip_if
|
||||
|
||||
class MagentoListener(Component):
|
||||
_name = 'magento.event.listener'
|
||||
_inherit = 'base.connector.listener'
|
||||
|
||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||
def on_record_create(self, record, fields=None):
|
||||
""" Called when a record is created """
|
||||
record.with_delay().export_record(fields=fields)
|
||||
|
||||
def on_something(self, record):
|
||||
# ...
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The listeners are now components
|
||||
* The name of the method is the same than the one notified in the previous
|
||||
section
|
||||
* A listener Component might container several listener methods
|
||||
* It must inherit from ``'base.event.listener'``, or one of its descendants.
|
||||
* The check of the key ``connector_no_export`` in the context can
|
||||
be replaced by the decorator :func:`odoo.addons.component_event.skip_if`
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :mod:`odoo.addons.component_event.components.event`
|
||||
|
||||
|
||||
Listening to an event only for some Models
|
||||
==========================================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.event import on_record_create
|
||||
|
||||
@on_record_create(model_names=['magento.address', 'magento.res.partner'])
|
||||
def delay_export(env, model_name, record_id, vals):
|
||||
if session.context.get('connector_no_export'):
|
||||
return
|
||||
fields = vals.keys()
|
||||
export_record.delay(session, model_name, record_id, fields=fields)
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
from odoo.addons.component_event import skip_if
|
||||
|
||||
class MagentoListener(Component):
|
||||
_name = 'magento.event.listener'
|
||||
_inherit = 'base.event.listener'
|
||||
_apply_on = ['magento.address', 'magento.res.partner']
|
||||
|
||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||
def on_record_create(self, record, fields=None):
|
||||
""" Called when a record is created """
|
||||
record.with_delay().export_record(fields=fields)
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* Same than previous example but we added ``_apply_on`` on the Component.
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :mod:`odoo.addons.component_event.components.event`
|
||||
|
||||
|
||||
********************
|
||||
Migrating Components
|
||||
********************
|
||||
|
||||
Backends
|
||||
========
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
You could have several versions for a backend:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
magento = backend.Backend('magento')
|
||||
""" Generic Magento Backend """
|
||||
|
||||
magento1700 = backend.Backend(parent=magento, version='1.7')
|
||||
""" Magento Backend for version 1.7 """
|
||||
|
||||
magento1900 = backend.Backend(parent=magento, version='1.9')
|
||||
""" Magento Backend for version 1.9 """
|
||||
|
||||
|
||||
|
||||
It was linked with a Backend model such as:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class MagentoBackend(models.Model):
|
||||
_name = 'magento.backend'
|
||||
_description = 'Magento Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
_backend_type = 'magento'
|
||||
|
||||
@api.model
|
||||
def select_versions(self):
|
||||
""" Available versions in the backend.
|
||||
Can be inherited to add custom versions. Using this method
|
||||
to add a version from an ``_inherit`` does not constrain
|
||||
to redefine the ``version`` field in the ``_inherit`` model.
|
||||
"""
|
||||
return [('1.7', '1.7+')]
|
||||
|
||||
version = fields.Selection(selection='select_versions', required=True)
|
||||
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
All the :class:`backend.Backend` instances must be deleted.
|
||||
|
||||
And the ``_backend_type`` must be removed from the Backend model.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class MagentoBackend(models.Model):
|
||||
_name = 'magento.backend'
|
||||
_description = 'Magento Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
@api.model
|
||||
def select_versions(self):
|
||||
""" Available versions in the backend.
|
||||
Can be inherited to add custom versions. Using this method
|
||||
to add a version from an ``_inherit`` does not constrain
|
||||
to redefine the ``version`` field in the ``_inherit`` model.
|
||||
"""
|
||||
return [('1.7', '1.7+')]
|
||||
|
||||
version = fields.Selection(selection='select_versions', required=True)
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The version is now optional in the Backend Models.
|
||||
* Backend Models are based on Component's Collections:
|
||||
:class:`odoo.addons.component.models.collection.Collection`
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
* :class:`odoo.addons.component.models.collection.Collection`
|
||||
|
||||
|
||||
Inheritance
|
||||
===========
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
You could inherit a ``ConnectorUnit`` by creating a custom Backend
|
||||
version and decorating your class with it
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
magento_custom = backend.Backend(parent=magento1700, version='custom')
|
||||
""" Custom Magento Backend """
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# base one
|
||||
@magento
|
||||
class MagentoPartnerAdapter(GenericAdapter):
|
||||
# ...
|
||||
|
||||
# other file...
|
||||
|
||||
from .backend import magento_custom
|
||||
|
||||
# custom one
|
||||
@magento_custom
|
||||
class MyPartnerAdapter(MagentoPartnerAdapter):
|
||||
# ...
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
You could also replace an existing class, this is mentionned in `Replace or
|
||||
unregister a component`_.
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
For an existing component:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MagentoPartnerAdapter(Component):
|
||||
_name = 'magento.partner.adapter'
|
||||
_inherit = 'magento.adapter'
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
You can extend it:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MyPartnerAdapter(Component):
|
||||
_inherit = 'magento.partner.adapter'
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
Or create a new different component with the existing one as base:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MyPartnerAdapter(Component):
|
||||
_name = 'my.magento.partner.adapter'
|
||||
_inherit = 'magento.partner.adapter'
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The inheritance is similar to the Odoo's one (without ``_inherits``.
|
||||
* All components have a Python inheritance on
|
||||
:class:`~odoo.addons.component.core.AbstractComponent` or
|
||||
:class:`~odoo.addons.component.core.Component`
|
||||
* The names are global (as in Odoo), so you should prefix them with a namespace
|
||||
* The name of the classes has no effect
|
||||
* As in Odoo Models, a Component can ``_inherit`` from a list of Components
|
||||
* All components implicitly inherits from a ``'base'`` component
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
* :class:`odoo.addons.component.core.AbstractComponent`
|
||||
|
||||
|
||||
|
||||
Entrypoint for working with components
|
||||
======================================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
Previously, when you had to work with ``ConnectorUnit`` from a Model or from a job,
|
||||
depending of the Odoo version you to:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.connector import ConnectorEnvironment
|
||||
|
||||
# ...
|
||||
|
||||
backend_record = session.env['magento.backend'].browse(backend_id)
|
||||
env = ConnectorEnvironment(backend_record, 'magento.res.partner')
|
||||
importer = env.get_connector_unit(MagentoImporter)
|
||||
importer.run(magento_id, force=force)
|
||||
|
||||
Or:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.connector import ConnectorEnvironment
|
||||
from odoo.addons.connector.session import ConnectorSession
|
||||
|
||||
#...
|
||||
|
||||
backend_record = session.env['magento.backend'].browse(backend_id)
|
||||
session = ConnectorSession.from_env(self.env)
|
||||
env = ConnectorEnvironment(backend_record, session, 'magento.res.partner')
|
||||
importer = env.get_connector_unit(MagentoImporter)
|
||||
importer.run(external_id, force=force)
|
||||
|
||||
Which was commonly abstracted in a helper function such as:
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def get_environment(session, model_name, backend_id):
|
||||
""" Create an environment to work with. """
|
||||
backend_record = session.env['magento.backend'].browse(backend_id)
|
||||
env = ConnectorEnvironment(backend_record, session, 'magento.res.partner')
|
||||
lang = backend_record.default_lang_id
|
||||
lang_code = lang.code if lang else 'en_US'
|
||||
if lang_code == session.context.get('lang'):
|
||||
return env
|
||||
else:
|
||||
with env.session.change_context(lang=lang_code):
|
||||
return env
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# ...
|
||||
backend_record = self.env['magento.backend'].browse(backend_id)
|
||||
with backend_record.work_on('magento.res.partner') as work:
|
||||
importer = work.component(usage='record.importer')
|
||||
importer.run(external_id, force=force)
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* And when you are already in a Component, refer to `Find a component`_
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :class:`~odoo.addons.component.core.WorkContext`
|
||||
|
||||
|
||||
Find a component
|
||||
================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
To find a ``ConnectorUnit``, you had to ask for given class or subclass:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# our ConnectorUnit to find
|
||||
@magento
|
||||
class MagentoPartnerAdapter(GenericAdapter):
|
||||
_model_name = ['magent.res.partner']
|
||||
|
||||
# other file...
|
||||
|
||||
def run(self, record):
|
||||
backend_adapter = self.unit_for(GenericAdapter)
|
||||
|
||||
It was searched for the current model and the current backend.
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
For an existing component:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
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']
|
||||
|
||||
# other file...
|
||||
|
||||
def run(self, record):
|
||||
backend_adapter = self.component(usage='backend.adapter')
|
||||
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The model is compared with the ``_apply_on`` attribute
|
||||
* The Backend is compared with the ``_collection`` attribute, it must
|
||||
have the same name than the Backend Model.
|
||||
* The ``_usage`` indicates what the purpose of the component is, and
|
||||
allow to find the correct one for our task. It allow more dynamic
|
||||
usages than the previous usage of a class.
|
||||
* Usually, the ``_usage`` and the ``_collection`` will be ``_inherit`` 'ed from
|
||||
a component (here from ``'magento.adapter``), so they won't need to be
|
||||
repeated in all Components.
|
||||
* A good idea is to have a base abstract Component for the Collection, then
|
||||
an abstract Component for every usage::
|
||||
|
||||
class BaseMagentoConnectorComponent(AbstractComponent):
|
||||
|
||||
_name = 'base.magento.connector'
|
||||
_inherit = 'base.connector'
|
||||
_collection = 'magento.backend'
|
||||
|
||||
class MagentoBaseExporter(AbstractComponent):
|
||||
""" Base exporter for Magento """
|
||||
|
||||
_name = 'magento.base.exporter'
|
||||
_inherit = ['base.exporter', 'base.magento.connector']
|
||||
_usage = 'record.exporter'
|
||||
|
||||
class MagentoImportMapper(AbstractComponent):
|
||||
_name = 'magento.import.mapper'
|
||||
_inherit = ['base.magento.connector', 'base.import.mapper']
|
||||
_usage = 'import.mapper'
|
||||
|
||||
# ...
|
||||
|
||||
* The main usages are:
|
||||
* import.mapper
|
||||
* export.mapper
|
||||
* backend.adapter
|
||||
* importer
|
||||
* exporter
|
||||
* binder
|
||||
* event.listener
|
||||
* But for the importer and exporter, I recommend to use more precise ones in
|
||||
the connectors: record.importer, record.exporter, batch.importer,
|
||||
batch.exporter
|
||||
* You are allowed to be creative with the ``_usage``, it's the key that will
|
||||
allow you to find the right one component you need. (e.g. on
|
||||
``stock.picking`` you need to 1. export the record, 2. export the tracking.
|
||||
Then use ``record.exporter`` and ``tracking.exporter``).
|
||||
* AbstractComponent will never be returned by a lookup
|
||||
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
* :class:`odoo.addons.component.core.AbstractComponent`
|
||||
|
||||
|
||||
Backend Versions
|
||||
================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
You could have several versions for a backend:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
magento = backend.Backend('magento')
|
||||
""" Generic Magento Backend """
|
||||
|
||||
magento1700 = backend.Backend(parent=magento, version='1.7')
|
||||
""" Magento Backend for version 1.7 """
|
||||
|
||||
magento1900 = backend.Backend(parent=magento, version='1.9')
|
||||
""" Magento Backend for version 1.9 """
|
||||
|
||||
|
||||
And use them for a class-level dynamic dispatch
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.magentoerpconnect.backend import magento1700, magento1900
|
||||
|
||||
@magento1700
|
||||
class PartnerAdapter1700(GenericAdapter):
|
||||
# ...
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
@magento1900
|
||||
class PartnerAdapter1900(GenericAdapter):
|
||||
# ...
|
||||
|
||||
def do_something(self):
|
||||
# do it that way
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
This feature has been removed, it introduced a lot of complexity (notably
|
||||
regarding inheritance) for few gain. The version is now optional on the
|
||||
backends and the version dispatch, if needed, should be handled manually.
|
||||
|
||||
In methods:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class PartnerAdapter(Component):
|
||||
# ...
|
||||
|
||||
def do_something(self):
|
||||
if self.backend_record.version == '1.7':
|
||||
# do it this way
|
||||
else:
|
||||
# do it that way
|
||||
|
||||
Or with a factory:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class PartnerAdapterFactory(Component):
|
||||
# ...
|
||||
|
||||
def get_component(self, version):
|
||||
if self.backend_record.version == '1.7':
|
||||
return self.component(usage='backend.adapter.1.7')
|
||||
else:
|
||||
return self.component(usage='backend.adapter.1.9')
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* None
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
|
||||
|
||||
Replace or unregister a component
|
||||
=================================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
You could replace a ``ConnectorUnit`` with the ``replace`` argument passed to
|
||||
the backend decorator:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
@magento(replacing=product.ProductImportMapper)
|
||||
class ProductImportMapper(product.ProductImportMapper):
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
First point: this should hardly be needed now, as you can inherit a component
|
||||
like Odoo Models. Still, if you need to totally replace a component by
|
||||
another, let's say there is this component:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class ProductImportMapper(Component):
|
||||
_name = 'magento.product.import.mapper'
|
||||
_inherit = 'magento.import.mapper'
|
||||
|
||||
_apply_on = ['magento.product.product']
|
||||
# normally the following attrs are inherited from the _inherit
|
||||
_usage = 'import.mapper'
|
||||
_collection = 'magento.backend'
|
||||
|
||||
|
||||
Then you can remove the usage of the component: it will never be used:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class ProductImportMapper(Component):
|
||||
_inherit = 'magento.product.import.mapper'
|
||||
_usage = None
|
||||
|
||||
And create your own, that will be picked up instead of the base one:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MyProductImportMapper(Component):
|
||||
_name = 'my.magento.product.import.mapper'
|
||||
_inherit = 'magento.import.mapper'
|
||||
|
||||
_apply_on = ['magento.product.product']
|
||||
# normally the following attrs are inherited from the _inherit
|
||||
_usage = 'import.mapper'
|
||||
_collection = 'magento.backend'
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* None
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
|
||||
|
||||
Various hints
|
||||
=============
|
||||
|
||||
* The components and the jobs know how to work with Model instances,
|
||||
so prefer them over ids in parameters.
|
||||
126
odoo-bringout-oca-connector-connector/connector/doc/index.rst
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
.. Connectors documentation master file, created by
|
||||
sphinx-quickstart on Mon Feb 4 11:35:44 2013.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
##############
|
||||
Odoo Connector
|
||||
##############
|
||||
|
||||
Odoo Connector is a powerful framework to develop any kind of
|
||||
bi-directional connector between `Odoo`_ (Open Source ERP) and any other
|
||||
software or service.
|
||||
|
||||
This Odoo add-on has a modular and generic core, with the
|
||||
ability to be extended with additional modules for new features or
|
||||
customizations.
|
||||
|
||||
The development of Odoo Connector has been started by `Camptocamp`_ and is now
|
||||
maintained by `Camptocamp`_, `Akretion`_, `Acsone`_ and several :ref:`contributors`.
|
||||
|
||||
It got a major overhaul in 2017 (Odoo 10.0). A :ref:`migration-guide` is
|
||||
available.
|
||||
|
||||
*Subscribe to the* `project's mailing list (name: Connectors)`_
|
||||
|
||||
*Learn how to* :ref:`contribute`
|
||||
|
||||
*************
|
||||
Core Features
|
||||
*************
|
||||
|
||||
* **100% Open Source** (`LGPL version 3`_): the full `source code is available
|
||||
on GitHub`_
|
||||
* Not only designed to connect Odoo with e-commerce backends,
|
||||
rather it is **adaptable** to connect Odoo with any type of service.
|
||||
* **Robust for high volumetries** and **easy to monitor** thanks to a :ref:`jobs-queue`.
|
||||
* A flexible set of building blocks, it does not force to a certain
|
||||
implementation but leaves the final choice to the
|
||||
developer on how to use the proposed pieces.
|
||||
* See a :ref:`code-overview` with examples of code
|
||||
|
||||
.. _Odoo: https://www.odoo.com
|
||||
.. _Camptocamp: https://www.camptocamp.com
|
||||
.. _Akretion: http://www.akretion.com
|
||||
.. _Acsone: https://www.acsone.eu
|
||||
.. _`source code is available on GitHub`: https://github.com/OCA/connector
|
||||
.. _`LGPL version 3`: https://www.gnu.org/licenses/lgpl-3.0.html
|
||||
.. _`project's mailing list (name: Connectors)`: https://odoo-community.org/groups
|
||||
|
||||
*****************
|
||||
Developer's guide
|
||||
*****************
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
guides/migration_guide.rst
|
||||
guides/code_overview.rst
|
||||
guides/concepts.rst
|
||||
guides/bootstrap_connector.rst
|
||||
guides/jobrunner.rst
|
||||
|
||||
API Reference
|
||||
=============
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
api/api_components.rst
|
||||
api/api_backend.rst
|
||||
api/api_event.rst
|
||||
api/api_queue.rst
|
||||
api/api_exception.rst
|
||||
api/api_channels.rst
|
||||
|
||||
*******
|
||||
Project
|
||||
*******
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
project/contribute
|
||||
project/contributors
|
||||
project/license
|
||||
project/roadmap
|
||||
|
||||
*********************************
|
||||
Connectors based on the framework
|
||||
*********************************
|
||||
|
||||
* `Magento Connector <http://www.odoo-magento-connector.com>`_
|
||||
* `Prestashop Connector <https://github.com/OCA/connector-prestashop>`_
|
||||
* `Search Engine Connector <https://github.com/akretion/connector-search-engine>`_
|
||||
* `CMIS <https://github.com/OCA/connector-cmis>`_
|
||||
* `Odoo Asynchronous import module <https://github.com/OCA/connector-interfaces/tree/8.0/base_import_async>`_
|
||||
* `Salesforce Connector <https://github.com/OCA/connector-salesforce>`_
|
||||
* `JIRA Connector <https://github.com/camptocamp/connector-jira>`_
|
||||
* `Google Spreadsheet Connector <https://github.com/akretion/connector-google-spreadsheet>`_
|
||||
* `Connector Exchange <https://github.com/camptocamp/connector-exchange/tree/10.0>`_
|
||||
* `Infor Connector <https://github.com/OCA/connector-infor>`_
|
||||
* `Voicent Connector <https://github.com/ursais/osi-addons>`_
|
||||
* Develop easily and rapidly your own connector based on this powerful
|
||||
framework and list your project on this page! Examples:
|
||||
|
||||
* E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce connector, Odoo Spree connector, Odoo Ebay connector, Odoo Amazon connector…
|
||||
* CMS: Odoo Wordpress connector…
|
||||
* CRM: Odoo SugarCRM connector, Odoo Zabbix connector…
|
||||
* Project Management: Odoo Redmine connector…
|
||||
* Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…
|
||||
|
||||
|
||||
*****
|
||||
Talks
|
||||
*****
|
||||
|
||||
* `A jobs queue for processing tasks asynchronously. Leonardo Pistone & Guewen Baconnier (2015) <https://fr.slideshare.net/camptocamp/a-jobs-queue-for-processing-tasks-asynchronously>`_
|
||||
* `E-commerce: the new Magento - OpenERP Connector: a generic connector to any apps. Luc Maurer & Guewen Baconnier, Camptocamp (2013) <https://fr.slideshare.net/openobject/ecommerce-the-new-magento-open-erp-connector-a-generic-connector-to-any-apps-luc-maurer-guewen-baconnier-camptocamp>`_
|
||||
|
||||
******************
|
||||
Indices and tables
|
||||
******************
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
|
|
@ -0,0 +1,281 @@
|
|||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Connector\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-04-15 22:28+0300\n"
|
||||
"PO-Revision-Date: 2015-05-05 11:52+0100\n"
|
||||
"Last-Translator: Guewen Baconnier <guewen.baconnier@camptocamp.com>\n"
|
||||
"Language-Team: fr <LL@li.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.5.4\n"
|
||||
|
||||
#: ../../index.rst:21
|
||||
msgid "*Subscribe to the* `project's mailing list`_"
|
||||
msgstr "*Inscrivez-vous à la* `project's mailing list`_ *(en anglais)*"
|
||||
|
||||
#: ../../index.rst:23
|
||||
msgid "*Learn how to* :ref:`contribute`"
|
||||
msgstr "*Découvrez comment* :ref:`contribute`"
|
||||
|
||||
#: ../../index.rst:27
|
||||
msgid "Core Features"
|
||||
msgstr "Fonctionnalités de base"
|
||||
|
||||
#: ../../index.rst:29
|
||||
msgid ""
|
||||
"**100% Open Source** (`LGPL version 3`_): the full `source code is available "
|
||||
"on GitHub`_"
|
||||
msgstr ""
|
||||
"**100% Open Source** (`LGPL version 3`_): la totalité du `code source est "
|
||||
"disponible sur GitHub`_"
|
||||
|
||||
#: ../../index.rst:33
|
||||
msgid ""
|
||||
"**Robust for high volumetries** and **easy to monitor** thanks to a :ref:"
|
||||
"`jobs-queue`."
|
||||
msgstr ""
|
||||
"**Robuste pour des volumétries importantes** et **faciler à surveiller** "
|
||||
"grâce à la :ref:`jobs-queue`."
|
||||
|
||||
#: ../../index.rst:34
|
||||
msgid ""
|
||||
"A flexible set of building blocks, it does not force to a certain "
|
||||
"implementation but leaves the final choice to the developer on how to use "
|
||||
"the proposed pieces."
|
||||
msgstr ""
|
||||
"Un ensemble flexible de blocs de construction : il n'oblige pas à respecter "
|
||||
"une implémentation particulière mais laisse le choix final au développeur "
|
||||
"sur la manière d'utiliser les composants."
|
||||
|
||||
#: ../../index.rst:37
|
||||
msgid "See a :ref:`code-overview` with examples of code"
|
||||
msgstr "Voir le :ref:`code-overview` et les exemples de code"
|
||||
|
||||
#: ../../index.rst:48
|
||||
msgid "Connectors based on the framework"
|
||||
msgstr "Connecteurs basés sur le framework"
|
||||
|
||||
#: ../../index.rst:50
|
||||
msgid "`Magento Connector <http://www.odoo-magento-connector.com>`_"
|
||||
msgstr "`Connecteur Magento <http://www.odoo-magento-connector.com>`_"
|
||||
|
||||
#: ../../index.rst:51
|
||||
msgid "`Prestashop Connector <https://github.com/OCA/connector-prestashop>`_"
|
||||
msgstr "`Connecteur Prestashop <https://github.com/OCA/connector-prestashop>`_"
|
||||
|
||||
#: ../../index.rst:52
|
||||
msgid "`solerp (Solr Connector) <https://github.com/akretion/solerp>`_"
|
||||
msgstr "`solerp (Connecteur Solr) <https://github.com/akretion/solerp>`_"
|
||||
|
||||
#: ../../index.rst:54
|
||||
msgid "`CMIS <https://github.com/OCA/connector-cmis>`_"
|
||||
msgstr "`Connecteur CMIS <https://github.com/OCA/connector-cmis>`_"
|
||||
|
||||
#: ../../index.rst:58
|
||||
msgid ""
|
||||
"Develop easily and rapidly your own connector based on this powerful "
|
||||
"framework and list your project on this page! Examples:"
|
||||
msgstr ""
|
||||
"Développez facilement et rapidement votre propre connecteur basé sur ce "
|
||||
"puissant framework et ajoutez votre projet sur cette page ! Exemples :"
|
||||
|
||||
#: ../../index.rst:69
|
||||
msgid "Overview"
|
||||
msgstr "Présentation"
|
||||
|
||||
#: ../../index.rst:79
|
||||
msgid "Top financial contributors"
|
||||
msgstr "Principaux contributeurs financiers"
|
||||
|
||||
#: ../../index.rst:90
|
||||
msgid "*See all the project's* :ref:`financial-contributors`."
|
||||
msgstr "*Voir tous les* :ref:`financial-contributors` *du projet*."
|
||||
|
||||
#: ../../index.rst:94
|
||||
msgid "Project"
|
||||
msgstr "Projet"
|
||||
|
||||
#: ../../index.rst:107
|
||||
msgid "Developer's guide"
|
||||
msgstr "Guide du développeur"
|
||||
|
||||
#: ../../index.rst:118
|
||||
msgid "API Reference"
|
||||
msgstr "Référence de l'API"
|
||||
|
||||
#: ../../index.rst:136
|
||||
msgid "Indices and tables"
|
||||
msgstr "Index et tables"
|
||||
|
||||
#: ../../index.rst:138
|
||||
msgid ":ref:`genindex`"
|
||||
msgstr ":ref:`genindex`"
|
||||
|
||||
#: ../../index.rst:139
|
||||
msgid ":ref:`modindex`"
|
||||
msgstr ":ref:`modindex`"
|
||||
|
||||
#: ../../index.rst:140
|
||||
msgid ":ref:`search`"
|
||||
msgstr ":ref:`search`"
|
||||
|
||||
#: ../../index.rst:8
|
||||
msgid "Odoo Connector"
|
||||
msgstr "Odoo Connector"
|
||||
|
||||
#: ../../index.rst:10
|
||||
msgid ""
|
||||
"Odoo Connector is a powerful framework to develop any kind of bi-directional "
|
||||
"connector between `Odoo`_ (Open Source ERP) and any other software or "
|
||||
"service."
|
||||
msgstr ""
|
||||
"`Odoo Connector` est un puissant framework de développement de connecteur bi-"
|
||||
"directionnel entre `Odoo`_ (ERP Open Source) et tout autre logiciel ou "
|
||||
"service."
|
||||
|
||||
#: ../../index.rst:14
|
||||
msgid ""
|
||||
"This Odoo add-on has a modular and generic core, with the ability to be "
|
||||
"extended with additional modules for new features or customizations."
|
||||
msgstr ""
|
||||
"Ce module Odoo a un cœur modulaire et générique, capable d'être lui-même "
|
||||
"étendu grâce à des modules additionnels, pour ajouter des nouvelles "
|
||||
"fonctions ou des personnalisations."
|
||||
|
||||
#: ../../index.rst:18
|
||||
msgid ""
|
||||
"The development of Odoo Connector has been started by `Camptocamp`_ and is "
|
||||
"now maintained by `Camptocamp`_, `Akretion`_ and several :ref:`contributors`."
|
||||
msgstr ""
|
||||
"Le développement du Connecteur Odoo a été démarré par `Camptocamp`_ et est "
|
||||
"maintenu par `Camptocamp`_, `Akretion`_ et d'autres :ref:`contributors`."
|
||||
|
||||
#: ../../index.rst:31
|
||||
msgid ""
|
||||
"Not only designed to connect Odoo with e-commerce backends, rather it is "
|
||||
"**adaptable** to connect Odoo with any type of service."
|
||||
msgstr ""
|
||||
"Pas uniquement conçu pour connecter Odoo à des backend e-commerce, mais "
|
||||
"**adaptable** pour connecter Odoo à tout type de service."
|
||||
|
||||
#: ../../index.rst:53
|
||||
msgid ""
|
||||
"`Odoo Multi Company <http://www.odoo.net.cn/new-intercompany-process-"
|
||||
"module/>`_"
|
||||
msgstr ""
|
||||
"`Odoo Multi-sociétés <http://www.odoo.net.cn/new-intercompany-process-"
|
||||
"module/>`_"
|
||||
|
||||
#: ../../index.rst:55
|
||||
msgid ""
|
||||
"`Odoo Asynchronous import module <https://github.com/OCA/connector-"
|
||||
"interfaces/tree/8.0/base_import_async>`_"
|
||||
msgstr ""
|
||||
"`Module Odoo d'import asynchrone <https://github.com/OCA/connector-"
|
||||
"interfaces/tree/8.0/base_import_async>`_"
|
||||
|
||||
#: ../../index.rst:56
|
||||
msgid "`Salesforce Connector <https://github.com/OCA/connector-salesforce>`_"
|
||||
msgstr "`Connecteur Salesforce <https://github.com/OCA/connector-salesforce>`_"
|
||||
|
||||
#: ../../index.rst:57
|
||||
msgid ""
|
||||
"`Google Spreadsheet Connector <https://github.com/akretion/connector-google-"
|
||||
"spreadsheet>`_"
|
||||
msgstr ""
|
||||
"`Connecteur Google Spreadsheet <https://github.com/akretion/connector-google-"
|
||||
"spreadsheet>`_"
|
||||
|
||||
#: ../../index.rst:61
|
||||
msgid ""
|
||||
"E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce connector, Odoo "
|
||||
"Spree connector, Odoo Ebay connector, Odoo Amazon connector…"
|
||||
msgstr ""
|
||||
"E-Commerce : connecteur Odoo OsCommerce, connecteur Odoo Drupal Commerce, "
|
||||
"connecteur Odoo Spree, connecteur Odoo Ebay, connecteur Odoo Amazon…"
|
||||
|
||||
#: ../../index.rst:62
|
||||
msgid "CMS: Odoo Wordpress connector…"
|
||||
msgstr "CMS : connecteur Odoo Wordpress…"
|
||||
|
||||
#: ../../index.rst:63
|
||||
msgid "CRM: Odoo SugarCRM connector, Odoo Zabbix connector…"
|
||||
msgstr "CRM : connecteur Odoo SugarCRM, connecteur Odoo Zabbix…"
|
||||
|
||||
#: ../../index.rst:64
|
||||
msgid "Project Management: Odoo Redmine connector…"
|
||||
msgstr "Gestion de projets : connecteur Odoo Redmine…"
|
||||
|
||||
#: ../../index.rst:65
|
||||
msgid "Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…"
|
||||
msgstr "Ticketing : connecteur Odoo Request Tracker, connecteur Odoo GLPI…"
|
||||
|
||||
#~ msgid "Odoo Connector"
|
||||
#~ msgstr "Odoo Connector"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Odoo Connector is a powerful framework to develop any kind of bi-"
|
||||
#~ "directional connector between `Odoo`_ (Open Source ERP) and any other "
|
||||
#~ "software or service."
|
||||
#~ msgstr ""
|
||||
#~ "`Odoo Connector` est un puissant framework de développement de "
|
||||
#~ "connecteur bi-directionnel entre `Odoo`_ (ERP Open Source) et tout "
|
||||
#~ "autre logiciel ou service."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This Odoo add-on has a modular and generic core, with the ability to "
|
||||
#~ "be extended with additional modules for new features or customizations."
|
||||
#~ msgstr ""
|
||||
#~ "Ce module Odoo a un cœur modulaire et générique, capable d'être lui-"
|
||||
#~ "même étendu grâce à des modules additionnels, pour ajouter des nouvelles "
|
||||
#~ "fonctions ou des personnalisations."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The development of Odoo Connector has been started by `Camptocamp`_ "
|
||||
#~ "and is now maintained by `Camptocamp`_, `Akretion`_ and several :ref:"
|
||||
#~ "`contributors`."
|
||||
#~ msgstr ""
|
||||
#~ "Le développement du Connecteur Odoo a été démarré par `Camptocamp`_ et "
|
||||
#~ "est maintenu par `Camptocamp`_, `Akretion`_ et d'autres :ref:"
|
||||
#~ "`contributors`."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Not only designed to connect Odoo with e-commerce backends, rather it "
|
||||
#~ "is **adaptable** to connect Odoo with any type of service."
|
||||
#~ msgstr ""
|
||||
#~ "Pas uniquement conçu pour connecter Odoo à des backend e-commerce, "
|
||||
#~ "mais **adaptable** pour connecter Odoo à tout type de service."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "`Odoo Multi Company <http://www.odoo.net.cn/new-intercompany-"
|
||||
#~ "process-module/>`_"
|
||||
#~ msgstr ""
|
||||
#~ "`Odoo Multi-sociétés <http://www.odoo.net.cn/new-intercompany-"
|
||||
#~ "process-module/>`_"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce "
|
||||
#~ "connector, Odoo Spree connector, Odoo Ebay connector, Odoo "
|
||||
#~ "Amazon connector…"
|
||||
#~ msgstr ""
|
||||
#~ "E-Commerce : connecteur Odoo OsCommerce, connecteur Odoo Drupal "
|
||||
#~ "Commerce, connecteur Odoo Spree, connecteur Odoo Ebay, connecteur "
|
||||
#~ "Odoo Amazon…"
|
||||
|
||||
#~ msgid "CMS: Odoo Wordpress connector…"
|
||||
#~ msgstr "CMS : connecteur Odoo Wordpress…"
|
||||
|
||||
#~ msgid "CRM: Odoo SugarCRM connector, Odoo Zabbix connector…"
|
||||
#~ msgstr "CRM : connecteur Odoo SugarCRM, connecteur Odoo Zabbix…"
|
||||
|
||||
#~ msgid "Project Management: Odoo Redmine connector…"
|
||||
#~ msgstr "Gestion de projets : connecteur Odoo Redmine…"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…"
|
||||
#~ msgstr ""
|
||||
#~ "Ticketing : connecteur Odoo Request Tracker, connecteur Odoo GLPI…"
|
||||
|
|
@ -0,0 +1,777 @@
|
|||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Connector\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-04-15 22:28+0300\n"
|
||||
"PO-Revision-Date: 2015-05-05 11:48+0100\n"
|
||||
"Last-Translator: Guewen Baconnier <guewen.baconnier@camptocamp.com>\n"
|
||||
"Language-Team: fr <LL@li.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.5.4\n"
|
||||
|
||||
#: ../../project/changes.rst:5
|
||||
msgid "Changes"
|
||||
msgstr "Changements"
|
||||
|
||||
#: ../../../CHANGES.rst:2
|
||||
msgid "3.0.0 (2015-04-01)"
|
||||
msgstr "3.0.0 (2015-04-01)"
|
||||
|
||||
#: ../../../CHANGES.rst:4
|
||||
msgid "/!\\ Backwards incompatible changes inside."
|
||||
msgstr "Attention : changements non rétro-compatibles dans cette version."
|
||||
|
||||
#: ../../../CHANGES.rst:6
|
||||
msgid ""
|
||||
"Add ``odoo.api.Environment`` in ``Session`` It is accessible in ``self."
|
||||
"env`` in ``Session`` and all ``ConnectorUnit`` instances. Also in "
|
||||
"``ConnectorUnit``, ``model`` returns the current (new api!) model:"
|
||||
msgstr ""
|
||||
"Ajout de ``odoo.api.Environment`` dans ``Session`` Accessible via ``self."
|
||||
"env`` dans ``Session`` et toutes les instances ``ConnectorUnit``. Également "
|
||||
"dans ``ConnectorUnit``, ``model`` renvoie le modèle en cours (nouvelle "
|
||||
"API!) :"
|
||||
|
||||
#: ../../../CHANGES.rst:20
|
||||
msgid "Deprecate the CRUD methods in ``Session``"
|
||||
msgstr "Dépréciation des méthodes CRUD dans ``Session``"
|
||||
|
||||
#: ../../../CHANGES.rst:32
|
||||
msgid ""
|
||||
"``Environment.set_lang()`` is removed. It was modifying the context in place "
|
||||
"which is not possible with the new frozendict context. It should be done "
|
||||
"with:"
|
||||
msgstr ""
|
||||
"``Environment.set_lang()`` est supprimé. Il modifiait le contexte sur place "
|
||||
"ce qui n'est pas possible avec les nouveaux context en frozendict. Doit être "
|
||||
"fait avec:"
|
||||
|
||||
#: ../../../CHANGES.rst:41
|
||||
msgid "Add an argument on the Binders methods to return a browse record"
|
||||
msgstr ""
|
||||
"Ajout d'un argument sur les méthodes des Binders pour renvoyer un `browse "
|
||||
"record`"
|
||||
|
||||
#: ../../../CHANGES.rst:47
|
||||
msgid ""
|
||||
"Shorten ``ConnectorUnit.get_binder_for_model`` to ``ConnectorUnit."
|
||||
"binder_for``"
|
||||
msgstr ""
|
||||
"Renommage de ``ConnectorUnit.get_binder_for_model`` vers ``ConnectorUnit."
|
||||
"binder_for``"
|
||||
|
||||
#: ../../../CHANGES.rst:49
|
||||
msgid ""
|
||||
"Shorten ``ConnectorUnit.get_connector_unit_for_model`` to ``ConnectorUnit."
|
||||
"unit_for``"
|
||||
msgstr ""
|
||||
"Renommage de ``ConnectorUnit.get_connector_unit_for_model`` vers "
|
||||
"``ConnectorUnit.unit_for``"
|
||||
|
||||
#: ../../../CHANGES.rst:51
|
||||
msgid ""
|
||||
"Renamed ``Environment`` to ``ConnectorEnvironment`` to avoid confusion with "
|
||||
"``odoo.api.Environment``"
|
||||
msgstr ""
|
||||
"Renommage d'``Environment`` vers ``ConnectorEnvironment`` pour éviter la "
|
||||
"confusion avec ``odoo.api.Environment``"
|
||||
|
||||
#: ../../../CHANGES.rst:53
|
||||
msgid ""
|
||||
"Renamed the class attribute ``ConnectorUnit.model_name`` to ``ConnectorUnit."
|
||||
"for_model_name``."
|
||||
msgstr ""
|
||||
"Renommage de l'attribut de classe ``ConnectorUnit.model_name`` vers "
|
||||
"``ConnectorUnit.for_model_name``."
|
||||
|
||||
#: ../../../CHANGES.rst:55
|
||||
msgid ""
|
||||
"Added ``_base_binder``, ``_base_mapper``, ``_base_backend_adapter`` in the "
|
||||
"synchronizers (Importer, Exporter) so it is no longer required to override "
|
||||
"the ``binder``, ``mapper``, ``backend_adapter`` property methods"
|
||||
msgstr ""
|
||||
"Ajout de ``_base_binder``, ``_base_mapper``, ``_base_backend_adapter`` dans "
|
||||
"les synchroniseurs (Importer, Exporter) donc ce n'est plus nécessaire pour "
|
||||
"surcharger les méthodes property ``binder``, ``mapper``, ``backend_adapter``"
|
||||
|
||||
#: ../../../CHANGES.rst:59
|
||||
msgid ""
|
||||
"``Session.change_context()`` now supports the same argument/keyword "
|
||||
"arguments semantics than ``odoo.model.BaseModel.with_context()``."
|
||||
msgstr ""
|
||||
"``Session.change_context()`` prend maintenant en charge la même sémantique "
|
||||
"d'arguments que ``odoo.model.BaseModel.with_context()``."
|
||||
|
||||
#: ../../../CHANGES.rst:62
|
||||
msgid "Renamed ``ExportSynchronizer`` to ``Exporter``"
|
||||
msgstr "Renommage de ``ExportSynchronizer`` vers ``Exporter``"
|
||||
|
||||
#: ../../../CHANGES.rst:63
|
||||
msgid "Renamed ``ImportSynchronizer`` to ``Importer``"
|
||||
msgstr "Renommage de ``ImportSynchronizer`` vers ``Importer``"
|
||||
|
||||
#: ../../../CHANGES.rst:64
|
||||
msgid "Renamed ``DeleteSynchronizer`` to ``Deleter``"
|
||||
msgstr "Renommage de ``DeleteSynchronizer`` vers ``Deleter``"
|
||||
|
||||
#: ../../../CHANGES.rst:65
|
||||
msgid "``Session.commit`` do not commit when tests are running"
|
||||
msgstr "``Session.commit`` ne commite pas pendant les tests"
|
||||
|
||||
#: ../../../CHANGES.rst:66
|
||||
msgid "Cleaned the methods that have been deprecated in version 2.x"
|
||||
msgstr "Nettoyage des méthodes dépréciées en version 2.x"
|
||||
|
||||
#: ../../../CHANGES.rst:70
|
||||
msgid "2.2.0 (2014-05-26)"
|
||||
msgstr "2.2.0 (2014-05-26)"
|
||||
|
||||
#: ../../../CHANGES.rst:72
|
||||
msgid ""
|
||||
"Job arguments can now contain unicode strings (thanks to Stéphane Bidoul) "
|
||||
"lp:1288187"
|
||||
msgstr ""
|
||||
"Les arguments d'un Job peuvent maintenant contenir des chaînes unicode "
|
||||
"(merci à Stéphane Bidoul) lp:1288187"
|
||||
|
||||
#: ../../../CHANGES.rst:73
|
||||
msgid "List view of the jobs improved"
|
||||
msgstr "Amélioration de la vue en liste des jobs"
|
||||
|
||||
#: ../../../CHANGES.rst:74
|
||||
msgid ""
|
||||
"Jobs now support multicompany (thanks to Laurent Mignon) https://lists."
|
||||
"launchpad.net/odoo-connector-community/msg00253.html)"
|
||||
msgstr ""
|
||||
"Les jobs fonctionnement maintenant en multi-sociétés (merci à Laurent "
|
||||
"Mignon) https://lists.launchpad.net/odoo-connector-community/msg00253."
|
||||
"html)"
|
||||
|
||||
#: ../../../CHANGES.rst:75
|
||||
msgid ""
|
||||
"An action can be assigned to a job. The action is called with a button on "
|
||||
"the job and could be something like open a form view or an url."
|
||||
msgstr ""
|
||||
"Une action peut être affectée à un job. L'action est appelée via un bouton "
|
||||
"sur le job et peut appeler une ouverture de formulaire ou une URL."
|
||||
|
||||
#: ../../../CHANGES.rst:78
|
||||
msgid "2.1.1 (2014-02-06)"
|
||||
msgstr "2.1.1 (2014-02-06)"
|
||||
|
||||
#: ../../../CHANGES.rst:80
|
||||
msgid ""
|
||||
"A user can be blocked because he has no access to the model queue.job when a "
|
||||
"job has been delayed. The creation of a job is low level and should not be "
|
||||
"restrained by the accesses of the user. (lp:1276182)"
|
||||
msgstr ""
|
||||
"Un utilisateur peut être bloqué s'il n'a pas accès au modèle queue.job quand "
|
||||
"un job a été retardé. La création d'un job est à bas niveau et ne devrait "
|
||||
"pas être contrainte par les accès de l'utilisateur. (lp:1276182)"
|
||||
|
||||
#: ../../../CHANGES.rst:85
|
||||
msgid "2.1.0 (2014-01-15 - warning: breaks compatibility)"
|
||||
msgstr "2.1.0 (2014-01-15 - attention : rupture de compatibilité)"
|
||||
|
||||
#: ../../../CHANGES.rst:87
|
||||
msgid ""
|
||||
"Add a new optional keyword argument 'description' to the delay() function of "
|
||||
"a job. If given, the description is used as name of the queue.job record "
|
||||
"stored in Odoo and displayed in the list of jobs."
|
||||
msgstr ""
|
||||
"Ajout d'un nouvel argument nommé 'description' pour la fonction delay() d'un "
|
||||
"job. Si fournie, la description est utilisée comme nom pour "
|
||||
"l'enregistrement ``queue.job`` stocké dans Odoo et affiché dans la liste "
|
||||
"des jobs."
|
||||
|
||||
#: ../../../CHANGES.rst:90
|
||||
msgid ""
|
||||
"Fix: assignment of jobs to workers respect the priority of the jobs "
|
||||
"(lp:1252681)"
|
||||
msgstr ""
|
||||
"Correction: l'affectation des jobs aux workers respecte la priorité des jobs "
|
||||
"(lp:1252681)"
|
||||
|
||||
#: ../../../CHANGES.rst:91
|
||||
msgid ""
|
||||
"Pass a new parameter to listeners of 'on_record_create' ( vals: field "
|
||||
"values of the new record, e.g {'field_name': field_value, ...})"
|
||||
msgstr ""
|
||||
"Passage d'un nouveau paramètre aux abonnés à 'on_record_create' ( vals: "
|
||||
"valeurs du champ du nouvel enregistrement, par ex : {'field_name': "
|
||||
"field_value, ...})"
|
||||
|
||||
#: ../../../CHANGES.rst:93
|
||||
msgid ""
|
||||
"Replace the list of updated fields passed to listeners of 'on_record_write' "
|
||||
"by a dictionary of updated field values e.g {'field_name': field_value, ...}"
|
||||
msgstr ""
|
||||
"Remplacement de la liste des champs modifiés transmis aux abonnés à "
|
||||
"'on_record_write' par un dictionnaire des valeurs des champs modifiés. Par "
|
||||
"ex : {'field_name': field_value, ...}"
|
||||
|
||||
#: ../../../CHANGES.rst:95
|
||||
msgid ""
|
||||
"Add the possibility to use 'Modifiers' functions in the 'direct "
|
||||
"mappings' (details in the documentation of the Mapper class)"
|
||||
msgstr ""
|
||||
"Ajout de la possibilité d'utiliser des fonctions 'Modificatrices' dans les "
|
||||
"'mappings directs' (détails dans la documentation de la classe Mapper)"
|
||||
|
||||
#: ../../../CHANGES.rst:97
|
||||
msgid ""
|
||||
"When a job a delayed, the job's UUID is returned by the delay() function"
|
||||
msgstr ""
|
||||
"Quand un job est retardé, le UUID du job est renvoyé par la fonction delay()"
|
||||
|
||||
#: ../../../CHANGES.rst:98
|
||||
msgid ""
|
||||
"Refactoring of mappers. Much details here: https://code.launchpad.net/"
|
||||
"~odoo-connector-core-editors/odoo-connector/7.0-connector-mapper-"
|
||||
"refactor/+merge/194485"
|
||||
msgstr ""
|
||||
"Refactorisation des mappers. Plus de détails ici : https://code.launchpad."
|
||||
"net/~odoo-connector-core-editors/odoo-connector/7.0-connector-mapper-"
|
||||
"refactor/+merge/194485"
|
||||
|
||||
#: ../../../CHANGES.rst:102
|
||||
msgid "2.0.1 (2013-09-12)"
|
||||
msgstr "2.0.1 (2013-09-12)"
|
||||
|
||||
#: ../../../CHANGES.rst:104
|
||||
msgid ""
|
||||
"Developers of addons do no longer need to create an AbstractModel with a "
|
||||
"_name 'name_of_the_module.installed', instead, they just have to call "
|
||||
"connector.connector.install_in_connector() lp:1196859"
|
||||
msgstr ""
|
||||
"Les développeurs d'addons n'ont plus besoin de créer un AbstractModel avec "
|
||||
"un _name 'nom_module.installed', ils doivent simplement appeler ``connector."
|
||||
"connector.install_in_connector()`` lp:1196859"
|
||||
|
||||
#: ../../../CHANGES.rst:106
|
||||
msgid ""
|
||||
"Added a script `odoo-connector-worker` to start processes for Jobs "
|
||||
"Workers when running Odoo is multiprocessing"
|
||||
msgstr ""
|
||||
"Ajout d'un script `odoo-connector-worker` pour lancer les processus des "
|
||||
"workers de jobs en fonctionnement multi-processus d'Odoo"
|
||||
|
||||
#: ../../../CHANGES.rst:108
|
||||
msgid ""
|
||||
"Fix: do no fail to start when Odoo has access to a not-Odoo database "
|
||||
"(lp:1233388)"
|
||||
msgstr ""
|
||||
"Correction : n'échoue pas au démarrage quand Odoo a accès à une base de "
|
||||
"données non-Odoo (lp:1233388)"
|
||||
|
||||
#: ../../../CHANGES.rst:112
|
||||
msgid "2.0.0"
|
||||
msgstr "2.0.0"
|
||||
|
||||
#: ../../../CHANGES.rst:114
|
||||
msgid "First release"
|
||||
msgstr "Première version"
|
||||
|
||||
#: ../../project/contribute.rst:5
|
||||
msgid "Contribute"
|
||||
msgstr "Contribuer"
|
||||
|
||||
#: ../../project/contribute.rst:7
|
||||
msgid "We accept with pleasure all type of contributions:"
|
||||
msgstr "Nous acceptons avec plaisir tous types de contributions :"
|
||||
|
||||
#: ../../project/contribute.rst:9
|
||||
msgid "bug reports"
|
||||
msgstr "Signalement d'anomalies"
|
||||
|
||||
#: ../../project/contribute.rst:10
|
||||
msgid "merge proposals"
|
||||
msgstr "Propositions de corrections"
|
||||
|
||||
#: ../../project/contribute.rst:11
|
||||
msgid "ideas"
|
||||
msgstr "idées"
|
||||
|
||||
#: ../../project/contribute.rst:12
|
||||
msgid "translations"
|
||||
msgstr "traductions"
|
||||
|
||||
#: ../../project/contribute.rst:13
|
||||
msgid "..."
|
||||
msgstr "..."
|
||||
|
||||
#: ../../project/contribute.rst:15
|
||||
msgid ""
|
||||
"Have a look on the :ref:`Magento Connector Developer's Guide "
|
||||
"<connectormagento:contribute>` which is more complete, most of the "
|
||||
"information is the same."
|
||||
msgstr ""
|
||||
"Jetez un œil au :ref:`Guide du développeur du Connecteur Magento "
|
||||
"<connectormagento:contribute>` qui est plus complet, la plupart des "
|
||||
"informations sont les mêmes."
|
||||
|
||||
#: ../../project/contribute.rst:19
|
||||
msgid "The GitHub project is: https://github.com/OCA/connector"
|
||||
msgstr "Le projet GitHub est : https://github.com/OCA/connector"
|
||||
|
||||
#: ../../project/contribute.rst:23
|
||||
msgid "Want to start a new connector"
|
||||
msgstr "Démarrer un nouveau connecteur"
|
||||
|
||||
#: ../../project/contribute.rst:25
|
||||
msgid ""
|
||||
"If you want to start a new connector based on the framework, a sane approach "
|
||||
"is to read this documentation, especially :ref:`concepts` and :ref:"
|
||||
"`bootstrap-connector`."
|
||||
msgstr ""
|
||||
"Si vous voulez fabriquer un nouveau connecteur basé sur le framework, "
|
||||
"l'approche conseillée est de lire cette documentation, en particulier les :"
|
||||
"ref:`concepts` et :ref:`bootstrap-connector`."
|
||||
|
||||
#: ../../project/contribute.rst:33
|
||||
msgid ""
|
||||
"If the connector belongs to the e-commerce domain, you may want to reuse the "
|
||||
"pieces of the `E-Commerce Connector`_ module."
|
||||
msgstr ""
|
||||
"Si le connecteur est dans le domaine e-commerce, vous devriez réutiliser les "
|
||||
"composants du module `E-Commerce Connector`_."
|
||||
|
||||
#: ../../project/contribute.rst:39
|
||||
msgid "Naming conventions"
|
||||
msgstr "Conventions de nommage"
|
||||
|
||||
#: ../../project/contribute.rst:41
|
||||
msgid "The naming conventions for the new projects are the following:"
|
||||
msgstr ""
|
||||
"Les conventions de nommage pour les nouveaux projets sont les suivantes :"
|
||||
|
||||
#: ../../project/contribute.rst:43
|
||||
msgid "Name of the project if it is in the OCA:"
|
||||
msgstr "Nom du projet s'il est dans l'OCA :"
|
||||
|
||||
#: ../../project/contribute.rst:45
|
||||
msgid "connector-xxx"
|
||||
msgstr "connector-xxx"
|
||||
|
||||
#: ../../project/contribute.rst:48
|
||||
msgid "connector_xxx"
|
||||
msgstr "connector_xxx"
|
||||
|
||||
#: ../../project/contribute.rst:53
|
||||
msgid "Example:"
|
||||
msgstr "Exemple :"
|
||||
|
||||
#: ../../project/contribute.rst:51
|
||||
msgid "https://github.com/OCA/connector-magento"
|
||||
msgstr "https://github.com/OCA/connector-magento"
|
||||
|
||||
#: ../../project/contribute.rst:53
|
||||
msgid "``connector_magento``"
|
||||
msgstr "``connector_magento``"
|
||||
|
||||
#: ../../project/contribute.rst:55
|
||||
msgid ""
|
||||
"Actually, the Magento and Prestashop connectors do not respect this "
|
||||
"convention for historical reasons (magentoerpconnect, prestashoperpconnect). "
|
||||
"New projects should ideally respect it."
|
||||
msgstr ""
|
||||
"En réalité les connecteurs Magento et Prestashop ne respectent pas cette "
|
||||
"convention pour des raisons historiques (magentoerpconnect, "
|
||||
"prestashoperpconnect). Les nouveaux projets devraient idéalement la "
|
||||
"respecter."
|
||||
|
||||
#: ../../project/contributors.rst:5
|
||||
msgid "Contributors"
|
||||
msgstr "Contributeurs"
|
||||
|
||||
#: ../../project/contributors.rst:7
|
||||
msgid "List of contributors:"
|
||||
msgstr "Liste des contributeurs :"
|
||||
|
||||
#: ../../../AUTHORS:1
|
||||
msgid "Guewen Baconnier at Camptocamp"
|
||||
msgstr "Guewen Baconnier chez Camptocamp"
|
||||
|
||||
#: ../../../AUTHORS:2
|
||||
msgid "Alexandre Fayolle at Camptocamp"
|
||||
msgstr "Alexandre Fayolle chez Camptocamp"
|
||||
|
||||
#: ../../../AUTHORS:3
|
||||
msgid "Benoit Guillot at Akretion"
|
||||
msgstr "Benoit Guillot chez Akretion"
|
||||
|
||||
#: ../../../AUTHORS:4
|
||||
msgid "Nicolas Bessi at Camptocamp (tiny change)"
|
||||
msgstr "Nicolas Bessi chez Camptocamp (changement minuscule)"
|
||||
|
||||
#: ../../../AUTHORS:5
|
||||
msgid "Joël Grand-Guillaume at Camptocamp (tiny change)"
|
||||
msgstr "Joël Grand-Guillaume chez Camptocamp (changement minuscule)"
|
||||
|
||||
#: ../../../AUTHORS:6
|
||||
msgid "Arthur Vuillard at Akretion (tiny change)"
|
||||
msgstr "Arthur Vuillard chez Akretion (changement minuscule)"
|
||||
|
||||
#: ../../../AUTHORS:7
|
||||
msgid "Sebastien Beau at Akretion (tiny change)"
|
||||
msgstr "Sebastien Beau chez Akretion (changement minuscule)"
|
||||
|
||||
#: ../../../AUTHORS:8
|
||||
msgid "Laurent Mignon at Acsone"
|
||||
msgstr "Laurent Mignon chez Acsone"
|
||||
|
||||
#: ../../../AUTHORS:9
|
||||
msgid "Leonardo Pistone at Camptocamp"
|
||||
msgstr "Leonardo Pistone chez Camptocamp"
|
||||
|
||||
#: ../../../AUTHORS:10
|
||||
msgid "David Béal at Akretion (tiny change)"
|
||||
msgstr "David Béal chez Akretion (changement minuscule)"
|
||||
|
||||
#: ../../project/contributors.rst:16
|
||||
msgid "Financial Contributors"
|
||||
msgstr "Contributeurs financiers"
|
||||
|
||||
#: ../../project/contributors.rst:18
|
||||
msgid ""
|
||||
"A fund raising has been done during the year 2013, allowing us to develop "
|
||||
"the connector framework and the Magento connector."
|
||||
msgstr ""
|
||||
"Une levée de fond a été réalisée en 2013, et a permis de développer le "
|
||||
"framework Connecteur et le Connecteur Magento."
|
||||
|
||||
#: ../../project/contributors.rst:21
|
||||
msgid ""
|
||||
"Here is the list of the funders, ordered by the amount of the contribution:"
|
||||
msgstr "Voici la liste des fondateurs, classée par volume de contribution :"
|
||||
|
||||
#: ../../project/contributors.rst:23
|
||||
msgid "**Logic Supply**"
|
||||
msgstr "**Logic Supply**"
|
||||
|
||||
#: ../../project/contributors.rst:24
|
||||
msgid "**Debonix**"
|
||||
msgstr "**Debonix**"
|
||||
|
||||
#: ../../project/contributors.rst:25
|
||||
msgid "Apertoso"
|
||||
msgstr "Apertoso"
|
||||
|
||||
#: ../../project/contributors.rst:26
|
||||
msgid "OpenBIG"
|
||||
msgstr "OpenBIG"
|
||||
|
||||
#: ../../project/contributors.rst:27
|
||||
msgid "Smile"
|
||||
msgstr "Smile"
|
||||
|
||||
#: ../../project/contributors.rst:28
|
||||
msgid "IT Service Partners"
|
||||
msgstr "IT Service Partners"
|
||||
|
||||
#: ../../project/contributors.rst:29
|
||||
msgid "WillowIT"
|
||||
msgstr "WillowIT"
|
||||
|
||||
#: ../../project/contributors.rst:30
|
||||
msgid "Eezee-It"
|
||||
msgstr "Eezee-It"
|
||||
|
||||
#: ../../project/contributors.rst:31
|
||||
msgid "Auguria"
|
||||
msgstr "Auguria"
|
||||
|
||||
#: ../../project/contributors.rst:32
|
||||
msgid "Enova"
|
||||
msgstr "Enova"
|
||||
|
||||
#: ../../project/contributors.rst:33
|
||||
msgid "Mr. Goran Sunjka"
|
||||
msgstr "M. Goran Sunjka"
|
||||
|
||||
#: ../../project/contributors.rst:34
|
||||
msgid "Taktik"
|
||||
msgstr "Taktik"
|
||||
|
||||
#: ../../project/contributors.rst:35
|
||||
msgid "Maison del Gusto"
|
||||
msgstr "Maison del Gusto"
|
||||
|
||||
#: ../../project/contributors.rst:36
|
||||
msgid "Open2bizz Software"
|
||||
msgstr "Open2bizz Software"
|
||||
|
||||
#: ../../project/contributors.rst:37
|
||||
msgid "Bee Company"
|
||||
msgstr "Bee Company"
|
||||
|
||||
#: ../../project/contributors.rst:38
|
||||
msgid "initOS"
|
||||
msgstr "initOS"
|
||||
|
||||
#: ../../project/contributors.rst:39
|
||||
msgid "Rhônalia"
|
||||
msgstr "Rhônalia"
|
||||
|
||||
#: ../../project/contributors.rst:40
|
||||
msgid "Julius Network Solutions"
|
||||
msgstr "Julius Network Solutions"
|
||||
|
||||
#: ../../project/contributors.rst:41
|
||||
msgid "Elico Corp"
|
||||
msgstr "Elico Corp"
|
||||
|
||||
#: ../../project/contributors.rst:42
|
||||
msgid "Linko Solutions"
|
||||
msgstr "Linko Solutions"
|
||||
|
||||
#: ../../project/contributors.rst:43
|
||||
msgid "HSP Hanse Shopping"
|
||||
msgstr "HSP Hanse Shopping"
|
||||
|
||||
#: ../../project/contributors.rst:44
|
||||
msgid "Burn Out Italy"
|
||||
msgstr "Burn Out Italy"
|
||||
|
||||
#: ../../project/contributors.rst:45
|
||||
msgid "Mr. Peter Dijkstra"
|
||||
msgstr "M. Peter Dijkstra"
|
||||
|
||||
#: ../../project/contributors.rst:46
|
||||
msgid "Mr. Luc Maurer"
|
||||
msgstr "M. Luc Maurer"
|
||||
|
||||
#: ../../project/contributors.rst:47
|
||||
msgid "Mr. Maxime Chambreuil"
|
||||
msgstr "M. Maxime Chambreuil"
|
||||
|
||||
#: ../../project/contributors.rst:48
|
||||
msgid "Mr. Eric Vernichon"
|
||||
msgstr "M. Eric Vernichon"
|
||||
|
||||
#: ../../project/contributors.rst:49
|
||||
msgid "Avanzosc"
|
||||
msgstr "Avanzosc"
|
||||
|
||||
#: ../../project/contributors.rst:50
|
||||
msgid "Mr. Fabio Martinelli"
|
||||
msgstr "M. Fabio Martinelli"
|
||||
|
||||
#: ../../project/contributors.rst:51
|
||||
msgid "Mr. Marcelo Bello"
|
||||
msgstr "M. Marcelo Bello"
|
||||
|
||||
#: ../../project/contributors.rst:52
|
||||
msgid "Rove.design"
|
||||
msgstr "Rove.design"
|
||||
|
||||
#: ../../project/contributors.rst:53
|
||||
msgid "Mr. Mark Felling"
|
||||
msgstr "M. Mark Felling"
|
||||
|
||||
#: ../../project/contributors.rst:55
|
||||
msgid "Thanks to all of them!"
|
||||
msgstr "Merci à eux !"
|
||||
|
||||
#: ../../project/license.rst:5
|
||||
msgid "License"
|
||||
msgstr "Licence"
|
||||
|
||||
#: ../../project/license.rst:7
|
||||
msgid "This work is licensed under the LGPL3 license."
|
||||
msgstr "Ce travail est publié sous licence LGPL3."
|
||||
|
||||
#: ../../project/roadmap.rst:5
|
||||
msgid "Roadmap"
|
||||
msgstr "Roadmap"
|
||||
|
||||
#: ../../project/roadmap.rst:7
|
||||
msgid "Here is a list of things we may agree to merge."
|
||||
msgstr "Voici une liste de choses qu'on peut s'accorder à intégrer"
|
||||
|
||||
#: ../../project/roadmap.rst:9
|
||||
msgid "Queue: use PostgreSQL `notify` for direct enqueue of jobs"
|
||||
msgstr ""
|
||||
"Queue : utiliser `notify` de PostgreSQL pour une mise en queue directe des "
|
||||
"jobs"
|
||||
|
||||
#: ../../project/roadmap.rst:13
|
||||
msgid ""
|
||||
"Add facilities to parse the errors from the jobs so we can replace it by "
|
||||
"more contextual and helpful errors."
|
||||
msgstr ""
|
||||
"Ajouter des facilités pour analyser les erreurs des jobs pour pouvoir les "
|
||||
"remplacer par des erreurs plus contextuelles et utiles"
|
||||
|
||||
#: ../../project/roadmap.rst:16
|
||||
msgid ""
|
||||
"A logger which keeps in a buffer all the logs and flushes them when an error "
|
||||
"occurs in a synchronization, clears them if it succeeded"
|
||||
msgstr ""
|
||||
"Un `logger` qui garde en tampon tous les logs et les vide quand une erreur "
|
||||
"survient pendant une synchronisation, et les efface s'ils ont réussi"
|
||||
|
||||
#: ../../project/roadmap.rst:19
|
||||
msgid ""
|
||||
"Job Channels: each job is owned by a channel and workers can be dedicated to "
|
||||
"one channel only"
|
||||
msgstr ""
|
||||
"Canal de job : chaque job appartient à un canal et les workers peuvent être "
|
||||
"dédiés à un canal"
|
||||
|
||||
#: ../../../CHANGES.rst:107
|
||||
msgid ""
|
||||
"Fix: inheritance broken when an orm.Model inherit from an orm.AbstractModel. "
|
||||
"One effect was that the mail.thread features were no longer working "
|
||||
"(lp:1233355)"
|
||||
msgstr ""
|
||||
"Correction : héritage cassé quand un orm.Model hérite d'un orm."
|
||||
"AbstractModel. Un effet était que les fonctionnalités de mail.thread ne "
|
||||
"fonctionnaient plus (lp:1233355)"
|
||||
|
||||
#: ../../../AUTHORS:11
|
||||
msgid "Christophe Combelles at Anybox (french translation)"
|
||||
msgstr "Christophe Combelles chez Anybox (trad française)"
|
||||
|
||||
#: ../../project/contribute.rst:65
|
||||
msgid "Creating or maintaining a translation of this doc"
|
||||
msgstr "Créer ou maintenir une traduction de cette doc"
|
||||
|
||||
#: ../../project/contribute.rst:67
|
||||
msgid ""
|
||||
"Install Odoo, its dependencies, sphinx, sphinx_bootstrap_theme and sphinx-"
|
||||
"intl"
|
||||
msgstr ""
|
||||
"Installez Odoo, ses dépendances, sphinx, sphinx_bootstrap_theme et sphinx-"
|
||||
"intl"
|
||||
|
||||
#: ../../project/contribute.rst:72
|
||||
msgid "create an empty database with the connector module installed"
|
||||
msgstr "créez une nouvelle base de donnée avec le module connector installé"
|
||||
|
||||
#: ../../project/contribute.rst:73
|
||||
msgid "``cd connector/doc``"
|
||||
msgstr "``cd connector/doc``"
|
||||
|
||||
#: ../../project/contribute.rst:74
|
||||
msgid "rebuild the gettext .pot source catalogs: ``make gettext``"
|
||||
msgstr "reconstruisez les catalogues gettext sources .pot: ``make gettext``"
|
||||
|
||||
#: ../../project/contribute.rst:75
|
||||
msgid ""
|
||||
"update the .po translation files from the latest .pot files (here for "
|
||||
"language 'fr'): ``sphinx-intl update -l fr -p _build/locale``"
|
||||
msgstr ""
|
||||
"mettez à jour les fichiers de traduction .po depuis les derniers fichiers ."
|
||||
"pot (ici pour la langue 'fr'): ``sphinx-intl update -l fr -p _build/locale``"
|
||||
|
||||
#: ../../project/contribute.rst:77
|
||||
msgid ""
|
||||
"create or edit the translation in the .po files: ``poedit locale/fr/"
|
||||
"LC_MESSAGES/*.po``"
|
||||
msgstr ""
|
||||
"créez ou modifiez la traduction dans les fichiers .po : ``poedit locale/fr/"
|
||||
"LC_MESSAGES/*.po``"
|
||||
|
||||
#: ../../project/contribute.rst:79
|
||||
msgid "compile the .po files into .mo files: ``sphinx-intl build``"
|
||||
msgstr "compilez les fichiers .po en fichiers .mo : ``sphinx-intl build``"
|
||||
|
||||
#: ../../project/contribute.rst:80
|
||||
msgid ""
|
||||
"build the translated documentation to html: ``make SPHINXOPTS=\"-Dlanguage=fr"
|
||||
"\" html``"
|
||||
msgstr ""
|
||||
"construisez en html la documentation traduite : ``make SPHINXOPTS=\"-"
|
||||
"Dlanguage=fr\" html``"
|
||||
|
||||
#: ../../project/contribute.rst:83
|
||||
msgid ""
|
||||
"The same using a `buildout <https://bitbucket.org/anybox/"
|
||||
"public_buildbot_buildouts/src/tip/odoo-connector.cfg>`_::"
|
||||
msgstr ""
|
||||
"La même chose en utilisant un `buildout <https://bitbucket.org/anybox/"
|
||||
"public_buildbot_buildouts/src/tip/odoo-connector.cfg>`_::"
|
||||
|
||||
#: ../../project/contribute.rst:69
|
||||
msgid ""
|
||||
"Add `this patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
|
||||
"request/9/>`_ to sphinx-intl (until merged) to support *fuzzy* translations"
|
||||
msgstr ""
|
||||
"Ajoutez `ce patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
|
||||
"request/9/>`_ à sphinx-intl (jusqu'à ce que ce soit mergé) pour gérer les "
|
||||
"traductions *fuzzy*"
|
||||
|
||||
#: ../../project/contribute.rst:29
|
||||
msgid ""
|
||||
"Then, my personal advice is to look at the existing connectors (`Odoo "
|
||||
"Magento Connector`_, `Odoo Prestashop Connector`_). You will also probably "
|
||||
"need to dive a bit in the framework's code."
|
||||
msgstr ""
|
||||
"Ensuite, il est conseillé de parcourir les connecteurs existants "
|
||||
"(`Connecteur Odoo Magento`_, `Connecteur Odoo Prestashop`_). Vous devrez "
|
||||
"aussi plonger peut-être un peu dans le code du framework."
|
||||
|
||||
#: ../../project/contribute.rst:48
|
||||
msgid "Name of the Odoo module:"
|
||||
msgstr "Nom du module Odoo :"
|
||||
|
||||
#: ../../project/contribute.rst:100
|
||||
msgid ""
|
||||
"Then you can see the result in _build/html/ and submit a Pull Request. "
|
||||
"Repeat the 5 last steps to update the translation if modified upstream."
|
||||
msgstr ""
|
||||
"Vous pouvez ensuite voir le résultat dans _build/html/ et soumettre un "
|
||||
"\"Pull Request\". Répétez les 5 dernières étapes pour remettre à jour les "
|
||||
"traductions en cas de modification dans le tronc principal."
|
||||
|
||||
#: ../../project/roadmap.rst:11 ../../project/roadmap.rst:22
|
||||
msgid "See: https://github.com/OCA/connector/pull/52"
|
||||
msgstr "See: https://github.com/OCA/connector/pull/52"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Then, my personal advice is to look at the existing connectors (`Odoo "
|
||||
#~ "Magento Connector`_, `Odoo Prestashop Connector`_). You will also "
|
||||
#~ "probably need to dive a bit in the framework's code."
|
||||
#~ msgstr ""
|
||||
#~ "Ensuite, il est conseillé de parcourir les connecteurs existants "
|
||||
#~ "(`Connecteur Odoo Magento`_, `Connecteur Odoo Prestashop`_). Vous "
|
||||
#~ "devrez aussi plonger peut-être un peu dans le code du framework."
|
||||
|
||||
#~ msgid "Name of the Odoo module:"
|
||||
#~ msgstr "Nom du module Odoo :"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Experimental branch: lp:~odoo-connector-core-editors/odoo-"
|
||||
#~ "connector/7.0-connector-pg-notify-listen-experimental"
|
||||
#~ msgstr ""
|
||||
#~ "Branche expérimentale : lp:~odoo-connector-core-editors/odoo-"
|
||||
#~ "connector/7.0-connector-pg-notify-listen-experimental"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Then you can see the result in _build/html/ and submit a Pull Request"
|
||||
#~ msgstr ""
|
||||
#~ "Vous pouvez ensuite voir le résultat dans _build/html/ et soumettre un "
|
||||
#~ "Pull Request"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Add `this patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
|
||||
#~ "request/9/issue-9-support-fuzzy-translations>`_ to sphinx-intl (until "
|
||||
#~ "merged)"
|
||||
#~ msgstr ""
|
||||
#~ "Ajoutez `ce patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
|
||||
#~ "request/9/issue-9-support-fuzzy-translations>`_ to sphinx-intl (jusqu'à "
|
||||
#~ "ce qu'il soit mergé)"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Fix: inheritance broken when an orm.Model inherit from an or."
|
||||
#~ "AbstractModel. One effect was that the mail.thread features were no "
|
||||
#~ "longer working (lp:1233355)"
|
||||
#~ msgstr ""
|
||||
#~ "Correction : héritage cassé quand un orm.Model hérite d'un or."
|
||||
#~ "AbstractModel. Une conséquence est que les fonctionnalités de mail.thread "
|
||||
#~ "ne fonctionnaient plus (lp:1233355)"
|
||||
190
odoo-bringout-oca-connector-connector/connector/doc/make.bat
Normal file
|
|
@ -0,0 +1,190 @@
|
|||
@ECHO OFF
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=sphinx-build
|
||||
)
|
||||
set BUILDDIR=_build
|
||||
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
|
||||
set I18NSPHINXOPTS=%SPHINXOPTS% .
|
||||
if NOT "%PAPER%" == "" (
|
||||
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
|
||||
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
|
||||
)
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
if "%1" == "help" (
|
||||
:help
|
||||
echo.Please use `make ^<target^>` where ^<target^> is one of
|
||||
echo. html to make standalone HTML files
|
||||
echo. dirhtml to make HTML files named index.html in directories
|
||||
echo. singlehtml to make a single large HTML file
|
||||
echo. pickle to make pickle files
|
||||
echo. json to make JSON files
|
||||
echo. htmlhelp to make HTML files and a HTML help project
|
||||
echo. qthelp to make HTML files and a qthelp project
|
||||
echo. devhelp to make HTML files and a Devhelp project
|
||||
echo. epub to make an epub
|
||||
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
|
||||
echo. text to make text files
|
||||
echo. man to make manual pages
|
||||
echo. texinfo to make Texinfo files
|
||||
echo. gettext to make PO message catalogs
|
||||
echo. changes to make an overview over all changed/added/deprecated items
|
||||
echo. linkcheck to check all external links for integrity
|
||||
echo. doctest to run all doctests embedded in the documentation if enabled
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "clean" (
|
||||
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
|
||||
del /q /s %BUILDDIR%\*
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "html" (
|
||||
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "dirhtml" (
|
||||
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "singlehtml" (
|
||||
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "pickle" (
|
||||
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the pickle files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "json" (
|
||||
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the JSON files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "htmlhelp" (
|
||||
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run HTML Help Workshop with the ^
|
||||
.hhp project file in %BUILDDIR%/htmlhelp.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "qthelp" (
|
||||
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run "qcollectiongenerator" with the ^
|
||||
.qhcp project file in %BUILDDIR%/qthelp, like this:
|
||||
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Connectors.qhcp
|
||||
echo.To view the help file:
|
||||
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Connectors.ghc
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "devhelp" (
|
||||
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "epub" (
|
||||
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The epub file is in %BUILDDIR%/epub.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "latex" (
|
||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "text" (
|
||||
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The text files are in %BUILDDIR%/text.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "man" (
|
||||
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The manual pages are in %BUILDDIR%/man.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "texinfo" (
|
||||
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "gettext" (
|
||||
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "changes" (
|
||||
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.The overview file is in %BUILDDIR%/changes.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "linkcheck" (
|
||||
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Link check complete; look for any errors in the above output ^
|
||||
or in %BUILDDIR%/linkcheck/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "doctest" (
|
||||
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Testing of doctests in the sources finished, look at the ^
|
||||
results in %BUILDDIR%/doctest/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
:end
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
.. _contribute:
|
||||
|
||||
##########
|
||||
Contribute
|
||||
##########
|
||||
|
||||
We accept with pleasure all type of contributions:
|
||||
|
||||
* bug reports
|
||||
* merge proposals
|
||||
* ideas
|
||||
* translations
|
||||
* ...
|
||||
|
||||
Have a look on the :ref:`Magento Connector Developer's Guide
|
||||
<connectormagento:contribute>` which is more complete, most of the
|
||||
information is the same.
|
||||
|
||||
The GitHub project is: https://github.com/OCA/connector
|
||||
|
||||
*****************************
|
||||
Want to start a new connector
|
||||
*****************************
|
||||
|
||||
If you want to start a new connector based on the framework,
|
||||
a sane approach is to read this documentation, especially
|
||||
:ref:`concepts` and :ref:`bootstrap-connector`.
|
||||
|
||||
Then, my personal advice is to look at the existing connectors (`Odoo
|
||||
Magento Connector`_, `Odoo Prestashop Connector`_). You will also probably
|
||||
need to dive a bit in the framework's code.
|
||||
|
||||
If the connector belongs to the e-commerce domain, you may want to reuse the pieces
|
||||
of the `E-Commerce Connector`_ module.
|
||||
|
||||
.. _naming-convention:
|
||||
|
||||
Naming conventions
|
||||
==================
|
||||
|
||||
The naming conventions for the new projects are the following:
|
||||
|
||||
Name of the project if it is in the OCA:
|
||||
|
||||
connector-xxx
|
||||
|
||||
Name of the Odoo module:
|
||||
connector_xxx
|
||||
|
||||
Example:
|
||||
https://github.com/OCA/connector-magento
|
||||
|
||||
``connector_magento``
|
||||
|
||||
Actually, the Magento and Prestashop connectors do not respect this convention
|
||||
for historical reasons (magentoerpconnect, prestashoperpconnect).
|
||||
New projects should ideally respect it.
|
||||
|
||||
.. _`Odoo Magento Connector`: https://github.com/OCA/connector-magento
|
||||
.. _`Odoo Prestashop Connector`: https://github.com/OCA/connector-prestashop
|
||||
.. _`E-Commerce Connector`: https://github.com/OCA/connector-ecommerce
|
||||
|
||||
*************************************************
|
||||
Creating or maintaining a translation of this doc
|
||||
*************************************************
|
||||
|
||||
- Install Odoo, its dependencies, sphinx, sphinx_bootstrap_theme and
|
||||
sphinx-intl
|
||||
- Add `this patch
|
||||
<https://bitbucket.org/shimizukawa/sphinx-intl/pull-request/9/>`_
|
||||
to sphinx-intl (until merged) to support *fuzzy* translations
|
||||
- create an empty database with the connector module installed
|
||||
- ``cd connector/doc``
|
||||
- rebuild the gettext .pot source catalogs: ``make gettext``
|
||||
- update the .po translation files from the latest .pot files (here for
|
||||
language 'fr'): ``sphinx-intl update -l fr -p _build/locale``
|
||||
- create or edit the translation in the .po files: ``poedit
|
||||
locale/fr/LC_MESSAGES/*.po``
|
||||
- compile the .po files into .mo files: ``sphinx-intl build``
|
||||
- build the translated documentation to html: ``make SPHINXOPTS="-Dlanguage=fr"
|
||||
html``
|
||||
|
||||
The same using a `buildout
|
||||
<https://bitbucket.org/anybox/public_buildbot_buildouts/src/tip/odoo-connector.cfg>`_::
|
||||
|
||||
$ mkdir buildout && cd buildout
|
||||
$ wget https://bitbucket.org/anybox/public_buildbot_buildouts/raw/tip/odoo-connector.cfg -O buildout.cfg
|
||||
$ wget https://bitbucket.org/anybox/public_buildbot_buildouts/raw/tip/bootstrap.py
|
||||
$ python bootstrap.py
|
||||
$ bin/buildout
|
||||
$ createdb connectordb
|
||||
$ bin/start_odoo -d connectordb --stop-after-init
|
||||
$ cd connector/connector/doc/
|
||||
$ ../../../bin/sphinx-build -d connectordb -- -b gettext ./ _build/locale/
|
||||
$ ../../../bin/sphinx-intl -d connectordb -- update -l fr -p _build/locale/
|
||||
$ poedit locale/fr/LC_MESSAGES/*po
|
||||
$ ../../../bin/sphinx-intl -d connectordb -- build
|
||||
$ ../../../bin/sphinx-build -d connectordb -- -D language=fr -b html ./ _build/html/
|
||||
|
||||
Then you can see the result in _build/html/ and submit a Pull Request. Repeat the 5 last steps to update the translation if modified upstream.
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
.. _contributors:
|
||||
|
||||
############
|
||||
Contributors
|
||||
############
|
||||
|
||||
List of contributors:
|
||||
|
||||
.. include:: ../../AUTHORS
|
||||
|
||||
|
||||
.. _financial-contributors:
|
||||
|
||||
######################
|
||||
Financial Contributors
|
||||
######################
|
||||
|
||||
A fund raising has been done during the year 2013, allowing us to develop
|
||||
the connector framework and the Magento connector.
|
||||
|
||||
Here is the list of the funders, ordered by the amount of the contribution:
|
||||
|
||||
* **Logic Supply**
|
||||
* **Debonix**
|
||||
* Apertoso
|
||||
* OpenBIG
|
||||
* Smile
|
||||
* IT Service Partners
|
||||
* WillowIT
|
||||
* Eezee-It
|
||||
* Auguria
|
||||
* Enova
|
||||
* Mr. Goran Sunjka
|
||||
* Taktik
|
||||
* Maison del Gusto
|
||||
* Open2bizz Software
|
||||
* Bee Company
|
||||
* initOS
|
||||
* Rhônalia
|
||||
* Julius Network Solutions
|
||||
* Elico Corp
|
||||
* Linko Solutions
|
||||
* HSP Hanse Shopping
|
||||
* Burn Out Italy
|
||||
* Mr. Peter Dijkstra
|
||||
* Mr. Luc Maurer
|
||||
* Mr. Maxime Chambreuil
|
||||
* Mr. Eric Vernichon
|
||||
* Avanzosc
|
||||
* Mr. Fabio Martinelli
|
||||
* Mr. Marcelo Bello
|
||||
* Rove.design
|
||||
* Mr. Mark Felling
|
||||
|
||||
Thanks to all of them!
|
||||
|
|
@ -0,0 +1,674 @@
|
|||
.. _license:
|
||||
|
||||
#######
|
||||
License
|
||||
#######
|
||||
|
||||
This work is licensed under the LGPL3 license.
|
||||
|
||||
------
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU LGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
.. _roadmap:
|
||||
|
||||
#######
|
||||
Roadmap
|
||||
#######
|
||||
|
||||
Here is a list of things we may agree to merge.
|
||||
|
||||
* Add facilities to parse the errors from the jobs so we can replace it
|
||||
by more contextual and helpful errors.
|
||||
|
||||
* A logger which keeps in a buffer all the logs and flushes them when an error
|
||||
occurs in a synchronization, clears them if it succeeded
|
||||
41
odoo-bringout-oca-connector-connector/connector/exception.py
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
# Copyright 2012 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
from odoo.addons.queue_job.exception import JobError, RetryableJobError
|
||||
|
||||
# Connector related errors
|
||||
|
||||
|
||||
class ConnectorException(Exception):
|
||||
"""Base Exception for the connectors"""
|
||||
|
||||
|
||||
class NoConnectorUnitError(ConnectorException):
|
||||
"""No ConnectorUnit has been found"""
|
||||
|
||||
|
||||
class InvalidDataError(ConnectorException):
|
||||
"""Data Invalid"""
|
||||
|
||||
|
||||
# Job related errors
|
||||
|
||||
|
||||
class MappingError(ConnectorException):
|
||||
"""An error occurred during a mapping transformation."""
|
||||
|
||||
|
||||
class NetworkRetryableError(RetryableJobError):
|
||||
"""A network error caused the failure of the job, it can be retried later."""
|
||||
|
||||
|
||||
class NoExternalId(RetryableJobError):
|
||||
"""No External ID found, it can be retried later."""
|
||||
|
||||
|
||||
class IDMissingInBackend(JobError):
|
||||
"""The ID does not exist in the backend"""
|
||||
|
||||
|
||||
class ManyIDSInBackend(JobError):
|
||||
"""Unique key exists many times in backend"""
|
||||
95
odoo-bringout-oca-connector-connector/connector/i18n/am.po
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Amharic (https://www.transifex.com/oca/teams/23907/am/)\n"
|
||||
"Language: am\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Creado por"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Creado en"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Última actualización por"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Última actualización en"
|
||||
81
odoo-bringout-oca-connector-connector/connector/i18n/ar.po
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Arabic (https://www.transifex.com/oca/teams/23907/ar/)\n"
|
||||
"Language: ar\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "إلغاء"
|
||||
73
odoo-bringout-oca-connector-connector/connector/i18n/bs.po
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Konektor"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "Connector Backend"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Menadžer konektora"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Priključci"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Vanjsko vezivanje (apstraktno)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Datum zadnje sinhronizacije"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr "Nema ništa za izvoz."
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Posao u redu"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr "Zapis izvezen sa ID %s na Backend."
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "Povezani zapis"
|
||||
167
odoo-bringout-oca-connector-connector/connector/i18n/ca.po
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2018-01-05 16:56+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2018\n"
|
||||
"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Connector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "Backend del Connector"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Administrador del connector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Connectors"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Lligam extern (abstracte)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Darrera data de sincronització"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Tasca de Cua"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "Registre relacionat"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "A %s needs a review."
|
||||
#~ msgstr "Un %s necessita revisió."
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancel·la"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "Punt de control"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Punts de control"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Revisió de punts de control"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "Fes clic en el"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Punts de control del connector"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Creat per"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Creat a"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Agrupa per..."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Importat de"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Darrear modificació per"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Darrera modificació el"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Model"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Necessita Revisió"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "ID Registre"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "Revisa Punts-Control"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Revisat"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Marcat com revisat"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "Estat"
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "El registre ha estat importat des d'aquest backend"
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr "Els seleccionats seran marcats com revisats. "
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "per verificar:"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Aplica"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Backends"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Configura el connector"
|
||||
|
||||
#~ msgid "Connector Configuration"
|
||||
#~ msgstr "Configuració del connector"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Menú de Open Connector"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "o "
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 16.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
80
odoo-bringout-oca-connector-connector/connector/i18n/cs.po
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Czech (https://www.transifex.com/oca/teams/23907/cs/)\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Zrušit"
|
||||
189
odoo-bringout-oca-connector-connector/connector/i18n/de.po
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2025-03-17 14:06+0000\n"
|
||||
"Last-Translator: davidbeckercbl <becker@cbl-computer.de>\n"
|
||||
"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.10.2\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Connector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "Connector Backend"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Connector Manager"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Connector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Externe Verbindung (abstrakt)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Letztes Synchronisationsdatum"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr "Nichts zu exportieren."
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Aufgabe in Warteschlange einreihen"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr "Datensatz mit ID %s auf dem Backend exportiert."
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "Zugehöriger Datensatz"
|
||||
|
||||
#~ msgid "Display Name"
|
||||
#~ msgstr "Anzeigebezeichnung"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Last Modified on"
|
||||
#~ msgstr "Zuletzt aktualisiert am"
|
||||
|
||||
#~ msgid "A %s needs a review."
|
||||
#~ msgstr "Ein %s erfordert Sichtung"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Abbrechen"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "Checkpunkt"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Checkpunkte"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Checkpunkt Überprüfung"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "Klicken Sie auf den"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Connector Checkpunkt"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Angelegt durch"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Angelegt am"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Gruppieren nach ..."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Importiert von"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Zuletzt aktualisiert durch"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Zuletzt aktualisiert am"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Modell"
|
||||
|
||||
#~ msgid "Name of the record to review"
|
||||
#~ msgstr "Bezeichnung des zu prüfenden Datensatzes"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Benötigt Prüfung"
|
||||
|
||||
#~ msgid "No record to check."
|
||||
#~ msgstr "Kein Datensatz zu prüfen."
|
||||
|
||||
#~ msgid "Record"
|
||||
#~ msgstr "Datensatz"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "Datensatz Nr."
|
||||
|
||||
#~ msgid "Record Name"
|
||||
#~ msgstr "Datensatz-Bezeichnung"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "Überprüfungs Checkpunkte"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Überprüft"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Als Überprüft markieren"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "Status"
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "Der Eintrag wurde von diesem Backend importiert."
|
||||
|
||||
#~ msgid "The record to review."
|
||||
#~ msgstr "Der zu prüfende Datensatz."
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr "Die ausgewählten Checkpunkte werden als überprüft markiert."
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "es zu überprüfen:"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "anwenden"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Backends"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Connector konfigurieren"
|
||||
|
||||
#~ msgid "Connector Configuration"
|
||||
#~ msgstr "Connector-Einstellungen"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Open Connector Menü"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "oder"
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Greek (Greece) (https://www.transifex.com/oca/teams/23907/"
|
||||
"el_GR/)\n"
|
||||
"Language: el_GR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "Κωδικός"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Δημιουργήθηκε από "
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Δημιουργήθηκε στις"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Τελευταία ενημέρωση από"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Τελευταία ενημέρωση στις"
|
||||
168
odoo-bringout-oca-connector-connector/connector/i18n/es.po
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2023-08-02 13:09+0000\n"
|
||||
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
|
||||
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.17\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Conector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "Conector de servidor"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Administrador del Conector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Conectores"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Unión Externa (abstracto)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Última fecha de sincronización"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr "Nada que exportar."
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Trabajo de Cola"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr "Registro exportado con ID %s en el servidor."
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "Registro relacionado"
|
||||
|
||||
#~ msgid "Display Name"
|
||||
#~ msgstr "Nombre mostrado"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Last Modified on"
|
||||
#~ msgstr "Última modificación el"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "Punto Control"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Puntos de control"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Revisión de puntos de control"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "Hcer clic en"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Punto de Control del Conector"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Creado por"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Creado en"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Agrupar Por..."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Importado de"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Última actualización por"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Última actualización el"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Modelo"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Necesita Revisión"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "ID de Registro"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "Puntos de Control de Revisión"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Revisado"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Marcar como Revisado"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "Estado"
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "El registro ha sido importado de esta área de administación"
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr "Los puntos de control seleccionados serán marcados como revisados"
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "para verificar:"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Aplicar"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Áreas de administración"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Configurar el conector"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Menú del Open Connector"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "o"
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/oca/"
|
||||
"teams/23907/es_CR/)\n"
|
||||
"Language: es_CR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Spanish (Ecuador) (https://www.transifex.com/oca/teams/23907/"
|
||||
"es_EC/)\n"
|
||||
"Language: es_EC\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Spanish (Spain) (https://www.transifex.com/oca/teams/23907/"
|
||||
"es_ES/)\n"
|
||||
"Language: es_ES\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Creado por"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Creado en"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Última actualización por"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Última actualización en"
|
||||
102
odoo-bringout-oca-connector-connector/connector/i18n/es_MX.po
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2018-01-05 16:56+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2018\n"
|
||||
"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/"
|
||||
"es_MX/)\n"
|
||||
"Language: es_MX\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Conector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "A %s needs a review."
|
||||
#~ msgstr "El %s necesita revisión."
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Importado de"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Modelo"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Necesita Revisión"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Revisiado"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Aplicar"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Configurar Conector"
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Spanish (Venezuela) (https://www.transifex.com/oca/"
|
||||
"teams/23907/es_VE/)\n"
|
||||
"Language: es_VE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
80
odoo-bringout-oca-connector-connector/connector/i18n/et.po
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Estonian (https://www.transifex.com/oca/teams/23907/et/)\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Loobu"
|
||||
98
odoo-bringout-oca-connector-connector/connector/i18n/fi.po
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Finnish (https://www.transifex.com/oca/teams/23907/fi/)\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Display Name"
|
||||
#~ msgstr "Nimi"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Last Modified on"
|
||||
#~ msgstr "Viimeksi muokattu"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Luonut"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Luotu"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Viimeksi päivittänyt"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Viimeksi päivitetty"
|
||||
211
odoo-bringout-oca-connector-connector/connector/i18n/fr.po
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
# Nicolas JEUDY <njeudy@panda-chi.io>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: \n"
|
||||
"PO-Revision-Date: 2024-11-06 16:06+0000\n"
|
||||
"Last-Translator: samibc2c <sami.bouzidi@camptocamp.com>\n"
|
||||
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Connecteur"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "Backend de connecteur"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Responsable connecteurs"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Connecteurs"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Lien Externe (abstrait)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Dernière date de synchronisation"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr "Rien à exporter."
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Queue de jobs"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr "Enregistrement exporté avec l'ID %s dans le Backend."
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "Enregistrement lié"
|
||||
|
||||
#~ msgid "Display Name"
|
||||
#~ msgstr "Nom affiché"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Last Modified on"
|
||||
#~ msgstr "Dernière modification le"
|
||||
|
||||
#~ msgid "A %s needs a review."
|
||||
#~ msgstr "Un %s a besoin d'un contrôle."
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Annuler"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "Points de contrôle"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Points de contrôle"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Points de contrôle"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "Cliquer sur le"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Point de contrôle"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Créé par"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Créé le"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Grouper par..."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Importé depuis"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Dernière mise à jour par"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Dernière mise à jour le"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Modèle"
|
||||
|
||||
#~ msgid "Name of the record to review"
|
||||
#~ msgstr "Nom de l'enregistrement à contrôler"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Nécessite un contrôle"
|
||||
|
||||
#~ msgid "No record to check."
|
||||
#~ msgstr "Pas d'enregistrement à contrôler."
|
||||
|
||||
#~ msgid "Record"
|
||||
#~ msgstr "Enregistrement"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "ID de ressource"
|
||||
|
||||
#~ msgid "Record Name"
|
||||
#~ msgstr "Nom d'enregistrement"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "Contrôler"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Contrôlé"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Passer en contrôlé"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "État"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The connectors list the new records to verify\n"
|
||||
#~ " based on their type. Only some need a manual\n"
|
||||
#~ " review."
|
||||
#~ msgstr ""
|
||||
#~ "Les connecteurs listent les nouveaux enregistrements pour vérifier\n"
|
||||
#~ " leur type. Seulement certaines nécessitent un contrôle\n"
|
||||
#~ " manuel."
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "La ressource a été importée depuis ce backend"
|
||||
|
||||
#~ msgid "The record to review."
|
||||
#~ msgstr "L'enregistrement à contrôler."
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr ""
|
||||
#~ "Les points de contrôle sélectionnés vont être considérés comme contrôlés."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When a connector imports new records which have\n"
|
||||
#~ " configuration or reviews to do manually, they\n"
|
||||
#~ " will appear in this list. Once a record has been\n"
|
||||
#~ " checked, click on the 'Reviewed' button."
|
||||
#~ msgstr ""
|
||||
#~ "Lorsqu'un connecteur importe de nouveaux enregistrements qui doivent être "
|
||||
#~ "configurés ou révisés manuellement, ils apparaissent dans cette liste. "
|
||||
#~ "Une fois qu'un enregistrement a été vérifié, cliquez sur le bouton "
|
||||
#~ "\"Controlé\"."
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "pour le vérifier :"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Appliquer"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Backends"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Configurer les connecteurs"
|
||||
|
||||
#~ msgid "Connector Configuration"
|
||||
#~ msgstr "Configuration du connecteur"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Ouvrir le menu du connecteur"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "ou"
|
||||
95
odoo-bringout-oca-connector-connector/connector/i18n/gl.po
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Galician (https://www.transifex.com/oca/teams/23907/gl/)\n"
|
||||
"Language: gl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Creado por"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Creado en"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "ültima actualización por"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Última actualización en"
|
||||
84
odoo-bringout-oca-connector-connector/connector/i18n/hr.po
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n"
|
||||
"Language: hr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Grupiraj po..."
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Primjeni"
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2018-01-05 16:56+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2018\n"
|
||||
"Language-Team: Croatian (Croatia) (https://www.transifex.com/oca/teams/23907/"
|
||||
"hr_HR/)\n"
|
||||
"Language: hr_HR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
146
odoo-bringout-oca-connector-connector/connector/i18n/hu.po
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2018-01-05 16:56+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2018\n"
|
||||
"Language-Team: Hungarian (https://www.transifex.com/oca/teams/23907/hu/)\n"
|
||||
"Language: hu\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Csatoló"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Csatoló beállítás"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Csatolók"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Külső csatolás (absztract)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Utolsó szinkronizáció dátuma"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Sorbanálló feladatok"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Mégsem"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "Ellenőrzőpont"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Ellenörző pontok"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Ellenörzőpontok felülvizsgálata"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "Kattintson erre"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Csatoló ellenörzőpont"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Csoportosítás ezzel..."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Innen importált"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Modell, minta"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Felülvizsgálat szükséges"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "Rekordazonosító ID"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "Ellenörzőpontok felülvizsgálata"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Leellenörzött"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Leellenörzöttnek jelölt"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "Állapot"
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "Erről a végpontról importált rekord"
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr "A kiválasztott ellenörzőpont leellenörzőttként nyilvántartva."
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "ezt ellenőrizni:"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Alkalmaz"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Háttérprogramok"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Csatlakozó beállítása"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Csatoló menü megnyitása"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "vagy"
|
||||
138
odoo-bringout-oca-connector-connector/connector/i18n/it.po
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2024-05-06 14:34+0000\n"
|
||||
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
|
||||
"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.17\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Connettore"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "Connettore backend"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Gestore connettore"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Connettori"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Collegamento esterno (astratto)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Data ultima sincronizzazione"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr "Niente da esportare."
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Lavoro in coda"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr "Il record è stato esportato con ID %s su backend."
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "Record collegato"
|
||||
|
||||
#~ msgid "Display Name"
|
||||
#~ msgstr "Nome da visualizzare"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Last Modified on"
|
||||
#~ msgstr "Ultima modifica il"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Annulla"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Checkpoints"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Revisione Checkpoints"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Checkpoint Connettore"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Creato da"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Creato il"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Raggruppa per..."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Importato da"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Ultimo aggiornamento di"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Ultimo aggiornamento il"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Imposta come revisionato"
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "Il record è stato importato da questo backend"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Applica"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Backends"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Configura Connettore"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Apre il menù del Connettore"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "o"
|
||||
81
odoo-bringout-oca-connector-connector/connector/i18n/lt.po
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Lithuanian (https://www.transifex.com/oca/teams/23907/lt/)\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
|
||||
"%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Atšaukti"
|
||||
146
odoo-bringout-oca-connector-connector/connector/i18n/nl.po
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2018-01-05 16:56+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2018\n"
|
||||
"Language-Team: Dutch (https://www.transifex.com/oca/teams/23907/nl/)\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Connector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Connector manager"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Connectors"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "External Binding (abstract)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Laatste synchronisatie datum"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Geplande taken"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Annuleer"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "Controlepunt"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Controlepunten"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Controlepunten controle"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "Klik op de"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Connector controlepunt"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Groepeer op..."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Geïmporteerd van"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Model"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Controle nodig"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "Record-id"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "Controleer controlepunten"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Gecontroleerd"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Stel in als gecontroleerd"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "Status"
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "De regel is geïmporteerd vanuit deze backend"
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr "De geselecteerde controlepunten worden ingesteld als gecontroleerd"
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "om te controleren:"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Toepassen"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Backends"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Connector instellen"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Open connector menu"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "of"
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Dutch (Belgium) (https://www.transifex.com/oca/teams/23907/"
|
||||
"nl_BE/)\n"
|
||||
"Language: nl_BE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Annuleren"
|
||||
82
odoo-bringout-oca-connector-connector/connector/i18n/pl.po
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Polish (https://www.transifex.com/oca/teams/23907/pl/)\n"
|
||||
"Language: pl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
|
||||
"%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
|
||||
"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Anuluj"
|
||||
95
odoo-bringout-oca-connector-connector/connector/i18n/pt.po
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Portuguese (https://www.transifex.com/oca/teams/23907/pt/)\n"
|
||||
"Language: pt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Criado por"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Criado em"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Atualizado pela última vez por"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Atualizado pela última vez em"
|
||||
324
odoo-bringout-oca-connector-connector/connector/i18n/pt_BR.po
Normal file
|
|
@ -0,0 +1,324 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2020-03-21 20:14+0000\n"
|
||||
"Last-Translator: Rodrigo Macedo <rmsolucoeseminformatic4@gmail.com>\n"
|
||||
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/"
|
||||
"teams/23907/pt_BR/)\n"
|
||||
"Language: pt_BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 3.10\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Conector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "Backend do conector"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Gerenciador do conector"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Conectores"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Ligações externas (resumo)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Última data de sincronização"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr "Nada para exportar."
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Fila de tarefas"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr "Registro exportado com o ID %s no back-end."
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "Registro relacionado"
|
||||
|
||||
#~ msgid "Display Name"
|
||||
#~ msgstr "Exibir Nome"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Last Modified on"
|
||||
#~ msgstr "Última Modificação em"
|
||||
|
||||
#~ msgid "A %s needs a review."
|
||||
#~ msgstr "Um %s necessita revisão."
|
||||
|
||||
#~ msgid "Action Needed"
|
||||
#~ msgstr "Ação Necessária"
|
||||
|
||||
#~ msgid "Activities"
|
||||
#~ msgstr "Atividades"
|
||||
|
||||
#~ msgid "Activity Exception Decoration"
|
||||
#~ msgstr "Decoração de Exceção de Atividade"
|
||||
|
||||
#~ msgid "Activity State"
|
||||
#~ msgstr "Estado da Atividade"
|
||||
|
||||
#~ msgid "Attachment Count"
|
||||
#~ msgstr "Conta de Anexos"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "Ponto de checagem"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Pontos de checagem"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Revisão de pontos de checagem"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "Clique na"
|
||||
|
||||
#~ msgid "Company"
|
||||
#~ msgstr "Empresa"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Ponto de checagem conector"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Criado por"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Criado em"
|
||||
|
||||
#~ msgid "Followers"
|
||||
#~ msgstr "Seguidores"
|
||||
|
||||
#~ msgid "Followers (Channels)"
|
||||
#~ msgstr "Seguidores (Canais)"
|
||||
|
||||
#~ msgid "Followers (Partners)"
|
||||
#~ msgstr "Seguidores (Parceiros)"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Agrupar por .."
|
||||
|
||||
#~ msgid "Icon"
|
||||
#~ msgstr "Ícone"
|
||||
|
||||
#~ msgid "Icon to indicate an exception activity."
|
||||
#~ msgstr "Ícone para indicar uma atividade de exceção."
|
||||
|
||||
#~ msgid "If checked, new messages require your attention."
|
||||
#~ msgstr "Se marcada, novas mensagens requerem sua atenção."
|
||||
|
||||
#~ msgid "If checked, some messages have a delivery error."
|
||||
#~ msgstr "Se marcada, algumas mensagens tem um erro de entrega."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Importado de"
|
||||
|
||||
#~ msgid "Is Follower"
|
||||
#~ msgstr "É Seguidor"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Última atualização por"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Atualizado pela última vez em"
|
||||
|
||||
#~ msgid "Main Attachment"
|
||||
#~ msgstr "Anexo Principal"
|
||||
|
||||
#~ msgid "Message Delivery error"
|
||||
#~ msgstr "Mensagem de erro de entrega"
|
||||
|
||||
#~ msgid "Messages"
|
||||
#~ msgstr "Mensagens"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Modelo"
|
||||
|
||||
#~ msgid "Name of the record to review"
|
||||
#~ msgstr "Nome do registro para revisar"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Necessita revisão"
|
||||
|
||||
#~ msgid "Next Activity Deadline"
|
||||
#~ msgstr "Próximo prazo de atividade"
|
||||
|
||||
#~ msgid "Next Activity Summary"
|
||||
#~ msgstr "Próximo resumo da atividade"
|
||||
|
||||
#~ msgid "Next Activity Type"
|
||||
#~ msgstr "Próximo tipo de atividade"
|
||||
|
||||
#~ msgid "No record to check."
|
||||
#~ msgstr "sem registro para checar."
|
||||
|
||||
#~ msgid "Number of Actions"
|
||||
#~ msgstr "Número de Ações"
|
||||
|
||||
#~ msgid "Number of errors"
|
||||
#~ msgstr "Número de erros"
|
||||
|
||||
#~ msgid "Number of messages which requires an action"
|
||||
#~ msgstr "Número de mensagens que requerem uma ação"
|
||||
|
||||
#~ msgid "Number of messages with delivery error"
|
||||
#~ msgstr "Número de mensagens com erro de entrega"
|
||||
|
||||
#~ msgid "Number of unread messages"
|
||||
#~ msgstr "Número de mensagens não lidas"
|
||||
|
||||
#~ msgid "Record"
|
||||
#~ msgstr "Registro"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "ID do registro"
|
||||
|
||||
#~ msgid "Record Name"
|
||||
#~ msgstr "Nome Registro"
|
||||
|
||||
#~ msgid "Responsible User"
|
||||
#~ msgstr "Usuário Responsável"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "Revisão dos pontos de checagem"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Revisado"
|
||||
|
||||
#~ msgid "SMS Delivery error"
|
||||
#~ msgstr "SMS de erro de entrega"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Marcar como revisado"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "Situação"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Status based on activities\n"
|
||||
#~ "Overdue: Due date is already passed\n"
|
||||
#~ "Today: Activity date is today\n"
|
||||
#~ "Planned: Future activities."
|
||||
#~ msgstr ""
|
||||
#~ "Status baseado em atividades\n"
|
||||
#~ "Em atraso: a data de vencimento já passou\n"
|
||||
#~ "Hoje: a data da atividade é hoje\n"
|
||||
#~ "Planejado: atividades futuras."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The connectors list the new records to verify\n"
|
||||
#~ " based on their type. Only some need a manual\n"
|
||||
#~ " review."
|
||||
#~ msgstr ""
|
||||
#~ "Os conectores listam os novos registros para verificar\n"
|
||||
#~ " com base no seu tipo. Apenas alguns precisam de um "
|
||||
#~ "manual\n"
|
||||
#~ " Reveja."
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "O registro foi importado deste backend"
|
||||
|
||||
#~ msgid "The record to review."
|
||||
#~ msgstr "O registro para revisar."
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr "O pontos de checagem selecionados vão ser marcados como revisados."
|
||||
|
||||
#~ msgid "Type of the exception activity on record."
|
||||
#~ msgstr "Tipo da atividade de exceção registrada."
|
||||
|
||||
#~ msgid "Unread Messages"
|
||||
#~ msgstr "Mensagens não lidas"
|
||||
|
||||
#~ msgid "Unread Messages Counter"
|
||||
#~ msgstr "Contador de mensagens não lidas"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When a connector imports new records which have\n"
|
||||
#~ " configuration or reviews to do manually, they\n"
|
||||
#~ " will appear in this list. Once a record has been\n"
|
||||
#~ " checked, click on the 'Reviewed' button."
|
||||
#~ msgstr ""
|
||||
#~ "Quando um conector importa novos registros que\n"
|
||||
#~ " configuração ou revisões para fazer manualmente, eles\n"
|
||||
#~ " aparecerá nesta lista. Depois de um registro ter sido\n"
|
||||
#~ " marcado, clique no botão \"Revisto\"."
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "para verificar isto:"
|
||||
|
||||
#~ msgid "If checked new messages require your attention."
|
||||
#~ msgstr "Se marcada, novas mensagens requerem sua atenção."
|
||||
|
||||
#~ msgid "Overdue"
|
||||
#~ msgstr "Atrasado(a)"
|
||||
|
||||
#~ msgid "Planned"
|
||||
#~ msgstr "Planejada"
|
||||
|
||||
#~ msgid "Today"
|
||||
#~ msgstr "Hoje"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Aplicar"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Back-ends"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Configurar conector"
|
||||
|
||||
#~ msgid "Connector Configuration"
|
||||
#~ msgstr "Configuração do conector"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Abrir menu do conector"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "ou"
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Portuguese (Portugal) (https://www.transifex.com/oca/"
|
||||
"teams/23907/pt_PT/)\n"
|
||||
"Language: pt_PT\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Cancelar"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Criado por"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Criado em"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Atualizado pela última vez por"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Atualizado pela última vez em"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "Estado"
|
||||
84
odoo-bringout-oca-connector-connector/connector/i18n/ro.po
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Romanian (https://www.transifex.com/oca/teams/23907/ro/)\n"
|
||||
"Language: ro\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
|
||||
"2:1));\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Anuleaza"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Aplică"
|
||||
82
odoo-bringout-oca-connector-connector/connector/i18n/ru.po
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Russian (https://www.transifex.com/oca/teams/23907/ru/)\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
|
||||
"%100>=11 && n%100<=14)? 2 : 3);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Отменена"
|
||||
174
odoo-bringout-oca-connector-connector/connector/i18n/sl.po
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2018-01-05 16:56+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2018\n"
|
||||
"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
|
||||
"Language: sl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
|
||||
"%100==4 ? 2 : 3);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "Povezovalnik"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "Ozadje povezovalnika"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "Upravitelj povezovalnika"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "Konektorji"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "Zunanja povezava (povzetek)"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "Datum zadnje sinhronizacije"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "Delo čakalne vrste"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "Povezani zapis"
|
||||
|
||||
#~ msgid "Display Name"
|
||||
#~ msgstr "Prikazni naziv"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Last Modified on"
|
||||
#~ msgstr "Zadnjič spremenjeno"
|
||||
|
||||
#~ msgid "A %s needs a review."
|
||||
#~ msgstr "Potrebna je revizija %s ."
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Preklic"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "Kontrolna točka"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "Kontrolne točke"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "Preverjanje kontrolnih točk"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "Kliknite na"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "Kontrolna točka povezovalnika"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Ustvaril"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Ustvarjeno"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "Združi po..."
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "Uvoženo iz"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Zadnji posodobil"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Zadnjič posodobljeno"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "Model"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "Potrebna revizija"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "ID zapisa"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "Pregled kontrolnih točk"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "Pregledano"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "Nastavi kot pregledano"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "Status"
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "Zapis je bil uvožen iz tega ozadja."
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr "Izbrane kontrolne točke bodo označene kot pregledane."
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "za preverjanje:"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "Uporabi"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "Ozadja"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "Nastavitve povezovalnika"
|
||||
|
||||
#~ msgid "Connector Configuration"
|
||||
#~ msgstr "Nastavitve povezovalnika"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "Odpri meni povezovalnika"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "ali"
|
||||
80
odoo-bringout-oca-connector-connector/connector/i18n/th.po
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Thai (https://www.transifex.com/oca/teams/23907/th/)\n"
|
||||
"Language: th\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "ยกเลิก"
|
||||
95
odoo-bringout-oca-connector-connector/connector/i18n/tr.po
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Turkish (https://www.transifex.com/oca/teams/23907/tr/)\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Vazgeç"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "Oluşturan"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "Oluşturuldu"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "Son güncelleyen"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "Son güncelleme"
|
||||
80
odoo-bringout-oca-connector-connector/connector/i18n/vi.po
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 10.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-03-10 03:36+0000\n"
|
||||
"PO-Revision-Date: 2017-03-10 03:36+0000\n"
|
||||
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\n"
|
||||
"Language-Team: Vietnamese (https://www.transifex.com/oca/teams/23907/vi/)\n"
|
||||
"Language: vi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr ""
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Hủy bỏ"
|
||||
320
odoo-bringout-oca-connector-connector/connector/i18n/zh_CN.po
Normal file
|
|
@ -0,0 +1,320 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * connector
|
||||
#
|
||||
# Translators:
|
||||
# OCA Transbot <transbot@odoo-community.org>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 11.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2018-01-05 16:56+0000\n"
|
||||
"PO-Revision-Date: 2020-07-08 05:19+0000\n"
|
||||
"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
|
||||
"Language-Team: Chinese (China) (https://www.transifex.com/oca/teams/23907/"
|
||||
"zh_CN/)\n"
|
||||
"Language: zh_CN\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 3.10\n"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.module.category,name:connector.module_category_connector
|
||||
msgid "Connector"
|
||||
msgstr "连接器"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_connector_backend
|
||||
msgid "Connector Backend"
|
||||
msgstr "连接器后端"
|
||||
|
||||
#. module: connector
|
||||
#: model:res.groups,name:connector.group_connector_manager
|
||||
msgid "Connector Manager"
|
||||
msgstr "连接器管理"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector
|
||||
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||
#: model_terms:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||
msgid "Connectors"
|
||||
msgstr "连接器"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_external_binding
|
||||
msgid "External Binding (abstract)"
|
||||
msgstr "外部绑定"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model.fields,field_description:connector.field_external_binding__sync_date
|
||||
msgid "Last synchronization date"
|
||||
msgstr "最后同步日期"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Nothing to export."
|
||||
msgstr "无需输出。"
|
||||
|
||||
#. module: connector
|
||||
#: model:ir.model,name:connector.model_queue_job
|
||||
msgid "Queue Job"
|
||||
msgstr "队列中作业"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/components/synchronizer.py:0
|
||||
#, python-format
|
||||
msgid "Record exported with ID %s on Backend."
|
||||
msgstr "已在后端导出ID为%s的记录。"
|
||||
|
||||
#. module: connector
|
||||
#. odoo-python
|
||||
#: code:addons/connector/models/queue_job.py:0
|
||||
#, python-format
|
||||
msgid "Related Record"
|
||||
msgstr "相关记录"
|
||||
|
||||
#~ msgid "Display Name"
|
||||
#~ msgstr "显示名称"
|
||||
|
||||
#~ msgid "ID"
|
||||
#~ msgstr "ID"
|
||||
|
||||
#~ msgid "Last Modified on"
|
||||
#~ msgstr "最后修改日"
|
||||
|
||||
#~ msgid "A %s needs a review."
|
||||
#~ msgstr "一个 %s 需要审核。"
|
||||
|
||||
#~ msgid "Action Needed"
|
||||
#~ msgstr "需要的操作"
|
||||
|
||||
#~ msgid "Activities"
|
||||
#~ msgstr "活动"
|
||||
|
||||
#~ msgid "Activity Exception Decoration"
|
||||
#~ msgstr "活动异常装饰"
|
||||
|
||||
#~ msgid "Activity State"
|
||||
#~ msgstr "活动状态"
|
||||
|
||||
#~ msgid "Attachment Count"
|
||||
#~ msgstr "附件数量"
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "取消"
|
||||
|
||||
#~ msgid "Checkpoint"
|
||||
#~ msgstr "检查点"
|
||||
|
||||
#~ msgid "Checkpoints"
|
||||
#~ msgstr "检查点"
|
||||
|
||||
#~ msgid "Checkpoints Review"
|
||||
#~ msgstr "检查点视图"
|
||||
|
||||
#~ msgid "Click on the"
|
||||
#~ msgstr "单击"
|
||||
|
||||
#~ msgid "Company"
|
||||
#~ msgstr "公司"
|
||||
|
||||
#~ msgid "Connector Checkpoint"
|
||||
#~ msgstr "连接器检查点"
|
||||
|
||||
#~ msgid "Created by"
|
||||
#~ msgstr "创建者"
|
||||
|
||||
#~ msgid "Created on"
|
||||
#~ msgstr "创建时间"
|
||||
|
||||
#~ msgid "Followers"
|
||||
#~ msgstr "关注者"
|
||||
|
||||
#~ msgid "Followers (Channels)"
|
||||
#~ msgstr "关注者(频道)"
|
||||
|
||||
#~ msgid "Followers (Partners)"
|
||||
#~ msgstr "关注者(业务伙伴)"
|
||||
|
||||
#~ msgid "Group By..."
|
||||
#~ msgstr "分组..."
|
||||
|
||||
#~ msgid "Icon"
|
||||
#~ msgstr "图标"
|
||||
|
||||
#~ msgid "Icon to indicate an exception activity."
|
||||
#~ msgstr "表示异常活动的图标。"
|
||||
|
||||
#~ msgid "If checked, new messages require your attention."
|
||||
#~ msgstr "如果选中,则需要您注意新消息。"
|
||||
|
||||
#~ msgid "If checked, some messages have a delivery error."
|
||||
#~ msgstr "如果选中,则某些邮件会发送传递错误。"
|
||||
|
||||
#~ msgid "Imported from"
|
||||
#~ msgstr "导入自"
|
||||
|
||||
#~ msgid "Is Follower"
|
||||
#~ msgstr "是关注者"
|
||||
|
||||
#~ msgid "Last Updated by"
|
||||
#~ msgstr "最后更新者"
|
||||
|
||||
#~ msgid "Last Updated on"
|
||||
#~ msgstr "最后更新时间"
|
||||
|
||||
#~ msgid "Main Attachment"
|
||||
#~ msgstr "附件"
|
||||
|
||||
#~ msgid "Message Delivery error"
|
||||
#~ msgstr "消息递送错误"
|
||||
|
||||
#~ msgid "Messages"
|
||||
#~ msgstr "消息"
|
||||
|
||||
#~ msgid "Model"
|
||||
#~ msgstr "模型"
|
||||
|
||||
#~ msgid "Name of the record to review"
|
||||
#~ msgstr "要审核的记录的名称"
|
||||
|
||||
#~ msgid "Need Review"
|
||||
#~ msgstr "需要审阅"
|
||||
|
||||
#~ msgid "Next Activity Deadline"
|
||||
#~ msgstr "下一活动截止日期"
|
||||
|
||||
#~ msgid "Next Activity Summary"
|
||||
#~ msgstr "下一个活动摘要"
|
||||
|
||||
#~ msgid "Next Activity Type"
|
||||
#~ msgstr "下一个活动类型"
|
||||
|
||||
#~ msgid "No record to check."
|
||||
#~ msgstr "没有记录要检查。"
|
||||
|
||||
#~ msgid "Number of Actions"
|
||||
#~ msgstr "操作次数"
|
||||
|
||||
#~ msgid "Number of errors"
|
||||
#~ msgstr "错误数量"
|
||||
|
||||
#~ msgid "Number of messages which requires an action"
|
||||
#~ msgstr "需要操作的消息数"
|
||||
|
||||
#~ msgid "Number of messages with delivery error"
|
||||
#~ msgstr "发送错误的消息数量"
|
||||
|
||||
#~ msgid "Number of unread messages"
|
||||
#~ msgstr "未读消息数量"
|
||||
|
||||
#~ msgid "Record"
|
||||
#~ msgstr "记录"
|
||||
|
||||
#~ msgid "Record ID"
|
||||
#~ msgstr "记录 ID"
|
||||
|
||||
#~ msgid "Record Name"
|
||||
#~ msgstr "记录名称"
|
||||
|
||||
#~ msgid "Responsible User"
|
||||
#~ msgstr "责任用户"
|
||||
|
||||
#~ msgid "Review Checkpoints"
|
||||
#~ msgstr "审查检查点"
|
||||
|
||||
#~ msgid "Reviewed"
|
||||
#~ msgstr "已审阅"
|
||||
|
||||
#~ msgid "SMS Delivery error"
|
||||
#~ msgstr "短信发送错误"
|
||||
|
||||
#~ msgid "Set as reviewed"
|
||||
#~ msgstr "设置为已读"
|
||||
|
||||
#~ msgid "Status"
|
||||
#~ msgstr "状态"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Status based on activities\n"
|
||||
#~ "Overdue: Due date is already passed\n"
|
||||
#~ "Today: Activity date is today\n"
|
||||
#~ "Planned: Future activities."
|
||||
#~ msgstr ""
|
||||
#~ "基于活动的状态\n"
|
||||
#~ "逾期:已经超过截止日期\n"
|
||||
#~ "现今:活动日期是当天\n"
|
||||
#~ "计划:未来的活动。"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The connectors list the new records to verify\n"
|
||||
#~ " based on their type. Only some need a manual\n"
|
||||
#~ " review."
|
||||
#~ msgstr ""
|
||||
#~ "连接器列出要验证的新记录\n"
|
||||
#~ " 根据他们的类型。只有一些人需要手册\n"
|
||||
#~ " 回顾。"
|
||||
|
||||
#~ msgid "The record has been imported from this backend"
|
||||
#~ msgstr "记录已经成功从后台导入"
|
||||
|
||||
#~ msgid "The record to review."
|
||||
#~ msgstr "要审查的记录。"
|
||||
|
||||
#~ msgid "The selected checkpoints will be set as reviewed."
|
||||
#~ msgstr "选定的检查点将设置为已审核。"
|
||||
|
||||
#~ msgid "Type of the exception activity on record."
|
||||
#~ msgstr "记录的异常活动的类型。"
|
||||
|
||||
#~ msgid "Unread Messages"
|
||||
#~ msgstr "未读消息"
|
||||
|
||||
#~ msgid "Unread Messages Counter"
|
||||
#~ msgstr "未读消息计数器"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When a connector imports new records which have\n"
|
||||
#~ " configuration or reviews to do manually, they\n"
|
||||
#~ " will appear in this list. Once a record has been\n"
|
||||
#~ " checked, click on the 'Reviewed' button."
|
||||
#~ msgstr ""
|
||||
#~ "当连接器导入具有的新记录时\n"
|
||||
#~ " 他们需要手动配置或评论\n"
|
||||
#~ " 将出现在此列表中。一旦有记录\n"
|
||||
#~ " 选中,单击“已审核”按钮。"
|
||||
|
||||
#~ msgid "to verify it:"
|
||||
#~ msgstr "验证它:"
|
||||
|
||||
#~ msgid "If checked new messages require your attention."
|
||||
#~ msgstr "如果选中,则需要您注意新消息。"
|
||||
|
||||
#~ msgid "Overdue"
|
||||
#~ msgstr "逾期"
|
||||
|
||||
#~ msgid "Planned"
|
||||
#~ msgstr "计划"
|
||||
|
||||
#~ msgid "Today"
|
||||
#~ msgstr "今天"
|
||||
|
||||
#~ msgid "Apply"
|
||||
#~ msgstr "应用"
|
||||
|
||||
#~ msgid "Backends"
|
||||
#~ msgstr "后台"
|
||||
|
||||
#~ msgid "Configure Connector"
|
||||
#~ msgstr "配置连接器"
|
||||
|
||||
#~ msgid "Open Connector Menu"
|
||||
#~ msgstr "打开连接器菜单"
|
||||
|
||||
#~ msgid "or"
|
||||
#~ msgstr "或"
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
from . import backend_model
|
||||
from . import queue_job
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
# Copyright 2013 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ConnectorBackend(models.AbstractModel):
|
||||
"""An instance of an external backend to synchronize with.
|
||||
|
||||
The backends have to ``_inherit`` this model in the connectors
|
||||
modules.
|
||||
|
||||
The components articulates around a collection, which in the context of the
|
||||
connectors is called a Backend.
|
||||
|
||||
It must be defined as a Model that inherits from ``'connector.backend'``.
|
||||
|
||||
Example with the Magento Connector::
|
||||
|
||||
# in connector_magento/models/magento_backend.py
|
||||
|
||||
class MagentoBackend(models.Model):
|
||||
_name = 'magento.backend'
|
||||
_inherit = 'connector.backend'
|
||||
_description = 'Magento Backend'
|
||||
|
||||
# the version in not mandatory
|
||||
@api.model
|
||||
def _select_versions(self):
|
||||
\"\"\" Available versions
|
||||
|
||||
Can be inherited to add custom versions.
|
||||
\"\"\"
|
||||
return [('1.7', 'Magento 1.7')]
|
||||
|
||||
location = fields.Char(string='Location', required=True)
|
||||
username = fields.Char(string='Username')
|
||||
password = fields.Char(string='Password')
|
||||
versions = fields.Selection(
|
||||
selection='_select_versions', required=True
|
||||
)
|
||||
|
||||
|
||||
"""
|
||||
|
||||
_name = "connector.backend"
|
||||
_inherit = ["collection.base"]
|
||||
_description = "Connector Backend"
|
||||
|
||||
|
||||
class ExternalBinding(models.AbstractModel):
|
||||
"""An abstract model for bindings to external records.
|
||||
|
||||
An external binding is a binding between a backend and Odoo. For
|
||||
example, for a partner, it could be ``magento.res.partner`` or for a
|
||||
product, ``magento.product``.
|
||||
|
||||
The final model, will be an ``_inherits`` of the Odoo model and
|
||||
will ``_inherit`` this model.
|
||||
|
||||
It will have a relation to the record (via ``_inherits``) and to the
|
||||
concrete backend model (``magento.backend`` for instance).
|
||||
|
||||
It will also contains all the data relative to the backend for the
|
||||
record.
|
||||
|
||||
It needs to implements at least these fields:
|
||||
|
||||
odoo_id
|
||||
The many2one to the record it links (used by ``_inherits``).
|
||||
|
||||
backend_id
|
||||
The many2one to the backend (for instance ``magento.backend``).
|
||||
|
||||
external_id
|
||||
The ID on the backend.
|
||||
|
||||
sync_date
|
||||
Last date of synchronization
|
||||
|
||||
|
||||
The definition of the field relations is to be done in the
|
||||
concrete classes because the relations themselves do not exist in
|
||||
this addon.
|
||||
|
||||
For example, for a ``res.partner.category`` from Magento, I would have
|
||||
(this is a consolidation of all the columns from the abstract models,
|
||||
in ``magentoerpconnect`` you would not find that)::
|
||||
|
||||
class MagentoResPartnerCategory(models.Model):
|
||||
_name = 'magento.res.partner.category'
|
||||
|
||||
_inherits = {'res.partner.category': 'odoo_id'}
|
||||
|
||||
odoo_id = fields.Many2one(comodel_name='res.partner.category',
|
||||
string='Partner Category',
|
||||
required=True,
|
||||
ondelete='cascade')
|
||||
backend_id = fields.Many2one(
|
||||
comodel_name='magento.backend',
|
||||
string='Magento Backend',
|
||||
required=True,
|
||||
ondelete='restrict')
|
||||
external_id = fields.Char(string='ID on Magento')
|
||||
tax_class_id = fields.Integer(string='Tax Class ID')
|
||||
|
||||
_sql_constraints = [
|
||||
('magento_uniq', 'unique(backend_id, magento_id)',
|
||||
'Partner Tag with same ID on Magento already exists.'),
|
||||
]
|
||||
|
||||
|
||||
"""
|
||||
|
||||
_name = "external.binding"
|
||||
_description = "External Binding (abstract)"
|
||||
|
||||
sync_date = fields.Datetime(string="Last synchronization date")
|
||||
# add other fields in concrete models
|
||||
# XXX we could add a default 'external_id'
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
# Copyright 2017 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
from odoo import _, models
|
||||
|
||||
|
||||
class QueueJob(models.Model):
|
||||
|
||||
_inherit = "queue.job"
|
||||
|
||||
def related_action_unwrap_binding(self, component_usage="binder"):
|
||||
"""Open a form view with the unwrapped record.
|
||||
|
||||
For instance, for a job on a ``magento.product.product``,
|
||||
it will open a ``product.product`` form view with the unwrapped
|
||||
record.
|
||||
|
||||
:param component_usage: base component usage to search for the binder
|
||||
"""
|
||||
self.ensure_one()
|
||||
model_name = self.model_name
|
||||
binding = self.env[model_name].browse(self.record_ids).exists()
|
||||
if not binding:
|
||||
return None
|
||||
if len(binding) > 1:
|
||||
# not handled
|
||||
return None
|
||||
action = {
|
||||
"name": _("Related Record"),
|
||||
"type": "ir.actions.act_window",
|
||||
"view_type": "form",
|
||||
"view_mode": "form",
|
||||
}
|
||||
with binding.backend_id.work_on(binding._name) as work:
|
||||
binder = work.component(usage=component_usage)
|
||||
try:
|
||||
model = binder.unwrap_model()
|
||||
record = binder.unwrap_binding(binding)
|
||||
# the unwrapped record will be displayed
|
||||
action.update({"res_model": model, "res_id": record.id})
|
||||
except ValueError:
|
||||
# the binding record will be displayed
|
||||
action.update({"res_model": binding._name, "res_id": binding.id})
|
||||
return action
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
* Guewen Baconnier at Camptocamp
|
||||
* Alexandre Fayolle at Camptocamp
|
||||
* Benoit Guillot at Akretion
|
||||
* Nicolas Bessi at Camptocamp
|
||||
* Joël Grand-Guillaume at Camptocamp
|
||||
* Arthur Vuillard at Akretion
|
||||
* Sebastien Beau at Akretion
|
||||
* Laurent Mignon at Acsone
|
||||
* Leonardo Pistone at Camptocamp
|
||||
* David Béal at Akretion
|
||||
* Christophe Combelles at Anybox
|
||||
* Stéphane Bidoul at Acsone
|
||||
* Malte Jacobi at IBO / HTW
|
||||
* Laetitia Gangloff at Acsone
|
||||
* David Lefever at Taktik S.A.
|
||||
* Jos de Graeve at Apertoso NV
|
||||
* Jean-Sébastien Suzanne at Anybox
|
||||
* Leonardo Donelli at MONK Software
|
||||
* Mathias Colpaert
|
||||
* Yannick Vaucher at Camptocamp
|
||||
* Nicolas Piganeau at NDP Systèmes
|
||||
* Florent Thomas at Mind And Go
|
||||
* Matthieu Dietrich at Camptocamp
|
||||
* Olivier Laurent at Acsone
|
||||
* Eric Antones at NuoBiT Solutions S.L.
|
||||
* Asier Neira at Factor Libre S.L.
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
This is a framework designed to build connectors with external systems,
|
||||
usually called ``Backends`` in the documentation.
|
||||
|
||||
Documentation: http://odoo-connector.com
|
||||
|
||||
It features:
|
||||
|
||||
* A jobs queue
|
||||
|
||||
In which the connectors can push functions (synchronization tasks)
|
||||
to be executed later.
|
||||
|
||||
* An event pattern
|
||||
|
||||
The connectors can subscribe listener functions on the events,
|
||||
executed when the events are fired.
|
||||
|
||||
* Connector base classes
|
||||
|
||||
Called ``ConnectorUnit``.
|
||||
|
||||
Include base classes for the use in connectors, ready to be extended:
|
||||
|
||||
* ``Synchronizer``: flow of an import or export
|
||||
* ``Mapper``: transform a record according to mapping rules
|
||||
* ``Binder``: link external IDs with local IDS
|
||||
* ``BackendAdapter``: adapter interface for the exchanges with the backend
|
||||
* But ``ConnectorUnit`` can be extended to accomplish any task
|
||||
|
||||
* A multi-backend support
|
||||
|
||||
Each ``ConnectorUnit`` can be registered amongst a backend type (eg.
|
||||
Magento) and a backend version (allow to have a different ``Mapper``
|
||||
for each backend's version for instance)
|
||||
|
||||
It is used for example used to connect Magento_ and Prestashop_, but
|
||||
also used with Solr, CMIS, ...
|
||||
|
||||
.. _Magento: http://odoo-magento-connector.com
|
||||
.. _Prestashop: https://github.com/OCA/connector-prestashop
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
.. [ The change log. The goal of this file is to help readers
|
||||
understand changes between version. The primary audience is
|
||||
end users and integrators. Purely technical changes such as
|
||||
code refactoring must not be mentioned here.
|
||||
|
||||
This file may contain ONE level of section titles, underlined
|
||||
with the ~ (tilde) character. Other section markers are
|
||||
forbidden and will likely break the structure of the README.rst
|
||||
or other documents where this fragment is included. ]
|
||||
|
||||
Next
|
||||
~~~~
|
||||
|
||||
12.0.1.0.0 (2018-11-26)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* [MIGRATION] from 12.0 branched at rev. 324e006
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
This module does nothing on its own. It is a ground for developing
|
||||
advanced connector modules. For further information, please go on:
|
||||
http://odoo-connector.com
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<odoo>
|
||||
<record model="ir.module.category" id="module_category_connector">
|
||||
<field name="name">Connector</field>
|
||||
<field name="sequence">20</field>
|
||||
</record>
|
||||
<record id="group_connector_manager" model="res.groups">
|
||||
<field name="name">Connector Manager</field>
|
||||
<field name="category_id" ref="module_category_connector" />
|
||||
<field name="users" eval="[(4, ref('base.user_root'))]" />
|
||||
</record>
|
||||
<record id="queue_job.group_queue_job_manager" model="res.groups">
|
||||
<field name="implied_ids" eval="[(4, ref('group_connector_manager'))]" />
|
||||
</record>
|
||||
</odoo>
|
||||
|
After Width: | Height: | Size: 7.8 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="70" height="70" viewBox="0,0,70,70"><!-- Generated with https://ivantodorovich.github.io/odoo-icon --><defs><linearGradient x1="70" y1="0" x2="0" y2="70" gradientUnits="userSpaceOnUse" id="color-1"><stop offset="0" stop-color="#ff6c68"/><stop offset="1" stop-color="#e53935"/></linearGradient></defs><g fill="none" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal"><path d="M3.5,70c-1.933,0 -3.5,-1.567 -3.5,-3.5v-63c0,-1.933 1.567,-3.5 3.5,-3.5h63c1.933,0 3.5,1.567 3.5,3.5v63c0,1.933 -1.567,3.5 -3.5,3.5z" id="box" fill="url(#color-1)"/><path d="M65,1h-61c-1.95033,0 -3.2667,0.63396 -3.9491,1.90189c0.28378,-1.64806 1.72001,-2.90189 3.4491,-2.90189h63c1.72965,0 3.16627,1.25466 3.44938,2.90352c-0.69803,-1.26902 -2.34782,-1.90352 -4.94938,-1.90352z" id="topBoxShadow" fill="#ffffff" opacity="0.383"/><path d="M4,69h61c2.66667,0 4.33333,-1 5,-3v0.5c0,1.933 -1.567,3.5 -3.5,3.5h-63c-1.933,0 -3.5,-1.567 -3.5,-3.5c0,-0.1611 0,-0.32777 0,-0.5c0.66667,2 2,3 4,3z" id="bottomBoxShadow" fill="#000000" opacity="0.383"/><path d="M13.87529,28.78201c-0.58398,0.58398 -0.87529,1.32511 -0.87529,2.22354c0,0.80858 0.29203,1.50474 0.876,2.08872l8.62451,8.62451l-3.23437,3.23437c-0.31445,0.31445 -0.47225,0.69644 -0.47225,1.14566c0,0.35937 0.15779,0.69567 0.47225,1.01012l2.15649,2.15649c0.31445,0.31445 0.67359,0.49509 1.07788,0.54001c0.40429,-0.04492 0.76344,-0.22556 1.07788,-0.54001l1.07788,-1.07788l2.15649,2.15649c2.56051,2.56051 5.66073,4.04279 9.29935,4.44708c3.63862,0.31445 6.94019,-0.51666 9.90499,-2.49319l6.67062,6.67062l4.31226,-4.31225l-6.67062,-6.67062c1.97654,-2.9648 2.7855,-6.24424 2.42613,-9.83794c-0.35937,-3.68354 -1.82023,-6.80518 -4.38074,-9.36569l-2.15649,-2.15649l1.0786,-1.0786c0.31445,-0.31445 0.47225,-0.65075 0.47225,-1.01012c0,-0.44921 -0.15779,-0.83121 -0.47225,-1.14566l-2.15649,-2.15649c-0.31445,-0.31445 -0.67359,-0.4494 -1.07788,-0.40448c-0.40429,-0.04492 -0.76344,0.09003 -1.07788,0.40448l-3.23437,3.23437l-8.62451,-8.62451c-0.58398,-0.58398 -1.30298,-0.85316 -2.15649,-0.80824c-0.8535,-0.04492 -1.57251,0.22426 -2.15649,0.80824c-0.58398,0.58398 -0.87529,1.32511 -0.87529,2.22354c0,0.80858 0.29203,1.50474 0.876,2.08872l8.62451,8.62451l-8.62523,8.62523l-8.62451,-8.62451c-0.58398,-0.58398 -1.30298,-0.85316 -2.15649,-0.80824c-0.8535,-0.04492 -1.57251,0.22426 -2.15649,0.80824z" id="shadow" fill="#000000" opacity="0.3"/><path d="M26.81278,13.84453c0.58398,-0.58398 1.30298,-0.85316 2.15649,-0.80824c0.8535,-0.04492 1.57251,0.22426 2.15649,0.80824l8.62451,8.62451l3.23438,-3.23438c0.31444,-0.31444 0.67359,-0.44939 1.07787,-0.40447c0.40429,-0.04492 0.76343,0.09003 1.07788,0.40448l2.15649,2.15649c0.31445,0.31445 0.47225,0.69644 0.47225,1.14566c0,0.35936 -0.15779,0.69566 -0.47223,1.0101l-0.00001,0.00001l-1.0786,1.0786l2.15648,2.15648c2.56051,2.56051 4.02137,5.68215 4.38074,9.36569c0.35937,3.5937 -0.4496,6.87313 -2.42613,9.83794l6.67062,6.67062l-17.34373,17.34373h-36.15627c-1.933,0 -3.5,-1.567 -3.5,-3.5l0,-25.8427l13.87529,-13.87529v0.00001z" id="flatShadow" fill="#000000" opacity="0.324"/><path d="M13.87529,26.78201c-0.58398,0.58398 -0.87529,1.32511 -0.87529,2.22354c0,0.80858 0.29203,1.50474 0.876,2.08872l8.62451,8.62451l-3.23437,3.23437c-0.31445,0.31445 -0.47225,0.69644 -0.47225,1.14566c0,0.35937 0.15779,0.69567 0.47225,1.01012l2.15649,2.15649c0.31445,0.31445 0.67359,0.49509 1.07788,0.54001c0.40429,-0.04492 0.76344,-0.22556 1.07788,-0.54001l1.07788,-1.07788l2.15649,2.15649c2.56051,2.56051 5.66073,4.04279 9.29935,4.44708c3.63862,0.31445 6.94019,-0.51666 9.90499,-2.49319l6.67062,6.67062l4.31226,-4.31225l-6.67062,-6.67062c1.97654,-2.9648 2.7855,-6.24424 2.42613,-9.83794c-0.35937,-3.68354 -1.82023,-6.80518 -4.38074,-9.36569l-2.15649,-2.15649l1.0786,-1.0786c0.31445,-0.31445 0.47225,-0.65075 0.47225,-1.01012c0,-0.44921 -0.15779,-0.83121 -0.47225,-1.14566l-2.15649,-2.15649c-0.31445,-0.31445 -0.67359,-0.4494 -1.07788,-0.40448c-0.40429,-0.04492 -0.76344,0.09003 -1.07788,0.40448l-3.23437,3.23437l-8.62451,-8.62451c-0.58398,-0.58398 -1.30298,-0.85316 -2.15649,-0.80824c-0.8535,-0.04492 -1.57251,0.22426 -2.15649,0.80824c-0.58398,0.58398 -0.87529,1.32511 -0.87529,2.22354c0,0.80858 0.29203,1.50474 0.876,2.08872l8.62451,8.62451l-8.62523,8.62523l-8.62451,-8.62451c-0.58398,-0.58398 -1.30298,-0.85316 -2.15649,-0.80824c-0.8535,-0.04492 -1.57251,0.22426 -2.15649,0.80824z" id="icon" fill="#ffffff"/></g></svg>
|
||||
|
After Width: | Height: | Size: 4.6 KiB |
|
|
@ -0,0 +1,518 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
|
||||
<title>Connector</title>
|
||||
<style type="text/css">
|
||||
|
||||
/*
|
||||
:Author: David Goodger (goodger@python.org)
|
||||
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
|
||||
:Copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
|
||||
customize this style sheet.
|
||||
*/
|
||||
|
||||
/* used to remove borders from tables and images */
|
||||
.borderless, table.borderless td, table.borderless th {
|
||||
border: 0 }
|
||||
|
||||
table.borderless td, table.borderless th {
|
||||
/* Override padding for "table.docutils td" with "! important".
|
||||
The right padding separates the table cells. */
|
||||
padding: 0 0.5em 0 0 ! important }
|
||||
|
||||
.first {
|
||||
/* Override more specific margin styles with "! important". */
|
||||
margin-top: 0 ! important }
|
||||
|
||||
.last, .with-subtitle {
|
||||
margin-bottom: 0 ! important }
|
||||
|
||||
.hidden {
|
||||
display: none }
|
||||
|
||||
.subscript {
|
||||
vertical-align: sub;
|
||||
font-size: smaller }
|
||||
|
||||
.superscript {
|
||||
vertical-align: super;
|
||||
font-size: smaller }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
blockquote.epigraph {
|
||||
margin: 2em 5em ; }
|
||||
|
||||
dl.docutils dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||
dl.docutils dt {
|
||||
font-weight: bold }
|
||||
*/
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||
div.hint, div.important, div.note, div.tip, div.warning {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||
div.important p.admonition-title, div.note p.admonition-title,
|
||||
div.tip p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title, .code .error {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||
compound paragraphs.
|
||||
div.compound .compound-first, div.compound .compound-middle {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.compound .compound-last, div.compound .compound-middle {
|
||||
margin-top: 0.5em }
|
||||
*/
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
clear: both;
|
||||
font-size: smaller }
|
||||
|
||||
div.line-block {
|
||||
display: block ;
|
||||
margin-top: 1em ;
|
||||
margin-bottom: 1em }
|
||||
|
||||
div.line-block div.line-block {
|
||||
margin-top: 0 ;
|
||||
margin-bottom: 0 ;
|
||||
margin-left: 1.5em }
|
||||
|
||||
div.sidebar {
|
||||
margin: 0 0 0.5em 1em ;
|
||||
border: medium outset ;
|
||||
padding: 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||
margin-top: 0.4em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr.docutils {
|
||||
width: 75% }
|
||||
|
||||
img.align-left, .figure.align-left, object.align-left, table.align-left {
|
||||
clear: left ;
|
||||
float: left ;
|
||||
margin-right: 1em }
|
||||
|
||||
img.align-right, .figure.align-right, object.align-right, table.align-right {
|
||||
clear: right ;
|
||||
float: right ;
|
||||
margin-left: 1em }
|
||||
|
||||
img.align-center, .figure.align-center, object.align-center {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
table.align-center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.align-left {
|
||||
text-align: left }
|
||||
|
||||
.align-center {
|
||||
clear: both ;
|
||||
text-align: center }
|
||||
|
||||
.align-right {
|
||||
text-align: right }
|
||||
|
||||
/* reset inner alignment in figures */
|
||||
div.align-right {
|
||||
text-align: inherit }
|
||||
|
||||
/* div.align-center * { */
|
||||
/* text-align: left } */
|
||||
|
||||
.align-top {
|
||||
vertical-align: top }
|
||||
|
||||
.align-middle {
|
||||
vertical-align: middle }
|
||||
|
||||
.align-bottom {
|
||||
vertical-align: bottom }
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font: inherit }
|
||||
|
||||
pre.literal-block, pre.doctest-block, pre.math, pre.code {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em }
|
||||
|
||||
pre.code .ln { color: grey; } /* line numbers */
|
||||
pre.code, code { background-color: #eeeeee }
|
||||
pre.code .comment, code .comment { color: #5C6576 }
|
||||
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
|
||||
pre.code .literal.string, code .literal.string { color: #0C5404 }
|
||||
pre.code .name.builtin, code .name.builtin { color: #352B84 }
|
||||
pre.code .deleted, code .deleted { background-color: #DEB0A1}
|
||||
pre.code .inserted, code .inserted { background-color: #A3D289}
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
span.section-subtitle {
|
||||
/* font-size relative to parent (h1..h6 element) */
|
||||
font-size: 80% }
|
||||
|
||||
table.citation {
|
||||
border-left: solid 1px gray;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.docutils {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid 1px black;
|
||||
margin-left: 1px }
|
||||
|
||||
table.docutils td, table.docutils th,
|
||||
table.docinfo td, table.docinfo th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap ;
|
||||
padding-left: 0 }
|
||||
|
||||
/* "booktabs" style (no vertical lines) */
|
||||
table.docutils.booktabs {
|
||||
border: 0px;
|
||||
border-top: 2px solid;
|
||||
border-bottom: 2px solid;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.docutils.booktabs * {
|
||||
border: 0px;
|
||||
}
|
||||
table.docutils.booktabs th {
|
||||
border-bottom: thin solid;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||
font-size: 100% }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="document" id="connector">
|
||||
<h1 class="title">Connector</h1>
|
||||
|
||||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:89e6132419a9388e31f1e1919ac881f45189d2c51e4bd383a41174d51c984b60
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||||
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/connector/tree/16.0/connector"><img alt="OCA/connector" src="https://img.shields.io/badge/github-OCA%2Fconnector-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/connector-16-0/connector-16-0-connector"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/connector&target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
|
||||
<p>This is a framework designed to build connectors with external systems,
|
||||
usually called <tt class="docutils literal">Backends</tt> in the documentation.</p>
|
||||
<p>Documentation: <a class="reference external" href="http://odoo-connector.com">http://odoo-connector.com</a></p>
|
||||
<p>It features:</p>
|
||||
<ul>
|
||||
<li><p class="first">A jobs queue</p>
|
||||
<blockquote>
|
||||
<p>In which the connectors can push functions (synchronization tasks)
|
||||
to be executed later.</p>
|
||||
</blockquote>
|
||||
</li>
|
||||
<li><p class="first">An event pattern</p>
|
||||
<blockquote>
|
||||
<p>The connectors can subscribe listener functions on the events,
|
||||
executed when the events are fired.</p>
|
||||
</blockquote>
|
||||
</li>
|
||||
<li><p class="first">Connector base classes</p>
|
||||
<blockquote>
|
||||
<p>Called <tt class="docutils literal">ConnectorUnit</tt>.</p>
|
||||
<p>Include base classes for the use in connectors, ready to be extended:</p>
|
||||
<ul class="simple">
|
||||
<li><tt class="docutils literal">Synchronizer</tt>: flow of an import or export</li>
|
||||
<li><tt class="docutils literal">Mapper</tt>: transform a record according to mapping rules</li>
|
||||
<li><tt class="docutils literal">Binder</tt>: link external IDs with local IDS</li>
|
||||
<li><tt class="docutils literal">BackendAdapter</tt>: adapter interface for the exchanges with the backend</li>
|
||||
<li>But <tt class="docutils literal">ConnectorUnit</tt> can be extended to accomplish any task</li>
|
||||
</ul>
|
||||
</blockquote>
|
||||
</li>
|
||||
<li><p class="first">A multi-backend support</p>
|
||||
<blockquote>
|
||||
<p>Each <tt class="docutils literal">ConnectorUnit</tt> can be registered amongst a backend type (eg.
|
||||
Magento) and a backend version (allow to have a different <tt class="docutils literal">Mapper</tt>
|
||||
for each backend’s version for instance)</p>
|
||||
</blockquote>
|
||||
</li>
|
||||
</ul>
|
||||
<p>It is used for example used to connect <a class="reference external" href="http://odoo-magento-connector.com">Magento</a> and <a class="reference external" href="https://github.com/OCA/connector-prestashop">Prestashop</a>, but
|
||||
also used with Solr, CMIS, …</p>
|
||||
<p><strong>Table of contents</strong></p>
|
||||
<div class="contents local topic" id="contents">
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
|
||||
<li><a class="reference internal" href="#changelog" id="toc-entry-2">Changelog</a><ul>
|
||||
<li><a class="reference internal" href="#next" id="toc-entry-3">Next</a></li>
|
||||
<li><a class="reference internal" href="#section-1" id="toc-entry-4">12.0.1.0.0 (2018-11-26)</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-5">Bug Tracker</a></li>
|
||||
<li><a class="reference internal" href="#credits" id="toc-entry-6">Credits</a><ul>
|
||||
<li><a class="reference internal" href="#authors" id="toc-entry-7">Authors</a></li>
|
||||
<li><a class="reference internal" href="#contributors" id="toc-entry-8">Contributors</a></li>
|
||||
<li><a class="reference internal" href="#maintainers" id="toc-entry-9">Maintainers</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="usage">
|
||||
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
|
||||
<p>This module does nothing on its own. It is a ground for developing
|
||||
advanced connector modules. For further information, please go on:
|
||||
<a class="reference external" href="http://odoo-connector.com">http://odoo-connector.com</a></p>
|
||||
</div>
|
||||
<div class="section" id="changelog">
|
||||
<h1><a class="toc-backref" href="#toc-entry-2">Changelog</a></h1>
|
||||
<!-- [ The change log. The goal of this file is to help readers
|
||||
understand changes between version. The primary audience is
|
||||
end users and integrators. Purely technical changes such as
|
||||
code refactoring must not be mentioned here.
|
||||
|
||||
This file may contain ONE level of section titles, underlined
|
||||
with the ~ (tilde) character. Other section markers are
|
||||
forbidden and will likely break the structure of the README.rst
|
||||
or other documents where this fragment is included. ] -->
|
||||
<div class="section" id="next">
|
||||
<h2><a class="toc-backref" href="#toc-entry-3">Next</a></h2>
|
||||
</div>
|
||||
<div class="section" id="section-1">
|
||||
<h2><a class="toc-backref" href="#toc-entry-4">12.0.1.0.0 (2018-11-26)</a></h2>
|
||||
<ul class="simple">
|
||||
<li>[MIGRATION] from 12.0 branched at rev. 324e006</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="bug-tracker">
|
||||
<h1><a class="toc-backref" href="#toc-entry-5">Bug Tracker</a></h1>
|
||||
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/connector/issues">GitHub Issues</a>.
|
||||
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
|
||||
<a class="reference external" href="https://github.com/OCA/connector/issues/new?body=module:%20connector%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
|
||||
<p>Do not contact contributors directly about support or help with technical issues.</p>
|
||||
</div>
|
||||
<div class="section" id="credits">
|
||||
<h1><a class="toc-backref" href="#toc-entry-6">Credits</a></h1>
|
||||
<div class="section" id="authors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-7">Authors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Camptocamp</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="contributors">
|
||||
<h2><a class="toc-backref" href="#toc-entry-8">Contributors</a></h2>
|
||||
<ul class="simple">
|
||||
<li>Guewen Baconnier at Camptocamp</li>
|
||||
<li>Alexandre Fayolle at Camptocamp</li>
|
||||
<li>Benoit Guillot at Akretion</li>
|
||||
<li>Nicolas Bessi at Camptocamp</li>
|
||||
<li>Joël Grand-Guillaume at Camptocamp</li>
|
||||
<li>Arthur Vuillard at Akretion</li>
|
||||
<li>Sebastien Beau at Akretion</li>
|
||||
<li>Laurent Mignon at Acsone</li>
|
||||
<li>Leonardo Pistone at Camptocamp</li>
|
||||
<li>David Béal at Akretion</li>
|
||||
<li>Christophe Combelles at Anybox</li>
|
||||
<li>Stéphane Bidoul at Acsone</li>
|
||||
<li>Malte Jacobi at IBO / HTW</li>
|
||||
<li>Laetitia Gangloff at Acsone</li>
|
||||
<li>David Lefever at Taktik S.A.</li>
|
||||
<li>Jos de Graeve at Apertoso NV</li>
|
||||
<li>Jean-Sébastien Suzanne at Anybox</li>
|
||||
<li>Leonardo Donelli at MONK Software</li>
|
||||
<li>Mathias Colpaert</li>
|
||||
<li>Yannick Vaucher at Camptocamp</li>
|
||||
<li>Nicolas Piganeau at NDP Systèmes</li>
|
||||
<li>Florent Thomas at Mind And Go</li>
|
||||
<li>Matthieu Dietrich at Camptocamp</li>
|
||||
<li>Olivier Laurent at Acsone</li>
|
||||
<li>Eric Antones at NuoBiT Solutions S.L.</li>
|
||||
<li>Asier Neira at Factor Libre S.L.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
<h2><a class="toc-backref" href="#toc-entry-9">Maintainers</a></h2>
|
||||
<p>This module is maintained by the OCA.</p>
|
||||
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
|
||||
<p>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.</p>
|
||||
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/connector/tree/16.0/connector">OCA/connector</a> project on GitHub.</p>
|
||||
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
from . import test_advisory_lock
|
||||
from . import test_listener
|
||||
from . import test_locker
|
||||
from . import test_mapper
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
# Copyright 2017 Camptocamp SA
|
||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||
|
||||
from unittest import mock
|
||||
|
||||
from odoo import api
|
||||
from odoo.modules.registry import Registry
|
||||
from odoo.tests import common
|
||||
|
||||
from odoo.addons.component.core import WorkContext
|
||||
from odoo.addons.component.tests.common import TransactionComponentCase
|
||||
from odoo.addons.connector.database import pg_try_advisory_lock
|
||||
from odoo.addons.queue_job.exception import RetryableJobError
|
||||
|
||||
|
||||
class TestAdvisoryLock(TransactionComponentCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.registry2 = Registry(common.get_db_name())
|
||||
self.cr2 = self.registry2.cursor()
|
||||
self.env2 = api.Environment(self.cr2, self.env.uid, {})
|
||||
|
||||
@self.addCleanup
|
||||
def reset_cr2():
|
||||
# rollback and close the cursor, and reset the environments
|
||||
self.env2.reset()
|
||||
self.cr2.rollback()
|
||||
self.cr2.close()
|
||||
|
||||
def test_concurrent_lock(self):
|
||||
"""2 concurrent transactions cannot acquire the same lock"""
|
||||
# the lock is based on a string, a second transaction trying
|
||||
# to acquire the same lock won't be able to acquire it
|
||||
lock = "import_record({}, {}, {}, {})".format(
|
||||
"backend.name", 1, "res.partner", "999999"
|
||||
)
|
||||
acquired = pg_try_advisory_lock(self.env, lock)
|
||||
self.assertTrue(acquired)
|
||||
# we test the base function
|
||||
inner_acquired = pg_try_advisory_lock(self.env2, lock)
|
||||
self.assertFalse(inner_acquired)
|
||||
|
||||
def test_concurrent_import_lock(self):
|
||||
"""A 2nd concurrent transaction must retry"""
|
||||
# the lock is based on a string, a second transaction trying
|
||||
# to acquire the same lock won't be able to acquire it
|
||||
lock = "import_record({}, {}, {}, {})".format(
|
||||
"backend.name", 1, "res.partner", "999999"
|
||||
)
|
||||
|
||||
backend = mock.MagicMock()
|
||||
backend.env = self.env
|
||||
work = WorkContext(model_name="res.partner", collection=backend)
|
||||
# we test the function through a Component instance
|
||||
component = work.component_by_name("base.connector")
|
||||
# acquire the lock
|
||||
component.advisory_lock_or_retry(lock)
|
||||
|
||||
# instanciate another component using a different odoo env
|
||||
# hence another PG transaction
|
||||
backend2 = mock.MagicMock()
|
||||
backend2.env = self.env2
|
||||
work2 = WorkContext(model_name="res.partner", collection=backend2)
|
||||
component2 = work2.component_by_name("base.connector")
|
||||
with self.assertRaises(RetryableJobError) as cm:
|
||||
component2.advisory_lock_or_retry(lock, retry_seconds=3)
|
||||
self.assertEqual(cm.exception.seconds, 3)
|
||||