sst02 mit connector
|  | @ -15,3 +15,12 @@ timezone = Europe/Vienna | |||
| 
 | ||||
| #dbfilter_test = ['.*',] | ||||
| 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 "" | ||||