Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,153 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Connectors.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Connectors.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/Connectors"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Connectors"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

View file

@ -0,0 +1,3 @@
.navbar span.navbar-text {
visibility: hidden;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,20 @@
{% extends "!layout.html" %} {%- block extrahead %} {{ super() }}
<script>
(function (i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function () {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-7628916-3", "odoo-connector.com");
ga("send", "pageview");
</script>
{% endblock %}

View file

@ -0,0 +1,28 @@
{% extends "!navbar.html" %} {% block navbartoc %}
<li class="dropdown">
<a
role="button"
id="dLabelTranslations"
data-toggle="dropdown"
data-target="#"
href="#"
>Translations<b class="caret"></b
></a>
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabelTranslations">
<li><a class="reference" href="http://odoo-connector.com">English</a></li>
<li><a class="reference" href="http://odoo-connector.com/fr">French</a></li>
</ul>
</li>
<li class="dropdown">
<a role="button" id="dLabelVersions" data-toggle="dropdown" data-target="#" href="#"
>Version<b class="caret"></b
></a>
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabeVersions">
<li><a class="reference" href="http://odoo-connector.com/8.0">8.0</a></li>
<li><a class="reference" href="http://odoo-connector.com/9.0">9.0</a></li>
<li><a class="reference" href="http://odoo-connector.com/10.0">10.0</a></li>
<li><a class="reference" href="http://odoo-connector.com/11.0">11.0</a></li>
<li><a class="reference" href="http://odoo-connector.com/12.0">12.0</a></li>
</ul>
</li>
{{ super() }} {% endblock %}

View file

@ -0,0 +1,3 @@
*.pyc
*.pyo
.DS_Store

View file

@ -0,0 +1,24 @@
######
Models
######
.. _api-backend-model:
*************
Backend Model
*************
.. autoclass:: connector.models.backend_model.ConnectorBackend
:members:
:undoc-members:
:show-inheritance:
.. _api-binding-model:
*************
Binding Model
*************
.. autoclass:: connector.models.backend_model.ExternalBinding
:show-inheritance:

View file

@ -0,0 +1,13 @@
########
Channels
########
This is the API documentation for the job channels and the
scheduling mechanisms of the job runner.
These classes are not intended for use by module developers.
.. automodule:: odoo.addons.queue_job.jobrunner.channels
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,165 @@
.. _api-component:
##########
Components
##########
Components are the blocks allowing to build a flexible and
well decoupled code. They are based on the ``component`` addon, which
can as well be used separately.
***************
Core Components
***************
.. automodule:: connector.components.core
:members:
:undoc-members:
:exclude-members: _module
:show-inheritance:
:private-members:
********************
Connector Components
********************
.. automodule:: connector.components.binder
:members:
:undoc-members:
:exclude-members: _module
:show-inheritance:
:private-members:
.. automodule:: connector.components.mapper
:members:
:member-order: groupwise
:exclude-members: MappingDefinition, Mapper, ImportMapper, ExportMapper, MapChild, ImportMapChild, ExportMapChild
:show-inheritance:
.. autoclass:: Mapper
:members:
:show-inheritance:
.. autoattribute:: _name
.. autoattribute:: _inherit
.. autoattribute:: _usage
.. autoclass:: ImportMapper
:members:
:show-inheritance:
.. autoattribute:: _name
.. autoattribute:: _inherit
.. autoattribute:: _usage
.. autoclass:: ExportMapper
:members:
:show-inheritance:
.. autoattribute:: _name
.. autoattribute:: _inherit
.. autoattribute:: _usage
.. autoclass:: MapChild
:members:
:show-inheritance:
.. autoattribute:: _name
.. autoattribute:: _inherit
.. autoattribute:: _usage
.. autoclass:: ImportMapChild
:members:
:show-inheritance:
.. autoattribute:: _name
.. autoattribute:: _inherit
.. autoattribute:: _usage
.. autoclass:: ExportMapChild
:members:
:show-inheritance:
.. autoattribute:: _name
.. autoattribute:: _inherit
.. autoattribute:: _usage
.. automodule:: connector.components.backend_adapter
:members:
:show-inheritance:
:exclude-members: BackendAdapter, CRUDAdapter
.. autoclass:: BackendAdapter
:members:
:show-inheritance:
.. autoattribute:: _name
.. autoattribute:: _inherit
.. autoattribute:: _usage
.. autoclass:: CRUDAdapter
:members:
:show-inheritance:
.. autoattribute:: _name
.. autoattribute:: _inherit
.. autoattribute:: _usage
.. automodule:: connector.components.synchronizer
:members:
:undoc-members:
:show-inheritance:
:exclude-members: _module
:private-members:
.. automodule:: connector.components.listener
:members:
:undoc-members:
:show-inheritance:
:exclude-members: _module
:private-members:
.. automodule:: connector.components.locker
:members:
:undoc-members:
:show-inheritance:
:exclude-members: _module
:private-members:
***************************
Components Collection Model
***************************
.. automodule:: odoo.addons.component.models.collection
:members:
:undoc-members:
:show-inheritance:
*********************
Components Exceptions
*********************
.. automodule:: odoo.addons.component.exception
:members:
:undoc-members:
:show-inheritance:
********************
Components Internals
********************
Low-level APIs of the Components.
.. automodule:: odoo.addons.component.core
:members:
:undoc-members:
:show-inheritance:
.. automodule:: odoo.addons.component.builder
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,26 @@
.. _api-event:
######
Events
######
Events is an implementation of an Observer pattern for Odoo.
**********
Components
**********
.. automodule:: odoo.addons.component_event.components.event
:members:
:show-inheritance:
**********************
Odoo Models Extensions
**********************
.. automodule:: odoo.addons.component_event.models.base
.. autoclass:: Base
:show-inheritance:

View file

@ -0,0 +1,7 @@
Exceptions
==========
.. automodule:: connector.exception
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,45 @@
.. _api-queue:
#####
Queue
#####
Models
******
.. automodule:: odoo.addons.queue_job.models.base
:members:
:undoc-members:
:show-inheritance:
.. automodule:: odoo.addons.queue_job.models.queue_job
.. autoclass:: QueueJob
.. autoattribute:: _name
.. autoattribute:: _inherit
***
Job
***
.. automodule:: odoo.addons.queue_job.job
Decorators
==========
.. autofunction:: job
.. autofunction:: related_action
Internals
=========
.. autoclass:: DelayableRecordset
:members:
:undoc-members:
:show-inheritance:
.. autoclass:: Job
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,27 @@
# This viminfo file was generated by Vim 7.4.
# You may edit it if you're careful!
# Value of 'encoding' when this file was written
*encoding=utf-8
# hlsearch on (H) or off (h):
~h
# Command Line History (newest to oldest):
:q!
# Search String History (newest to oldest):
# Expression History (newest to oldest):
# Input Line History (newest to oldest):
# Input Line History (newest to oldest):
# Registers:
# File marks:
# Jumplist (newest first):
# History of marks within files (newest to oldest):

View file

@ -0,0 +1,376 @@
#
# Connectors documentation build configuration file, created by
# sphinx-quickstart on Mon Feb 4 11:35:44 2013.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# flake8: noqa
import os
import sys
import sphinx_bootstrap_theme
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
# sys.path.insert(0, os.path.abspath('.'))
sys.path.append(os.path.abspath("_themes"))
MANIFEST_FILES = ["__manifest__.py", "__odoo__.py", "__openerp__.py"]
def is_module(path):
"""return False if the path doesn't contain an odoo module, and the full
path to the module manifest otherwise"""
if not os.path.isdir(path):
return False
files = os.listdir(path)
filtered = [x for x in files if x in (MANIFEST_FILES + ["__init__.py"])]
if len(filtered) == 2 and "__init__.py" in filtered:
return os.path.join(path, next(x for x in filtered if x != "__init__.py"))
else:
return False
def is_installable_module(path):
"""return False if the path doesn't contain an installable odoo module,
and the full path to the module manifest otherwise"""
manifest_path = is_module(path)
if manifest_path:
manifest = ast.literal_eval(open(manifest_path).read())
if manifest.get("installable", True):
return manifest_path
return False
if os.environ.get("TRAVIS_BUILD_DIR") and os.environ.get("VERSION"):
# build from travis
repos_home = os.environ["HOME"]
deps_path = os.path.join(repos_home, "dependencies")
odoo_folder = "odoo-" + os.environ.get("VERSION")
odoo_root = os.path.join(repos_home, odoo_folder)
build_path = os.environ["TRAVIS_BUILD_DIR"]
else:
# build from dev
odoo_root = os.path.abspath("../../../../src")
deps_path = os.path.abspath("../../..")
build_path = os.path.abspath("../..")
addons_paths = []
def add_path(*paths):
addons_paths.append(os.path.join(*paths))
add_path(odoo_root, "odoo", "addons")
add_path(odoo_root, "addons")
add_path(build_path)
deps_repos = [
repo
for repo in os.listdir(deps_path)
if os.path.isdir(os.path.join(deps_path, repo)) and not repo.startswith(".")
]
for repo in deps_repos:
add_path(deps_path, repo)
addons = [
x
for x in os.listdir(build_path)
if not x.startswith((".", "__")) and is_installable_module(x)
]
# sphinxodoo.ext.autodoc variables
sphinxodoo_root_path = odoo_root
sphinxodoo_addons = addons
sphinxodoo_addons_path = addons_paths
sys.path.append(build_path)
# -- General configuration -----------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.intersphinx",
"sphinx.ext.todo",
"sphinx.ext.viewcode",
"sphinxodoo.ext.autodoc",
]
todo_include_todos = False
# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]
# The suffix of source filenames.
source_suffix = ".rst"
# The encoding of source files.
# source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = "index"
# autodoc options
autodoc_member_order = "bysource"
# General information about the project.
project = "Connector"
copyright = "2013, Camptocamp SA" # pylint: disable=W0622
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = ""
# The full version, including alpha/beta/rc tags.
release = ""
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
language = "en"
locale_dirs = ["locale"]
gettext_compact = True
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ''
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ["_build"]
# The reST default role (used for this markup: `text`) to use for all documents.
# default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
# add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
# add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "sphinx"
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = "bootstrap"
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options = {
# Navigation bar title. (Default: ``project`` value)
"navbar_title": "Odoo Connector",
# Tab name for entire site. (Default: "Site")
"navbar_site_name": "Site",
# Global TOC depth for "site" navbar tab. (Default: 1)
# Switching to -1 shows all levels.
"globaltoc_depth": 2,
# Include hidden TOCs in Site navbar?
#
# Note: If this is "false", you cannot have mixed ``:hidden:`` and
# non-hidden ``toctree`` directives in the same page, or else the build
# will break.
#
# Values: "true" (default) or "false"
"globaltoc_includehidden": "true",
# HTML navbar class (Default: "navbar") to attach to <div> element.
# For black navbar, do "navbar navbar-inverse"
"navbar_class": "navbar",
# Fix navigation bar to top of page?
# Values: "true" (default) or "false"
"navbar_fixed_top": "true",
# Location of link to source.
# Options are "nav" (default), "footer" or anything else to exclude.
"source_link_position": "footer",
# Bootswatch (http://bootswatch.com/) theme.
#
# Options are nothing with "" (default) or the name of a valid theme
# such as "amelia" or "cosmo".
#
# Note that this is served off CDN, so won't be available offline.
"bootswatch_theme": "united",
}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
# html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
# html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
# html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}
# If false, no module index is generated.
# html_domain_indices = True
# If false, no index is generated.
# html_use_index = True
# If true, the index is split into individual pages for each letter.
# html_split_index = False
# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = "connector-doc"
# -- Options for LaTeX output --------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
("index", "Connector.tex", "Connector Documentation", "Camptocamp SA", "manual")
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
# latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# latex_use_parts = False
# If true, show page references after internal links.
# latex_show_pagerefs = False
# If true, show URL addresses after external links.
# latex_show_urls = False
# Documents to append as an appendix to all manuals.
# latex_appendices = []
# If false, no module index is generated.
# latex_domain_indices = True
# -- Options for manual page output --------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [("index", "connector", "Connector Documentation", ["Camptocamp SA"], 1)]
# If true, show URL addresses after external links.
# man_show_urls = False
# -- Options for Texinfo output ------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(
"index",
"Connector",
"Connector Documentation",
"Camptocamp SA",
"Connector",
"Framework for Odoo Connectors.",
"Miscellaneous",
)
]
# Documents to append as an appendix to all manuals.
# texinfo_appendices = []
# If false, no module index is generated.
# texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
# texinfo_show_urls = 'footnote'
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {
"http://docs.python.org/": None,
"odooweb": ("https://www.odoo.com/documentation/10.0/", None),
"odoodev": ("https://www.odoo.com/documentation/10.0/", None),
"connectormagento": ("http://www.odoo-magento-connector.com", None),
}

View file

@ -0,0 +1,152 @@
.. _bootstrap-connector:
########################
Boostrapping a connector
########################
We'll see the steps to bootstrap a new connector.
Besides that, you may want to use the existing connectors to have some
real implementation examples:
* `Odoo Magento Connector`_
* `Odoo Prestashop Connector`_
Be aware that the connector API has changed in Odoo 10.0, so the examples
might be outdated.
Some boilerplate is necessary, so this document will guide you through
some steps. Please also take a look on the :ref:`naming-convention`.
For the sake of the example, we'll imagine we have to synchronize
Odoo with a coffee machine.
*************
Odoo Manifest
*************
As we want to synchronize Odoo with a coffee machine, we'll name
our connector connector_coffee.
First, we need to create the Odoo addons itself, editing the
``connector_coffee/__manifest__.py`` manifest.
.. code-block:: python
:emphasize-lines: 3,4
{'name': 'Coffee Connector',
'version': '1.0.0',
'category': 'Connector',
'depends': ['connector',
],
'author': 'Myself',
'license': 'LGPL-3',
'description': """
Coffee Connector
================
Connect Odoo to my coffee machine.
Features:
* Pour a coffee when Odoo is busy for too long
""",
'data': [],
'installable': True,
}
Nothing special but 2 things to note:
* It depends from ``connector``. ``connector`` itself depends from
``queue_job``, ``component`` and ``component_event``. ``queue_job`` is in the
`OCA/queue`_ repository.
* The module category should be ``Connector``.
Of course, we also need to create the ``__init__.py`` file where we will
put the imports of our python modules.
.. _OCA/queue: https://github.com/OCA/queue
*************
Backend Model
*************
Reference: :ref:`api-backend-model`
We need to create a Backend representing the external service. Every record we
synchronize will be linked with a record of ``coffee.backend``. This backend
is our *collection* of Components.
The ``coffee.backend`` model is an ``_inherit`` of ``connector.backend``. In
``connector_coffee/models/coffee_binding.py``::
from odoo import api, fields, models
class CoffeeBackend(models.Model):
_name = 'coffee.backend'
_description = 'Coffee Backend'
_inherit = 'connector.backend'
location = fields.Char(string='Location')
username = fields.Char(string='Username')
password = fields.Char(string='Password')
Notes:
* We can other fields for the configuration of the connection or the
synchronizations.
****************
Abstract Binding
****************
Reference: :ref:`api-binding-model`
In order to share common features between all the bindings (see
:ref:`binding`), create an abstract binding model.
It can be as follows (in ``connector_coffee/models/coffee_binding.py``)::
from odoo import models, fields
class CoffeeBinding(models.AbstractModel):
_name = 'coffee.binding'
_inherit = 'external.binding'
_description = 'Coffee Binding (abstract)'
# odoo_id = odoo-side id must be declared in concrete model
backend_id = fields.Many2one(
comodel_name='coffee.backend',
string='Coffee Backend',
required=True,
ondelete='restrict',
)
coffee_id = fields.Integer(string='ID in the Coffee Machine',
index=True)
Notes:
* This model inherit from ``external.binding``
* Any number of fields or methods can be added
**********
Components
**********
Reference: :ref:`api-component`
We'll probably need to create synchronizers, mappers, backend adapters,
binders and maybe our own kind of components.
Their implementation can vary from a project to another. Have a look on the
`Odoo Magento Connector`_ and `Odoo Prestashop Connector`_ projects.
.. _`Odoo Magento Connector`: https://github.com/OCA/connector-magento
.. _`Odoo Prestashop Connector`: https://github.com/OCA/connector-prestashop

View file

@ -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`

View file

@ -0,0 +1,242 @@
.. _concepts:
##################
Connector Concepts
##################
The framework to develop connectors is decoupled in small pieces of
codes interacting together. Each of them can be used or not in an
implementation.
An example of implementation is the `Odoo Magento Connector`_.
This document describes them from a high-level point of view and gives
pointers to more concrete 'how-to' or small tutorials.
.. _`Odoo Magento Connector`: http://www.odoo-magento-connector.com
******
Events
******
Reference: :ref:`api-event`
Events are hooks in Odoo on which we can plug some actions. They are
based on an Observer pattern.
The same event can be shared across several connectors, easing their
implementation.
For instance, the module connector_ecommerce_ which extends the
framework with common e-commerce capabilities, adds its own events
common to e-commerce.
A connectors developer is mostly interested by:
* adding and listening to events (see :ref:`api-event`)
.. _jobs-queue:
**********
Jobs Queue
**********
Reference: :ref:`api-queue`
This feature is part of a standalone addon, but is a prerequisite for
the connector framework.
The module is ``queue_job`` in https://github.com/OCA/queue.
A connectors developer is mostly interested by:
* Delay a job (see the decorator :py:func:`~odoo.addons.queue_job.job.job`)
*******
Backend
*******
Reference: :ref:`api-backend-model`
The Backend Model is what represents the external service / system we
synchronize with. The name on the backend indicates what is the collection the
Components will be registered into. Put another way: every backend has its own
collection of Components.
It must use an ``_inherit`` on ``connector.backend``.
``connector.backend`` inherits
:class:`odoo.addons.component.models.collection.Collection` which has a
:meth:`odoo.addons.component.models.collection.Collection.work_on` that will be
used as entrypoint for the component system. This method returns a
:class:`~odoo.addons.component.core.WorkContext`
***********
WorkContext
***********
Reference: :class:`~odoo.addons.component.core.WorkContext`
A :class:`~odoo.addons.component.core.WorkContext` is the work environment or
context that will be passed transversally through all the components. This is
also the entrypoint to the component system.
A connectors developer is mostly interested by:
* Get a Component from a WorkContext (:py:meth:`~odoo.addons.component.core.WorkContext.component`)
*********
Component
*********
Reference: :ref:`api-component`
:py:class:`~odoo.addons.component.core.Component` are pluggable classes used
for the synchronizations with the external systems (or anything!)
The Components system has been extracted in a standalone addon (``component``),
which means it can really be used in a totally different way.
The connector defines some base components, which you can find below. Note
that you can and are encouraged to define your own Components as well.
Mappings
========
The base class is :py:class:`connector.components.mapper.Mapper`.
In your components, you probably want to inherit from:
* ``_inherit = 'base.import.mapper'``
* ``_inherit = 'base.export.mapper'``
And the usages for the lookups are:
* ``import.mapper``
* ``export.mapper``
A mapping translates an external record to an Odoo record and
conversely.
It supports:
direct mappings
Fields *a* is written in field *b*.
method mappings
A method is used to convert one or many fields to one or many
fields, with transformation.
It can be filtered, for example only applied when the record is
created or when the source fields are modified.
submapping
a sub-record (lines of a sale order) is converted using another
Mapper
See the documentation of the class for more details.
Synchronizers
=============
The base class is :py:class:`connector.components.synchronizer.Synchronizer`.
In your components, you probably want to inherit from:
* ``_inherit = 'base.importer'``
* ``_inherit = 'base.exporter'``
And the usages for the lookups are:
* ``importer``
* ``exporter``
However, in your implementation, it is advised to use more refined usages such
as:
* ``record.importer``
* ``record.exporter``
* ``batch.importer``
* ``batch.exporter``
* ..
A synchronizer orchestrates a synchronization with a backend. It can be a
record's import or export, a deletion of something, or anything else. For
instance, it will use the mappings to convert the data between both systems,
the backend adapters to read or write data on the backend and the binders to
create the link between them.
Backend Adapters
================
The base class is
:py:class:`connector.components.backend_adapter.BackendAdapter`.
In your components, you probably want to inherit from:
* ``_inherit = 'base.backend.adapter'``
* ``_inherit = 'base.backend.adapter.crud'``
And the usages for the lookups are:
* ``backend.adapter``
An external adapter has a common interface to speak with the backend.
It translates the basic orders (search, read, write) to the protocol
used by the backend.
Binders
=======
The base class is
:py:class:`connector.components.binder.Binder`.
In your components, you probably want to inherit from:
* ``_inherit = 'base.binder'``
And the usages for the lookups are:
* ``binder``
Binders are components that know how to find the external ID for an
Odoo ID, how to find the Odoo ID for an external ID and how to
create the binding between them. A default implementation is
available and can be inherited if needed.
Listeners
=========
The base class is
:py:class:`connector.components.listener.ConnectorListener`.
In your components, you probably want to inherit from:
* ``_inherit = 'base.connector.listener'``
This is where you will register your event listeners.
See :mod:`addons.component_event.components.event`.
.. _binding:
********
Bindings
********
Reference: :ref:`api-binding-model`
A binding represents the link of a record between Odoo and a backend.
The proposed implementation for the connectors widely use the
`_inherits` capabilities.
Say we import a customer from *Magento*.
We create a `magento.res.partner` model, which `_inherits`
`res.partner`.
This model, called a *binding* model, knows the ID of the partner in
Odoo, the ID in Magento and the relation to the backend model.
It also stores all the necessary metadata related to this customer
coming from Magento.

View file

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

View file

@ -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.

View file

@ -0,0 +1,126 @@
.. Connectors documentation master file, created by
sphinx-quickstart on Mon Feb 4 11:35:44 2013.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
##############
Odoo Connector
##############
Odoo Connector is a powerful framework to develop any kind of
bi-directional connector between `Odoo`_ (Open Source ERP) and any other
software or service.
This Odoo add-on has a modular and generic core, with the
ability to be extended with additional modules for new features or
customizations.
The development of Odoo Connector has been started by `Camptocamp`_ and is now
maintained by `Camptocamp`_, `Akretion`_, `Acsone`_ and several :ref:`contributors`.
It got a major overhaul in 2017 (Odoo 10.0). A :ref:`migration-guide` is
available.
*Subscribe to the* `project's mailing list (name: Connectors)`_
*Learn how to* :ref:`contribute`
*************
Core Features
*************
* **100% Open Source** (`LGPL version 3`_): the full `source code is available
on GitHub`_
* Not only designed to connect Odoo with e-commerce backends,
rather it is **adaptable** to connect Odoo with any type of service.
* **Robust for high volumetries** and **easy to monitor** thanks to a :ref:`jobs-queue`.
* A flexible set of building blocks, it does not force to a certain
implementation but leaves the final choice to the
developer on how to use the proposed pieces.
* See a :ref:`code-overview` with examples of code
.. _Odoo: https://www.odoo.com
.. _Camptocamp: https://www.camptocamp.com
.. _Akretion: http://www.akretion.com
.. _Acsone: https://www.acsone.eu
.. _`source code is available on GitHub`: https://github.com/OCA/connector
.. _`LGPL version 3`: https://www.gnu.org/licenses/lgpl-3.0.html
.. _`project's mailing list (name: Connectors)`: https://odoo-community.org/groups
*****************
Developer's guide
*****************
.. toctree::
:maxdepth: 2
guides/migration_guide.rst
guides/code_overview.rst
guides/concepts.rst
guides/bootstrap_connector.rst
guides/jobrunner.rst
API Reference
=============
.. toctree::
:maxdepth: 1
api/api_components.rst
api/api_backend.rst
api/api_event.rst
api/api_queue.rst
api/api_exception.rst
api/api_channels.rst
*******
Project
*******
.. toctree::
:maxdepth: 1
project/contribute
project/contributors
project/license
project/roadmap
*********************************
Connectors based on the framework
*********************************
* `Magento Connector <http://www.odoo-magento-connector.com>`_
* `Prestashop Connector <https://github.com/OCA/connector-prestashop>`_
* `Search Engine Connector <https://github.com/akretion/connector-search-engine>`_
* `CMIS <https://github.com/OCA/connector-cmis>`_
* `Odoo Asynchronous import module <https://github.com/OCA/connector-interfaces/tree/8.0/base_import_async>`_
* `Salesforce Connector <https://github.com/OCA/connector-salesforce>`_
* `JIRA Connector <https://github.com/camptocamp/connector-jira>`_
* `Google Spreadsheet Connector <https://github.com/akretion/connector-google-spreadsheet>`_
* `Connector Exchange <https://github.com/camptocamp/connector-exchange/tree/10.0>`_
* `Infor Connector <https://github.com/OCA/connector-infor>`_
* `Voicent Connector <https://github.com/ursais/osi-addons>`_
* Develop easily and rapidly your own connector based on this powerful
framework and list your project on this page! Examples:
* E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce connector, Odoo Spree connector, Odoo Ebay connector, Odoo Amazon connector…
* CMS: Odoo Wordpress connector…
* CRM: Odoo SugarCRM connector, Odoo Zabbix connector…
* Project Management: Odoo Redmine connector…
* Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…
*****
Talks
*****
* `A jobs queue for processing tasks asynchronously. Leonardo Pistone & Guewen Baconnier (2015) <https://fr.slideshare.net/camptocamp/a-jobs-queue-for-processing-tasks-asynchronously>`_
* `E-commerce: the new Magento - OpenERP Connector: a generic connector to any apps. Luc Maurer & Guewen Baconnier, Camptocamp (2013) <https://fr.slideshare.net/openobject/ecommerce-the-new-magento-open-erp-connector-a-generic-connector-to-any-apps-luc-maurer-guewen-baconnier-camptocamp>`_
******************
Indices and tables
******************
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,281 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Connector\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-15 22:28+0300\n"
"PO-Revision-Date: 2015-05-05 11:52+0100\n"
"Last-Translator: Guewen Baconnier <guewen.baconnier@camptocamp.com>\n"
"Language-Team: fr <LL@li.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\n"
#: ../../index.rst:21
msgid "*Subscribe to the* `project's mailing list`_"
msgstr "*Inscrivez-vous à la* `project's mailing list`_ *(en anglais)*"
#: ../../index.rst:23
msgid "*Learn how to* :ref:`contribute`"
msgstr "*Découvrez comment* :ref:`contribute`"
#: ../../index.rst:27
msgid "Core Features"
msgstr "Fonctionnalités de base"
#: ../../index.rst:29
msgid ""
"**100% Open Source** (`LGPL version 3`_): the full `source code is available "
"on GitHub`_"
msgstr ""
"**100% Open Source** (`LGPL version 3`_): la totalité du `code source est "
"disponible sur GitHub`_"
#: ../../index.rst:33
msgid ""
"**Robust for high volumetries** and **easy to monitor** thanks to a :ref:"
"`jobs-queue`."
msgstr ""
"**Robuste pour des volumétries importantes** et **faciler à surveiller** "
"grâce à la :ref:`jobs-queue`."
#: ../../index.rst:34
msgid ""
"A flexible set of building blocks, it does not force to a certain "
"implementation but leaves the final choice to the developer on how to use "
"the proposed pieces."
msgstr ""
"Un ensemble flexible de blocs de construction : il n'oblige pas à respecter "
"une implémentation particulière mais laisse le choix final au développeur "
"sur la manière d'utiliser les composants."
#: ../../index.rst:37
msgid "See a :ref:`code-overview` with examples of code"
msgstr "Voir le :ref:`code-overview` et les exemples de code"
#: ../../index.rst:48
msgid "Connectors based on the framework"
msgstr "Connecteurs basés sur le framework"
#: ../../index.rst:50
msgid "`Magento Connector <http://www.odoo-magento-connector.com>`_"
msgstr "`Connecteur Magento <http://www.odoo-magento-connector.com>`_"
#: ../../index.rst:51
msgid "`Prestashop Connector <https://github.com/OCA/connector-prestashop>`_"
msgstr "`Connecteur Prestashop <https://github.com/OCA/connector-prestashop>`_"
#: ../../index.rst:52
msgid "`solerp (Solr Connector) <https://github.com/akretion/solerp>`_"
msgstr "`solerp (Connecteur Solr) <https://github.com/akretion/solerp>`_"
#: ../../index.rst:54
msgid "`CMIS <https://github.com/OCA/connector-cmis>`_"
msgstr "`Connecteur CMIS <https://github.com/OCA/connector-cmis>`_"
#: ../../index.rst:58
msgid ""
"Develop easily and rapidly your own connector based on this powerful "
"framework and list your project on this page! Examples:"
msgstr ""
"Développez facilement et rapidement votre propre connecteur basé sur ce "
"puissant framework et ajoutez votre projet sur cette page ! Exemples :"
#: ../../index.rst:69
msgid "Overview"
msgstr "Présentation"
#: ../../index.rst:79
msgid "Top financial contributors"
msgstr "Principaux contributeurs financiers"
#: ../../index.rst:90
msgid "*See all the project's* :ref:`financial-contributors`."
msgstr "*Voir tous les* :ref:`financial-contributors` *du projet*."
#: ../../index.rst:94
msgid "Project"
msgstr "Projet"
#: ../../index.rst:107
msgid "Developer's guide"
msgstr "Guide du développeur"
#: ../../index.rst:118
msgid "API Reference"
msgstr "Référence de l'API"
#: ../../index.rst:136
msgid "Indices and tables"
msgstr "Index et tables"
#: ../../index.rst:138
msgid ":ref:`genindex`"
msgstr ":ref:`genindex`"
#: ../../index.rst:139
msgid ":ref:`modindex`"
msgstr ":ref:`modindex`"
#: ../../index.rst:140
msgid ":ref:`search`"
msgstr ":ref:`search`"
#: ../../index.rst:8
msgid "Odoo Connector"
msgstr "Odoo Connector"
#: ../../index.rst:10
msgid ""
"Odoo Connector is a powerful framework to develop any kind of bi-directional "
"connector between `Odoo`_ (Open Source ERP) and any other software or "
"service."
msgstr ""
"`Odoo Connector` est un puissant framework de développement de connecteur bi-"
"directionnel entre `Odoo`_ (ERP Open Source) et tout autre logiciel ou "
"service."
#: ../../index.rst:14
msgid ""
"This Odoo add-on has a modular and generic core, with the ability to be "
"extended with additional modules for new features or customizations."
msgstr ""
"Ce module Odoo a un cœur modulaire et générique, capable d'être lui-même "
"étendu grâce à des modules additionnels, pour ajouter des nouvelles "
"fonctions ou des personnalisations."
#: ../../index.rst:18
msgid ""
"The development of Odoo Connector has been started by `Camptocamp`_ and is "
"now maintained by `Camptocamp`_, `Akretion`_ and several :ref:`contributors`."
msgstr ""
"Le développement du Connecteur Odoo a été démarré par `Camptocamp`_ et est "
"maintenu par `Camptocamp`_, `Akretion`_ et d'autres :ref:`contributors`."
#: ../../index.rst:31
msgid ""
"Not only designed to connect Odoo with e-commerce backends, rather it is "
"**adaptable** to connect Odoo with any type of service."
msgstr ""
"Pas uniquement conçu pour connecter Odoo à des backend e-commerce, mais "
"**adaptable** pour connecter Odoo à tout type de service."
#: ../../index.rst:53
msgid ""
"`Odoo Multi Company <http://www.odoo.net.cn/new-intercompany-process-"
"module/>`_"
msgstr ""
"`Odoo Multi-sociétés <http://www.odoo.net.cn/new-intercompany-process-"
"module/>`_"
#: ../../index.rst:55
msgid ""
"`Odoo Asynchronous import module <https://github.com/OCA/connector-"
"interfaces/tree/8.0/base_import_async>`_"
msgstr ""
"`Module Odoo d'import asynchrone <https://github.com/OCA/connector-"
"interfaces/tree/8.0/base_import_async>`_"
#: ../../index.rst:56
msgid "`Salesforce Connector <https://github.com/OCA/connector-salesforce>`_"
msgstr "`Connecteur Salesforce <https://github.com/OCA/connector-salesforce>`_"
#: ../../index.rst:57
msgid ""
"`Google Spreadsheet Connector <https://github.com/akretion/connector-google-"
"spreadsheet>`_"
msgstr ""
"`Connecteur Google Spreadsheet <https://github.com/akretion/connector-google-"
"spreadsheet>`_"
#: ../../index.rst:61
msgid ""
"E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce connector, Odoo "
"Spree connector, Odoo Ebay connector, Odoo Amazon connector…"
msgstr ""
"E-Commerce : connecteur Odoo OsCommerce, connecteur Odoo Drupal Commerce, "
"connecteur Odoo Spree, connecteur Odoo Ebay, connecteur Odoo Amazon…"
#: ../../index.rst:62
msgid "CMS: Odoo Wordpress connector…"
msgstr "CMS : connecteur Odoo Wordpress…"
#: ../../index.rst:63
msgid "CRM: Odoo SugarCRM connector, Odoo Zabbix connector…"
msgstr "CRM : connecteur Odoo SugarCRM, connecteur Odoo Zabbix…"
#: ../../index.rst:64
msgid "Project Management: Odoo Redmine connector…"
msgstr "Gestion de projets : connecteur Odoo Redmine…"
#: ../../index.rst:65
msgid "Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…"
msgstr "Ticketing : connecteur Odoo Request Tracker, connecteur Odoo GLPI…"
#~ msgid "Odoo Connector"
#~ msgstr "Odoo Connector"
#~ msgid ""
#~ "Odoo Connector is a powerful framework to develop any kind of bi-"
#~ "directional connector between `Odoo`_ (Open Source ERP) and any other "
#~ "software or service."
#~ msgstr ""
#~ "`Odoo Connector` est un puissant framework de développement de "
#~ "connecteur bi-directionnel entre `Odoo`_ (ERP Open Source) et tout "
#~ "autre logiciel ou service."
#~ msgid ""
#~ "This Odoo add-on has a modular and generic core, with the ability to "
#~ "be extended with additional modules for new features or customizations."
#~ msgstr ""
#~ "Ce module Odoo a un cœur modulaire et générique, capable d'être lui-"
#~ "même étendu grâce à des modules additionnels, pour ajouter des nouvelles "
#~ "fonctions ou des personnalisations."
#~ msgid ""
#~ "The development of Odoo Connector has been started by `Camptocamp`_ "
#~ "and is now maintained by `Camptocamp`_, `Akretion`_ and several :ref:"
#~ "`contributors`."
#~ msgstr ""
#~ "Le développement du Connecteur Odoo a été démarré par `Camptocamp`_ et "
#~ "est maintenu par `Camptocamp`_, `Akretion`_ et d'autres :ref:"
#~ "`contributors`."
#~ msgid ""
#~ "Not only designed to connect Odoo with e-commerce backends, rather it "
#~ "is **adaptable** to connect Odoo with any type of service."
#~ msgstr ""
#~ "Pas uniquement conçu pour connecter Odoo à des backend e-commerce, "
#~ "mais **adaptable** pour connecter Odoo à tout type de service."
#~ msgid ""
#~ "`Odoo Multi Company <http://www.odoo.net.cn/new-intercompany-"
#~ "process-module/>`_"
#~ msgstr ""
#~ "`Odoo Multi-sociétés <http://www.odoo.net.cn/new-intercompany-"
#~ "process-module/>`_"
#~ msgid ""
#~ "E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce "
#~ "connector, Odoo Spree connector, Odoo Ebay connector, Odoo "
#~ "Amazon connector…"
#~ msgstr ""
#~ "E-Commerce : connecteur Odoo OsCommerce, connecteur Odoo Drupal "
#~ "Commerce, connecteur Odoo Spree, connecteur Odoo Ebay, connecteur "
#~ "Odoo Amazon…"
#~ msgid "CMS: Odoo Wordpress connector…"
#~ msgstr "CMS : connecteur Odoo Wordpress…"
#~ msgid "CRM: Odoo SugarCRM connector, Odoo Zabbix connector…"
#~ msgstr "CRM : connecteur Odoo SugarCRM, connecteur Odoo Zabbix…"
#~ msgid "Project Management: Odoo Redmine connector…"
#~ msgstr "Gestion de projets : connecteur Odoo Redmine…"
#~ msgid ""
#~ "Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…"
#~ msgstr ""
#~ "Ticketing : connecteur Odoo Request Tracker, connecteur Odoo GLPI…"

View file

@ -0,0 +1,777 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Connector\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-04-15 22:28+0300\n"
"PO-Revision-Date: 2015-05-05 11:48+0100\n"
"Last-Translator: Guewen Baconnier <guewen.baconnier@camptocamp.com>\n"
"Language-Team: fr <LL@li.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.4\n"
#: ../../project/changes.rst:5
msgid "Changes"
msgstr "Changements"
#: ../../../CHANGES.rst:2
msgid "3.0.0 (2015-04-01)"
msgstr "3.0.0 (2015-04-01)"
#: ../../../CHANGES.rst:4
msgid "/!\\ Backwards incompatible changes inside."
msgstr "Attention : changements non rétro-compatibles dans cette version."
#: ../../../CHANGES.rst:6
msgid ""
"Add ``odoo.api.Environment`` in ``Session`` It is accessible in ``self."
"env`` in ``Session`` and all ``ConnectorUnit`` instances. Also in "
"``ConnectorUnit``, ``model`` returns the current (new api!) model:"
msgstr ""
"Ajout de ``odoo.api.Environment`` dans ``Session`` Accessible via ``self."
"env`` dans ``Session`` et toutes les instances ``ConnectorUnit``. Également "
"dans ``ConnectorUnit``, ``model`` renvoie le modèle en cours (nouvelle "
"API!) :"
#: ../../../CHANGES.rst:20
msgid "Deprecate the CRUD methods in ``Session``"
msgstr "Dépréciation des méthodes CRUD dans ``Session``"
#: ../../../CHANGES.rst:32
msgid ""
"``Environment.set_lang()`` is removed. It was modifying the context in place "
"which is not possible with the new frozendict context. It should be done "
"with:"
msgstr ""
"``Environment.set_lang()`` est supprimé. Il modifiait le contexte sur place "
"ce qui n'est pas possible avec les nouveaux context en frozendict. Doit être "
"fait avec:"
#: ../../../CHANGES.rst:41
msgid "Add an argument on the Binders methods to return a browse record"
msgstr ""
"Ajout d'un argument sur les méthodes des Binders pour renvoyer un `browse "
"record`"
#: ../../../CHANGES.rst:47
msgid ""
"Shorten ``ConnectorUnit.get_binder_for_model`` to ``ConnectorUnit."
"binder_for``"
msgstr ""
"Renommage de ``ConnectorUnit.get_binder_for_model`` vers ``ConnectorUnit."
"binder_for``"
#: ../../../CHANGES.rst:49
msgid ""
"Shorten ``ConnectorUnit.get_connector_unit_for_model`` to ``ConnectorUnit."
"unit_for``"
msgstr ""
"Renommage de ``ConnectorUnit.get_connector_unit_for_model`` vers "
"``ConnectorUnit.unit_for``"
#: ../../../CHANGES.rst:51
msgid ""
"Renamed ``Environment`` to ``ConnectorEnvironment`` to avoid confusion with "
"``odoo.api.Environment``"
msgstr ""
"Renommage d'``Environment`` vers ``ConnectorEnvironment`` pour éviter la "
"confusion avec ``odoo.api.Environment``"
#: ../../../CHANGES.rst:53
msgid ""
"Renamed the class attribute ``ConnectorUnit.model_name`` to ``ConnectorUnit."
"for_model_name``."
msgstr ""
"Renommage de l'attribut de classe ``ConnectorUnit.model_name`` vers "
"``ConnectorUnit.for_model_name``."
#: ../../../CHANGES.rst:55
msgid ""
"Added ``_base_binder``, ``_base_mapper``, ``_base_backend_adapter`` in the "
"synchronizers (Importer, Exporter) so it is no longer required to override "
"the ``binder``, ``mapper``, ``backend_adapter`` property methods"
msgstr ""
"Ajout de ``_base_binder``, ``_base_mapper``, ``_base_backend_adapter`` dans "
"les synchroniseurs (Importer, Exporter) donc ce n'est plus nécessaire pour "
"surcharger les méthodes property ``binder``, ``mapper``, ``backend_adapter``"
#: ../../../CHANGES.rst:59
msgid ""
"``Session.change_context()`` now supports the same argument/keyword "
"arguments semantics than ``odoo.model.BaseModel.with_context()``."
msgstr ""
"``Session.change_context()`` prend maintenant en charge la même sémantique "
"d'arguments que ``odoo.model.BaseModel.with_context()``."
#: ../../../CHANGES.rst:62
msgid "Renamed ``ExportSynchronizer`` to ``Exporter``"
msgstr "Renommage de ``ExportSynchronizer`` vers ``Exporter``"
#: ../../../CHANGES.rst:63
msgid "Renamed ``ImportSynchronizer`` to ``Importer``"
msgstr "Renommage de ``ImportSynchronizer`` vers ``Importer``"
#: ../../../CHANGES.rst:64
msgid "Renamed ``DeleteSynchronizer`` to ``Deleter``"
msgstr "Renommage de ``DeleteSynchronizer`` vers ``Deleter``"
#: ../../../CHANGES.rst:65
msgid "``Session.commit`` do not commit when tests are running"
msgstr "``Session.commit`` ne commite pas pendant les tests"
#: ../../../CHANGES.rst:66
msgid "Cleaned the methods that have been deprecated in version 2.x"
msgstr "Nettoyage des méthodes dépréciées en version 2.x"
#: ../../../CHANGES.rst:70
msgid "2.2.0 (2014-05-26)"
msgstr "2.2.0 (2014-05-26)"
#: ../../../CHANGES.rst:72
msgid ""
"Job arguments can now contain unicode strings (thanks to Stéphane Bidoul) "
"lp:1288187"
msgstr ""
"Les arguments d'un Job peuvent maintenant contenir des chaînes unicode "
"(merci à Stéphane Bidoul) lp:1288187"
#: ../../../CHANGES.rst:73
msgid "List view of the jobs improved"
msgstr "Amélioration de la vue en liste des jobs"
#: ../../../CHANGES.rst:74
msgid ""
"Jobs now support multicompany (thanks to Laurent Mignon) https://lists."
"launchpad.net/odoo-connector-community/msg00253.html)"
msgstr ""
"Les jobs fonctionnement maintenant en multi-sociétés (merci à Laurent "
"Mignon) https://lists.launchpad.net/odoo-connector-community/msg00253."
"html)"
#: ../../../CHANGES.rst:75
msgid ""
"An action can be assigned to a job. The action is called with a button on "
"the job and could be something like open a form view or an url."
msgstr ""
"Une action peut être affectée à un job. L'action est appelée via un bouton "
"sur le job et peut appeler une ouverture de formulaire ou une URL."
#: ../../../CHANGES.rst:78
msgid "2.1.1 (2014-02-06)"
msgstr "2.1.1 (2014-02-06)"
#: ../../../CHANGES.rst:80
msgid ""
"A user can be blocked because he has no access to the model queue.job when a "
"job has been delayed. The creation of a job is low level and should not be "
"restrained by the accesses of the user. (lp:1276182)"
msgstr ""
"Un utilisateur peut être bloqué s'il n'a pas accès au modèle queue.job quand "
"un job a été retardé. La création d'un job est à bas niveau et ne devrait "
"pas être contrainte par les accès de l'utilisateur. (lp:1276182)"
#: ../../../CHANGES.rst:85
msgid "2.1.0 (2014-01-15 - warning: breaks compatibility)"
msgstr "2.1.0 (2014-01-15 - attention : rupture de compatibilité)"
#: ../../../CHANGES.rst:87
msgid ""
"Add a new optional keyword argument 'description' to the delay() function of "
"a job. If given, the description is used as name of the queue.job record "
"stored in Odoo and displayed in the list of jobs."
msgstr ""
"Ajout d'un nouvel argument nommé 'description' pour la fonction delay() d'un "
"job. Si fournie, la description est utilisée comme nom pour "
"l'enregistrement ``queue.job`` stocké dans Odoo et affiché dans la liste "
"des jobs."
#: ../../../CHANGES.rst:90
msgid ""
"Fix: assignment of jobs to workers respect the priority of the jobs "
"(lp:1252681)"
msgstr ""
"Correction: l'affectation des jobs aux workers respecte la priorité des jobs "
"(lp:1252681)"
#: ../../../CHANGES.rst:91
msgid ""
"Pass a new parameter to listeners of 'on_record_create' ( vals: field "
"values of the new record, e.g {'field_name': field_value, ...})"
msgstr ""
"Passage d'un nouveau paramètre aux abonnés à 'on_record_create' ( vals: "
"valeurs du champ du nouvel enregistrement, par ex : {'field_name': "
"field_value, ...})"
#: ../../../CHANGES.rst:93
msgid ""
"Replace the list of updated fields passed to listeners of 'on_record_write' "
"by a dictionary of updated field values e.g {'field_name': field_value, ...}"
msgstr ""
"Remplacement de la liste des champs modifiés transmis aux abonnés à "
"'on_record_write' par un dictionnaire des valeurs des champs modifiés. Par "
"ex : {'field_name': field_value, ...}"
#: ../../../CHANGES.rst:95
msgid ""
"Add the possibility to use 'Modifiers' functions in the 'direct "
"mappings' (details in the documentation of the Mapper class)"
msgstr ""
"Ajout de la possibilité d'utiliser des fonctions 'Modificatrices' dans les "
"'mappings directs' (détails dans la documentation de la classe Mapper)"
#: ../../../CHANGES.rst:97
msgid ""
"When a job a delayed, the job's UUID is returned by the delay() function"
msgstr ""
"Quand un job est retardé, le UUID du job est renvoyé par la fonction delay()"
#: ../../../CHANGES.rst:98
msgid ""
"Refactoring of mappers. Much details here: https://code.launchpad.net/"
"~odoo-connector-core-editors/odoo-connector/7.0-connector-mapper-"
"refactor/+merge/194485"
msgstr ""
"Refactorisation des mappers. Plus de détails ici : https://code.launchpad."
"net/~odoo-connector-core-editors/odoo-connector/7.0-connector-mapper-"
"refactor/+merge/194485"
#: ../../../CHANGES.rst:102
msgid "2.0.1 (2013-09-12)"
msgstr "2.0.1 (2013-09-12)"
#: ../../../CHANGES.rst:104
msgid ""
"Developers of addons do no longer need to create an AbstractModel with a "
"_name 'name_of_the_module.installed', instead, they just have to call "
"connector.connector.install_in_connector() lp:1196859"
msgstr ""
"Les développeurs d'addons n'ont plus besoin de créer un AbstractModel avec "
"un _name 'nom_module.installed', ils doivent simplement appeler ``connector."
"connector.install_in_connector()`` lp:1196859"
#: ../../../CHANGES.rst:106
msgid ""
"Added a script `odoo-connector-worker` to start processes for Jobs "
"Workers when running Odoo is multiprocessing"
msgstr ""
"Ajout d'un script `odoo-connector-worker` pour lancer les processus des "
"workers de jobs en fonctionnement multi-processus d'Odoo"
#: ../../../CHANGES.rst:108
msgid ""
"Fix: do no fail to start when Odoo has access to a not-Odoo database "
"(lp:1233388)"
msgstr ""
"Correction : n'échoue pas au démarrage quand Odoo a accès à une base de "
"données non-Odoo (lp:1233388)"
#: ../../../CHANGES.rst:112
msgid "2.0.0"
msgstr "2.0.0"
#: ../../../CHANGES.rst:114
msgid "First release"
msgstr "Première version"
#: ../../project/contribute.rst:5
msgid "Contribute"
msgstr "Contribuer"
#: ../../project/contribute.rst:7
msgid "We accept with pleasure all type of contributions:"
msgstr "Nous acceptons avec plaisir tous types de contributions :"
#: ../../project/contribute.rst:9
msgid "bug reports"
msgstr "Signalement d'anomalies"
#: ../../project/contribute.rst:10
msgid "merge proposals"
msgstr "Propositions de corrections"
#: ../../project/contribute.rst:11
msgid "ideas"
msgstr "idées"
#: ../../project/contribute.rst:12
msgid "translations"
msgstr "traductions"
#: ../../project/contribute.rst:13
msgid "..."
msgstr "..."
#: ../../project/contribute.rst:15
msgid ""
"Have a look on the :ref:`Magento Connector Developer's Guide "
"<connectormagento:contribute>` which is more complete, most of the "
"information is the same."
msgstr ""
"Jetez un œil au :ref:`Guide du développeur du Connecteur Magento "
"<connectormagento:contribute>` qui est plus complet, la plupart des "
"informations sont les mêmes."
#: ../../project/contribute.rst:19
msgid "The GitHub project is: https://github.com/OCA/connector"
msgstr "Le projet GitHub est : https://github.com/OCA/connector"
#: ../../project/contribute.rst:23
msgid "Want to start a new connector"
msgstr "Démarrer un nouveau connecteur"
#: ../../project/contribute.rst:25
msgid ""
"If you want to start a new connector based on the framework, a sane approach "
"is to read this documentation, especially :ref:`concepts` and :ref:"
"`bootstrap-connector`."
msgstr ""
"Si vous voulez fabriquer un nouveau connecteur basé sur le framework, "
"l'approche conseillée est de lire cette documentation, en particulier les :"
"ref:`concepts` et :ref:`bootstrap-connector`."
#: ../../project/contribute.rst:33
msgid ""
"If the connector belongs to the e-commerce domain, you may want to reuse the "
"pieces of the `E-Commerce Connector`_ module."
msgstr ""
"Si le connecteur est dans le domaine e-commerce, vous devriez réutiliser les "
"composants du module `E-Commerce Connector`_."
#: ../../project/contribute.rst:39
msgid "Naming conventions"
msgstr "Conventions de nommage"
#: ../../project/contribute.rst:41
msgid "The naming conventions for the new projects are the following:"
msgstr ""
"Les conventions de nommage pour les nouveaux projets sont les suivantes :"
#: ../../project/contribute.rst:43
msgid "Name of the project if it is in the OCA:"
msgstr "Nom du projet s'il est dans l'OCA :"
#: ../../project/contribute.rst:45
msgid "connector-xxx"
msgstr "connector-xxx"
#: ../../project/contribute.rst:48
msgid "connector_xxx"
msgstr "connector_xxx"
#: ../../project/contribute.rst:53
msgid "Example:"
msgstr "Exemple :"
#: ../../project/contribute.rst:51
msgid "https://github.com/OCA/connector-magento"
msgstr "https://github.com/OCA/connector-magento"
#: ../../project/contribute.rst:53
msgid "``connector_magento``"
msgstr "``connector_magento``"
#: ../../project/contribute.rst:55
msgid ""
"Actually, the Magento and Prestashop connectors do not respect this "
"convention for historical reasons (magentoerpconnect, prestashoperpconnect). "
"New projects should ideally respect it."
msgstr ""
"En réalité les connecteurs Magento et Prestashop ne respectent pas cette "
"convention pour des raisons historiques (magentoerpconnect, "
"prestashoperpconnect). Les nouveaux projets devraient idéalement la "
"respecter."
#: ../../project/contributors.rst:5
msgid "Contributors"
msgstr "Contributeurs"
#: ../../project/contributors.rst:7
msgid "List of contributors:"
msgstr "Liste des contributeurs :"
#: ../../../AUTHORS:1
msgid "Guewen Baconnier at Camptocamp"
msgstr "Guewen Baconnier chez Camptocamp"
#: ../../../AUTHORS:2
msgid "Alexandre Fayolle at Camptocamp"
msgstr "Alexandre Fayolle chez Camptocamp"
#: ../../../AUTHORS:3
msgid "Benoit Guillot at Akretion"
msgstr "Benoit Guillot chez Akretion"
#: ../../../AUTHORS:4
msgid "Nicolas Bessi at Camptocamp (tiny change)"
msgstr "Nicolas Bessi chez Camptocamp (changement minuscule)"
#: ../../../AUTHORS:5
msgid "Joël Grand-Guillaume at Camptocamp (tiny change)"
msgstr "Joël Grand-Guillaume chez Camptocamp (changement minuscule)"
#: ../../../AUTHORS:6
msgid "Arthur Vuillard at Akretion (tiny change)"
msgstr "Arthur Vuillard chez Akretion (changement minuscule)"
#: ../../../AUTHORS:7
msgid "Sebastien Beau at Akretion (tiny change)"
msgstr "Sebastien Beau chez Akretion (changement minuscule)"
#: ../../../AUTHORS:8
msgid "Laurent Mignon at Acsone"
msgstr "Laurent Mignon chez Acsone"
#: ../../../AUTHORS:9
msgid "Leonardo Pistone at Camptocamp"
msgstr "Leonardo Pistone chez Camptocamp"
#: ../../../AUTHORS:10
msgid "David Béal at Akretion (tiny change)"
msgstr "David Béal chez Akretion (changement minuscule)"
#: ../../project/contributors.rst:16
msgid "Financial Contributors"
msgstr "Contributeurs financiers"
#: ../../project/contributors.rst:18
msgid ""
"A fund raising has been done during the year 2013, allowing us to develop "
"the connector framework and the Magento connector."
msgstr ""
"Une levée de fond a été réalisée en 2013, et a permis de développer le "
"framework Connecteur et le Connecteur Magento."
#: ../../project/contributors.rst:21
msgid ""
"Here is the list of the funders, ordered by the amount of the contribution:"
msgstr "Voici la liste des fondateurs, classée par volume de contribution :"
#: ../../project/contributors.rst:23
msgid "**Logic Supply**"
msgstr "**Logic Supply**"
#: ../../project/contributors.rst:24
msgid "**Debonix**"
msgstr "**Debonix**"
#: ../../project/contributors.rst:25
msgid "Apertoso"
msgstr "Apertoso"
#: ../../project/contributors.rst:26
msgid "OpenBIG"
msgstr "OpenBIG"
#: ../../project/contributors.rst:27
msgid "Smile"
msgstr "Smile"
#: ../../project/contributors.rst:28
msgid "IT Service Partners"
msgstr "IT Service Partners"
#: ../../project/contributors.rst:29
msgid "WillowIT"
msgstr "WillowIT"
#: ../../project/contributors.rst:30
msgid "Eezee-It"
msgstr "Eezee-It"
#: ../../project/contributors.rst:31
msgid "Auguria"
msgstr "Auguria"
#: ../../project/contributors.rst:32
msgid "Enova"
msgstr "Enova"
#: ../../project/contributors.rst:33
msgid "Mr. Goran Sunjka"
msgstr "M. Goran Sunjka"
#: ../../project/contributors.rst:34
msgid "Taktik"
msgstr "Taktik"
#: ../../project/contributors.rst:35
msgid "Maison del Gusto"
msgstr "Maison del Gusto"
#: ../../project/contributors.rst:36
msgid "Open2bizz Software"
msgstr "Open2bizz Software"
#: ../../project/contributors.rst:37
msgid "Bee Company"
msgstr "Bee Company"
#: ../../project/contributors.rst:38
msgid "initOS"
msgstr "initOS"
#: ../../project/contributors.rst:39
msgid "Rhônalia"
msgstr "Rhônalia"
#: ../../project/contributors.rst:40
msgid "Julius Network Solutions"
msgstr "Julius Network Solutions"
#: ../../project/contributors.rst:41
msgid "Elico Corp"
msgstr "Elico Corp"
#: ../../project/contributors.rst:42
msgid "Linko Solutions"
msgstr "Linko Solutions"
#: ../../project/contributors.rst:43
msgid "HSP Hanse Shopping"
msgstr "HSP Hanse Shopping"
#: ../../project/contributors.rst:44
msgid "Burn Out Italy"
msgstr "Burn Out Italy"
#: ../../project/contributors.rst:45
msgid "Mr. Peter Dijkstra"
msgstr "M. Peter Dijkstra"
#: ../../project/contributors.rst:46
msgid "Mr. Luc Maurer"
msgstr "M. Luc Maurer"
#: ../../project/contributors.rst:47
msgid "Mr. Maxime Chambreuil"
msgstr "M. Maxime Chambreuil"
#: ../../project/contributors.rst:48
msgid "Mr. Eric Vernichon"
msgstr "M. Eric Vernichon"
#: ../../project/contributors.rst:49
msgid "Avanzosc"
msgstr "Avanzosc"
#: ../../project/contributors.rst:50
msgid "Mr. Fabio Martinelli"
msgstr "M. Fabio Martinelli"
#: ../../project/contributors.rst:51
msgid "Mr. Marcelo Bello"
msgstr "M. Marcelo Bello"
#: ../../project/contributors.rst:52
msgid "Rove.design"
msgstr "Rove.design"
#: ../../project/contributors.rst:53
msgid "Mr. Mark Felling"
msgstr "M. Mark Felling"
#: ../../project/contributors.rst:55
msgid "Thanks to all of them!"
msgstr "Merci à eux !"
#: ../../project/license.rst:5
msgid "License"
msgstr "Licence"
#: ../../project/license.rst:7
msgid "This work is licensed under the LGPL3 license."
msgstr "Ce travail est publié sous licence LGPL3."
#: ../../project/roadmap.rst:5
msgid "Roadmap"
msgstr "Roadmap"
#: ../../project/roadmap.rst:7
msgid "Here is a list of things we may agree to merge."
msgstr "Voici une liste de choses qu'on peut s'accorder à intégrer"
#: ../../project/roadmap.rst:9
msgid "Queue: use PostgreSQL `notify` for direct enqueue of jobs"
msgstr ""
"Queue : utiliser `notify` de PostgreSQL pour une mise en queue directe des "
"jobs"
#: ../../project/roadmap.rst:13
msgid ""
"Add facilities to parse the errors from the jobs so we can replace it by "
"more contextual and helpful errors."
msgstr ""
"Ajouter des facilités pour analyser les erreurs des jobs pour pouvoir les "
"remplacer par des erreurs plus contextuelles et utiles"
#: ../../project/roadmap.rst:16
msgid ""
"A logger which keeps in a buffer all the logs and flushes them when an error "
"occurs in a synchronization, clears them if it succeeded"
msgstr ""
"Un `logger` qui garde en tampon tous les logs et les vide quand une erreur "
"survient pendant une synchronisation, et les efface s'ils ont réussi"
#: ../../project/roadmap.rst:19
msgid ""
"Job Channels: each job is owned by a channel and workers can be dedicated to "
"one channel only"
msgstr ""
"Canal de job : chaque job appartient à un canal et les workers peuvent être "
"dédiés à un canal"
#: ../../../CHANGES.rst:107
msgid ""
"Fix: inheritance broken when an orm.Model inherit from an orm.AbstractModel. "
"One effect was that the mail.thread features were no longer working "
"(lp:1233355)"
msgstr ""
"Correction : héritage cassé quand un orm.Model hérite d'un orm."
"AbstractModel. Un effet était que les fonctionnalités de mail.thread ne "
"fonctionnaient plus (lp:1233355)"
#: ../../../AUTHORS:11
msgid "Christophe Combelles at Anybox (french translation)"
msgstr "Christophe Combelles chez Anybox (trad française)"
#: ../../project/contribute.rst:65
msgid "Creating or maintaining a translation of this doc"
msgstr "Créer ou maintenir une traduction de cette doc"
#: ../../project/contribute.rst:67
msgid ""
"Install Odoo, its dependencies, sphinx, sphinx_bootstrap_theme and sphinx-"
"intl"
msgstr ""
"Installez Odoo, ses dépendances, sphinx, sphinx_bootstrap_theme et sphinx-"
"intl"
#: ../../project/contribute.rst:72
msgid "create an empty database with the connector module installed"
msgstr "créez une nouvelle base de donnée avec le module connector installé"
#: ../../project/contribute.rst:73
msgid "``cd connector/doc``"
msgstr "``cd connector/doc``"
#: ../../project/contribute.rst:74
msgid "rebuild the gettext .pot source catalogs: ``make gettext``"
msgstr "reconstruisez les catalogues gettext sources .pot: ``make gettext``"
#: ../../project/contribute.rst:75
msgid ""
"update the .po translation files from the latest .pot files (here for "
"language 'fr'): ``sphinx-intl update -l fr -p _build/locale``"
msgstr ""
"mettez à jour les fichiers de traduction .po depuis les derniers fichiers ."
"pot (ici pour la langue 'fr'): ``sphinx-intl update -l fr -p _build/locale``"
#: ../../project/contribute.rst:77
msgid ""
"create or edit the translation in the .po files: ``poedit locale/fr/"
"LC_MESSAGES/*.po``"
msgstr ""
"créez ou modifiez la traduction dans les fichiers .po : ``poedit locale/fr/"
"LC_MESSAGES/*.po``"
#: ../../project/contribute.rst:79
msgid "compile the .po files into .mo files: ``sphinx-intl build``"
msgstr "compilez les fichiers .po en fichiers .mo : ``sphinx-intl build``"
#: ../../project/contribute.rst:80
msgid ""
"build the translated documentation to html: ``make SPHINXOPTS=\"-Dlanguage=fr"
"\" html``"
msgstr ""
"construisez en html la documentation traduite : ``make SPHINXOPTS=\"-"
"Dlanguage=fr\" html``"
#: ../../project/contribute.rst:83
msgid ""
"The same using a `buildout <https://bitbucket.org/anybox/"
"public_buildbot_buildouts/src/tip/odoo-connector.cfg>`_::"
msgstr ""
"La même chose en utilisant un `buildout <https://bitbucket.org/anybox/"
"public_buildbot_buildouts/src/tip/odoo-connector.cfg>`_::"
#: ../../project/contribute.rst:69
msgid ""
"Add `this patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
"request/9/>`_ to sphinx-intl (until merged) to support *fuzzy* translations"
msgstr ""
"Ajoutez `ce patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
"request/9/>`_ à sphinx-intl (jusqu'à ce que ce soit mergé) pour gérer les "
"traductions *fuzzy*"
#: ../../project/contribute.rst:29
msgid ""
"Then, my personal advice is to look at the existing connectors (`Odoo "
"Magento Connector`_, `Odoo Prestashop Connector`_). You will also probably "
"need to dive a bit in the framework's code."
msgstr ""
"Ensuite, il est conseillé de parcourir les connecteurs existants "
"(`Connecteur Odoo Magento`_, `Connecteur Odoo Prestashop`_). Vous devrez "
"aussi plonger peut-être un peu dans le code du framework."
#: ../../project/contribute.rst:48
msgid "Name of the Odoo module:"
msgstr "Nom du module Odoo :"
#: ../../project/contribute.rst:100
msgid ""
"Then you can see the result in _build/html/ and submit a Pull Request. "
"Repeat the 5 last steps to update the translation if modified upstream."
msgstr ""
"Vous pouvez ensuite voir le résultat dans _build/html/ et soumettre un "
"\"Pull Request\". Répétez les 5 dernières étapes pour remettre à jour les "
"traductions en cas de modification dans le tronc principal."
#: ../../project/roadmap.rst:11 ../../project/roadmap.rst:22
msgid "See: https://github.com/OCA/connector/pull/52"
msgstr "See: https://github.com/OCA/connector/pull/52"
#~ msgid ""
#~ "Then, my personal advice is to look at the existing connectors (`Odoo "
#~ "Magento Connector`_, `Odoo Prestashop Connector`_). You will also "
#~ "probably need to dive a bit in the framework's code."
#~ msgstr ""
#~ "Ensuite, il est conseillé de parcourir les connecteurs existants "
#~ "(`Connecteur Odoo Magento`_, `Connecteur Odoo Prestashop`_). Vous "
#~ "devrez aussi plonger peut-être un peu dans le code du framework."
#~ msgid "Name of the Odoo module:"
#~ msgstr "Nom du module Odoo :"
#~ msgid ""
#~ "Experimental branch: lp:~odoo-connector-core-editors/odoo-"
#~ "connector/7.0-connector-pg-notify-listen-experimental"
#~ msgstr ""
#~ "Branche expérimentale : lp:~odoo-connector-core-editors/odoo-"
#~ "connector/7.0-connector-pg-notify-listen-experimental"
#~ msgid ""
#~ "Then you can see the result in _build/html/ and submit a Pull Request"
#~ msgstr ""
#~ "Vous pouvez ensuite voir le résultat dans _build/html/ et soumettre un "
#~ "Pull Request"
#~ msgid ""
#~ "Add `this patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
#~ "request/9/issue-9-support-fuzzy-translations>`_ to sphinx-intl (until "
#~ "merged)"
#~ msgstr ""
#~ "Ajoutez `ce patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
#~ "request/9/issue-9-support-fuzzy-translations>`_ to sphinx-intl (jusqu'à "
#~ "ce qu'il soit mergé)"
#~ msgid ""
#~ "Fix: inheritance broken when an orm.Model inherit from an or."
#~ "AbstractModel. One effect was that the mail.thread features were no "
#~ "longer working (lp:1233355)"
#~ msgstr ""
#~ "Correction : héritage cassé quand un orm.Model hérite d'un or."
#~ "AbstractModel. Une conséquence est que les fonctionnalités de mail.thread "
#~ "ne fonctionnaient plus (lp:1233355)"

View file

@ -0,0 +1,190 @@
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=_build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
set I18NSPHINXOPTS=%SPHINXOPTS% .
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Connectors.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Connectors.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub file is in %BUILDDIR%/epub.
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
if errorlevel 1 exit /b 1
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "text" (
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The text files are in %BUILDDIR%/text.
goto end
)
if "%1" == "man" (
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The manual pages are in %BUILDDIR%/man.
goto end
)
if "%1" == "texinfo" (
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
goto end
)
if "%1" == "gettext" (
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
if errorlevel 1 exit /b 1
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
if errorlevel 1 exit /b 1
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
if errorlevel 1 exit /b 1
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
:end

View file

@ -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.

View file

@ -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!

View file

@ -0,0 +1,674 @@
.. _license:
#######
License
#######
This work is licensed under the LGPL3 license.
------
.. code-block:: none
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU LGPL, see
<http://www.gnu.org/licenses/>.

View file

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