sst02 mit connector
|
|
@ -15,3 +15,12 @@ timezone = Europe/Vienna
|
||||||
|
|
||||||
#dbfilter_test = ['.*',]
|
#dbfilter_test = ['.*',]
|
||||||
show_debug = 1
|
show_debug = 1
|
||||||
|
|
||||||
|
workers = 0
|
||||||
|
server_wide_modules = web,base_sparse_field,queue_job
|
||||||
|
|
||||||
|
portal_url = https://erp.tzaustria.info
|
||||||
|
portal_secret = secret
|
||||||
|
|
||||||
|
[queue_job]
|
||||||
|
channels = root:4
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,90 @@
|
||||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||||
|
:target: http://www.gnu.org/licenses/agpl
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
|
||||||
|
==========
|
||||||
|
Components
|
||||||
|
==========
|
||||||
|
|
||||||
|
This module implements a component system and is a base block for the Connector
|
||||||
|
Framework. It can be used without using the full Connector though.
|
||||||
|
|
||||||
|
Documentation: http://odoo-connector.com/
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
* Install ``component``
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
The module does nothing by itself and has no configuration.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
As a developer, you have access to a component system. You can find the
|
||||||
|
documentation in the code or on http://odoo-connector.com
|
||||||
|
|
||||||
|
In a nutshell, you can create components::
|
||||||
|
|
||||||
|
|
||||||
|
from odoo.addons.component.core import Component
|
||||||
|
|
||||||
|
class MagentoPartnerAdapter(Component):
|
||||||
|
_name = 'magento.partner.adapter'
|
||||||
|
_inherit = 'magento.adapter'
|
||||||
|
|
||||||
|
_usage = 'backend.adapter'
|
||||||
|
_collection = 'magento.backend'
|
||||||
|
_apply_on = ['res.partner']
|
||||||
|
|
||||||
|
And later, find the component you need at runtime (dynamic dispatch at
|
||||||
|
component level)::
|
||||||
|
|
||||||
|
def run(self, external_id):
|
||||||
|
backend_adapter = self.component(usage='backend.adapter')
|
||||||
|
external_data = backend_adapter.read(external_id)
|
||||||
|
|
||||||
|
|
||||||
|
Known issues / Roadmap
|
||||||
|
======================
|
||||||
|
|
||||||
|
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 smash it by providing detailed and welcomed feedback.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Images
|
||||||
|
------
|
||||||
|
|
||||||
|
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Guewen Baconnier <guewen.baconnier@camptocamp.com>
|
||||||
|
|
||||||
|
Do not contact contributors directly about support or help with technical issues.
|
||||||
|
|
||||||
|
Maintainer
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. image:: https://odoo-community.org/logo.png
|
||||||
|
:alt: Odoo Community Association
|
||||||
|
:target: https://odoo-community.org
|
||||||
|
|
||||||
|
This module is maintained by the OCA.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
To contribute to this module, please visit https://odoo-community.org.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import core
|
||||||
|
|
||||||
|
from . import components
|
||||||
|
from . import builder
|
||||||
|
from . import models
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
{'name': 'Components',
|
||||||
|
'version': '11.0.1.0.0',
|
||||||
|
'author': 'Camptocamp,'
|
||||||
|
'Odoo Community Association (OCA)',
|
||||||
|
'website': 'https://www.camptocamp.com',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'category': 'Generic Modules',
|
||||||
|
'depends': ['base',
|
||||||
|
],
|
||||||
|
'external_dependencies': {
|
||||||
|
'python': ['cachetools'],
|
||||||
|
},
|
||||||
|
'data': [],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
Components Builder
|
||||||
|
==================
|
||||||
|
|
||||||
|
Build the components at the build of a registry.
|
||||||
|
|
||||||
|
"""
|
||||||
|
import odoo
|
||||||
|
from odoo import api, models
|
||||||
|
from .core import (
|
||||||
|
_component_databases,
|
||||||
|
ComponentRegistry,
|
||||||
|
DEFAULT_CACHE_SIZE,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ComponentBuilder(models.AbstractModel):
|
||||||
|
""" Build the component classes
|
||||||
|
|
||||||
|
And register them in a global registry.
|
||||||
|
|
||||||
|
Every time an Odoo registry is built, the know components are cleared and
|
||||||
|
rebuilt as well. The Component classes are built using the same mechanism
|
||||||
|
than Odoo's Models: a final class is created, taking every Components with
|
||||||
|
a ``_name`` and applying Components with an ``_inherits`` upon them.
|
||||||
|
|
||||||
|
The final Component classes are registered in global registry.
|
||||||
|
|
||||||
|
This class is an Odoo model, allowing us to hook the build of the
|
||||||
|
components at the end of the Odoo's registry loading, using
|
||||||
|
``_register_hook``. This method is called after all modules are loaded, so
|
||||||
|
we are sure that we have all the components Classes and in the correct
|
||||||
|
order.
|
||||||
|
|
||||||
|
"""
|
||||||
|
_name = 'component.builder'
|
||||||
|
_description = 'Component Builder'
|
||||||
|
|
||||||
|
_components_registry_cache_size = DEFAULT_CACHE_SIZE
|
||||||
|
|
||||||
|
@api.model_cr
|
||||||
|
def _register_hook(self):
|
||||||
|
# This method is called by Odoo when the registry is built,
|
||||||
|
# so in case the registry is rebuilt (cache invalidation, ...),
|
||||||
|
# we have to to rebuild the components. We use a new
|
||||||
|
# registry so we have an empty cache and we'll add components in it.
|
||||||
|
components_registry = self._init_global_registry()
|
||||||
|
self.build_registry(components_registry)
|
||||||
|
components_registry.ready = True
|
||||||
|
|
||||||
|
def _init_global_registry(self):
|
||||||
|
components_registry = ComponentRegistry(
|
||||||
|
cachesize=self._components_registry_cache_size
|
||||||
|
)
|
||||||
|
_component_databases[self.env.cr.dbname] = components_registry
|
||||||
|
return components_registry
|
||||||
|
|
||||||
|
def build_registry(self, components_registry, states=None,
|
||||||
|
exclude_addons=None):
|
||||||
|
if not states:
|
||||||
|
states = ('installed', 'to upgrade')
|
||||||
|
# lookup all the installed (or about to be) addons and generate
|
||||||
|
# the graph, so we can load the components following the order
|
||||||
|
# of the addons' dependencies
|
||||||
|
graph = odoo.modules.graph.Graph()
|
||||||
|
graph.add_module(self.env.cr, 'base')
|
||||||
|
|
||||||
|
query = (
|
||||||
|
"SELECT name "
|
||||||
|
"FROM ir_module_module "
|
||||||
|
"WHERE state IN %s "
|
||||||
|
)
|
||||||
|
params = [tuple(states)]
|
||||||
|
if exclude_addons:
|
||||||
|
query += " AND name NOT IN %s "
|
||||||
|
params.append(tuple(exclude_addons))
|
||||||
|
self.env.cr.execute(query, params)
|
||||||
|
|
||||||
|
module_list = [name for (name,) in self.env.cr.fetchall()
|
||||||
|
if name not in graph]
|
||||||
|
graph.add_modules(self.env.cr, module_list)
|
||||||
|
|
||||||
|
for module in graph:
|
||||||
|
self.load_components(module.name,
|
||||||
|
components_registry=components_registry)
|
||||||
|
|
||||||
|
def load_components(self, module, components_registry=None):
|
||||||
|
""" Build every component known by MetaComponent for an odoo module
|
||||||
|
|
||||||
|
The final component (composed by all the Component classes in this
|
||||||
|
module) will be pushed into the registry.
|
||||||
|
|
||||||
|
:param module: the name of the addon for which we want to load
|
||||||
|
the components
|
||||||
|
:type module: str | unicode
|
||||||
|
:param registry: the registry in which we want to put the Component
|
||||||
|
:type registry: :py:class:`~.core.ComponentRegistry`
|
||||||
|
"""
|
||||||
|
components_registry = (
|
||||||
|
components_registry or
|
||||||
|
_component_databases[self.env.cr.dbname])
|
||||||
|
components_registry.load_components(module)
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import base
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
from ..core import AbstractComponent
|
||||||
|
|
||||||
|
|
||||||
|
class BaseComponent(AbstractComponent):
|
||||||
|
""" This is the base component for every component
|
||||||
|
|
||||||
|
It is implicitely inherited by all components.
|
||||||
|
|
||||||
|
All your base are belong to us
|
||||||
|
"""
|
||||||
|
_name = 'base'
|
||||||
|
|
@ -0,0 +1,857 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# Copyright 2017 Odoo
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
Core
|
||||||
|
====
|
||||||
|
|
||||||
|
Core classes for the components.
|
||||||
|
The most common classes used publicly are:
|
||||||
|
|
||||||
|
* :class:`Component`
|
||||||
|
* :class:`AbstractComponent`
|
||||||
|
* :class:`WorkContext`
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import operator
|
||||||
|
|
||||||
|
from collections import defaultdict, OrderedDict
|
||||||
|
|
||||||
|
from odoo import models
|
||||||
|
from odoo.tools import OrderedSet, LastOrderedSet
|
||||||
|
from .exception import NoComponentError, SeveralComponentError
|
||||||
|
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
try:
|
||||||
|
from cachetools import LRUCache, cachedmethod
|
||||||
|
except ImportError:
|
||||||
|
_logger.debug("Cannot import 'cachetools'.")
|
||||||
|
|
||||||
|
|
||||||
|
# The Cache size represents the number of items, so the number
|
||||||
|
# of components (include abstract components) we will keep in the LRU
|
||||||
|
# cache. We would need stats to know what is the average but this is a bit
|
||||||
|
# early.
|
||||||
|
DEFAULT_CACHE_SIZE = 512
|
||||||
|
|
||||||
|
|
||||||
|
# this is duplicated from odoo.models.MetaModel._get_addon_name() which we
|
||||||
|
# unfortunately can't use because it's an instance method and should have been
|
||||||
|
# a @staticmethod
|
||||||
|
def _get_addon_name(full_name):
|
||||||
|
# The (Odoo) module name can be in the ``odoo.addons`` namespace
|
||||||
|
# or not. For instance, module ``sale`` can be imported as
|
||||||
|
# ``odoo.addons.sale`` (the right way) or ``sale`` (for backward
|
||||||
|
# compatibility).
|
||||||
|
module_parts = full_name.split('.')
|
||||||
|
if len(module_parts) > 2 and module_parts[:2] == ['odoo', 'addons']:
|
||||||
|
addon_name = full_name.split('.')[2]
|
||||||
|
else:
|
||||||
|
addon_name = full_name.split('.')[0]
|
||||||
|
return addon_name
|
||||||
|
|
||||||
|
|
||||||
|
class ComponentDatabases(dict):
|
||||||
|
""" Holds a registry of components for each database """
|
||||||
|
|
||||||
|
|
||||||
|
class ComponentRegistry(object):
|
||||||
|
""" Store all the components and allow to find them using criteria
|
||||||
|
|
||||||
|
The key is the ``_name`` of the components.
|
||||||
|
|
||||||
|
This is an OrderedDict, because we want to keep the registration order of
|
||||||
|
the components, addons loaded first have their components found first.
|
||||||
|
|
||||||
|
The :attr:`ready` attribute must be set to ``True`` when all the components
|
||||||
|
are loaded.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, cachesize=DEFAULT_CACHE_SIZE):
|
||||||
|
self._cache = LRUCache(maxsize=cachesize)
|
||||||
|
self._components = OrderedDict()
|
||||||
|
self._loaded_modules = set()
|
||||||
|
self.ready = False
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self._components[key]
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self._components[key] = value
|
||||||
|
|
||||||
|
def __contains__(self, key):
|
||||||
|
return key in self._components
|
||||||
|
|
||||||
|
def get(self, key, default=None):
|
||||||
|
return self._components.get(key, default)
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
return iter(self._components)
|
||||||
|
|
||||||
|
def load_components(self, module):
|
||||||
|
if module in self._loaded_modules:
|
||||||
|
return
|
||||||
|
for component_class in MetaComponent._modules_components[module]:
|
||||||
|
component_class._build_component(self)
|
||||||
|
self._loaded_modules.add(module)
|
||||||
|
|
||||||
|
@cachedmethod(operator.attrgetter('_cache'))
|
||||||
|
def lookup(self, collection_name=None, usage=None, model_name=None):
|
||||||
|
""" Find and return a list of components for a usage
|
||||||
|
|
||||||
|
If a component is not registered in a particular collection (no
|
||||||
|
``_collection``), it might will be returned in any case (as far as
|
||||||
|
the ``usage`` and ``model_name`` match). This is useful to share
|
||||||
|
generic components across different collections.
|
||||||
|
|
||||||
|
If no collection name is given, components from any collection
|
||||||
|
will be returned.
|
||||||
|
|
||||||
|
Then, the components of a collection are filtered by usage and/or
|
||||||
|
model. The ``_usage`` is mandatory on the components. When the
|
||||||
|
``_model_name`` is empty, it means it can be used for every models,
|
||||||
|
and it will ignore the ``model_name`` argument.
|
||||||
|
|
||||||
|
The abstract components are never returned.
|
||||||
|
|
||||||
|
This is a rather low-level function, usually you will use the
|
||||||
|
high-level :meth:`AbstractComponent.component`,
|
||||||
|
:meth:`AbstractComponent.many_components` or even
|
||||||
|
:meth:`AbstractComponent.component_by_name`.
|
||||||
|
|
||||||
|
:param collection_name: the name of the collection the component is
|
||||||
|
registered into.
|
||||||
|
:param usage: the usage of component we are looking for
|
||||||
|
:param model_name: filter on components that apply on this model
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# keep the order so addons loaded first have components used first
|
||||||
|
candidates = (
|
||||||
|
component for component in self._components.values()
|
||||||
|
if not component._abstract
|
||||||
|
)
|
||||||
|
|
||||||
|
if collection_name is not None:
|
||||||
|
candidates = (
|
||||||
|
component for component in candidates
|
||||||
|
if (component._collection == collection_name or
|
||||||
|
component._collection is None)
|
||||||
|
)
|
||||||
|
|
||||||
|
if usage is not None:
|
||||||
|
candidates = (component for component in candidates
|
||||||
|
if component._usage == usage)
|
||||||
|
|
||||||
|
if model_name is not None:
|
||||||
|
candidates = (c for c in candidates
|
||||||
|
if c.apply_on_models is None or
|
||||||
|
model_name in c.apply_on_models)
|
||||||
|
|
||||||
|
return list(candidates)
|
||||||
|
|
||||||
|
|
||||||
|
# We will store a ComponentRegistry per database here,
|
||||||
|
# it will be cleared and updated when the odoo's registry is rebuilt
|
||||||
|
_component_databases = ComponentDatabases()
|
||||||
|
|
||||||
|
|
||||||
|
class WorkContext(object):
|
||||||
|
""" Transport the context required to work with components
|
||||||
|
|
||||||
|
It is propagated through all the components, so any
|
||||||
|
data or instance (like a random RPC client) that need
|
||||||
|
to be propagated transversally to the components
|
||||||
|
should be kept here.
|
||||||
|
|
||||||
|
Including:
|
||||||
|
|
||||||
|
.. attribute:: model_name
|
||||||
|
|
||||||
|
Name of the model we are working with. It means that any lookup for a
|
||||||
|
component will be done for this model. It also provides a shortcut
|
||||||
|
as a `model` attribute to use directly with the Odoo model from
|
||||||
|
the components
|
||||||
|
|
||||||
|
.. attribute:: collection
|
||||||
|
|
||||||
|
The collection we are working with. The collection is an Odoo
|
||||||
|
Model that inherit from 'collection.base'. The collection attribute
|
||||||
|
can be a record or an "empty" model.
|
||||||
|
|
||||||
|
.. attribute:: model
|
||||||
|
|
||||||
|
Odoo Model for ``model_name`` with the same Odoo
|
||||||
|
:class:`~odoo.api.Environment` than the ``collection`` attribute.
|
||||||
|
|
||||||
|
This is also the entrypoint to work with the components.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
collection = self.env['my.collection'].browse(1)
|
||||||
|
work = WorkContext(model_name='res.partner', collection=collection)
|
||||||
|
component = work.component(usage='record.importer')
|
||||||
|
|
||||||
|
Usually you will use the context manager on the ``collection.base`` Model:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
collection = self.env['my.collection'].browse(1)
|
||||||
|
with collection.work_on('res.partner') as work:
|
||||||
|
component = work.component(usage='record.importer')
|
||||||
|
|
||||||
|
It supports any arbitrary keyword arguments that will become attributes of
|
||||||
|
the instance, and be propagated throughout all the components.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
collection = self.env['my.collection'].browse(1)
|
||||||
|
with collection.work_on('res.partner', hello='world') as work:
|
||||||
|
assert work.hello == 'world'
|
||||||
|
|
||||||
|
When you need to work on a different model, a new work instance will be
|
||||||
|
created for you when you are using the high-level API. This is what
|
||||||
|
happens under the hood:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
collection = self.env['my.collection'].browse(1)
|
||||||
|
with collection.work_on('res.partner', hello='world') as work:
|
||||||
|
assert work.model_name == 'res.partner'
|
||||||
|
assert work.hello == 'world'
|
||||||
|
work2 = work.work_on('res.users')
|
||||||
|
# => spawn a new WorkContext with a copy of the attributes
|
||||||
|
assert work2.model_name == 'res.users'
|
||||||
|
assert work2.hello == 'world'
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, model_name=None, collection=None,
|
||||||
|
components_registry=None, **kwargs):
|
||||||
|
self.collection = collection
|
||||||
|
self.model_name = model_name
|
||||||
|
self.model = self.env[model_name]
|
||||||
|
# lookup components in an alternative registry, used by the tests
|
||||||
|
if components_registry is not None:
|
||||||
|
self.components_registry = components_registry
|
||||||
|
else:
|
||||||
|
dbname = self.env.cr.dbname
|
||||||
|
try:
|
||||||
|
self.components_registry = _component_databases[dbname]
|
||||||
|
except KeyError:
|
||||||
|
_logger.error(
|
||||||
|
'No component registry for database %s. '
|
||||||
|
'Probably because the Odoo registry has not been built '
|
||||||
|
'yet.'
|
||||||
|
)
|
||||||
|
raise
|
||||||
|
self._propagate_kwargs = [
|
||||||
|
'collection',
|
||||||
|
'model_name',
|
||||||
|
'components_registry',
|
||||||
|
]
|
||||||
|
for attr_name, value in kwargs.items():
|
||||||
|
setattr(self, attr_name, value)
|
||||||
|
self._propagate_kwargs.append(attr_name)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def env(self):
|
||||||
|
""" Return the current Odoo env
|
||||||
|
|
||||||
|
This is the environment of the current collection.
|
||||||
|
"""
|
||||||
|
return self.collection.env
|
||||||
|
|
||||||
|
def work_on(self, model_name=None, collection=None):
|
||||||
|
""" Create a new work context for another model keeping attributes
|
||||||
|
|
||||||
|
Used when one need to lookup components for another model.
|
||||||
|
"""
|
||||||
|
kwargs = {attr_name: getattr(self, attr_name)
|
||||||
|
for attr_name in self._propagate_kwargs}
|
||||||
|
if collection is not None:
|
||||||
|
kwargs['collection'] = collection
|
||||||
|
if model_name is not None:
|
||||||
|
kwargs['model_name'] = model_name
|
||||||
|
return self.__class__(**kwargs)
|
||||||
|
|
||||||
|
def _component_class_by_name(self, name):
|
||||||
|
components_registry = self.components_registry
|
||||||
|
component_class = components_registry.get(name)
|
||||||
|
if not component_class:
|
||||||
|
raise NoComponentError("No component with name '%s' found." % name)
|
||||||
|
return component_class
|
||||||
|
|
||||||
|
def component_by_name(self, name, model_name=None):
|
||||||
|
""" Return a component by its name
|
||||||
|
|
||||||
|
If the component exists, an instance of it will be returned,
|
||||||
|
initialized with the current :class:`WorkContext`.
|
||||||
|
|
||||||
|
A :exc:`odoo.addons.component.exception.NoComponentError` is raised
|
||||||
|
if:
|
||||||
|
|
||||||
|
* no component with this name exists
|
||||||
|
* the ``_apply_on`` of the found component does not match
|
||||||
|
with the current working model
|
||||||
|
|
||||||
|
In the latter case, it can be an indication that you need to switch to
|
||||||
|
a different model, you can do so by providing the ``model_name``
|
||||||
|
argument.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if isinstance(model_name, models.BaseModel):
|
||||||
|
model_name = model_name._name
|
||||||
|
component_class = self._component_class_by_name(name)
|
||||||
|
work_model = model_name or self.model_name
|
||||||
|
if (component_class._collection and
|
||||||
|
self.collection._name != component_class._collection):
|
||||||
|
raise NoComponentError(
|
||||||
|
"Component with name '%s' can't be used for collection '%s'."
|
||||||
|
(name, self.collection._name)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (component_class.apply_on_models and
|
||||||
|
work_model not in component_class.apply_on_models):
|
||||||
|
if len(component_class.apply_on_models) == 1:
|
||||||
|
hint_models = "'%s'" % (component_class.apply_on_models[0],)
|
||||||
|
else:
|
||||||
|
hint_models = "<one of %r>" % (
|
||||||
|
component_class.apply_on_models,
|
||||||
|
)
|
||||||
|
raise NoComponentError(
|
||||||
|
"Component with name '%s' can't be used for model '%s'.\n"
|
||||||
|
"Hint: you might want to use: "
|
||||||
|
"component_by_name('%s', model_name=%s)" %
|
||||||
|
(name, work_model, name, hint_models)
|
||||||
|
)
|
||||||
|
|
||||||
|
if work_model == self.model_name:
|
||||||
|
work_context = self
|
||||||
|
else:
|
||||||
|
work_context = self.work_on(model_name)
|
||||||
|
return component_class(work_context)
|
||||||
|
|
||||||
|
def _lookup_components(self, usage=None, model_name=None):
|
||||||
|
component_classes = self.components_registry.lookup(
|
||||||
|
self.collection._name,
|
||||||
|
usage=usage,
|
||||||
|
model_name=model_name,
|
||||||
|
)
|
||||||
|
|
||||||
|
return [cls for cls in component_classes if cls._component_match(self)]
|
||||||
|
|
||||||
|
def component(self, usage=None, model_name=None):
|
||||||
|
""" Find a component by usage and model for the current collection
|
||||||
|
|
||||||
|
It searches a component using the rules of
|
||||||
|
:meth:`ComponentRegistry.lookup`. When a component is found,
|
||||||
|
it initialize it with the current :class:`WorkContext` and returned.
|
||||||
|
|
||||||
|
A :exc:`odoo.addons.component.exception.SeveralComponentError` is
|
||||||
|
raised if more than one component match for the provided
|
||||||
|
``usage``/``model_name``.
|
||||||
|
|
||||||
|
A :exc:`odoo.addons.component.exception.NoComponentError` is raised
|
||||||
|
if no component is found for the provided ``usage``/``model_name``.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if isinstance(model_name, models.BaseModel):
|
||||||
|
model_name = model_name._name
|
||||||
|
model_name = model_name or self.model_name
|
||||||
|
component_classes = self._lookup_components(
|
||||||
|
usage=usage, model_name=model_name
|
||||||
|
)
|
||||||
|
if not component_classes:
|
||||||
|
raise NoComponentError(
|
||||||
|
"No component found for collection '%s', "
|
||||||
|
"usage '%s', model_name '%s'." %
|
||||||
|
(self.collection._name, usage, model_name)
|
||||||
|
)
|
||||||
|
elif len(component_classes) > 1:
|
||||||
|
raise SeveralComponentError(
|
||||||
|
"Several components found for collection '%s', "
|
||||||
|
"usage '%s', model_name '%s'. Found: %r" %
|
||||||
|
(self.collection._name, usage or '',
|
||||||
|
model_name or '', component_classes)
|
||||||
|
)
|
||||||
|
if model_name == self.model_name:
|
||||||
|
work_context = self
|
||||||
|
else:
|
||||||
|
work_context = self.work_on(model_name)
|
||||||
|
return component_classes[0](work_context)
|
||||||
|
|
||||||
|
def many_components(self, usage=None, model_name=None):
|
||||||
|
""" Find many components by usage and model for the current collection
|
||||||
|
|
||||||
|
It searches a component using the rules of
|
||||||
|
:meth:`ComponentRegistry.lookup`. When components are found, they
|
||||||
|
initialized with the current :class:`WorkContext` and returned as a
|
||||||
|
list.
|
||||||
|
|
||||||
|
If no component is found, an empty list is returned.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if isinstance(model_name, models.BaseModel):
|
||||||
|
model_name = model_name._name
|
||||||
|
model_name = model_name or self.model_name
|
||||||
|
component_classes = self._lookup_components(
|
||||||
|
usage=usage, model_name=model_name
|
||||||
|
)
|
||||||
|
if model_name == self.model_name:
|
||||||
|
work_context = self
|
||||||
|
else:
|
||||||
|
work_context = self.work_on(model_name)
|
||||||
|
return [comp(work_context) for comp in component_classes]
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "WorkContext(%s, %s)" % (self.model_name, repr(self.collection))
|
||||||
|
|
||||||
|
__repr__ = __str__
|
||||||
|
|
||||||
|
|
||||||
|
class MetaComponent(type):
|
||||||
|
""" Metaclass for Components
|
||||||
|
|
||||||
|
Every new :class:`Component` will be added to ``_modules_components``,
|
||||||
|
that will be used by the component builder.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
_modules_components = defaultdict(list)
|
||||||
|
|
||||||
|
def __init__(self, name, bases, attrs):
|
||||||
|
if not self._register:
|
||||||
|
self._register = True
|
||||||
|
super(MetaComponent, self).__init__(name, bases, attrs)
|
||||||
|
return
|
||||||
|
|
||||||
|
if not hasattr(self, '_module'):
|
||||||
|
self._module = _get_addon_name(self.__module__)
|
||||||
|
|
||||||
|
self._modules_components[self._module].append(self)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def apply_on_models(self):
|
||||||
|
# None means all models
|
||||||
|
if self._apply_on is None:
|
||||||
|
return None
|
||||||
|
# always return a list, used for the lookup
|
||||||
|
elif isinstance(self._apply_on, str):
|
||||||
|
return [self._apply_on]
|
||||||
|
return self._apply_on
|
||||||
|
|
||||||
|
|
||||||
|
class AbstractComponent(object, metaclass=MetaComponent):
|
||||||
|
""" Main Component Model
|
||||||
|
|
||||||
|
All components have a Python inheritance either on
|
||||||
|
:class:`AbstractComponent` or either on :class:`Component`.
|
||||||
|
|
||||||
|
Abstract Components will not be returned by lookups on components, however
|
||||||
|
they can be used as a base for other Components through inheritance (using
|
||||||
|
``_inherit``).
|
||||||
|
|
||||||
|
Inheritance mechanism
|
||||||
|
The inheritance mechanism is like the Odoo's one for Models. Each
|
||||||
|
component has a ``_name``. This is the absolute minimum in a Component
|
||||||
|
class.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
class MyComponent(Component):
|
||||||
|
_name = 'my.component'
|
||||||
|
|
||||||
|
def speak(self, message):
|
||||||
|
print message
|
||||||
|
|
||||||
|
Every component implicitly inherit from the `'base'` component.
|
||||||
|
|
||||||
|
There are two close but distinct inheritance types, which look
|
||||||
|
familiar if you already know Odoo. The first uses ``_inherit`` with
|
||||||
|
an existing name, the name of the component we want to extend. With
|
||||||
|
the following example, ``my.component`` is now able to speak and to
|
||||||
|
yell.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
class MyComponent(Component): # name of the class does not matter
|
||||||
|
_inherit = 'my.component'
|
||||||
|
|
||||||
|
def yell(self, message):
|
||||||
|
print message.upper()
|
||||||
|
|
||||||
|
The second has a different ``_name``, it creates a new component,
|
||||||
|
including the behavior of the inherited component, but without
|
||||||
|
modifying it. In the following example, ``my.component`` is still able
|
||||||
|
to speak and to yell (brough by the previous inherit), but not to
|
||||||
|
sing. ``another.component`` is able to speak, to yell and to sing.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
class AnotherComponent(Component):
|
||||||
|
_name = 'another.component'
|
||||||
|
_inherit = 'my.component'
|
||||||
|
|
||||||
|
def sing(self, message):
|
||||||
|
print message.upper()
|
||||||
|
|
||||||
|
Registration and lookups
|
||||||
|
It is handled by 3 attributes on the class:
|
||||||
|
|
||||||
|
_collection
|
||||||
|
The name of the collection where we want to register the
|
||||||
|
component. This is not strictly mandatory as a component can be
|
||||||
|
shared across several collections. But usually, you want to set a
|
||||||
|
collection to segregate the components for a domain. A collection
|
||||||
|
can be for instance ``magento.backend``. It is also the name of a
|
||||||
|
model that inherits from ``collection.base``. See also
|
||||||
|
:class:`~WorkContext` and
|
||||||
|
:class:`~odoo.addons.component.models.collection.Collection`.
|
||||||
|
|
||||||
|
_apply_on
|
||||||
|
List of names or name of the Odoo model(s) for which the component
|
||||||
|
can be used. When not set, the component can be used on any model.
|
||||||
|
|
||||||
|
_usage
|
||||||
|
The collection and the model (``_apply_on``) will help to filter
|
||||||
|
the candidate components according to our working context (e.g. I'm
|
||||||
|
working on ``magento.backend`` with the model
|
||||||
|
``magento.res.partner``). The usage will define **what** kind of
|
||||||
|
task the component we are looking for serves to. For instance, it
|
||||||
|
might be ``record.importer``, ``export.mapper```... but you can be
|
||||||
|
as creative as you want.
|
||||||
|
|
||||||
|
Now, to get a component, you'll likely use
|
||||||
|
:meth:`WorkContext.component` when you start to work with components
|
||||||
|
in your flow, but then from within your components, you are more
|
||||||
|
likely to use one of:
|
||||||
|
|
||||||
|
* :meth:`component`
|
||||||
|
* :meth:`many_components`
|
||||||
|
* :meth:`component_by_name` (more rarely though)
|
||||||
|
|
||||||
|
Declaration of some Components can look like::
|
||||||
|
|
||||||
|
class FooBar(models.Model):
|
||||||
|
_name = 'foo.bar.collection'
|
||||||
|
_inherit = 'collection.base' # this inherit is required
|
||||||
|
|
||||||
|
|
||||||
|
class FooBarBase(AbstractComponent):
|
||||||
|
_name = 'foo.bar.base'
|
||||||
|
_collection = 'foo.bar.collection' # name of the model above
|
||||||
|
|
||||||
|
|
||||||
|
class Foo(Component):
|
||||||
|
_name = 'foo'
|
||||||
|
_inherit = 'foo.bar.base' # we will inherit the _collection
|
||||||
|
_apply_on = 'res.users'
|
||||||
|
_usage = 'speak'
|
||||||
|
|
||||||
|
def utter(self, message):
|
||||||
|
print message
|
||||||
|
|
||||||
|
|
||||||
|
class Bar(Component):
|
||||||
|
_name = 'bar'
|
||||||
|
_inherit = 'foo.bar.base' # we will inherit the _collection
|
||||||
|
_apply_on = 'res.users'
|
||||||
|
_usage = 'yell'
|
||||||
|
|
||||||
|
def utter(self, message):
|
||||||
|
print message.upper() + '!!!'
|
||||||
|
|
||||||
|
|
||||||
|
class Vocalizer(Component):
|
||||||
|
_name = 'vocalizer'
|
||||||
|
_inherit = 'foo.bar.base'
|
||||||
|
_usage = 'vocalizer'
|
||||||
|
# can be used for any model
|
||||||
|
|
||||||
|
def vocalize(action, message):
|
||||||
|
self.component(usage=action).utter(message)
|
||||||
|
|
||||||
|
|
||||||
|
And their usage::
|
||||||
|
|
||||||
|
>>> coll = self.env['foo.bar.collection'].browse(1)
|
||||||
|
>>> with coll.work_on('res.users') as work:
|
||||||
|
... vocalizer = work.component(usage='vocalizer')
|
||||||
|
... vocalizer.vocalize('speak', 'hello world')
|
||||||
|
...
|
||||||
|
hello world
|
||||||
|
... vocalizer.vocalize('yell', 'hello world')
|
||||||
|
HELLO WORLD!!!
|
||||||
|
|
||||||
|
Hints:
|
||||||
|
|
||||||
|
* If you want to create components without ``_apply_on``, choose a
|
||||||
|
``_usage`` that will not conflict other existing components.
|
||||||
|
* Unless this is what you want and in that case you use
|
||||||
|
:meth:`many_components` which will return all components for a usage
|
||||||
|
with a matching or a not set ``_apply_on``.
|
||||||
|
* It is advised to namespace the names of the components (e.g.
|
||||||
|
``magento.xxx``) to prevent conflicts between addons.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
_register = False
|
||||||
|
_abstract = True
|
||||||
|
|
||||||
|
# used for inheritance
|
||||||
|
_name = None
|
||||||
|
_inherit = None
|
||||||
|
|
||||||
|
# name of the collection to subscribe in
|
||||||
|
_collection = None
|
||||||
|
|
||||||
|
# None means any Model, can be a list ['res.users', ...]
|
||||||
|
_apply_on = None
|
||||||
|
# component purpose ('import.mapper', ...)
|
||||||
|
_usage = None
|
||||||
|
|
||||||
|
def __init__(self, work_context):
|
||||||
|
super(AbstractComponent, self).__init__()
|
||||||
|
self.work = work_context
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _component_match(cls, work):
|
||||||
|
""" Evaluated on candidate components
|
||||||
|
|
||||||
|
When a component lookup is done and candidate(s) have
|
||||||
|
been found for a usage, a final call is done on this method.
|
||||||
|
If the method return False, the candidate component is ignored.
|
||||||
|
|
||||||
|
It can be used for instance to dynamically choose a component
|
||||||
|
according to a value in the :class:`WorkContext`.
|
||||||
|
|
||||||
|
Beware, if the lookups from usage, model and collection are
|
||||||
|
cached, the calls to :meth:`_component_match` are executed
|
||||||
|
each time we get components. Heavy computation should be
|
||||||
|
avoided.
|
||||||
|
|
||||||
|
:param work: the :class:`WorkContext` we are working with
|
||||||
|
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def collection(self):
|
||||||
|
""" Collection we are working with """
|
||||||
|
return self.work.collection
|
||||||
|
|
||||||
|
@property
|
||||||
|
def env(self):
|
||||||
|
""" Current Odoo environment, the one of the collection record """
|
||||||
|
return self.work.env
|
||||||
|
|
||||||
|
@property
|
||||||
|
def model(self):
|
||||||
|
""" The model instance we are working with """
|
||||||
|
return self.work.model
|
||||||
|
|
||||||
|
def component_by_name(self, name, model_name=None):
|
||||||
|
""" Return a component by its name
|
||||||
|
|
||||||
|
Shortcut to meth:`~WorkContext.component_by_name`
|
||||||
|
"""
|
||||||
|
return self.work.component_by_name(name, model_name=model_name)
|
||||||
|
|
||||||
|
def component(self, usage=None, model_name=None):
|
||||||
|
""" Return a component
|
||||||
|
|
||||||
|
Shortcut to meth:`~WorkContext.component`
|
||||||
|
"""
|
||||||
|
return self.work.component(usage=usage, model_name=model_name)
|
||||||
|
|
||||||
|
def many_components(self, usage=None, model_name=None):
|
||||||
|
""" Return several components
|
||||||
|
|
||||||
|
Shortcut to meth:`~WorkContext.many_components`
|
||||||
|
"""
|
||||||
|
return self.work.many_components(usage=usage, model_name=model_name)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "Component(%s)" % self._name
|
||||||
|
|
||||||
|
__repr__ = __str__
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _build_component(cls, registry):
|
||||||
|
""" Instantiate a given Component in the components registry.
|
||||||
|
|
||||||
|
This method is called at the end of the Odoo's registry build. The
|
||||||
|
caller is :meth:`component.builder.ComponentBuilder.load_components`.
|
||||||
|
|
||||||
|
It generates new classes, which will be the Component classes we will
|
||||||
|
be using. The new classes are generated following the inheritance
|
||||||
|
of ``_inherit``. It ensures that the ``__bases__`` of the generated
|
||||||
|
Component classes follow the ``_inherit`` chain.
|
||||||
|
|
||||||
|
Once a Component class is created, it adds it in the Component Registry
|
||||||
|
(:class:`ComponentRegistry`), so it will be available for
|
||||||
|
lookups.
|
||||||
|
|
||||||
|
At the end of new class creation, a hook method
|
||||||
|
:meth:`_complete_component_build` is called, so you can customize
|
||||||
|
further the created components. An example can be found in
|
||||||
|
:meth:`odoo.addons.connector.components.mapper.Mapper._complete_component_build`
|
||||||
|
|
||||||
|
The following code is roughly the same than the Odoo's one for
|
||||||
|
building Models.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# In the simplest case, the component's registry class inherits from
|
||||||
|
# cls and the other classes that define the component in a flat
|
||||||
|
# hierarchy. The registry contains the instance ``component`` (on the
|
||||||
|
# left). Its class, ``ComponentClass``, carries inferred metadata that
|
||||||
|
# is shared between all the component's instances for this registry
|
||||||
|
# only.
|
||||||
|
#
|
||||||
|
# class A1(Component): Component
|
||||||
|
# _name = 'a' / | \
|
||||||
|
# A3 A2 A1
|
||||||
|
# class A2(Component): \ | /
|
||||||
|
# _inherit = 'a' ComponentClass
|
||||||
|
#
|
||||||
|
# class A3(Component):
|
||||||
|
# _inherit = 'a'
|
||||||
|
#
|
||||||
|
# When a component is extended by '_inherit', its base classes are
|
||||||
|
# modified to include the current class and the other inherited
|
||||||
|
# component classes.
|
||||||
|
# Note that we actually inherit from other ``ComponentClass``, so that
|
||||||
|
# extensions to an inherited component are immediately visible in the
|
||||||
|
# current component class, like in the following example:
|
||||||
|
#
|
||||||
|
# class A1(Component):
|
||||||
|
# _name = 'a' Component
|
||||||
|
# / / \ \
|
||||||
|
# class B1(Component): / A2 A1 \
|
||||||
|
# _name = 'b' / \ / \
|
||||||
|
# B2 ComponentA B1
|
||||||
|
# class B2(Component): \ | /
|
||||||
|
# _name = 'b' \ | /
|
||||||
|
# _inherit = ['b', 'a'] \ | /
|
||||||
|
# ComponentB
|
||||||
|
# class A2(Component):
|
||||||
|
# _inherit = 'a'
|
||||||
|
|
||||||
|
# determine inherited components
|
||||||
|
parents = cls._inherit
|
||||||
|
if isinstance(parents, str):
|
||||||
|
parents = [parents]
|
||||||
|
elif parents is None:
|
||||||
|
parents = []
|
||||||
|
|
||||||
|
if cls._name in registry and not parents:
|
||||||
|
raise TypeError('Component %r (in class %r) already exists. '
|
||||||
|
'Consider using _inherit instead of _name '
|
||||||
|
'or using a different _name.' % (cls._name, cls))
|
||||||
|
|
||||||
|
# determine the component's name
|
||||||
|
name = cls._name or (len(parents) == 1 and parents[0])
|
||||||
|
|
||||||
|
if not name:
|
||||||
|
raise TypeError('Component %r must have a _name' % cls)
|
||||||
|
|
||||||
|
# all components except 'base' implicitly inherit from 'base'
|
||||||
|
if name != 'base':
|
||||||
|
parents = list(parents) + ['base']
|
||||||
|
|
||||||
|
# create or retrieve the component's class
|
||||||
|
if name in parents:
|
||||||
|
if name not in registry:
|
||||||
|
raise TypeError("Component %r does not exist in registry." %
|
||||||
|
name)
|
||||||
|
ComponentClass = registry[name]
|
||||||
|
ComponentClass._build_component_check_base(cls)
|
||||||
|
check_parent = ComponentClass._build_component_check_parent
|
||||||
|
else:
|
||||||
|
ComponentClass = type(
|
||||||
|
name, (AbstractComponent,),
|
||||||
|
{'_name': name,
|
||||||
|
'_register': False,
|
||||||
|
# names of children component
|
||||||
|
'_inherit_children': OrderedSet()},
|
||||||
|
)
|
||||||
|
check_parent = cls._build_component_check_parent
|
||||||
|
|
||||||
|
# determine all the classes the component should inherit from
|
||||||
|
bases = LastOrderedSet([cls])
|
||||||
|
for parent in parents:
|
||||||
|
if parent not in registry:
|
||||||
|
raise TypeError(
|
||||||
|
"Component %r inherits from non-existing component %r." %
|
||||||
|
(name, parent)
|
||||||
|
)
|
||||||
|
parent_class = registry[parent]
|
||||||
|
if parent == name:
|
||||||
|
for base in parent_class.__bases__:
|
||||||
|
bases.add(base)
|
||||||
|
else:
|
||||||
|
check_parent(cls, parent_class)
|
||||||
|
bases.add(parent_class)
|
||||||
|
parent_class._inherit_children.add(name)
|
||||||
|
ComponentClass.__bases__ = tuple(bases)
|
||||||
|
|
||||||
|
ComponentClass._complete_component_build()
|
||||||
|
|
||||||
|
registry[name] = ComponentClass
|
||||||
|
|
||||||
|
return ComponentClass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _build_component_check_base(cls, extend_cls):
|
||||||
|
""" Check whether ``cls`` can be extended with ``extend_cls``. """
|
||||||
|
if cls._abstract and not extend_cls._abstract:
|
||||||
|
msg = ("%s transforms the abstract component %r into a "
|
||||||
|
"non-abstract component. "
|
||||||
|
"That class should either inherit from AbstractComponent, "
|
||||||
|
"or set a different '_name'.")
|
||||||
|
raise TypeError(msg % (extend_cls, cls._name))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _build_component_check_parent(component_class, cls, parent_class):
|
||||||
|
""" Check whether ``model_class`` can inherit from ``parent_class``.
|
||||||
|
"""
|
||||||
|
if component_class._abstract and not parent_class._abstract:
|
||||||
|
msg = ("In %s, the abstract Component %r cannot inherit "
|
||||||
|
"from the non-abstract Component %r.")
|
||||||
|
raise TypeError(
|
||||||
|
msg % (cls, component_class._name, parent_class._name)
|
||||||
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _complete_component_build(cls):
|
||||||
|
""" Complete build of the new component class
|
||||||
|
|
||||||
|
After the component has been built from its bases, this method is
|
||||||
|
called, and can be used to customize the class before it can be used.
|
||||||
|
|
||||||
|
Nothing is done in the base Component, but a Component can inherit
|
||||||
|
the method to add its own behavior.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class Component(AbstractComponent):
|
||||||
|
""" Concrete Component class
|
||||||
|
|
||||||
|
This is the class you inherit from when you want your component to
|
||||||
|
be registered in the component collections.
|
||||||
|
|
||||||
|
Look in :class:`AbstractComponent` for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
_register = False
|
||||||
|
_abstract = False
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
|
||||||
|
class ComponentException(Exception):
|
||||||
|
""" Base Exception for the components """
|
||||||
|
|
||||||
|
|
||||||
|
class NoComponentError(ComponentException):
|
||||||
|
""" No component has been found """
|
||||||
|
|
||||||
|
|
||||||
|
class SeveralComponentError(ComponentException):
|
||||||
|
""" More than one component have been found """
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import collection
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
Collection Model
|
||||||
|
================
|
||||||
|
|
||||||
|
This is the base Model shared by all the Collections.
|
||||||
|
In the context of the Connector, a collection is the Backend.
|
||||||
|
The `_name` given to the Collection Model will be the name
|
||||||
|
to use in the `_collection` of the Components usable for the Backend.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
from odoo import models, api
|
||||||
|
from ..core import WorkContext
|
||||||
|
|
||||||
|
|
||||||
|
class Collection(models.AbstractModel):
|
||||||
|
""" The model on which components are subscribed
|
||||||
|
|
||||||
|
It would be for instance the ``backend`` for the connectors.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
class MagentoBackend(models.Model):
|
||||||
|
_name = 'magento.backend' # name of the collection
|
||||||
|
_inherit = 'collection.base'
|
||||||
|
|
||||||
|
|
||||||
|
class MagentoSaleImporter(Component):
|
||||||
|
_name = 'magento.sale.importer'
|
||||||
|
_apply_on = 'magento.sale.order'
|
||||||
|
_collection = 'magento.backend' # name of the collection
|
||||||
|
|
||||||
|
def run(self, magento_id):
|
||||||
|
mapper = self.component(usage='import.mapper')
|
||||||
|
extra_mappers = self.many_components(
|
||||||
|
usage='import.mapper.extra',
|
||||||
|
)
|
||||||
|
# ...
|
||||||
|
|
||||||
|
Use it::
|
||||||
|
|
||||||
|
>>> backend = self.env['magento.backend'].browse(1)
|
||||||
|
>>> with backend.work_on('magento.sale.order') as work:
|
||||||
|
... importer = work.component(usage='magento.sale.importer')
|
||||||
|
... importer.run(1)
|
||||||
|
|
||||||
|
See also: :class:`odoo.addons.component.core.WorkContext`
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
_name = 'collection.base'
|
||||||
|
_description = 'Base Abstract Collection'
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
@api.multi
|
||||||
|
def work_on(self, model_name, **kwargs):
|
||||||
|
""" Entry-point for the components, context manager
|
||||||
|
|
||||||
|
Start a work using the components on the model.
|
||||||
|
Any keyword argument will be assigned to the work context.
|
||||||
|
See documentation of :class:`odoo.addons.component.core.WorkContext`.
|
||||||
|
|
||||||
|
It is a context manager, so you can attach objects and clean them
|
||||||
|
at the end of the work session, such as::
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
@api.multi
|
||||||
|
def work_on(self, model_name, **kwargs):
|
||||||
|
self.ensure_one()
|
||||||
|
magento_location = MagentoLocation(
|
||||||
|
self.location,
|
||||||
|
self.username,
|
||||||
|
self.password,
|
||||||
|
)
|
||||||
|
# We create a Magento Client API here, so we can create the
|
||||||
|
# client once (lazily on the first use) and propagate it
|
||||||
|
# through all the sync session, instead of recreating a client
|
||||||
|
# in each backend adapter usage.
|
||||||
|
with MagentoAPI(magento_location) as magento_api:
|
||||||
|
_super = super(MagentoBackend, self)
|
||||||
|
# from the components we'll be able to do:
|
||||||
|
# self.work.magento_api
|
||||||
|
with _super.work_on(
|
||||||
|
model_name, magento_api=magento_api, **kwargs
|
||||||
|
) as work:
|
||||||
|
yield work
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.ensure_one()
|
||||||
|
yield WorkContext(model_name=model_name, collection=self, **kwargs)
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import test_build_component
|
||||||
|
from . import test_component
|
||||||
|
from . import test_lookup
|
||||||
|
from . import test_work_on
|
||||||
|
|
@ -0,0 +1,207 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
import copy
|
||||||
|
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
import odoo
|
||||||
|
from odoo import api
|
||||||
|
from odoo.tests import common
|
||||||
|
from odoo.addons.component.core import (
|
||||||
|
ComponentRegistry,
|
||||||
|
MetaComponent,
|
||||||
|
_get_addon_name,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def new_rollbacked_env():
|
||||||
|
registry = odoo.registry(common.get_db_name())
|
||||||
|
uid = odoo.SUPERUSER_ID
|
||||||
|
cr = registry.cursor()
|
||||||
|
try:
|
||||||
|
yield api.Environment(cr, uid, {})
|
||||||
|
finally:
|
||||||
|
cr.rollback() # we shouldn't have to commit anything
|
||||||
|
cr.close()
|
||||||
|
|
||||||
|
|
||||||
|
class ComponentMixin(object):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpComponent(cls):
|
||||||
|
with new_rollbacked_env() as env:
|
||||||
|
builder = env['component.builder']
|
||||||
|
# build the components of every installed addons
|
||||||
|
comp_registry = builder._init_global_registry()
|
||||||
|
cls._components_registry = comp_registry
|
||||||
|
# ensure that we load only the components of the 'installed'
|
||||||
|
# modules, not 'to install', which means we load only the
|
||||||
|
# dependencies of the tested addons, not the siblings or
|
||||||
|
# chilren addons
|
||||||
|
builder.build_registry(comp_registry, states=('installed',))
|
||||||
|
# build the components of the current tested addon
|
||||||
|
current_addon = _get_addon_name(cls.__module__)
|
||||||
|
env['component.builder'].load_components(current_addon)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
# should be ready only during tests, never during installation
|
||||||
|
# of addons
|
||||||
|
self._components_registry.ready = True
|
||||||
|
|
||||||
|
@self.addCleanup
|
||||||
|
def notready():
|
||||||
|
self._components_registry.ready = False
|
||||||
|
|
||||||
|
|
||||||
|
class TransactionComponentCase(common.TransactionCase, ComponentMixin):
|
||||||
|
""" A TransactionCase that loads all the components
|
||||||
|
|
||||||
|
It it used like an usual Odoo's TransactionCase, but it ensures
|
||||||
|
that all the components of the current addon and its dependencies
|
||||||
|
are loaded.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super(TransactionComponentCase, cls).setUpClass()
|
||||||
|
cls.setUpComponent()
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
# resolve an inheritance issue (common.TransactionCase does not call
|
||||||
|
# super)
|
||||||
|
common.TransactionCase.setUp(self)
|
||||||
|
ComponentMixin.setUp(self)
|
||||||
|
|
||||||
|
|
||||||
|
class SavepointComponentCase(common.SavepointCase, ComponentMixin):
|
||||||
|
""" A SavepointCase that loads all the components
|
||||||
|
|
||||||
|
It it used like an usual Odoo's SavepointCase, but it ensures
|
||||||
|
that all the components of the current addon and its dependencies
|
||||||
|
are loaded.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super(SavepointComponentCase, cls).setUpClass()
|
||||||
|
cls.setUpComponent()
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
# resolve an inheritance issue (common.SavepointCase does not call
|
||||||
|
# super)
|
||||||
|
common.SavepointCase.setUp(self)
|
||||||
|
ComponentMixin.setUp(self)
|
||||||
|
|
||||||
|
|
||||||
|
class ComponentRegistryCase(unittest.TestCase):
|
||||||
|
""" This test case can be used as a base for writings tests on components
|
||||||
|
|
||||||
|
This test case is meant to test components in a special component registry,
|
||||||
|
where you want to have maximum control on which components are loaded
|
||||||
|
or not, or when you want to create additional components in your tests.
|
||||||
|
|
||||||
|
If you only want to *use* the components of the tested addon in your tests,
|
||||||
|
then consider using one of:
|
||||||
|
|
||||||
|
* :class:`TransactionComponentCase`
|
||||||
|
* :class:`SavepointComponentCase`
|
||||||
|
|
||||||
|
This test case creates a special
|
||||||
|
:class:`odoo.addons.component.core.ComponentRegistry` for the purpose of
|
||||||
|
the tests. By default, it loads all the components of the dependencies, but
|
||||||
|
not the components of the current addon (which you have to handle
|
||||||
|
manually). In your tests, you can add more components in 2 manners.
|
||||||
|
|
||||||
|
All the components of an Odoo module::
|
||||||
|
|
||||||
|
self._load_module_components('connector')
|
||||||
|
|
||||||
|
Only specific components::
|
||||||
|
|
||||||
|
self._build_components(MyComponent1, MyComponent2)
|
||||||
|
|
||||||
|
Note: for the lookups of the components, the default component
|
||||||
|
registry is a global registry for the database. Here, you will
|
||||||
|
need to explicitly pass ``self.comp_registry`` in the
|
||||||
|
:class:`~odoo.addons.component.core.WorkContext`::
|
||||||
|
|
||||||
|
work = WorkContext(model_name='res.users',
|
||||||
|
collection='my.collection',
|
||||||
|
components_registry=self.comp_registry)
|
||||||
|
|
||||||
|
Or::
|
||||||
|
|
||||||
|
collection_record = self.env['my.collection'].browse(1)
|
||||||
|
with collection_record.work_on(
|
||||||
|
'res.partner',
|
||||||
|
components_registry=self.comp_registry) as work:
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(ComponentRegistryCase, self).setUp()
|
||||||
|
|
||||||
|
# keep the original classes registered by the metaclass
|
||||||
|
# so we'll restore them at the end of the tests, it avoid
|
||||||
|
# to pollute it with Stub / Test components
|
||||||
|
self._original_components = copy.deepcopy(
|
||||||
|
MetaComponent._modules_components
|
||||||
|
)
|
||||||
|
|
||||||
|
# it will be our temporary component registry for our test session
|
||||||
|
self.comp_registry = ComponentRegistry()
|
||||||
|
|
||||||
|
# it builds the 'final component' for every component of the
|
||||||
|
# 'component' addon and push them in the component registry
|
||||||
|
self.comp_registry.load_components('component')
|
||||||
|
# build the components of every installed addons already installed
|
||||||
|
# but the current addon (when running with pytest/nosetest, we
|
||||||
|
# simulate the --test-enable behavior by excluding the current addon
|
||||||
|
# which is in 'to install' / 'to upgrade' with --test-enable).
|
||||||
|
current_addon = _get_addon_name(self.__module__)
|
||||||
|
with new_rollbacked_env() as env:
|
||||||
|
env['component.builder'].build_registry(
|
||||||
|
self.comp_registry,
|
||||||
|
states=('installed',),
|
||||||
|
exclude_addons=[current_addon],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Fake that we are ready to work with the registry
|
||||||
|
# normally, it is set to True and the end of the build
|
||||||
|
# of the components. Here, we'll add components later in
|
||||||
|
# the components registry, but we don't mind for the tests.
|
||||||
|
self.comp_registry.ready = True
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
super(ComponentRegistryCase, self).tearDown()
|
||||||
|
# restore the original metaclass' classes
|
||||||
|
MetaComponent._modules_components = self._original_components
|
||||||
|
|
||||||
|
def _load_module_components(self, module):
|
||||||
|
self.comp_registry.load_components(module)
|
||||||
|
|
||||||
|
def _build_components(self, *classes):
|
||||||
|
for cls in classes:
|
||||||
|
cls._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
|
||||||
|
class TransactionComponentRegistryCase(common.TransactionCase,
|
||||||
|
ComponentRegistryCase):
|
||||||
|
""" Adds Odoo Transaction in the base Component TestCase """
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
# resolve an inheritance issue (common.TransactionCase does not use
|
||||||
|
# super)
|
||||||
|
common.TransactionCase.setUp(self)
|
||||||
|
ComponentRegistryCase.setUp(self)
|
||||||
|
self.collection = self.env['collection.base']
|
||||||
|
|
||||||
|
def teardown(self):
|
||||||
|
common.TransactionCase.tearDown(self)
|
||||||
|
ComponentRegistryCase.tearDown(self)
|
||||||
|
|
@ -0,0 +1,272 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
import mock
|
||||||
|
from odoo.addons.component.core import AbstractComponent, Component
|
||||||
|
from .common import ComponentRegistryCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestBuildComponent(ComponentRegistryCase):
|
||||||
|
""" Test build of components
|
||||||
|
|
||||||
|
All the tests in this suite are based on the same principle with
|
||||||
|
variations:
|
||||||
|
|
||||||
|
* Create new Components (classes inheriting from
|
||||||
|
:class:`component.core.Component` or
|
||||||
|
:class:`component.core.AbstractComponent`
|
||||||
|
* Call :meth:`component.core.Component._build_component` on them
|
||||||
|
in order to build the 'final class' composed from all the ``_inherit``
|
||||||
|
and push it in the components registry (``self.comp_registry`` here)
|
||||||
|
* Assert that classes are built, registered, have correct ``__bases__``...
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def test_no_name(self):
|
||||||
|
""" Ensure that a component has a _name """
|
||||||
|
class Component1(Component):
|
||||||
|
pass
|
||||||
|
|
||||||
|
msg = '.*must have a _name.*'
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
def test_register(self):
|
||||||
|
""" Able to register components in components registry """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_name = 'component2'
|
||||||
|
|
||||||
|
# build the 'final classes' for the components and check that we find
|
||||||
|
# them in the components registry
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
self.assertEqual(
|
||||||
|
['base', 'component1', 'component2'],
|
||||||
|
list(self.comp_registry)
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_inherit_bases(self):
|
||||||
|
""" Check __bases__ of Component with _inherit """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
class Component3(Component):
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
Component3._build_component(self.comp_registry)
|
||||||
|
self.assertEqual(
|
||||||
|
(Component3,
|
||||||
|
Component2,
|
||||||
|
Component1,
|
||||||
|
self.comp_registry['base']),
|
||||||
|
self.comp_registry['component1'].__bases__
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_prototype_inherit_bases(self):
|
||||||
|
""" Check __bases__ of Component with _inherit and different _name """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_name = 'component2'
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
class Component3(Component):
|
||||||
|
_name = 'component3'
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
class Component4(Component):
|
||||||
|
_name = 'component4'
|
||||||
|
_inherit = ['component2', 'component3']
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
Component3._build_component(self.comp_registry)
|
||||||
|
Component4._build_component(self.comp_registry)
|
||||||
|
self.assertEqual(
|
||||||
|
(Component1,
|
||||||
|
self.comp_registry['base']),
|
||||||
|
self.comp_registry['component1'].__bases__
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
(Component2,
|
||||||
|
self.comp_registry['component1'],
|
||||||
|
self.comp_registry['base']),
|
||||||
|
self.comp_registry['component2'].__bases__
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
(Component3,
|
||||||
|
self.comp_registry['component1'],
|
||||||
|
self.comp_registry['base']),
|
||||||
|
self.comp_registry['component3'].__bases__
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
(Component4,
|
||||||
|
self.comp_registry['component2'],
|
||||||
|
self.comp_registry['component3'],
|
||||||
|
self.comp_registry['base']),
|
||||||
|
self.comp_registry['component4'].__bases__
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_custom_build(self):
|
||||||
|
""" Check that we can hook at the end of a Component build """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _complete_component_build(cls):
|
||||||
|
# This method should be called after the Component
|
||||||
|
# is built, and before it is pushed in the registry
|
||||||
|
cls._build_done = True
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
# we inspect that our custom build has been executed
|
||||||
|
self.assertTrue(
|
||||||
|
self.comp_registry['component1']._build_done
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_inherit_attrs(self):
|
||||||
|
""" Check attributes inheritance of Components with _inherit """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
msg = 'ping'
|
||||||
|
|
||||||
|
def say(self):
|
||||||
|
return 'foo'
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_name = 'component2'
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
msg = 'pong'
|
||||||
|
|
||||||
|
def say(self):
|
||||||
|
return super(Component2, self).say() + ' bar'
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
# we initialize the components, normally we should pass
|
||||||
|
# an instance of WorkContext, but we don't need a real one
|
||||||
|
# for this test
|
||||||
|
component1 = self.comp_registry['component1'](mock.Mock())
|
||||||
|
component2 = self.comp_registry['component2'](mock.Mock())
|
||||||
|
self.assertEqual('ping', component1.msg)
|
||||||
|
self.assertEqual('pong', component2.msg)
|
||||||
|
self.assertEqual('foo', component1.say())
|
||||||
|
self.assertEqual('foo bar', component2.say())
|
||||||
|
|
||||||
|
def test_duplicate_component(self):
|
||||||
|
""" Check that we can't have 2 components with the same name """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
msg = 'Component.*already exists.*'
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
def test_no_parent(self):
|
||||||
|
""" Ensure we can't _inherit a non-existent component """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
msg = 'Component.*does not exist in registry.*'
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
def test_no_parent2(self):
|
||||||
|
""" Ensure we can't _inherit by prototype a non-existent component """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_name = 'component2'
|
||||||
|
_inherit = ['component1', 'component3']
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
msg = 'Component.*inherits from non-existing component.*'
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
def test_add_inheritance(self):
|
||||||
|
""" Ensure we can add a new inheritance """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_name = 'component2'
|
||||||
|
|
||||||
|
class Component2bis(Component):
|
||||||
|
_name = 'component2'
|
||||||
|
_inherit = ['component2', 'component1']
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
Component2bis._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
(Component2bis,
|
||||||
|
Component2,
|
||||||
|
self.comp_registry['component1'],
|
||||||
|
self.comp_registry['base']),
|
||||||
|
self.comp_registry['component2'].__bases__
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_check_parent_component_over_abstract(self):
|
||||||
|
""" Component can inherit from AbstractComponent """
|
||||||
|
class Component1(AbstractComponent):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_name = 'component2'
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
self.assertTrue(
|
||||||
|
self.comp_registry['component1']._abstract
|
||||||
|
)
|
||||||
|
self.assertFalse(
|
||||||
|
self.comp_registry['component2']._abstract
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_check_parent_abstract_over_component(self):
|
||||||
|
""" Prevent AbstractComponent to inherit from Component """
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component2(AbstractComponent):
|
||||||
|
_name = 'component2'
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
msg = '.*cannot inherit from the non-abstract.*'
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
def test_check_transform_abstract_to_component(self):
|
||||||
|
""" Prevent AbstractComponent to be transformed to Component """
|
||||||
|
class Component1(AbstractComponent):
|
||||||
|
_name = 'component1'
|
||||||
|
|
||||||
|
class Component1bis(Component):
|
||||||
|
_inherit = 'component1'
|
||||||
|
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
msg = '.*transforms the abstract component.*into a non-abstract.*'
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
Component1bis._build_component(self.comp_registry)
|
||||||
|
|
@ -0,0 +1,287 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
from contextlib import contextmanager
|
||||||
|
from odoo.addons.component.core import (
|
||||||
|
Component,
|
||||||
|
)
|
||||||
|
from .common import TransactionComponentRegistryCase
|
||||||
|
from odoo.addons.component.exception import (
|
||||||
|
NoComponentError,
|
||||||
|
SeveralComponentError,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestComponent(TransactionComponentRegistryCase):
|
||||||
|
""" Test usage of components
|
||||||
|
|
||||||
|
These tests are a bit more broad that mere unit tests.
|
||||||
|
We test the chain odoo Model -> generate a WorkContext instance -> Work
|
||||||
|
with Component.
|
||||||
|
|
||||||
|
Tests are inside Odoo transactions, so we can work
|
||||||
|
with Odoo's env / models.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestComponent, self).setUp()
|
||||||
|
self.collection = self.env['collection.base']
|
||||||
|
|
||||||
|
# create some Component to play with
|
||||||
|
class Component1(Component):
|
||||||
|
_name = 'component1'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
_usage = 'for.test'
|
||||||
|
_apply_on = ['res.partner']
|
||||||
|
|
||||||
|
class Component2(Component):
|
||||||
|
_name = 'component2'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
_usage = 'for.test'
|
||||||
|
_apply_on = ['res.users']
|
||||||
|
|
||||||
|
# build the components and register them in our
|
||||||
|
# test component registry
|
||||||
|
Component1._build_component(self.comp_registry)
|
||||||
|
Component2._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
# our collection, in a less abstract use case, it
|
||||||
|
# could be a record of 'magento.backend' for instance
|
||||||
|
self.collection_record = self.collection.new()
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def get_base():
|
||||||
|
# Our WorkContext, it will be passed along in every
|
||||||
|
# components so we can share data transversally.
|
||||||
|
# We are working with res.partner in the following tests,
|
||||||
|
# unless we change it in the test.
|
||||||
|
with self.collection_record.work_on(
|
||||||
|
'res.partner',
|
||||||
|
# we use a custom registry only
|
||||||
|
# for the sake of the tests
|
||||||
|
components_registry=self.comp_registry
|
||||||
|
) as work:
|
||||||
|
# We get the 'base' component, handy to test the base
|
||||||
|
# methods component, many_components, ...
|
||||||
|
yield work.component_by_name('base')
|
||||||
|
self.get_base = get_base
|
||||||
|
|
||||||
|
def test_component_attrs(self):
|
||||||
|
""" Basic access to a Component's attribute """
|
||||||
|
with self.get_base() as base:
|
||||||
|
# as we are working on res.partner, we should get 'component1'
|
||||||
|
comp = base.work.component(usage='for.test')
|
||||||
|
# but this is not what we test here, we test the attributes:
|
||||||
|
self.assertEqual(self.collection_record, comp.collection)
|
||||||
|
self.assertEqual(base.work, comp.work)
|
||||||
|
self.assertEqual(self.env, comp.env)
|
||||||
|
self.assertEqual(self.env['res.partner'], comp.model)
|
||||||
|
|
||||||
|
def test_component_get_by_name_same_model(self):
|
||||||
|
""" Use component_by_name with current working model """
|
||||||
|
with self.get_base() as base:
|
||||||
|
# we ask a component directly by it's name, considering
|
||||||
|
# we work with res.partner, we should get 'component1'
|
||||||
|
# this is ok because it's _apply_on contains res.partner
|
||||||
|
comp = base.component_by_name('component1')
|
||||||
|
self.assertEqual('component1', comp._name)
|
||||||
|
self.assertEqual(self.env['res.partner'], comp.model)
|
||||||
|
|
||||||
|
def test_component_get_by_name_other_model(self):
|
||||||
|
""" Use component_by_name with another model """
|
||||||
|
with self.get_base() as base:
|
||||||
|
# we ask a component directly by it's name, but we
|
||||||
|
# want to work with 'res.users', this is ok since
|
||||||
|
# component2's _apply_on contains res.users
|
||||||
|
comp = base.component_by_name(
|
||||||
|
'component2', model_name='res.users'
|
||||||
|
)
|
||||||
|
self.assertEqual('component2', comp._name)
|
||||||
|
self.assertEqual(self.env['res.users'], comp.model)
|
||||||
|
# what happens under the hood, is that a new WorkContext
|
||||||
|
# has been created for this model, with all the other values
|
||||||
|
# identical to the previous WorkContext (the one for res.partner)
|
||||||
|
# We can check that with:
|
||||||
|
self.assertNotEqual(base.work, comp.work)
|
||||||
|
self.assertEqual('res.partner', base.work.model_name)
|
||||||
|
self.assertEqual('res.users', comp.work.model_name)
|
||||||
|
|
||||||
|
def test_component_get_by_name_wrong_model(self):
|
||||||
|
""" Use component_by_name with a model not in _apply_on """
|
||||||
|
msg = ("Component with name 'component2' can't be used "
|
||||||
|
"for model 'res.partner'.*")
|
||||||
|
with self.get_base() as base:
|
||||||
|
with self.assertRaisesRegex(NoComponentError, msg):
|
||||||
|
# we ask for the model 'component2' but we are working
|
||||||
|
# with res.partner, and it only accepts res.users
|
||||||
|
base.component_by_name('component2')
|
||||||
|
|
||||||
|
def test_component_get_by_name_not_exist(self):
|
||||||
|
""" Use component_by_name on a component that do not exist """
|
||||||
|
msg = "No component with name 'foo' found."
|
||||||
|
with self.get_base() as base:
|
||||||
|
with self.assertRaisesRegex(NoComponentError, msg):
|
||||||
|
base.component_by_name('foo')
|
||||||
|
|
||||||
|
def test_component_by_usage_same_model(self):
|
||||||
|
""" Use component(usage=...) on the same model """
|
||||||
|
# we ask for a component having _usage == 'for.test', and
|
||||||
|
# model being res.partner (the model in the current WorkContext)
|
||||||
|
with self.get_base() as base:
|
||||||
|
comp = base.component(usage='for.test')
|
||||||
|
self.assertEqual('component1', comp._name)
|
||||||
|
self.assertEqual(self.env['res.partner'], comp.model)
|
||||||
|
|
||||||
|
def test_component_by_usage_other_model(self):
|
||||||
|
""" Use component(usage=...) on a different model (name) """
|
||||||
|
# we ask for a component having _usage == 'for.test', and
|
||||||
|
# a different model (res.users)
|
||||||
|
with self.get_base() as base:
|
||||||
|
comp = base.component(usage='for.test', model_name='res.users')
|
||||||
|
self.assertEqual('component2', comp._name)
|
||||||
|
self.assertEqual(self.env['res.users'], comp.model)
|
||||||
|
# what happens under the hood, is that a new WorkContext
|
||||||
|
# has been created for this model, with all the other values
|
||||||
|
# identical to the previous WorkContext (the one for res.partner)
|
||||||
|
# We can check that with:
|
||||||
|
self.assertNotEqual(base.work, comp.work)
|
||||||
|
self.assertEqual('res.partner', base.work.model_name)
|
||||||
|
self.assertEqual('res.users', comp.work.model_name)
|
||||||
|
|
||||||
|
def test_component_by_usage_other_model_env(self):
|
||||||
|
""" Use component(usage=...) on a different model (instance) """
|
||||||
|
with self.get_base() as base:
|
||||||
|
comp = base.component(usage='for.test',
|
||||||
|
model_name=self.env['res.users'])
|
||||||
|
self.assertEqual('component2', comp._name)
|
||||||
|
self.assertEqual(self.env['res.users'], comp.model)
|
||||||
|
|
||||||
|
def test_component_error_several(self):
|
||||||
|
""" Use component(usage=...) when more than one component match """
|
||||||
|
# we create a new Component with _usage 'for.test', in the same
|
||||||
|
# collection and no _apply_on
|
||||||
|
class Component3(Component):
|
||||||
|
_name = 'component3'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
_usage = 'for.test'
|
||||||
|
|
||||||
|
Component3._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
with self.get_base() as base:
|
||||||
|
with self.assertRaises(SeveralComponentError):
|
||||||
|
# When a component has no _apply_on, it means it can be applied
|
||||||
|
# on *any* model. Here, the candidates components would be:
|
||||||
|
# component1 (because we are working with res.partner),
|
||||||
|
# component3 (because it has no _apply_on so apply in any case)
|
||||||
|
base.component(usage='for.test')
|
||||||
|
|
||||||
|
def test_many_components(self):
|
||||||
|
""" Use many_components(usage=...) on the same model """
|
||||||
|
class Component3(Component):
|
||||||
|
_name = 'component3'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
_usage = 'for.test'
|
||||||
|
|
||||||
|
Component3._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
with self.get_base() as base:
|
||||||
|
comps = base.many_components(usage='for.test')
|
||||||
|
|
||||||
|
# When a component has no _apply_on, it means it can be applied
|
||||||
|
# on *any* model. So here, both component1 and component3 match
|
||||||
|
self.assertEqual(
|
||||||
|
['component1', 'component3'],
|
||||||
|
[c._name for c in comps]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_many_components_other_model(self):
|
||||||
|
""" Use many_components(usage=...) on a different model (name) """
|
||||||
|
class Component3(Component):
|
||||||
|
_name = 'component3'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
_apply_on = 'res.users'
|
||||||
|
_usage = 'for.test'
|
||||||
|
|
||||||
|
Component3._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
with self.get_base() as base:
|
||||||
|
comps = base.many_components(usage='for.test',
|
||||||
|
model_name='res.users')
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
['component2', 'component3'],
|
||||||
|
[c._name for c in comps]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_many_components_other_model_env(self):
|
||||||
|
""" Use many_components(usage=...) on a different model (instance) """
|
||||||
|
class Component3(Component):
|
||||||
|
_name = 'component3'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
_apply_on = 'res.users'
|
||||||
|
_usage = 'for.test'
|
||||||
|
|
||||||
|
Component3._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
with self.get_base() as base:
|
||||||
|
comps = base.many_components(usage='for.test',
|
||||||
|
model_name=self.env['res.users'])
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
['component2', 'component3'],
|
||||||
|
[c._name for c in comps]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_no_component(self):
|
||||||
|
""" No component found for asked usage """
|
||||||
|
with self.get_base() as base:
|
||||||
|
with self.assertRaises(NoComponentError):
|
||||||
|
base.component(usage='foo')
|
||||||
|
|
||||||
|
def test_no_many_component(self):
|
||||||
|
""" No component found for asked usage for many_components() """
|
||||||
|
with self.get_base() as base:
|
||||||
|
self.assertEqual([], base.many_components(usage='foo'))
|
||||||
|
|
||||||
|
def test_work_on_component(self):
|
||||||
|
""" Check WorkContext.component() (shortcut to Component.component) """
|
||||||
|
with self.get_base() as base:
|
||||||
|
comp = base.work.component(usage='for.test')
|
||||||
|
self.assertEqual('component1', comp._name)
|
||||||
|
|
||||||
|
def test_work_on_many_components(self):
|
||||||
|
""" Check WorkContext.many_components()
|
||||||
|
|
||||||
|
(shortcut to Component.many_components)
|
||||||
|
"""
|
||||||
|
with self.get_base() as base:
|
||||||
|
comps = base.work.many_components(usage='for.test')
|
||||||
|
self.assertEqual('component1', comps[0]._name)
|
||||||
|
|
||||||
|
def test_component_match(self):
|
||||||
|
""" Lookup with match method """
|
||||||
|
class Foo(Component):
|
||||||
|
_name = 'foo'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
_usage = 'speaker'
|
||||||
|
_apply_on = ['res.partner']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _component_match(cls, work):
|
||||||
|
return False
|
||||||
|
|
||||||
|
class Bar(Component):
|
||||||
|
_name = 'bar'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
_usage = 'speaker'
|
||||||
|
_apply_on = ['res.partner']
|
||||||
|
|
||||||
|
self._build_components(Foo, Bar)
|
||||||
|
|
||||||
|
with self.get_base() as base:
|
||||||
|
# both components would we returned without the
|
||||||
|
# _component_match method
|
||||||
|
comp = base.component(usage='speaker',
|
||||||
|
model_name=self.env['res.partner'])
|
||||||
|
self.assertEqual('bar', comp._name)
|
||||||
|
|
@ -0,0 +1,194 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
from odoo.addons.component.core import (
|
||||||
|
AbstractComponent,
|
||||||
|
Component,
|
||||||
|
)
|
||||||
|
from .common import ComponentRegistryCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestLookup(ComponentRegistryCase):
|
||||||
|
""" Test the ComponentRegistry
|
||||||
|
|
||||||
|
Tests in this testsuite mainly do:
|
||||||
|
|
||||||
|
* Create new Components (classes inheriting from
|
||||||
|
:class:`component.core.Component` or
|
||||||
|
:class:`component.core.AbstractComponent`
|
||||||
|
* Call :meth:`component.core.Component._build_component` on them
|
||||||
|
in order to build the 'final class' composed from all the ``_inherit``
|
||||||
|
and push it in the components registry (``self.comp_registry`` here)
|
||||||
|
* Use the lookup method of the components registry and check
|
||||||
|
that we get the correct result
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def test_lookup_collection(self):
|
||||||
|
""" Lookup components of a collection """
|
||||||
|
# we register 2 components in foobar and one in other
|
||||||
|
class Foo(Component):
|
||||||
|
_name = 'foo'
|
||||||
|
_collection = 'foobar'
|
||||||
|
|
||||||
|
class Bar(Component):
|
||||||
|
_name = 'bar'
|
||||||
|
_collection = 'foobar'
|
||||||
|
|
||||||
|
class Homer(Component):
|
||||||
|
_name = 'homer'
|
||||||
|
_collection = 'other'
|
||||||
|
|
||||||
|
self._build_components(Foo, Bar, Homer)
|
||||||
|
|
||||||
|
# we should no see the component in 'other'
|
||||||
|
components = self.comp_registry.lookup('foobar')
|
||||||
|
self.assertEqual(
|
||||||
|
['foo', 'bar'],
|
||||||
|
[c._name for c in components]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_lookup_usage(self):
|
||||||
|
""" Lookup components by usage """
|
||||||
|
class Foo(Component):
|
||||||
|
_name = 'foo'
|
||||||
|
_collection = 'foobar'
|
||||||
|
_usage = 'speaker'
|
||||||
|
|
||||||
|
class Bar(Component):
|
||||||
|
_name = 'bar'
|
||||||
|
_collection = 'foobar'
|
||||||
|
_usage = 'speaker'
|
||||||
|
|
||||||
|
class Baz(Component):
|
||||||
|
_name = 'baz'
|
||||||
|
_collection = 'foobar'
|
||||||
|
_usage = 'listener'
|
||||||
|
|
||||||
|
self._build_components(Foo, Bar, Baz)
|
||||||
|
|
||||||
|
components = self.comp_registry.lookup('foobar', usage='listener')
|
||||||
|
self.assertEqual('baz', components[0]._name)
|
||||||
|
|
||||||
|
components = self.comp_registry.lookup('foobar', usage='speaker')
|
||||||
|
self.assertEqual(
|
||||||
|
['foo', 'bar'],
|
||||||
|
[c._name for c in components]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_lookup_no_component(self):
|
||||||
|
""" No component """
|
||||||
|
# we just expect an empty list when no component match, the error
|
||||||
|
# handling is handled at an higher level
|
||||||
|
self.assertEqual(
|
||||||
|
[],
|
||||||
|
self.comp_registry.lookup('something', usage='something')
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_get_by_name(self):
|
||||||
|
""" Get component by name """
|
||||||
|
class Foo(AbstractComponent):
|
||||||
|
_name = 'foo'
|
||||||
|
_collection = 'foobar'
|
||||||
|
|
||||||
|
self._build_components(Foo)
|
||||||
|
# this is just a dict access
|
||||||
|
self.assertEqual('foo', self.comp_registry['foo']._name)
|
||||||
|
|
||||||
|
def test_lookup_abstract(self):
|
||||||
|
""" Do not include abstract components in lookup """
|
||||||
|
class Foo(AbstractComponent):
|
||||||
|
_name = 'foo'
|
||||||
|
_collection = 'foobar'
|
||||||
|
_usage = 'speaker'
|
||||||
|
|
||||||
|
class Bar(Component):
|
||||||
|
_name = 'bar'
|
||||||
|
_inherit = 'foo'
|
||||||
|
|
||||||
|
self._build_components(Foo, Bar)
|
||||||
|
|
||||||
|
comp_registry = self.comp_registry
|
||||||
|
|
||||||
|
# we should never have 'foo' in the returned components
|
||||||
|
# as it is abstract
|
||||||
|
components = comp_registry.lookup('foobar', usage='speaker')
|
||||||
|
self.assertEqual('bar', components[0]._name)
|
||||||
|
|
||||||
|
components = comp_registry.lookup('foobar', usage='speaker')
|
||||||
|
self.assertEqual(
|
||||||
|
['bar'],
|
||||||
|
[c._name for c in components]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_lookup_model_name(self):
|
||||||
|
""" Lookup with model names """
|
||||||
|
class Foo(Component):
|
||||||
|
_name = 'foo'
|
||||||
|
_collection = 'foobar'
|
||||||
|
_usage = 'speaker'
|
||||||
|
# support list
|
||||||
|
_apply_on = ['res.partner']
|
||||||
|
|
||||||
|
class Bar(Component):
|
||||||
|
_name = 'bar'
|
||||||
|
_collection = 'foobar'
|
||||||
|
_usage = 'speaker'
|
||||||
|
# support string
|
||||||
|
_apply_on = 'res.users'
|
||||||
|
|
||||||
|
class Any(Component):
|
||||||
|
# can be used with any model as far as we look it up
|
||||||
|
# with its usage
|
||||||
|
_name = 'any'
|
||||||
|
_collection = 'foobar'
|
||||||
|
_usage = 'listener'
|
||||||
|
|
||||||
|
self._build_components(Foo, Bar, Any)
|
||||||
|
|
||||||
|
components = self.comp_registry.lookup('foobar',
|
||||||
|
usage='speaker',
|
||||||
|
model_name='res.partner')
|
||||||
|
self.assertEqual('foo', components[0]._name)
|
||||||
|
|
||||||
|
components = self.comp_registry.lookup('foobar',
|
||||||
|
usage='speaker',
|
||||||
|
model_name='res.users')
|
||||||
|
self.assertEqual('bar', components[0]._name)
|
||||||
|
|
||||||
|
components = self.comp_registry.lookup('foobar',
|
||||||
|
usage='listener',
|
||||||
|
model_name='res.users')
|
||||||
|
self.assertEqual('any', components[0]._name)
|
||||||
|
|
||||||
|
def test_lookup_cache(self):
|
||||||
|
""" Lookup uses a cache """
|
||||||
|
class Foo(Component):
|
||||||
|
_name = 'foo'
|
||||||
|
_collection = 'foobar'
|
||||||
|
|
||||||
|
self._build_components(Foo)
|
||||||
|
|
||||||
|
components = self.comp_registry.lookup('foobar')
|
||||||
|
self.assertEqual(['foo'], [c._name for c in components])
|
||||||
|
|
||||||
|
# we add a new component
|
||||||
|
class Bar(Component):
|
||||||
|
_name = 'bar'
|
||||||
|
_collection = 'foobar'
|
||||||
|
|
||||||
|
self._build_components(Bar)
|
||||||
|
|
||||||
|
# As the lookups are cached, we should still see only foo,
|
||||||
|
# even if we added a new component.
|
||||||
|
# We do this for testing, but in a real use case, we can't
|
||||||
|
# add new Component classes on the fly, and when we install
|
||||||
|
# new addons, the registry is rebuilt and cache cleared.
|
||||||
|
components = self.comp_registry.lookup('foobar')
|
||||||
|
self.assertEqual(['foo'], [c._name for c in components])
|
||||||
|
|
||||||
|
self.comp_registry._cache.clear()
|
||||||
|
# now we should find them both as the cache has been cleared
|
||||||
|
components = self.comp_registry.lookup('foobar')
|
||||||
|
self.assertEqual(['foo', 'bar'], [c._name for c in components])
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
from odoo.addons.component.core import WorkContext, ComponentRegistry
|
||||||
|
from .common import TransactionComponentCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestWorkOn(TransactionComponentCase):
|
||||||
|
""" Test on WorkContext
|
||||||
|
|
||||||
|
This model is mostly a container, so we check the access
|
||||||
|
to the attributes and properties.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestWorkOn, self).setUp()
|
||||||
|
self.collection = self.env['collection.base']
|
||||||
|
|
||||||
|
def test_collection_work_on(self):
|
||||||
|
""" Create a new instance and test attributes access """
|
||||||
|
collection_record = self.collection.new()
|
||||||
|
with collection_record.work_on('res.partner') as work:
|
||||||
|
self.assertEqual(collection_record, work.collection)
|
||||||
|
self.assertEqual('collection.base', work.collection._name)
|
||||||
|
self.assertEqual('res.partner', work.model_name)
|
||||||
|
self.assertEqual(self.env['res.partner'], work.model)
|
||||||
|
self.assertEqual(self.env, work.env)
|
||||||
|
|
||||||
|
def test_propagate_work_on(self):
|
||||||
|
""" Check custom attributes and their propagation """
|
||||||
|
registry = ComponentRegistry()
|
||||||
|
work = WorkContext(
|
||||||
|
model_name='res.partner',
|
||||||
|
collection=self.collection,
|
||||||
|
# we can customize the lookup registry, but used mostly for tests
|
||||||
|
components_registry=registry,
|
||||||
|
# we can pass our own keyword args that will set as attributes
|
||||||
|
test_keyword='value',
|
||||||
|
)
|
||||||
|
self.assertIs(registry, work.components_registry)
|
||||||
|
# check that our custom keyword is set as attribute
|
||||||
|
self.assertEqual('value', work.test_keyword)
|
||||||
|
|
||||||
|
# when we want to work on another model, work_on() create
|
||||||
|
# another instance and propagate the attributes to it
|
||||||
|
work2 = work.work_on('res.users')
|
||||||
|
self.assertNotEqual(work, work2)
|
||||||
|
self.assertEqual(self.env, work2.env)
|
||||||
|
self.assertEqual(self.collection, work2.collection)
|
||||||
|
self.assertEqual('res.users', work2.model_name)
|
||||||
|
self.assertIs(registry, work2.components_registry)
|
||||||
|
# test_keyword has been propagated to the new WorkContext instance
|
||||||
|
self.assertEqual('value', work2.test_keyword)
|
||||||
|
|
@ -0,0 +1,106 @@
|
||||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||||
|
:target: http://www.gnu.org/licenses/agpl
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
|
||||||
|
===================
|
||||||
|
Components - Events
|
||||||
|
===================
|
||||||
|
|
||||||
|
This module implements an event system (`Observer pattern`_) and is a
|
||||||
|
base block for the Connector Framework. It can be used without
|
||||||
|
using the full Connector though. It is built upon the ``component`` module.
|
||||||
|
|
||||||
|
Documentation: http://odoo-connector.com/
|
||||||
|
|
||||||
|
.. _Observer pattern: https://en.wikipedia.org/wiki/Observer_pattern
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
* Install ``component_event``
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
The module does nothing by itself and has no configuration.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
As a developer, you have access to a events system. You can find the
|
||||||
|
documentation in the code or on http://odoo-connector.com
|
||||||
|
|
||||||
|
In a nutshell, you can create trigger events::
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
And subscribe listeners to the events::
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
This module triggers 3 events:
|
||||||
|
|
||||||
|
* ``on_record_create(record, fields=None)``
|
||||||
|
* ``on_record_write(record, fields=None)``
|
||||||
|
* ``on_record_unlink(record)``
|
||||||
|
|
||||||
|
|
||||||
|
Known issues / Roadmap
|
||||||
|
======================
|
||||||
|
|
||||||
|
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 smash it by providing detailed and welcomed feedback.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Images
|
||||||
|
------
|
||||||
|
|
||||||
|
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Guewen Baconnier <guewen.baconnier@camptocamp.com>
|
||||||
|
|
||||||
|
Do not contact contributors directly about support or help with technical issues.
|
||||||
|
|
||||||
|
Maintainer
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. image:: https://odoo-community.org/logo.png
|
||||||
|
:alt: Odoo Community Association
|
||||||
|
:target: https://odoo-community.org
|
||||||
|
|
||||||
|
This module is maintained by the OCA.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
To contribute to this module, please visit https://odoo-community.org.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import core
|
||||||
|
from . import components
|
||||||
|
from . import models
|
||||||
|
|
||||||
|
# allow public API 'from odoo.addons.component_event import skip_if'
|
||||||
|
from .components.event import skip_if # noqa
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
{'name': 'Components Events',
|
||||||
|
'version': '11.0.1.0.0',
|
||||||
|
'author': 'Camptocamp,'
|
||||||
|
'Odoo Community Association (OCA)',
|
||||||
|
'website': 'https://www.camptocamp.com',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'category': 'Generic Modules',
|
||||||
|
'depends': ['component',
|
||||||
|
],
|
||||||
|
'external_dependencies': {
|
||||||
|
'python': ['cachetools'],
|
||||||
|
},
|
||||||
|
'data': [],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import event
|
||||||
|
|
@ -0,0 +1,294 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Events
|
||||||
|
======
|
||||||
|
|
||||||
|
Events are a notification system.
|
||||||
|
|
||||||
|
On one side, one or many listeners await for an event to happen. On
|
||||||
|
the other side, when such event happen, a notification is sent to
|
||||||
|
the listeners.
|
||||||
|
|
||||||
|
An example of event is: 'when a record has been created'.
|
||||||
|
|
||||||
|
The event system allows to write the notification code in only one place, in
|
||||||
|
one Odoo addon, and to write as many listeners as we want, in different places,
|
||||||
|
different addons.
|
||||||
|
|
||||||
|
We'll see below how the ``on_record_create`` is implemented.
|
||||||
|
|
||||||
|
Notifier
|
||||||
|
--------
|
||||||
|
|
||||||
|
The first thing is to find where/when the notification should be sent.
|
||||||
|
For the creation of a record, it is in :meth:`odoo.models.BaseModel.create`.
|
||||||
|
We can inherit from the `'base'` model to add this line:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
The :meth:`..models.base.Base._event` method has been added to the `'base'`
|
||||||
|
model, so an event can be notified from any model. The
|
||||||
|
:meth:`CollectedEvents.notify` method triggers the event and forward the
|
||||||
|
arguments to the listeners.
|
||||||
|
|
||||||
|
This should be done only once. See :class:`..models.base.Base` for a list of
|
||||||
|
events that are implemented in the `'base'` model.
|
||||||
|
|
||||||
|
Listeners
|
||||||
|
---------
|
||||||
|
|
||||||
|
Listeners are Components that respond to the event names.
|
||||||
|
The components must have a ``_usage`` equals to ``'event.listener'``, but it
|
||||||
|
doesn't to be set manually if the component inherits from
|
||||||
|
``'base.event.listener'``
|
||||||
|
|
||||||
|
Here is how we would log something each time a record is created::
|
||||||
|
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self, record, fields=None):
|
||||||
|
_logger.info("%r has been created", record)
|
||||||
|
|
||||||
|
Many listeners such as this one could be added for the same event.
|
||||||
|
|
||||||
|
|
||||||
|
Collection and models
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
In the example above, the listeners is global. It will be executed for any
|
||||||
|
model and collection. You can also restrict a listener to only a collection or
|
||||||
|
model, using the ``_collection`` or ``_apply_on`` attributes.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
_collection = 'magento.backend'
|
||||||
|
|
||||||
|
def on_record_create(self, record, fields=None):
|
||||||
|
_logger.info("%r has been created", record)
|
||||||
|
|
||||||
|
|
||||||
|
class MyModelEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
_apply_on = ['res.users']
|
||||||
|
|
||||||
|
def on_record_create(self, record, fields=None):
|
||||||
|
_logger.info("%r has been created", record)
|
||||||
|
|
||||||
|
|
||||||
|
If you want an event to be restricted to a collection, the
|
||||||
|
notification must also precise the collection, otherwise all listeners
|
||||||
|
will be executed::
|
||||||
|
|
||||||
|
|
||||||
|
collection = self.env['magento.backend']
|
||||||
|
self._event('on_foo_created', collection=collection).notify(record, vals)
|
||||||
|
|
||||||
|
An event can be skipped based on a condition evaluated from the notified
|
||||||
|
arguments. See :func:`skip_if`
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import operator
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
from functools import wraps
|
||||||
|
|
||||||
|
from odoo.addons.component.core import AbstractComponent, Component
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
try:
|
||||||
|
from cachetools import LRUCache, cachedmethod, keys
|
||||||
|
except ImportError:
|
||||||
|
_logger.debug("Cannot import 'cachetools'.")
|
||||||
|
|
||||||
|
# Number of items we keep in LRU cache when we collect the events.
|
||||||
|
# 1 item means: for an event name, model_name, collection, return
|
||||||
|
# the event methods
|
||||||
|
DEFAULT_EVENT_CACHE_SIZE = 512
|
||||||
|
|
||||||
|
|
||||||
|
def skip_if(cond):
|
||||||
|
""" Decorator allowing to skip an event based on a condition
|
||||||
|
|
||||||
|
The condition is a python lambda expression, which takes the
|
||||||
|
same arguments than the event.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
@skip_if(lambda self, *args, **kwargs:
|
||||||
|
self.env.context.get('connector_no_export'))
|
||||||
|
def on_record_write(self, record, fields=None):
|
||||||
|
_logger('I'll delay a job, but only if we didn't disabled '
|
||||||
|
' the export with a context key')
|
||||||
|
record.with_delay().export_record()
|
||||||
|
|
||||||
|
@skip_if(lambda self, record, kind: kind == 'complete')
|
||||||
|
def on_record_write(self, record, kind):
|
||||||
|
_logger("I'll delay a job, but only if the kind is 'complete'")
|
||||||
|
record.with_delay().export_record()
|
||||||
|
|
||||||
|
"""
|
||||||
|
def skip_if_decorator(func):
|
||||||
|
@wraps(func)
|
||||||
|
def func_wrapper(*args, **kwargs):
|
||||||
|
if cond(*args, **kwargs):
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
|
||||||
|
return func_wrapper
|
||||||
|
return skip_if_decorator
|
||||||
|
|
||||||
|
|
||||||
|
class CollectedEvents(object):
|
||||||
|
""" Event methods ready to be notified
|
||||||
|
|
||||||
|
This is a rather internal class. An instance of this class
|
||||||
|
is prepared by the :class:`EventCollecter` when we need to notify
|
||||||
|
the listener that the event has been triggered.
|
||||||
|
|
||||||
|
:meth:`EventCollecter.collect_events` collects the events,
|
||||||
|
feed them to the instance, so we can use the :meth:`notify` method
|
||||||
|
that will forward the arguments and keyword arguments to the
|
||||||
|
listeners of the event.
|
||||||
|
::
|
||||||
|
|
||||||
|
>>> # collecter is an instance of CollectedEvents
|
||||||
|
>>> collecter.collect_events('on_record_create').notify(something)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, events):
|
||||||
|
self.events = events
|
||||||
|
|
||||||
|
def notify(self, *args, **kwargs):
|
||||||
|
""" Forward the arguments to every listeners of an event """
|
||||||
|
for event in self.events:
|
||||||
|
event(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class EventCollecter(Component):
|
||||||
|
""" Component that collects the event from an event name
|
||||||
|
|
||||||
|
For doing so, it searches all the components that respond to the
|
||||||
|
``event.listener`` ``_usage`` and having an event of the same
|
||||||
|
name.
|
||||||
|
|
||||||
|
Then it feeds the events to an instance of :class:`EventCollecter`
|
||||||
|
and return it to the caller.
|
||||||
|
|
||||||
|
It keeps the results in a cache, the Component is rebuilt when
|
||||||
|
the Odoo's registry is rebuilt, hence the cache is cleared as well.
|
||||||
|
|
||||||
|
An event always starts with ``on_``.
|
||||||
|
|
||||||
|
Note that the special
|
||||||
|
:class:`odoo.addons.component_event.core.EventWorkContext` class should be
|
||||||
|
used for this Component, because it can work
|
||||||
|
without a collection.
|
||||||
|
|
||||||
|
It is used by :meth:`odoo.addons.component_event.models.base.Base._event`.
|
||||||
|
|
||||||
|
"""
|
||||||
|
_name = 'base.event.collecter'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _complete_component_build(cls):
|
||||||
|
""" Create a cache on the class when the component is built """
|
||||||
|
super(EventCollecter, cls)._complete_component_build()
|
||||||
|
# the _cache being on the component class, which is
|
||||||
|
# dynamically rebuild when odoo registry is rebuild, we
|
||||||
|
# are sure that the result is always the same for a lookup
|
||||||
|
# until the next rebuild of odoo's registry
|
||||||
|
cls._cache = LRUCache(maxsize=DEFAULT_EVENT_CACHE_SIZE)
|
||||||
|
|
||||||
|
@cachedmethod(operator.attrgetter('_cache'),
|
||||||
|
key=lambda self, name: keys.hashkey(
|
||||||
|
self.work.collection._name
|
||||||
|
if self.work._collection is not None else None,
|
||||||
|
self.work.model_name,
|
||||||
|
name)
|
||||||
|
)
|
||||||
|
def _collect_events(self, name):
|
||||||
|
events = defaultdict(set)
|
||||||
|
collection_name = (self.work.collection._name
|
||||||
|
if self.work._collection is not None
|
||||||
|
else None)
|
||||||
|
component_classes = self.work.components_registry.lookup(
|
||||||
|
collection_name=collection_name,
|
||||||
|
usage='event.listener',
|
||||||
|
model_name=self.work.model_name,
|
||||||
|
)
|
||||||
|
for cls in component_classes:
|
||||||
|
if cls.has_event(name):
|
||||||
|
events[cls].add(name)
|
||||||
|
return events
|
||||||
|
|
||||||
|
def _init_collected_events(self, class_events):
|
||||||
|
events = set()
|
||||||
|
for cls, names in class_events.items():
|
||||||
|
for name in names:
|
||||||
|
component = cls(self.work)
|
||||||
|
events.add(getattr(component, name))
|
||||||
|
return events
|
||||||
|
|
||||||
|
def collect_events(self, name):
|
||||||
|
""" Collect the events of a given name """
|
||||||
|
if not name.startswith('on_'):
|
||||||
|
raise ValueError("an event name always starts with 'on_'")
|
||||||
|
|
||||||
|
events = self._init_collected_events(self._collect_events(name))
|
||||||
|
return CollectedEvents(events)
|
||||||
|
|
||||||
|
|
||||||
|
class EventListener(AbstractComponent):
|
||||||
|
""" Base Component for the Event listeners
|
||||||
|
|
||||||
|
Events must be methods starting with ``on_``.
|
||||||
|
|
||||||
|
Example: :class:`RecordsEventListener`
|
||||||
|
|
||||||
|
"""
|
||||||
|
_name = 'base.event.listener'
|
||||||
|
_usage = 'event.listener'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def has_event(cls, name):
|
||||||
|
""" Indicate if the class has an event of this name """
|
||||||
|
return name in cls._events
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _build_event_listener_component(cls):
|
||||||
|
""" Make a list of events listeners for this class """
|
||||||
|
events = set([])
|
||||||
|
if not cls._abstract:
|
||||||
|
for attr_name in dir(cls):
|
||||||
|
if attr_name.startswith('on_'):
|
||||||
|
events.add(attr_name)
|
||||||
|
cls._events = events
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _complete_component_build(cls):
|
||||||
|
super(EventListener, cls)._complete_component_build()
|
||||||
|
cls._build_event_listener_component()
|
||||||
|
|
@ -0,0 +1,153 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Events Internals
|
||||||
|
================
|
||||||
|
|
||||||
|
Core classes for the events system.
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from odoo.addons.component.core import WorkContext
|
||||||
|
|
||||||
|
|
||||||
|
class EventWorkContext(WorkContext):
|
||||||
|
""" Work context used by the Events internals
|
||||||
|
|
||||||
|
Should not be used outside of the events internals.
|
||||||
|
The work context to use generally is
|
||||||
|
:class:`odoo.addons.component.core.WorkContext` or your own
|
||||||
|
subclass.
|
||||||
|
|
||||||
|
The events are a special kind of components because they are
|
||||||
|
not attached to any collection (they can but not the main use case).
|
||||||
|
|
||||||
|
So the work context must not need to have a collection, but when
|
||||||
|
it has no collection, it must at least have an 'env'.
|
||||||
|
|
||||||
|
When no collection is provided, the methods to get the Components
|
||||||
|
cannot be used, but :meth:`work_on` can be used to switch back to
|
||||||
|
a :class:`odoo.addons.component.core.WorkContext` with collection.
|
||||||
|
This is needed when one want to get a component for a collection
|
||||||
|
from inside an event listener.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, model_name=None, collection=None, env=None,
|
||||||
|
components_registry=None, **kwargs):
|
||||||
|
if not (collection is not None or env):
|
||||||
|
raise ValueError('collection or env is required')
|
||||||
|
if collection and env:
|
||||||
|
# when a collection is used, the env will be the one of
|
||||||
|
# the collection
|
||||||
|
raise ValueError('collection and env cannot both be provided')
|
||||||
|
|
||||||
|
self.env = env
|
||||||
|
super(EventWorkContext, self).__init__(
|
||||||
|
model_name=model_name, collection=collection,
|
||||||
|
components_registry=components_registry,
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
if self._env:
|
||||||
|
self._propagate_kwargs.remove('collection')
|
||||||
|
self._propagate_kwargs.append('env')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def env(self):
|
||||||
|
""" Return the current Odoo env """
|
||||||
|
if self._env:
|
||||||
|
return self._env
|
||||||
|
return super(EventWorkContext, self).env
|
||||||
|
|
||||||
|
@env.setter
|
||||||
|
def env(self, value):
|
||||||
|
self._env = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def collection(self):
|
||||||
|
""" Return the current Odoo env """
|
||||||
|
if self._collection is not None:
|
||||||
|
return self._collection
|
||||||
|
raise ValueError('No collection, it is optional for EventWorkContext')
|
||||||
|
|
||||||
|
@collection.setter
|
||||||
|
def collection(self, value):
|
||||||
|
self._collection = value
|
||||||
|
|
||||||
|
def work_on(self, model_name=None, collection=None):
|
||||||
|
""" Create a new work context for another model keeping attributes
|
||||||
|
|
||||||
|
Used when one need to lookup components for another model.
|
||||||
|
|
||||||
|
Used on an EventWorkContext, it switch back to a normal
|
||||||
|
WorkContext. It means we are inside an event listener, and
|
||||||
|
we want to get a component. We need to set a collection
|
||||||
|
to be able to get components.
|
||||||
|
"""
|
||||||
|
if self._collection is None and collection is None:
|
||||||
|
raise ValueError('you must provide a collection to work with')
|
||||||
|
if collection is not None:
|
||||||
|
if self.env is not collection.env:
|
||||||
|
raise ValueError('the Odoo env of the collection must be '
|
||||||
|
'the same than the current one')
|
||||||
|
kwargs = {attr_name: getattr(self, attr_name)
|
||||||
|
for attr_name in self._propagate_kwargs}
|
||||||
|
kwargs.pop('env', None)
|
||||||
|
if collection is not None:
|
||||||
|
kwargs['collection'] = collection
|
||||||
|
if model_name is not None:
|
||||||
|
kwargs['model_name'] = model_name
|
||||||
|
return WorkContext(**kwargs)
|
||||||
|
|
||||||
|
def component_by_name(self, name, model_name=None):
|
||||||
|
if self._collection is not None:
|
||||||
|
# switch to a normal WorkContext
|
||||||
|
work = self.work_on(collection=self._collection,
|
||||||
|
model_name=model_name)
|
||||||
|
else:
|
||||||
|
raise TypeError(
|
||||||
|
"Can't be used on an EventWorkContext without collection. "
|
||||||
|
"The collection must be known to find components.\n"
|
||||||
|
"Hint: you can set the collection and get a component with:\n"
|
||||||
|
">>> work.work_on(collection=self.env[...].browse(...))\n"
|
||||||
|
">>> work.component_by_name(name, model_name=model_name)"
|
||||||
|
)
|
||||||
|
return work.component_by_name(name, model_name=model_name)
|
||||||
|
|
||||||
|
def component(self, usage=None, model_name=None):
|
||||||
|
if self._collection is not None:
|
||||||
|
# switch to a normal WorkContext
|
||||||
|
work = self.work_on(collection=self._collection,
|
||||||
|
model_name=model_name)
|
||||||
|
else:
|
||||||
|
raise TypeError(
|
||||||
|
"Can't be used on an EventWorkContext without collection. "
|
||||||
|
"The collection must be known to find components.\n"
|
||||||
|
"Hint: you can set the collection and get a component with:\n"
|
||||||
|
">>> work.work_on(collection=self.env[...].browse(...))\n"
|
||||||
|
">>> work.component(usage=usage, model_name=model_name)"
|
||||||
|
)
|
||||||
|
return work.component(usage=usage, model_name=model_name)
|
||||||
|
|
||||||
|
def many_components(self, usage=None, model_name=None):
|
||||||
|
if self._collection is not None:
|
||||||
|
# switch to a normal WorkContext
|
||||||
|
work = self.work_on(collection=self._collection,
|
||||||
|
model_name=model_name)
|
||||||
|
else:
|
||||||
|
raise TypeError(
|
||||||
|
"Can't be used on an EventWorkContext without collection. "
|
||||||
|
"The collection must be known to find components.\n"
|
||||||
|
"Hint: you can set the collection and get a component with:\n"
|
||||||
|
">>> work.work_on(collection=self.env[...].browse(...))\n"
|
||||||
|
">>> work.many_components(usage=usage, model_name=model_name)"
|
||||||
|
)
|
||||||
|
return work.component(usage=usage, model_name=model_name)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return ("EventWorkContext(%s,%s)" %
|
||||||
|
(repr(self._env or self._collection), self.model_name))
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import base
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Base Model
|
||||||
|
==========
|
||||||
|
|
||||||
|
Extend the 'base' Odoo Model to add Events related features.
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from odoo import api, models
|
||||||
|
from odoo.addons.component.core import _component_databases
|
||||||
|
from ..components.event import CollectedEvents
|
||||||
|
from ..core import EventWorkContext
|
||||||
|
|
||||||
|
|
||||||
|
class Base(models.AbstractModel):
|
||||||
|
""" The base model, which is implicitly inherited by all models.
|
||||||
|
|
||||||
|
Add an :meth:`_event` method to all Models. This method allows to
|
||||||
|
trigger events.
|
||||||
|
|
||||||
|
It also notifies the following events:
|
||||||
|
|
||||||
|
* ``on_record_create(self, record, fields=None)``
|
||||||
|
* ``on_record_write(self, record, fields=none)``
|
||||||
|
* ``on_record_unlink(self, record)``
|
||||||
|
|
||||||
|
``on_record_unlink`` is notified just *before* the unlink is done.
|
||||||
|
|
||||||
|
"""
|
||||||
|
_inherit = 'base'
|
||||||
|
|
||||||
|
def _event(self, name, collection=None, components_registry=None):
|
||||||
|
""" Collect events for notifications
|
||||||
|
|
||||||
|
Usage::
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def button_do_something(self):
|
||||||
|
for record in self:
|
||||||
|
# do something
|
||||||
|
self._event('on_do_something').notify('something')
|
||||||
|
|
||||||
|
With this line, every listener having a ``on_do_something`` method
|
||||||
|
with be called and receive 'something' as argument.
|
||||||
|
|
||||||
|
See: :mod:`..components.event`
|
||||||
|
|
||||||
|
:param name: name of the event, start with 'on_'
|
||||||
|
:param collection: optional collection to filter on, only
|
||||||
|
listeners with similar ``_collection`` will be
|
||||||
|
notified
|
||||||
|
:param components_registry: component registry for lookups,
|
||||||
|
mainly used for tests
|
||||||
|
:type components_registry:
|
||||||
|
:class:`odoo.addons.components.core.ComponentRegistry`
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
dbname = self.env.cr.dbname
|
||||||
|
comp_registry = (
|
||||||
|
components_registry or _component_databases.get(dbname)
|
||||||
|
)
|
||||||
|
if not comp_registry or not comp_registry.ready:
|
||||||
|
# No event should be triggered before the registry has been loaded
|
||||||
|
# This is a very special case, when the odoo registry is being
|
||||||
|
# built, it calls odoo.modules.loading.load_modules().
|
||||||
|
# This function might trigger events (by writing on records, ...).
|
||||||
|
# But at this point, the component registry is not guaranteed
|
||||||
|
# to be ready, and anyway we should probably not trigger events
|
||||||
|
# during the initialization. Hence we return an empty list of
|
||||||
|
# events, the 'notify' calls will do nothing.
|
||||||
|
return CollectedEvents([])
|
||||||
|
|
||||||
|
model_name = self._name
|
||||||
|
if collection is not None:
|
||||||
|
work = EventWorkContext(collection=collection,
|
||||||
|
model_name=model_name,
|
||||||
|
components_registry=components_registry)
|
||||||
|
else:
|
||||||
|
work = EventWorkContext(env=self.env, model_name=model_name,
|
||||||
|
components_registry=components_registry)
|
||||||
|
|
||||||
|
collecter = work._component_class_by_name('base.event.collecter')(work)
|
||||||
|
return collecter.collect_events(name)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def create(self, vals):
|
||||||
|
record = super(Base, self).create(vals)
|
||||||
|
fields = list(vals.keys())
|
||||||
|
self._event('on_record_create').notify(record, fields=fields)
|
||||||
|
return record
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def write(self, vals):
|
||||||
|
result = super(Base, self).write(vals)
|
||||||
|
fields = list(vals.keys())
|
||||||
|
for record in self:
|
||||||
|
self._event('on_record_write').notify(record, fields=fields)
|
||||||
|
return result
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def unlink(self):
|
||||||
|
for record in self:
|
||||||
|
self._event('on_record_unlink').notify(record)
|
||||||
|
result = super(Base, self).unlink()
|
||||||
|
return result
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import test_event
|
||||||
|
|
@ -0,0 +1,432 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
import mock
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from odoo.addons.component.tests.common import (
|
||||||
|
ComponentRegistryCase,
|
||||||
|
TransactionComponentRegistryCase,
|
||||||
|
)
|
||||||
|
from odoo.addons.component.core import Component
|
||||||
|
from odoo.addons.component_event.core import EventWorkContext
|
||||||
|
from odoo.addons.component_event.components.event import skip_if
|
||||||
|
|
||||||
|
|
||||||
|
class TestEventWorkContext(unittest.TestCase):
|
||||||
|
""" Test Events Components """
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestEventWorkContext, self).setUp()
|
||||||
|
self.env = mock.MagicMock(name='env')
|
||||||
|
self.record = mock.MagicMock(name='record')
|
||||||
|
self.components_registry = mock.MagicMock(name='ComponentRegistry')
|
||||||
|
|
||||||
|
def test_env(self):
|
||||||
|
""" WorkContext with env """
|
||||||
|
work = EventWorkContext(model_name='res.users', env=self.env,
|
||||||
|
components_registry=self.components_registry)
|
||||||
|
self.assertEqual(self.env, work.env)
|
||||||
|
self.assertEqual('res.users', work.model_name)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
# pylint: disable=W0104
|
||||||
|
work.collection # noqa
|
||||||
|
|
||||||
|
def test_collection(self):
|
||||||
|
""" WorkContext with collection """
|
||||||
|
env = mock.MagicMock(name='env')
|
||||||
|
collection = mock.MagicMock(name='collection')
|
||||||
|
collection.env = env
|
||||||
|
work = EventWorkContext(model_name='res.users', collection=collection,
|
||||||
|
components_registry=self.components_registry)
|
||||||
|
self.assertEqual(collection, work.collection)
|
||||||
|
self.assertEqual(env, work.env)
|
||||||
|
self.assertEqual('res.users', work.model_name)
|
||||||
|
|
||||||
|
def test_env_and_collection(self):
|
||||||
|
""" WorkContext with collection and env is forbidden """
|
||||||
|
env = mock.MagicMock(name='env')
|
||||||
|
collection = mock.MagicMock(name='collection')
|
||||||
|
collection.env = env
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
EventWorkContext(model_name='res.users', collection=collection,
|
||||||
|
env=env,
|
||||||
|
components_registry=self.components_registry)
|
||||||
|
|
||||||
|
def test_missing(self):
|
||||||
|
""" WorkContext with collection and env is forbidden """
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
EventWorkContext(model_name='res.users',
|
||||||
|
components_registry=self.components_registry)
|
||||||
|
|
||||||
|
def test_env_work_on(self):
|
||||||
|
""" WorkContext propagated through work_on """
|
||||||
|
env = mock.MagicMock(name='env')
|
||||||
|
collection = mock.MagicMock(name='collection')
|
||||||
|
collection.env = env
|
||||||
|
work = EventWorkContext(env=env, model_name='res.users',
|
||||||
|
components_registry=self.components_registry)
|
||||||
|
work2 = work.work_on(model_name='res.partner', collection=collection)
|
||||||
|
self.assertEqual('WorkContext', work2.__class__.__name__)
|
||||||
|
self.assertEqual(env, work2.env)
|
||||||
|
self.assertEqual('res.partner', work2.model_name)
|
||||||
|
self.assertEqual(self.components_registry, work2.components_registry)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
# pylint: disable=W0104
|
||||||
|
work.collection # noqa
|
||||||
|
|
||||||
|
def test_collection_work_on(self):
|
||||||
|
""" WorkContext propagated through work_on """
|
||||||
|
env = mock.MagicMock(name='env')
|
||||||
|
collection = mock.MagicMock(name='collection')
|
||||||
|
collection.env = env
|
||||||
|
work = EventWorkContext(collection=collection, model_name='res.users',
|
||||||
|
components_registry=self.components_registry)
|
||||||
|
work2 = work.work_on(model_name='res.partner')
|
||||||
|
self.assertEqual('WorkContext', work2.__class__.__name__)
|
||||||
|
self.assertEqual(collection, work2.collection)
|
||||||
|
self.assertEqual(env, work2.env)
|
||||||
|
self.assertEqual('res.partner', work2.model_name)
|
||||||
|
self.assertEqual(self.components_registry, work2.components_registry)
|
||||||
|
|
||||||
|
def test_collection_work_on_collection(self):
|
||||||
|
""" WorkContext collection changed with work_on """
|
||||||
|
env = mock.MagicMock(name='env')
|
||||||
|
collection = mock.MagicMock(name='collection')
|
||||||
|
collection.env = env
|
||||||
|
work = EventWorkContext(model_name='res.users', env=env,
|
||||||
|
components_registry=self.components_registry)
|
||||||
|
work2 = work.work_on(collection=collection)
|
||||||
|
# when work_on is used inside an event component, we want
|
||||||
|
# to switch back to a normal WorkContext, because we don't
|
||||||
|
# need anymore the EventWorkContext
|
||||||
|
self.assertEqual('WorkContext', work2.__class__.__name__)
|
||||||
|
self.assertEqual(collection, work2.collection)
|
||||||
|
self.assertEqual(env, work2.env)
|
||||||
|
self.assertEqual('res.users', work2.model_name)
|
||||||
|
self.assertEqual(self.components_registry, work2.components_registry)
|
||||||
|
|
||||||
|
|
||||||
|
class TestEvent(ComponentRegistryCase):
|
||||||
|
""" Test Events Components """
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestEvent, self).setUp()
|
||||||
|
self._load_module_components('component_event')
|
||||||
|
|
||||||
|
# get the collecter to notify the event
|
||||||
|
# we don't mind about the collection and the model here,
|
||||||
|
# the events we test are global
|
||||||
|
env = mock.MagicMock()
|
||||||
|
self.work = EventWorkContext(model_name='res.users', env=env,
|
||||||
|
components_registry=self.comp_registry)
|
||||||
|
self.collecter = self.comp_registry['base.event.collecter'](self.work)
|
||||||
|
|
||||||
|
def test_event(self):
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self, recipient, something, fields=None):
|
||||||
|
recipient.append(('OK', something, fields))
|
||||||
|
|
||||||
|
MyEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
something = object()
|
||||||
|
fields = ['name', 'code']
|
||||||
|
|
||||||
|
# as there is no return value by the event, we
|
||||||
|
# modify this recipient to check it has been called
|
||||||
|
recipient = []
|
||||||
|
|
||||||
|
# collect the event and notify it
|
||||||
|
self.collecter.collect_events('on_record_create').notify(
|
||||||
|
recipient, something, fields=fields
|
||||||
|
)
|
||||||
|
self.assertEqual([('OK', something, fields)], recipient)
|
||||||
|
|
||||||
|
def test_collect_several(self):
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self, recipient, something, fields=None):
|
||||||
|
recipient.append(('OK', something, fields))
|
||||||
|
|
||||||
|
class MyOtherEventListener(Component):
|
||||||
|
_name = 'my.other.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self, recipient, something, fields=None):
|
||||||
|
recipient.append(('OK', something, fields))
|
||||||
|
|
||||||
|
MyEventListener._build_component(self.comp_registry)
|
||||||
|
MyOtherEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
something = object()
|
||||||
|
fields = ['name', 'code']
|
||||||
|
|
||||||
|
# as there is no return value by the event, we
|
||||||
|
# modify this recipient to check it has been called
|
||||||
|
recipient = []
|
||||||
|
|
||||||
|
# collect the event and notify them
|
||||||
|
collected = self.collecter.collect_events('on_record_create')
|
||||||
|
self.assertEqual(2, len(collected.events))
|
||||||
|
|
||||||
|
collected.notify(recipient, something, fields=fields)
|
||||||
|
self.assertEqual([('OK', something, fields),
|
||||||
|
('OK', something, fields)], recipient)
|
||||||
|
|
||||||
|
def test_event_cache(self):
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
MyEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
# collect the event
|
||||||
|
collected = self.collecter.collect_events('on_record_create')
|
||||||
|
# CollectedEvents.events contains the collected events
|
||||||
|
self.assertEqual(1, len(collected.events))
|
||||||
|
event = list(collected.events)[0]
|
||||||
|
self.assertEqual(self.work, event.__self__.work)
|
||||||
|
self.assertEqual(self.work.env, event.__self__.work.env)
|
||||||
|
|
||||||
|
# build and register a new listener
|
||||||
|
class MyOtherEventListener(Component):
|
||||||
|
_name = 'my.other.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
MyOtherEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
# get a new collecter and check that we it finds the same
|
||||||
|
# events even if we built a new one: it means the cache works
|
||||||
|
env = mock.MagicMock()
|
||||||
|
work = EventWorkContext(model_name='res.users', env=env,
|
||||||
|
components_registry=self.comp_registry)
|
||||||
|
collecter = self.comp_registry['base.event.collecter'](work)
|
||||||
|
collected = collecter.collect_events('on_record_create')
|
||||||
|
# CollectedEvents.events contains the collected events
|
||||||
|
self.assertEqual(1, len(collected.events))
|
||||||
|
event = list(collected.events)[0]
|
||||||
|
self.assertEqual(work, event.__self__.work)
|
||||||
|
self.assertEqual(env, event.__self__.work.env)
|
||||||
|
|
||||||
|
# if we empty the cache, as it on the class, both collecters
|
||||||
|
# should now find the 2 events
|
||||||
|
collecter._cache.clear()
|
||||||
|
self.comp_registry._cache.clear()
|
||||||
|
# CollectedEvents.events contains the collected events
|
||||||
|
self.assertEqual(
|
||||||
|
2,
|
||||||
|
len(collecter.collect_events('on_record_create').events)
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
2,
|
||||||
|
len(self.collecter.collect_events('on_record_create').events)
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_event_cache_collection(self):
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
MyEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
# collect the event
|
||||||
|
collected = self.collecter.collect_events('on_record_create')
|
||||||
|
# CollectedEvents.events contains the collected events
|
||||||
|
self.assertEqual(1, len(collected.events))
|
||||||
|
|
||||||
|
# build and register a new listener
|
||||||
|
class MyOtherEventListener(Component):
|
||||||
|
_name = 'my.other.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
_collection = 'base.collection'
|
||||||
|
|
||||||
|
def on_record_create(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
MyOtherEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
# get a new collecter and check that we it finds the same
|
||||||
|
# events even if we built a new one: it means the cache works
|
||||||
|
collection = mock.MagicMock(name='base.collection')
|
||||||
|
collection._name = 'base.collection'
|
||||||
|
collection.env = mock.MagicMock()
|
||||||
|
work = EventWorkContext(model_name='res.users', collection=collection,
|
||||||
|
components_registry=self.comp_registry)
|
||||||
|
collecter = self.comp_registry['base.event.collecter'](work)
|
||||||
|
collected = collecter.collect_events('on_record_create')
|
||||||
|
# for a different collection, we should not have the same
|
||||||
|
# cache entry
|
||||||
|
self.assertEqual(2, len(collected.events))
|
||||||
|
|
||||||
|
def test_event_cache_model_name(self):
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
MyEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
# collect the event
|
||||||
|
collected = self.collecter.collect_events('on_record_create')
|
||||||
|
# CollectedEvents.events contains the collected events
|
||||||
|
self.assertEqual(1, len(collected.events))
|
||||||
|
|
||||||
|
# build and register a new listener
|
||||||
|
class MyOtherEventListener(Component):
|
||||||
|
_name = 'my.other.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
_apply_on = ['res.country']
|
||||||
|
|
||||||
|
def on_record_create(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
MyOtherEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
# get a new collecter and check that we it finds the same
|
||||||
|
# events even if we built a new one: it means the cache works
|
||||||
|
env = mock.MagicMock()
|
||||||
|
work = EventWorkContext(model_name='res.country', env=env,
|
||||||
|
components_registry=self.comp_registry)
|
||||||
|
collecter = self.comp_registry['base.event.collecter'](work)
|
||||||
|
collected = collecter.collect_events('on_record_create')
|
||||||
|
# for a different collection, we should not have the same
|
||||||
|
# cache entry
|
||||||
|
self.assertEqual(2, len(collected.events))
|
||||||
|
|
||||||
|
def test_skip_if(self):
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_record_create(self, msg):
|
||||||
|
assert True
|
||||||
|
|
||||||
|
class MyOtherEventListener(Component):
|
||||||
|
_name = 'my.other.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
@skip_if(lambda self, msg: msg == 'foo')
|
||||||
|
def on_record_create(self, msg):
|
||||||
|
assert False
|
||||||
|
|
||||||
|
self._build_components(MyEventListener, MyOtherEventListener)
|
||||||
|
|
||||||
|
# collect the event and notify it
|
||||||
|
collected = self.collecter.collect_events('on_record_create')
|
||||||
|
self.assertEqual(2, len(collected.events))
|
||||||
|
collected.notify('foo')
|
||||||
|
|
||||||
|
|
||||||
|
class TestEventFromModel(TransactionComponentRegistryCase):
|
||||||
|
""" Test Events Components from Models """
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestEventFromModel, self).setUp()
|
||||||
|
self._load_module_components('component_event')
|
||||||
|
|
||||||
|
def test_event_from_model(self):
|
||||||
|
class MyEventListener(Component):
|
||||||
|
_name = 'my.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_foo(self, record, name):
|
||||||
|
record.name = name
|
||||||
|
|
||||||
|
MyEventListener._build_component(self.comp_registry)
|
||||||
|
|
||||||
|
partner = self.env['res.partner'].create({'name': 'test'})
|
||||||
|
# Normally you would not pass a components_registry,
|
||||||
|
# this is for the sake of the test, letting it empty
|
||||||
|
# will use the global registry.
|
||||||
|
# In a real code it would look like:
|
||||||
|
# partner._event('on_foo').notify('bar')
|
||||||
|
events = partner._event('on_foo',
|
||||||
|
components_registry=self.comp_registry)
|
||||||
|
events.notify(partner, 'bar')
|
||||||
|
self.assertEqual('bar', partner.name)
|
||||||
|
|
||||||
|
def test_event_filter_on_model(self):
|
||||||
|
class GlobalListener(Component):
|
||||||
|
_name = 'global.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_foo(self, record, name):
|
||||||
|
record.name = name
|
||||||
|
|
||||||
|
class PartnerListener(Component):
|
||||||
|
_name = 'partner.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
_apply_on = ['res.partner']
|
||||||
|
|
||||||
|
def on_foo(self, record, name):
|
||||||
|
record.ref = name
|
||||||
|
|
||||||
|
class UserListener(Component):
|
||||||
|
_name = 'user.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
_apply_on = ['res.users']
|
||||||
|
|
||||||
|
def on_foo(self, record, name):
|
||||||
|
assert False
|
||||||
|
|
||||||
|
self._build_components(GlobalListener, PartnerListener, UserListener)
|
||||||
|
|
||||||
|
partner = self.env['res.partner'].create({'name': 'test'})
|
||||||
|
partner._event(
|
||||||
|
'on_foo',
|
||||||
|
components_registry=self.comp_registry
|
||||||
|
).notify(partner, 'bar')
|
||||||
|
self.assertEqual('bar', partner.name)
|
||||||
|
self.assertEqual('bar', partner.ref)
|
||||||
|
|
||||||
|
def test_event_filter_on_collection(self):
|
||||||
|
class GlobalListener(Component):
|
||||||
|
_name = 'global.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
|
||||||
|
def on_foo(self, record, name):
|
||||||
|
record.name = name
|
||||||
|
|
||||||
|
class PartnerListener(Component):
|
||||||
|
_name = 'partner.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
_collection = 'collection.base'
|
||||||
|
|
||||||
|
def on_foo(self, record, name):
|
||||||
|
record.ref = name
|
||||||
|
|
||||||
|
class UserListener(Component):
|
||||||
|
_name = 'user.event.listener'
|
||||||
|
_inherit = 'base.event.listener'
|
||||||
|
_collection = 'magento.backend'
|
||||||
|
|
||||||
|
def on_foo(self, record, name):
|
||||||
|
assert False
|
||||||
|
|
||||||
|
self._build_components(GlobalListener, PartnerListener, UserListener)
|
||||||
|
|
||||||
|
partner = self.env['res.partner'].create({'name': 'test'})
|
||||||
|
events = partner._event(
|
||||||
|
'on_foo', collection=self.env['collection.base'],
|
||||||
|
components_registry=self.comp_registry
|
||||||
|
)
|
||||||
|
events.notify(partner, 'bar')
|
||||||
|
self.assertEqual('bar', partner.name)
|
||||||
|
self.assertEqual('bar', partner.ref)
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
* 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
|
||||||
|
|
@ -0,0 +1,201 @@
|
||||||
|
Changelog
|
||||||
|
---------
|
||||||
|
|
||||||
|
.. Future (?)
|
||||||
|
.. ~~~~~~~~~~
|
||||||
|
..
|
||||||
|
.. *
|
||||||
|
|
||||||
|
Future (?)
|
||||||
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
* Fix backend_to_m2o to extract id of the binding (https://github.com/OCA/connector/pull/194)
|
||||||
|
* Remove cancellation of jobs / active flag on jobs, now jobs are only set to
|
||||||
|
Done when NothingToDoJob is raised.
|
||||||
|
|
||||||
|
9.0.1.0.2 (2016-03-03)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Fix: adapt to upstream api change to obtain db connection (https://github.com/OCA/connector/pull/179)
|
||||||
|
|
||||||
|
9.0.1.0.1 (2016-03-03)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Enabled the JobRunner by default, with a default channels configuration of root:1
|
||||||
|
* Removed the old workers
|
||||||
|
* Removed the broken dbfilter support (https://github.com/OCA/connector/issues/58)
|
||||||
|
* Cleaned the methods that have been deprecated in version 3.x
|
||||||
|
|
||||||
|
|
||||||
|
8.0.3.3.0 (2016-02-29)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Allow to define seconds when raising a RetryableJobError (https://github.com/OCA/connector/pull/124)
|
||||||
|
* Allow to ignore the retry counter when raising a RetryableJobError (https://github.com/OCA/connector/pull/124)
|
||||||
|
* Add 'mock_job_delay_to_direct' to ease tests on jobs (https://github.com/OCA/connector/pull/123)
|
||||||
|
* Add helper function to acquire Posgres advisory locks (https://github.com/OCA/connector/pull/138, https://github.com/OCA/connector/pull/139)
|
||||||
|
* Improvement of 'is_module_installed' which now uses the registry instead of db + cache (https://github.com/OCA/connector/pull/130)
|
||||||
|
* Security: Prevent to unpickle globals which are not jobs or whitelisted types (https://github.com/OCA/connector/pull/170)
|
||||||
|
* Fix: Manage non-ascii Postgres errors (https://github.com/OCA/connector/pull/167)
|
||||||
|
* Fix: ignore dbfilter containing %d or %h (https://github.com/OCA/connector/pull/166)
|
||||||
|
* Fix: correctly obtain the list of database with odoo is started with --no-database-list (https://github.com/OCA/connector/pull/164)
|
||||||
|
* Fix: Set job back to 'pending' in case of exception (https://github.com/OCA/connector/pull/150, https://github.com/OCA/connector/pull/151, https://github.com/OCA/connector/pull/152, https://github.com/OCA/connector/pull/155)
|
||||||
|
* Fix: Clear environment caches and recomputations upon failures (https://github.com/OCA/connector/pull/131)
|
||||||
|
* Fix: when a job fails, inactive users are no longer added to its followers (https://github.com/OCA/connector/pull/137)
|
||||||
|
* Fix: Set job to failed after non-retryable OperationalError (https://github.com/OCA/connector/pull/132)
|
||||||
|
* Fix: wrong model in connector_base_product's views (https://github.com/OCA/connector/pull/119)
|
||||||
|
* Various documentation improvements
|
||||||
|
|
||||||
|
|
||||||
|
3.2.0 (2015-09-10)
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* method 'install_in_connector' is now deprecated (https://github.com/OCA/connector/pull/74)
|
||||||
|
* Add a retry pattern for jobs (https://github.com/OCA/connector/pull/75, https://github.com/OCA/connector/pull/92)
|
||||||
|
* Use custom connector environments and instantiate them with needed attributes (https://github.com/OCA/connector/pull/108)
|
||||||
|
* A new default implementation for the binder (https://github.com/OCA/connector/pull/76)
|
||||||
|
* Translations are now automatically synchronized from Transifex
|
||||||
|
* Mapper: add modifier to follow m2o relations with dot notation (https://github.com/OCA/connector/pull/94)
|
||||||
|
* Mapper: add 'changed_by_fields' which indicates which source fields will output data (https://github.com/OCA/connector/pull/73)
|
||||||
|
* Allow to assign a default channel on @job functions (https://github.com/OCA/connector/pull/71)
|
||||||
|
* Fix: connector-runner: manages retryable errors (https://github.com/OCA/connector/pull/87)
|
||||||
|
* Fix: connector-runner: logging error when a capacity is None (https://github.com/OCA/connector/pull/98)
|
||||||
|
* Fix: connector-runner: shows a wrong job result on retried jobs (https://github.com/OCA/connector/pull/101)
|
||||||
|
* Fix: add an index on queue_job.worker_id (https://github.com/OCA/connector/pull/89)
|
||||||
|
* Fix: Tests: common.DB is gone in 8.0 stable (https://github.com/OCA/connector/pull/79)
|
||||||
|
* Fix: connector-runner: graceful stop mechanism (https://github.com/OCA/connector/pull/69)
|
||||||
|
* Fix: connector-runner: Wrong arguments position in a log message (https://github.com/OCA/connector/pull/67)
|
||||||
|
|
||||||
|
|
||||||
|
3.1.0 (2015-05-15)
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* New jobs runner (details on https://github.com/OCA/connector/pull/52)
|
||||||
|
* French documentation (https://github.com/OCA/connector/pull/57)
|
||||||
|
* Add ConnectorSession.from_env() (https://github.com/OCA/connector/pull/66)
|
||||||
|
* Fix: missing indexes on jobs (https://github.com/OCA/connector/pull/65)
|
||||||
|
|
||||||
|
|
||||||
|
3.0.0 (2015-04-01)
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
/!\ Backwards incompatible changes inside.
|
||||||
|
|
||||||
|
* Add ``openerp.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:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
# On the current model
|
||||||
|
self.model.search([])
|
||||||
|
self.model.browse(ids)
|
||||||
|
# on another model
|
||||||
|
self.env['res.users'].search([])
|
||||||
|
self.env['res.users'].browse(ids)
|
||||||
|
|
||||||
|
* Deprecate the CRUD methods in ``Session``
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
# NO
|
||||||
|
self.session.search('res.partner', [])
|
||||||
|
self.session.browse('res.partner', ids)
|
||||||
|
|
||||||
|
# YES
|
||||||
|
self.env['res.partner'].search([])
|
||||||
|
self.env['res.partner'].browse(ids)
|
||||||
|
|
||||||
|
* ``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:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
with self.session.change_context(lang=lang_code):
|
||||||
|
...
|
||||||
|
|
||||||
|
* Add an argument on the Binders methods to return a browse record
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
binder.to_openerp(magento_id, browse=True)
|
||||||
|
|
||||||
|
* Shorten ``ConnectorUnit.get_binder_for_model`` to
|
||||||
|
``ConnectorUnit.binder_for``
|
||||||
|
* Shorten ``ConnectorUnit.get_connector_unit_for_model`` to
|
||||||
|
``ConnectorUnit.unit_for``
|
||||||
|
* Renamed ``Environment`` to ``ConnectorEnvironment`` to avoid
|
||||||
|
confusion with ``openerp.api.Environment``
|
||||||
|
* Renamed the class attribute ``ConnectorUnit.model_name`` to
|
||||||
|
``ConnectorUnit.for_model_name``.
|
||||||
|
* 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
|
||||||
|
* ``Session.change_context()`` now supports the same
|
||||||
|
argument/keyword arguments semantics than
|
||||||
|
``openerp.model.BaseModel.with_context()``.
|
||||||
|
* Renamed ``ExportSynchronizer`` to ``Exporter``
|
||||||
|
* Renamed ``ImportSynchronizer`` to ``Importer``
|
||||||
|
* Renamed ``DeleteSynchronizer`` to ``Deleter``
|
||||||
|
* ``Session.commit`` do not commit when tests are running
|
||||||
|
* Cleaned the methods that have been deprecated in version 2.x
|
||||||
|
|
||||||
|
|
||||||
|
2.2.0 (2014-05-26)
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* Job arguments can now contain unicode strings (thanks to Stéphane Bidoul) lp:1288187
|
||||||
|
* List view of the jobs improved
|
||||||
|
* Jobs now support multicompany (thanks to Laurent Mignon) https://lists.launchpad.net/openerp-connector-community/msg00253.html)
|
||||||
|
* 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.
|
||||||
|
|
||||||
|
2.1.1 (2014-02-06)
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* 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)
|
||||||
|
|
||||||
|
2.1.0 (2014-01-15 - warning: breaks compatibility)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* 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 OpenERP and displayed in the list of jobs.
|
||||||
|
* Fix: assignment of jobs to workers respect the priority of the jobs (lp:1252681)
|
||||||
|
* Pass a new parameter to listeners of 'on_record_create' ( vals: field values
|
||||||
|
of the new record, e.g {'field_name': field_value, ...})
|
||||||
|
* 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, ...}
|
||||||
|
* Add the possibility to use 'Modifiers' functions in the 'direct
|
||||||
|
mappings' (details in the documentation of the Mapper class)
|
||||||
|
* When a job a delayed, the job's UUID is returned by the delay() function
|
||||||
|
* Refactoring of mappers. Much details here:
|
||||||
|
https://code.launchpad.net/~openerp-connector-core-editors/openerp-connector/7.0-connector-mapper-refactor/+merge/194485
|
||||||
|
|
||||||
|
2.0.1 (2013-09-12)
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* 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
|
||||||
|
* Added a script `openerp-connector-worker` to start processes for Jobs Workers when running OpenERP is multiprocessing
|
||||||
|
* 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)
|
||||||
|
* Fix: do no fail to start when OpenERP has access to a not-OpenERP database (lp:1233388)
|
||||||
|
|
||||||
|
|
||||||
|
2.0.0
|
||||||
|
~~~~~
|
||||||
|
|
||||||
|
* First release
|
||||||
|
|
||||||
|
|
||||||
|
..
|
||||||
|
Model:
|
||||||
|
2.0.1 (date of release)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* change 1
|
||||||
|
* change 2
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||||
|
:alt: License
|
||||||
|
|
||||||
|
Connector
|
||||||
|
=========
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
Configuration and 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
|
||||||
|
|
||||||
|
|
||||||
|
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 smashing it by providing a detailed and welcomed feedback
|
||||||
|
`here <https://github.com/OCA/connector/issues/new?body=module:%20connector%0Aversion:%208.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
Read the `contributors list`_
|
||||||
|
|
||||||
|
.. _contributors list: ./AUTHORS
|
||||||
|
|
||||||
|
Maintainer
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. image:: http://odoo-community.org/logo.png
|
||||||
|
:alt: Odoo Community Association
|
||||||
|
:target: http://odoo-community.org
|
||||||
|
|
||||||
|
This module is maintained by the OCA.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
To contribute to this module, please visit http://odoo-community.org.
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import components
|
||||||
|
from . import models
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2013-2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
{'name': 'Connector',
|
||||||
|
'version': '11.0.1.0.0',
|
||||||
|
'author': 'Camptocamp,Openerp Connector Core Editors,'
|
||||||
|
'Odoo Community Association (OCA)',
|
||||||
|
'website': 'http://odoo-connector.com',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'category': 'Generic Modules',
|
||||||
|
'depends': ['mail',
|
||||||
|
'queue_job',
|
||||||
|
'component',
|
||||||
|
'component_event',
|
||||||
|
],
|
||||||
|
'data': ['security/connector_security.xml',
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'views/checkpoint_views.xml',
|
||||||
|
'views/connector_menu.xml',
|
||||||
|
'views/setting_views.xml',
|
||||||
|
'views/res_partner_views.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import core
|
||||||
|
from . import backend_adapter
|
||||||
|
from . import binder
|
||||||
|
from . import mapper
|
||||||
|
from . import listener
|
||||||
|
from . import synchronizer
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2013-2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.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'
|
||||||
|
|
||||||
|
|
||||||
|
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,140 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2013-2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.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
|
||||||
|
"""
|
||||||
|
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]
|
||||||
|
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 is 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:
|
||||||
|
raise ValueError(
|
||||||
|
'Cannot unwrap model %s, because it has no %s fields'
|
||||||
|
% (self.model._name, self._odoo_field))
|
||||||
|
return column.comodel_name
|
||||||
|
|
@ -0,0 +1,130 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.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``
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
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 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2013-2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.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,112 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2013-2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
Synchronizer
|
||||||
|
============
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from odoo.addons.component.core import AbstractComponent
|
||||||
|
|
||||||
|
|
||||||
|
class Synchronizer(AbstractComponent):
|
||||||
|
""" Base class for synchronizers """
|
||||||
|
|
||||||
|
_name = 'base.synchronizer'
|
||||||
|
_inherit = 'base.connector'
|
||||||
|
|
||||||
|
_base_mapper_usage = 'mapper'
|
||||||
|
_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 instanciation is delayed because some synchronisations 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 instanciation is delayed because some synchronisations 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 instanciation is delayed because some synchronisations 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'
|
||||||
|
_base_mapper_usage = 'export.mapper'
|
||||||
|
|
||||||
|
|
||||||
|
class Importer(AbstractComponent):
|
||||||
|
""" Synchronizer for importing data from a backend to Odoo """
|
||||||
|
|
||||||
|
_name = 'base.importer'
|
||||||
|
_inherit = 'base.synchronizer'
|
||||||
|
_usage = 'importer'
|
||||||
|
_base_mapper_usage = 'import.mapper'
|
||||||
|
|
||||||
|
|
||||||
|
class Deleter(AbstractComponent):
|
||||||
|
""" Synchronizer for deleting a record on the backend """
|
||||||
|
|
||||||
|
_name = 'base.deleter'
|
||||||
|
_inherit = 'base.synchronizer'
|
||||||
|
_usage = 'deleter'
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2013-2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.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
|
||||||
|
|
@ -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."
|
||||||
|
After Width: | Height: | Size: 375 KiB |
|
|
@ -0,0 +1,4 @@
|
||||||
|
.navbar span.navbar-text {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
BIN
ext/3rd-party-addons/connector/doc/_static/img/LogicSupply_Orange_260x80_transparent.png
vendored
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
|
@ -0,0 +1,14 @@
|
||||||
|
{% 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 %}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
{% 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>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{{ super() }}
|
||||||
|
{% endblock %}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
.DS_Store
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
######
|
||||||
|
Models
|
||||||
|
######
|
||||||
|
|
||||||
|
.. _api-backend-model:
|
||||||
|
|
||||||
|
*************
|
||||||
|
Backend Model
|
||||||
|
*************
|
||||||
|
|
||||||
|
|
||||||
|
.. autoclass:: connector.backend_model.ConnectorBackend
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
||||||
|
.. _api-binding-model:
|
||||||
|
|
||||||
|
*************
|
||||||
|
Binding Model
|
||||||
|
*************
|
||||||
|
|
||||||
|
.. autoclass:: connector.backend_model.ExternalBinding
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
########
|
||||||
|
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,91 @@
|
||||||
|
.. _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:
|
||||||
|
:show-inheritance:
|
||||||
|
:private-members:
|
||||||
|
|
||||||
|
|
||||||
|
********************
|
||||||
|
Connector Components
|
||||||
|
********************
|
||||||
|
|
||||||
|
.. automodule:: connector.components.binder
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
:private-members:
|
||||||
|
|
||||||
|
.. automodule:: connector.components.mapper
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
:private-members:
|
||||||
|
|
||||||
|
.. automodule:: connector.components.backend_adapter
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
:private-members:
|
||||||
|
|
||||||
|
.. automodule:: connector.components.synchronizer
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
:private-members:
|
||||||
|
|
||||||
|
.. automodule:: connector.components.listener
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
: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,37 @@
|
||||||
|
.. _api-event:
|
||||||
|
|
||||||
|
######
|
||||||
|
Events
|
||||||
|
######
|
||||||
|
|
||||||
|
Events is an implementation of an Observer pattern for Odoo.
|
||||||
|
|
||||||
|
|
||||||
|
**********
|
||||||
|
Components
|
||||||
|
**********
|
||||||
|
|
||||||
|
.. automodule:: odoo.addons.component_event.components.event
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
||||||
|
|
||||||
|
**********************
|
||||||
|
Odoo Models Extensions
|
||||||
|
**********************
|
||||||
|
|
||||||
|
.. automodule:: odoo.addons.component_event.models.base
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
||||||
|
|
||||||
|
*********
|
||||||
|
Internals
|
||||||
|
*********
|
||||||
|
|
||||||
|
.. automodule:: odoo.addons.component_event.core
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
Exceptions
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. automodule:: connector.exception
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
.. _api-queue:
|
||||||
|
|
||||||
|
#####
|
||||||
|
Queue
|
||||||
|
#####
|
||||||
|
|
||||||
|
***
|
||||||
|
Job
|
||||||
|
***
|
||||||
|
|
||||||
|
.. automodule:: odoo.addons.queue_job.job
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
||||||
|
******
|
||||||
|
Models
|
||||||
|
******
|
||||||
|
|
||||||
|
.. automodule:: odoo.addons.queue_job.models.base
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
||||||
|
.. automodule:: odoo.addons.queue_job.models.queue_job
|
||||||
|
:members:
|
||||||
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
@ -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):
|
||||||
|
|
@ -0,0 +1,381 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# 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 sys
|
||||||
|
import os
|
||||||
|
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-11.0'
|
||||||
|
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'
|
||||||
|
|
||||||
|
# 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,153 @@
|
||||||
|
.. _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: 4,5
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{'name': 'Coffee Connector',
|
||||||
|
'version': '1.0.0',
|
||||||
|
'category': 'Connector',
|
||||||
|
'depends': ['connector',
|
||||||
|
],
|
||||||
|
'author': 'Myself',
|
||||||
|
'license': 'AGPL-3',
|
||||||
|
'description': """
|
||||||
|
Coffee Connector
|
||||||
|
================
|
||||||
|
|
||||||
|
Connect Odoo to my coffee machine.
|
||||||
|
|
||||||
|
Features:
|
||||||
|
|
||||||
|
* Poor 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,255 @@
|
||||||
|
.. _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.
|
||||||
|
|
||||||
|
.. _checkpoint:
|
||||||
|
|
||||||
|
**********
|
||||||
|
Checkpoint
|
||||||
|
**********
|
||||||
|
|
||||||
|
A checkpoint is a record in the model `connector.checkpoint` linked to a
|
||||||
|
model and a record, the connectors can create a new one when the user
|
||||||
|
needs to review imported documents.
|
||||||
|
|
||||||
|
|
||||||
|
.. _connector_ecommerce: https://github.com/OCA/connector-ecommerce
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -0,0 +1,125 @@
|
||||||
|
.. 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** (`AGPL 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
|
||||||
|
.. _`AGPL version 3`: https://www.gnu.org/licenses/agpl-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/changes
|
||||||
|
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>`_
|
||||||
|
* 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** (`AGPL version 3`_): the full `source code is available "
|
||||||
|
"on GitHub`_"
|
||||||
|
msgstr ""
|
||||||
|
"**100% Open Source** (`AGPL 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 AGPL3 license."
|
||||||
|
msgstr "Ce travail est publié sous licence AGPL3."
|
||||||
|
|
||||||
|
#: ../../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)"
|
||||||
|
|
@ -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,9 @@
|
||||||
|
.. _changes:
|
||||||
|
|
||||||
|
#######
|
||||||
|
Changes
|
||||||
|
#######
|
||||||
|
|
||||||
|
.. include:: ../../CHANGES.rst
|
||||||
|
:start-line: 3
|
||||||
|
|
||||||
|
|
@ -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 AGPL3 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 AGPL, 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
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright 2012-2017 Camptocamp SA
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
||||||
|
|
||||||
|
from odoo.addons.queue_job.exception import (
|
||||||
|
RetryableJobError,
|
||||||
|
JobError,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# 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"""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: am\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Creado por"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Creado en"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Última actualización por"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Última actualización en"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: ar\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
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "إلغاء"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: ca\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr "Un %s necessita revisió."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Aplica"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr "Backends"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancel·la"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr "Punt de control"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr "Punts de control"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr "Revisió de punts de control"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr "Fes clic en el"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr "Configura el connector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr "Connector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr "Backend del Connector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr "Punts de control del connector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
msgstr "Configuració 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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr "Connectors"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Creat per"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Creat a"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr "Lligam extern (abstracte)"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr "Agrupa per..."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr "Importat de"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Darrear modificació per"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Darrera modificació el"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr "Darrera data de sincronització"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr "Model"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Nom"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr "Necessita Revisió"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr "Menú de Open Connector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr "Tasca de Cua"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr "ID Registre"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr "Registre relacionat"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr "Revisa Punts-Control"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr "Revisat"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr "Marcat com revisat"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Estat"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr "El registre ha estat importat des d'aquest backend"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr "Els seleccionats seran marcats com revisats. "
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr "Versió"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr "o "
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr "per verificar:"
|
||||||
|
|
@ -0,0 +1,560 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * connector
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo 10.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2013-05-01 13:36+0000\n"
|
||||||
|
"PO-Revision-Date: 2013-05-01 13:36+0000\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
|
||||||
|
#: view:connector.config.settings:0
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_queue_worker
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_queue_worker
|
||||||
|
msgid "Workers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint:0
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,date_done:0
|
||||||
|
msgid "Date Done"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_queue_job
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_queue_job
|
||||||
|
#: view:queue.job:0
|
||||||
|
#: field:queue.requeue.job,job_ids:0
|
||||||
|
#: field:queue.worker,job_ids:0
|
||||||
|
msgid "Jobs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.config.settings,module_multi_company:0
|
||||||
|
msgid "Manage multiple companies"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,message_unread:0
|
||||||
|
#: field:queue.job,message_unread:0
|
||||||
|
msgid "Unread Messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.worker,pid:0
|
||||||
|
msgid "PID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,user_id:0
|
||||||
|
msgid "User ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint.review,checkpoint_ids:0
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.requeue.job:0
|
||||||
|
msgid "The selected jobs will be requeued."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,func_string:0
|
||||||
|
msgid "Task"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.checkpoint,record:0
|
||||||
|
msgid "The record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.checkpoint,backend_id:0
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,message_ids:0
|
||||||
|
#: field:queue.job,message_ids:0
|
||||||
|
msgid "Messages"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
#: selection:queue.job,state:0
|
||||||
|
msgid "Enqueued"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.config.settings,module_portal_anonymous:0
|
||||||
|
msgid "Enable the public part of odoo, odoo becomes a public website."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,max_retries:0
|
||||||
|
msgid "Max. retries"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.checkpoint,message_unread:0
|
||||||
|
#: help:queue.job,message_unread:0
|
||||||
|
msgid "If checked new messages require your attention."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,uuid:0
|
||||||
|
#: field:queue.worker,uuid:0
|
||||||
|
msgid "UUID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.config.settings:0
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:external.binding,sync_date:0
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "<p>No record to check.</p>\n"
|
||||||
|
" <p> 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. </p>\n"
|
||||||
|
" <p>The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review.</p>\n"
|
||||||
|
" "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.checkpoint,message_summary:0
|
||||||
|
#: help:queue.job,message_summary:0
|
||||||
|
msgid "Holds the Chatter summary (number of messages, ...). This summary is directly in html format in order to be inserted in kanban views."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "connector.config.settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_worker
|
||||||
|
msgid "queue.worker"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.config.settings,module_magentoerpconnect:0
|
||||||
|
msgid "This installs the module magentoerpconnect."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,backend_id:0
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_requeue_job
|
||||||
|
msgid "Wizard to requeue a selection of jobs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,priority:0
|
||||||
|
msgid "Priority"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
#: selection:queue.job,state:0
|
||||||
|
msgid "Failed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,state:0
|
||||||
|
msgid "State"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.config.settings:0
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,message_follower_ids:0
|
||||||
|
#: field:queue.job,message_follower_ids:0
|
||||||
|
msgid "Followers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.config.settings,module_base_import:0
|
||||||
|
msgid "Allow users to import data from CSV files"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,worker_id:0
|
||||||
|
#: view:queue.worker:0
|
||||||
|
msgid "Worker"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint:0
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint.review:0
|
||||||
|
#: view:connector.config.settings:0
|
||||||
|
#: view:queue.requeue.job:0
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,func:0
|
||||||
|
msgid "Pickled Function"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_queue
|
||||||
|
msgid "Queue"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint.review:0
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,retry:0
|
||||||
|
msgid "Current try"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.config.settings,module_portal:0
|
||||||
|
msgid "Activate the customer portal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,date_created:0
|
||||||
|
msgid "Created Date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,record:0
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.worker,date_alive:0
|
||||||
|
msgid "Last Alive Check"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
msgid "Set to 'Done'"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_root
|
||||||
|
#: view:res.partner:0
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
#: field:queue.job,result:0
|
||||||
|
msgid "Result"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,date_started:0
|
||||||
|
#: field:queue.worker,date_start:0
|
||||||
|
msgid "Start Date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint.review:0
|
||||||
|
#: view:connector.config.settings:0
|
||||||
|
#: view:queue.requeue.job:0
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.config.settings,module_auth_oauth:0
|
||||||
|
msgid "Use external authentication providers, sign in with google, facebook, ..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "connector.backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint.review:0
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
#: selection:queue.job,state:0
|
||||||
|
msgid "Pending"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,state:0
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
#: selection:queue.job,state:0
|
||||||
|
msgid "Started"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_installed
|
||||||
|
msgid "connector.installed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,message_is_follower:0
|
||||||
|
#: field:queue.job,message_is_follower:0
|
||||||
|
msgid "Is a Follower"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.config.settings,module_share:0
|
||||||
|
msgid "Share or embbed any screen of odoo."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,active:0
|
||||||
|
msgid "Active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:queue.job,max_retries:0
|
||||||
|
msgid "The job will fail if the number of tries reach the max. retries.\n"
|
||||||
|
"Retries are infinite when empty."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint:0
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,message_summary:0
|
||||||
|
#: field:queue.job,message_summary:0
|
||||||
|
msgid "Summary"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
msgid "Exception Information"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.requeue.job:0
|
||||||
|
msgid "Requeue"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint:0
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.backend,version:0
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
#: selection:queue.job,state:0
|
||||||
|
msgid "Done"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint.review:0
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_requeue_job
|
||||||
|
#: view:queue.requeue.job:0
|
||||||
|
msgid "Requeue Jobs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,exc_info:0
|
||||||
|
msgid "Exception Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
msgid "Requeue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,name:0
|
||||||
|
msgid "Description"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
msgid "If the max. retries is 0, the number of retries is infinite."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,date_enqueued:0
|
||||||
|
msgid "Enqueue Time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.checkpoint,record_id:0
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.config.settings,module_multi_company:0
|
||||||
|
msgid "Work in multi-company environments, with appropriate security access between companies.\n"
|
||||||
|
" This installs the module multi_company."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.backend,name:0
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.config.settings,alias_domain:0
|
||||||
|
msgid "If you have setup a catch-all email domain redirected to the Odoo server, enter the domain name here."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.config.settings,alias_domain:0
|
||||||
|
msgid "Alias Domain"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:queue.job:0
|
||||||
|
msgid "Current try / max. retries"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.config.settings,module_magentoerpconnect:0
|
||||||
|
msgid "Synchronize with Magento"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint:0
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint:0
|
||||||
|
#: field:connector.checkpoint,model_id:0
|
||||||
|
#: field:queue.job,model_name:0
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.checkpoint,message_ids:0
|
||||||
|
#: help:queue.job,message_ids:0
|
||||||
|
msgid "Messages and communication history"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.config.settings,module_share:0
|
||||||
|
msgid "Allow documents sharing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:connector.config.settings,module_portal_anonymous:0
|
||||||
|
msgid "Activate the public portal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:res.groups,name:connector.group_connector_manager
|
||||||
|
msgid "Connector Manager"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:mail.message.subtype,name:connector.mt_job_failed
|
||||||
|
msgid "Job failed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: help:connector.config.settings,module_portal:0
|
||||||
|
msgid "Give your customers access to their documents."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: field:queue.job,eta:0
|
||||||
|
msgid "Execute only after"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: view:connector.checkpoint:0
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: cs\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Zrušit"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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: German (https://www.transifex.com/oca/teams/23907/de/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: de\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr "Ein %s erfordert Sichtung"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "anwenden"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr "Backends"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr "Checkpunkt"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr "Checkpunkte"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr "Checkpunkt Überprüfung"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr "Klicken Sie auf den"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr "Connector konfigurieren"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr "Connector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr "Connector Backend"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr "Connector Checkpunkt"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
msgstr "Connector-Einstellungen"
|
||||||
|
|
||||||
|
#. 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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr "Connector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Angelegt durch"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Angelegt am"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "Anzeigebezeichnung"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr "Externe Verbindung (abstrakt)"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr "Gruppieren nach ..."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr "Importiert von"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "Zuletzt aktualisiert am"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Zuletzt aktualisiert durch"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Zuletzt aktualisiert am"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr "Letztes Synchronisationsdatum"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr "Modell"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Name"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr "Bezeichnung des zu prüfenden Datensatzes"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr "Benötigt Prüfung"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr "Kein Datensatz zu prüfen."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr "Open Connector Menü"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr "Aufgabe in Warteschlange einreihen"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr "Datensatz"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr "Datensatz Nr."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr "Datensatz-Bezeichnung"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr "Zugehöriger Datensatz"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr "Überprüfungs Checkpunkte"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr "Überprüft"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr "Als Überprüft markieren"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Status"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr "Der Eintrag wurde von diesem Backend importiert."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr "Der zu prüfende Datensatz."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr "Die ausgewählten Checkpunkte werden als überprüft markiert."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr "Version"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr "oder"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr "es zu überprüfen:"
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: el_GR\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Δημιουργήθηκε από "
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Δημιουργήθηκε στις"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "Κωδικός"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Τελευταία ενημέρωση από"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Τελευταία ενημέρωση στις"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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 (https://www.transifex.com/oca/teams/23907/es/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: es\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Aplicar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr "Áreas de administración"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr "Punto Control"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr "Puntos de control"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr "Revisión de puntos de control"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr "Hcer clic en"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr "Configurar el conector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr "Conector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr "Punto de Control del Conector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. 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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr "Conectores"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Creado por"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Creado en"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "Nombre mostrado"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr "Unión Externa (abstracto)"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr "Agrupar Por..."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr "Importado de"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "Última modificación el"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Última actualización por"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Última actualización el"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr "Última fecha de sincronización"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr "Modelo"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Nombre"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr "Necesita Revisión"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr "Menú del Open Connector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr "Trabajo de Cola"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr "ID de Registro"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr "Puntos de Control de Revisión"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr "Revisado"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr "Marcar como Revisado"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Estado"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr "El registro ha sido importado de esta área de administación"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr "Los puntos de control seleccionados serán marcados como revisados"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr "Versión"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr "o"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr "para verificar:"
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: es_CR\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: es_EC\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: es_ES\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Creado por"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Creado en"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Última actualización por"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Última actualización en"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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 (Mexico) (https://www.transifex.com/oca/teams/23907/es_MX/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: es_MX\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr "El %s necesita revisión."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Aplicar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr "Configurar Conector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr "Conector"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr "Importado de"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr "Modelo"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Nombre"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr "Necesita Revisión"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr "Revisiado"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: es_VE\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: et\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Loobu"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: fi\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Luonut"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Luotu"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "Nimi"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "Viimeksi muokattu"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Viimeksi päivittänyt"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Viimeksi päivitetty"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,322 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * connector
|
||||||
|
#
|
||||||
|
# Translators:
|
||||||
|
# OCA Transbot <transbot@odoo-community.org>, 2017
|
||||||
|
# leemannd <denis.leemann@camptocamp.com>, 2017
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 10.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2017-06-14 20:10+0000\n"
|
||||||
|
"PO-Revision-Date: 2017-06-14 20:10+0000\n"
|
||||||
|
"Last-Translator: leemannd <denis.leemann@camptocamp.com>, 2017\n"
|
||||||
|
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: fr\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr "Un %s a besoin d'un contrôle."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Appliquer"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr "Backends"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Annuler"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr "Points de contrôle"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr "Points de contrôle"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr "Points de contrôle"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr "Cliquer sur le"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr "Configurer les connecteurs"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr "Connecteur"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr "Backend de connecteur"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr "Point de contrôle"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
msgstr "Configuration du 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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr "Connecteurs"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Créé par"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Créé le"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "Nom affiché"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr "Lien Externe (abstrait)"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr "Grouper par..."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr "Importé depuis"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "Dernière modification le"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Dernière mise à jour par"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Dernière mise à jour le"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr "Dernière date de synchronisation"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr "Modèle"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Nom"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr "Nom de l'enregistrement à contrôler"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr "Nécessite un contrôle"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr "Pas d'enregistrement à contrôler."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr "Ouvrir le menu du connecteur"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr "Queue de jobs"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr "Enregistrement"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr "ID de ressource"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr "Nom d'enregistrement"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr "Enregistrement lié"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr "Contrôler"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr "Contrôlé"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr "Passer en contrôlé"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "État"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr "La ressource a été importée depuis ce backend."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr "L'enregistrement à contrôler."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
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."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr "Version"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr "base"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr "ou"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr "pour le vérifier:"
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: gl\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Cancelar"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Creado por"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Creado en"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "ültima actualización por"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Última actualización en"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: hr\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
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Primjeni"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr "Grupiraj po..."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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 (Croatia) (https://www.transifex.com/oca/teams/23907/hr_HR/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: hr_HR\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
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr "%s potrebno je pregledati."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Primjeni"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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: Hungarian (https://www.transifex.com/oca/teams/23907/hu/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: hu\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Alkalmaz"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr "Háttérprogramok"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Mégsem"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr "Ellenőrzőpont"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr "Ellenörző pontok"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr "Ellenörzőpontok felülvizsgálata"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr "Kattintson erre"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr "Csatlakozó beállítása"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr "Csatoló"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr "Csatoló ellenörzőpont"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr "Csatolók"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr "Külső csatolás (absztract)"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr "Csoportosítás ezzel..."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr "Innen importált"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr "Utolsó szinkronizáció dátuma"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr "Modell, minta"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Név"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr "Felülvizsgálat szükséges"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr "Csatoló menü megnyitása"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr "Sorbanálló feladatok"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr "Rekordazonosító ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr "Ellenörzőpontok felülvizsgálata"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr "Leellenörzött"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr "Leellenörzöttnek jelölt"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr "Állapot"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr "Erről a végpontról importált rekord"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr "A kiválasztott ellenörzőpont leellenörzőttként nyilvántartva."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr "Verzió"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr "vagy"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr "ezt ellenőrizni:"
|
||||||
|
|
@ -0,0 +1,317 @@
|
||||||
|
# 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: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Language: it\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/checkpoint/checkpoint.py:119
|
||||||
|
#, python-format
|
||||||
|
msgid "A %s needs a review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Apply"
|
||||||
|
msgstr "Applica"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Backends"
|
||||||
|
msgstr "Backends"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Cancel"
|
||||||
|
msgstr "Annulla"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_checkpoint
|
||||||
|
msgid "Checkpoint"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_checkpoint_ids
|
||||||
|
msgid "Checkpoints"
|
||||||
|
msgstr "Checkpoints"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint_review
|
||||||
|
msgid "Checkpoints Review"
|
||||||
|
msgstr "Revisione Checkpoints"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "Click on the"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_config_settings
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "Configure Connector"
|
||||||
|
msgstr "Configura Connettore"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.module.category,name:connector.module_category_connector
|
||||||
|
#: model:ir.ui.menu,name:connector.menu_connector_config_settings
|
||||||
|
msgid "Connector"
|
||||||
|
msgstr "Connettore"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_backend
|
||||||
|
msgid "Connector Backend"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint
|
||||||
|
#: model:ir.model,name:connector.model_connector_checkpoint
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Connector Checkpoint"
|
||||||
|
msgstr "Checkpoint Connettore"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_connector_config_settings
|
||||||
|
msgid "Connector Configuration"
|
||||||
|
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:ir.ui.view,arch_db:connector.view_partner_connector_form
|
||||||
|
msgid "Connectors"
|
||||||
|
msgstr "Connettori"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_uid
|
||||||
|
msgid "Created by"
|
||||||
|
msgstr "Creato da"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_create_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_create_date
|
||||||
|
msgid "Created on"
|
||||||
|
msgstr "Creato il"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_display_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_display_name
|
||||||
|
msgid "Display Name"
|
||||||
|
msgstr "Nome da visualizzare"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_external_binding
|
||||||
|
msgid "External Binding (abstract)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Group By..."
|
||||||
|
msgstr "Raggruppa per..."
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_id
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_id
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "Imported from"
|
||||||
|
msgstr "Importato da"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings___last_update
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding___last_update
|
||||||
|
msgid "Last Modified on"
|
||||||
|
msgstr "Ultima modifica il"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_uid
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_uid
|
||||||
|
msgid "Last Updated by"
|
||||||
|
msgstr "Ultimo aggiornamento di"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_review_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_write_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_config_settings_write_date
|
||||||
|
msgid "Last Updated on"
|
||||||
|
msgstr "Ultimo aggiornamento il"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_test_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_external_binding_sync_date
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_no_inherits_binding_sync_date
|
||||||
|
msgid "Last synchronization date"
|
||||||
|
msgstr "Data ultima sincronizzazione"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_model_id
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Model"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_name
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_test_backend_name
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Name of the record to review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
msgid "Need Review"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid "No record to check."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.client,name:connector.action_client_connector_menu
|
||||||
|
msgid "Open Connector Menu"
|
||||||
|
msgstr "Apre il menù del Connettore"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_queue_job
|
||||||
|
msgid "Queue Job"
|
||||||
|
msgstr "Coda Job"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record
|
||||||
|
msgid "Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_record_id
|
||||||
|
msgid "Record ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_name
|
||||||
|
msgid "Record Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: code:addons/connector/models/queue_job.py:32
|
||||||
|
#, python-format
|
||||||
|
msgid "Related Record"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,name:connector.action_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Review Checkpoints"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: selection:connector.checkpoint,state:0
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_search
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_tree
|
||||||
|
msgid "Reviewed"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "Set as reviewed"
|
||||||
|
msgstr "Imposta come revisionato"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_checkpoint_state
|
||||||
|
msgid "Status"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
msgid ""
|
||||||
|
"The connectors list the new records to verify\n"
|
||||||
|
" based on their type. Only some need a manual\n"
|
||||||
|
" review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_backend_id
|
||||||
|
msgid "The record has been imported from this backend"
|
||||||
|
msgstr "Il record è stato importato da questo backend"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,help:connector.field_connector_checkpoint_record
|
||||||
|
msgid "The record to review."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
msgid "The selected checkpoints will be set as reviewed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model.fields,field_description:connector.field_connector_backend_version
|
||||||
|
msgid "Version"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.actions.act_window,help:connector.action_connector_checkpoint
|
||||||
|
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 ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.model,name:connector.model_base
|
||||||
|
msgid "base"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_review
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_config_settings
|
||||||
|
msgid "or"
|
||||||
|
msgstr "o"
|
||||||
|
|
||||||
|
#. module: connector
|
||||||
|
#: model:ir.ui.view,arch_db:connector.view_connector_checkpoint_form
|
||||||
|
msgid "to verify it:"
|
||||||
|
msgstr ""
|
||||||