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 "" | ||||||