Initial commit: OCA Technical packages (595 packages)
153
odoo-bringout-oca-connector-connector/connector/doc/Makefile
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Connectors.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Connectors.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/Connectors"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Connectors"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/09_datamodel.png
vendored
Normal file
|
After Width: | Height: | Size: 375 KiB |
3
odoo-bringout-oca-connector-connector/connector/doc/_static/connector_style.css
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
.navbar span.navbar-text {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/akretion_logo.png
vendored
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/c2c_square_baseline_192.jpg
vendored
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/logo-debonix.jpg
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/magentoerpconnect.png
vendored
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/magentoerpconnect150.png
vendored
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/prestashoperpconnect.png
vendored
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
odoo-bringout-oca-connector-connector/connector/doc/_static/img/prestashoperpconnect150.png
vendored
Normal file
|
After Width: | Height: | Size: 15 KiB |
20
odoo-bringout-oca-connector-connector/connector/doc/_templates/layout.html
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{% extends "!layout.html" %} {%- block extrahead %} {{ super() }}
|
||||
<script>
|
||||
(function (i, s, o, g, r, a, m) {
|
||||
i["GoogleAnalyticsObject"] = r;
|
||||
(i[r] =
|
||||
i[r] ||
|
||||
function () {
|
||||
(i[r].q = i[r].q || []).push(arguments);
|
||||
}),
|
||||
(i[r].l = 1 * new Date());
|
||||
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
|
||||
a.async = 1;
|
||||
a.src = g;
|
||||
m.parentNode.insertBefore(a, m);
|
||||
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
|
||||
|
||||
ga("create", "UA-7628916-3", "odoo-connector.com");
|
||||
ga("send", "pageview");
|
||||
</script>
|
||||
{% endblock %}
|
||||
28
odoo-bringout-oca-connector-connector/connector/doc/_templates/navbar.html
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
{% extends "!navbar.html" %} {% block navbartoc %}
|
||||
<li class="dropdown">
|
||||
<a
|
||||
role="button"
|
||||
id="dLabelTranslations"
|
||||
data-toggle="dropdown"
|
||||
data-target="#"
|
||||
href="#"
|
||||
>Translations<b class="caret"></b
|
||||
></a>
|
||||
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabelTranslations">
|
||||
<li><a class="reference" href="http://odoo-connector.com">English</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/fr">French</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown">
|
||||
<a role="button" id="dLabelVersions" data-toggle="dropdown" data-target="#" href="#"
|
||||
>Version<b class="caret"></b
|
||||
></a>
|
||||
<ul class="dropdown-menu" role="menu" aria-labelledby="dLabeVersions">
|
||||
<li><a class="reference" href="http://odoo-connector.com/8.0">8.0</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/9.0">9.0</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/10.0">10.0</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/11.0">11.0</a></li>
|
||||
<li><a class="reference" href="http://odoo-connector.com/12.0">12.0</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
{{ super() }} {% endblock %}
|
||||
3
odoo-bringout-oca-connector-connector/connector/doc/_themes/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
*.pyc
|
||||
*.pyo
|
||||
.DS_Store
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
######
|
||||
Models
|
||||
######
|
||||
|
||||
.. _api-backend-model:
|
||||
|
||||
*************
|
||||
Backend Model
|
||||
*************
|
||||
|
||||
|
||||
.. autoclass:: connector.models.backend_model.ConnectorBackend
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
.. _api-binding-model:
|
||||
|
||||
*************
|
||||
Binding Model
|
||||
*************
|
||||
|
||||
.. autoclass:: connector.models.backend_model.ExternalBinding
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
########
|
||||
Channels
|
||||
########
|
||||
|
||||
This is the API documentation for the job channels and the
|
||||
scheduling mechanisms of the job runner.
|
||||
|
||||
These classes are not intended for use by module developers.
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.jobrunner.channels
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
.. _api-component:
|
||||
|
||||
##########
|
||||
Components
|
||||
##########
|
||||
|
||||
Components are the blocks allowing to build a flexible and
|
||||
well decoupled code. They are based on the ``component`` addon, which
|
||||
can as well be used separately.
|
||||
|
||||
|
||||
***************
|
||||
Core Components
|
||||
***************
|
||||
|
||||
.. automodule:: connector.components.core
|
||||
:members:
|
||||
:undoc-members:
|
||||
:exclude-members: _module
|
||||
:show-inheritance:
|
||||
:private-members:
|
||||
|
||||
|
||||
********************
|
||||
Connector Components
|
||||
********************
|
||||
|
||||
.. automodule:: connector.components.binder
|
||||
:members:
|
||||
:undoc-members:
|
||||
:exclude-members: _module
|
||||
:show-inheritance:
|
||||
:private-members:
|
||||
|
||||
.. automodule:: connector.components.mapper
|
||||
:members:
|
||||
:member-order: groupwise
|
||||
:exclude-members: MappingDefinition, Mapper, ImportMapper, ExportMapper, MapChild, ImportMapChild, ExportMapChild
|
||||
:show-inheritance:
|
||||
|
||||
.. autoclass:: Mapper
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: ImportMapper
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: ExportMapper
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: MapChild
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: ImportMapChild
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: ExportMapChild
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
|
||||
.. automodule:: connector.components.backend_adapter
|
||||
:members:
|
||||
:show-inheritance:
|
||||
:exclude-members: BackendAdapter, CRUDAdapter
|
||||
|
||||
.. autoclass:: BackendAdapter
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. autoclass:: CRUDAdapter
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
.. autoattribute:: _usage
|
||||
|
||||
.. automodule:: connector.components.synchronizer
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:exclude-members: _module
|
||||
:private-members:
|
||||
|
||||
.. automodule:: connector.components.listener
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:exclude-members: _module
|
||||
:private-members:
|
||||
|
||||
.. automodule:: connector.components.locker
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
:exclude-members: _module
|
||||
:private-members:
|
||||
|
||||
***************************
|
||||
Components Collection Model
|
||||
***************************
|
||||
|
||||
.. automodule:: odoo.addons.component.models.collection
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
|
||||
*********************
|
||||
Components Exceptions
|
||||
*********************
|
||||
|
||||
.. automodule:: odoo.addons.component.exception
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
********************
|
||||
Components Internals
|
||||
********************
|
||||
|
||||
Low-level APIs of the Components.
|
||||
|
||||
.. automodule:: odoo.addons.component.core
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
.. automodule:: odoo.addons.component.builder
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
.. _api-event:
|
||||
|
||||
######
|
||||
Events
|
||||
######
|
||||
|
||||
Events is an implementation of an Observer pattern for Odoo.
|
||||
|
||||
|
||||
**********
|
||||
Components
|
||||
**********
|
||||
|
||||
.. automodule:: odoo.addons.component_event.components.event
|
||||
:members:
|
||||
:show-inheritance:
|
||||
|
||||
|
||||
**********************
|
||||
Odoo Models Extensions
|
||||
**********************
|
||||
|
||||
.. automodule:: odoo.addons.component_event.models.base
|
||||
|
||||
.. autoclass:: Base
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
Exceptions
|
||||
==========
|
||||
|
||||
.. automodule:: connector.exception
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
.. _api-queue:
|
||||
|
||||
#####
|
||||
Queue
|
||||
#####
|
||||
|
||||
Models
|
||||
******
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.models.base
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.models.queue_job
|
||||
|
||||
.. autoclass:: QueueJob
|
||||
|
||||
.. autoattribute:: _name
|
||||
.. autoattribute:: _inherit
|
||||
|
||||
***
|
||||
Job
|
||||
***
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.job
|
||||
|
||||
Decorators
|
||||
==========
|
||||
|
||||
.. autofunction:: job
|
||||
.. autofunction:: related_action
|
||||
|
||||
Internals
|
||||
=========
|
||||
|
||||
.. autoclass:: DelayableRecordset
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
|
||||
.. autoclass:: Job
|
||||
:members:
|
||||
:undoc-members:
|
||||
:show-inheritance:
|
||||
27
odoo-bringout-oca-connector-connector/connector/doc/bazaar
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# This viminfo file was generated by Vim 7.4.
|
||||
# You may edit it if you're careful!
|
||||
|
||||
# Value of 'encoding' when this file was written
|
||||
*encoding=utf-8
|
||||
|
||||
|
||||
# hlsearch on (H) or off (h):
|
||||
~h
|
||||
# Command Line History (newest to oldest):
|
||||
:q!
|
||||
|
||||
# Search String History (newest to oldest):
|
||||
|
||||
# Expression History (newest to oldest):
|
||||
|
||||
# Input Line History (newest to oldest):
|
||||
|
||||
# Input Line History (newest to oldest):
|
||||
|
||||
# Registers:
|
||||
|
||||
# File marks:
|
||||
|
||||
# Jumplist (newest first):
|
||||
|
||||
# History of marks within files (newest to oldest):
|
||||
376
odoo-bringout-oca-connector-connector/connector/doc/conf.py
Normal file
|
|
@ -0,0 +1,376 @@
|
|||
#
|
||||
# Connectors documentation build configuration file, created by
|
||||
# sphinx-quickstart on Mon Feb 4 11:35:44 2013.
|
||||
#
|
||||
# This file is execfile()d with the current directory set to its containing dir.
|
||||
#
|
||||
# Note that not all possible configuration values are present in this
|
||||
# autogenerated file.
|
||||
#
|
||||
# All configuration values have a default; values that are commented out
|
||||
# serve to show the default.
|
||||
|
||||
# flake8: noqa
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
import sphinx_bootstrap_theme
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
# sys.path.insert(0, os.path.abspath('.'))
|
||||
sys.path.append(os.path.abspath("_themes"))
|
||||
|
||||
MANIFEST_FILES = ["__manifest__.py", "__odoo__.py", "__openerp__.py"]
|
||||
|
||||
|
||||
def is_module(path):
|
||||
"""return False if the path doesn't contain an odoo module, and the full
|
||||
path to the module manifest otherwise"""
|
||||
|
||||
if not os.path.isdir(path):
|
||||
return False
|
||||
files = os.listdir(path)
|
||||
filtered = [x for x in files if x in (MANIFEST_FILES + ["__init__.py"])]
|
||||
if len(filtered) == 2 and "__init__.py" in filtered:
|
||||
return os.path.join(path, next(x for x in filtered if x != "__init__.py"))
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def is_installable_module(path):
|
||||
"""return False if the path doesn't contain an installable odoo module,
|
||||
and the full path to the module manifest otherwise"""
|
||||
manifest_path = is_module(path)
|
||||
if manifest_path:
|
||||
manifest = ast.literal_eval(open(manifest_path).read())
|
||||
if manifest.get("installable", True):
|
||||
return manifest_path
|
||||
return False
|
||||
|
||||
|
||||
if os.environ.get("TRAVIS_BUILD_DIR") and os.environ.get("VERSION"):
|
||||
# build from travis
|
||||
repos_home = os.environ["HOME"]
|
||||
deps_path = os.path.join(repos_home, "dependencies")
|
||||
odoo_folder = "odoo-" + os.environ.get("VERSION")
|
||||
odoo_root = os.path.join(repos_home, odoo_folder)
|
||||
build_path = os.environ["TRAVIS_BUILD_DIR"]
|
||||
else:
|
||||
# build from dev
|
||||
odoo_root = os.path.abspath("../../../../src")
|
||||
deps_path = os.path.abspath("../../..")
|
||||
build_path = os.path.abspath("../..")
|
||||
|
||||
addons_paths = []
|
||||
|
||||
|
||||
def add_path(*paths):
|
||||
addons_paths.append(os.path.join(*paths))
|
||||
|
||||
|
||||
add_path(odoo_root, "odoo", "addons")
|
||||
add_path(odoo_root, "addons")
|
||||
add_path(build_path)
|
||||
|
||||
deps_repos = [
|
||||
repo
|
||||
for repo in os.listdir(deps_path)
|
||||
if os.path.isdir(os.path.join(deps_path, repo)) and not repo.startswith(".")
|
||||
]
|
||||
|
||||
for repo in deps_repos:
|
||||
add_path(deps_path, repo)
|
||||
|
||||
addons = [
|
||||
x
|
||||
for x in os.listdir(build_path)
|
||||
if not x.startswith((".", "__")) and is_installable_module(x)
|
||||
]
|
||||
|
||||
|
||||
# sphinxodoo.ext.autodoc variables
|
||||
sphinxodoo_root_path = odoo_root
|
||||
sphinxodoo_addons = addons
|
||||
sphinxodoo_addons_path = addons_paths
|
||||
sys.path.append(build_path)
|
||||
|
||||
|
||||
# -- General configuration -----------------------------------------------
|
||||
|
||||
# If your documentation needs a minimal Sphinx version, state it here.
|
||||
# needs_sphinx = '1.0'
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = [
|
||||
"sphinx.ext.autodoc",
|
||||
"sphinx.ext.intersphinx",
|
||||
"sphinx.ext.todo",
|
||||
"sphinx.ext.viewcode",
|
||||
"sphinxodoo.ext.autodoc",
|
||||
]
|
||||
|
||||
todo_include_todos = False
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ["_templates"]
|
||||
|
||||
# The suffix of source filenames.
|
||||
source_suffix = ".rst"
|
||||
|
||||
# The encoding of source files.
|
||||
# source_encoding = 'utf-8-sig'
|
||||
|
||||
# The master toctree document.
|
||||
master_doc = "index"
|
||||
|
||||
# autodoc options
|
||||
autodoc_member_order = "bysource"
|
||||
|
||||
# General information about the project.
|
||||
project = "Connector"
|
||||
copyright = "2013, Camptocamp SA" # pylint: disable=W0622
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = ""
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = ""
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
language = "en"
|
||||
locale_dirs = ["locale"]
|
||||
gettext_compact = True
|
||||
|
||||
# There are two options for replacing |today|: either, you set today to some
|
||||
# non-false value, then it is used:
|
||||
# today = ''
|
||||
# Else, today_fmt is used as the format for a strftime call.
|
||||
# today_fmt = '%B %d, %Y'
|
||||
|
||||
# List of patterns, relative to source directory, that match files and
|
||||
# directories to ignore when looking for source files.
|
||||
exclude_patterns = ["_build"]
|
||||
|
||||
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||
# default_role = None
|
||||
|
||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||
# add_function_parentheses = True
|
||||
|
||||
# If true, the current module name will be prepended to all description
|
||||
# unit titles (such as .. function::).
|
||||
# add_module_names = True
|
||||
|
||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||
# output. They are ignored by default.
|
||||
# show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = "sphinx"
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
# modindex_common_prefix = []
|
||||
|
||||
|
||||
# -- Options for HTML output ---------------------------------------------
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = "bootstrap"
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
html_theme_options = {
|
||||
# Navigation bar title. (Default: ``project`` value)
|
||||
"navbar_title": "Odoo Connector",
|
||||
# Tab name for entire site. (Default: "Site")
|
||||
"navbar_site_name": "Site",
|
||||
# Global TOC depth for "site" navbar tab. (Default: 1)
|
||||
# Switching to -1 shows all levels.
|
||||
"globaltoc_depth": 2,
|
||||
# Include hidden TOCs in Site navbar?
|
||||
#
|
||||
# Note: If this is "false", you cannot have mixed ``:hidden:`` and
|
||||
# non-hidden ``toctree`` directives in the same page, or else the build
|
||||
# will break.
|
||||
#
|
||||
# Values: "true" (default) or "false"
|
||||
"globaltoc_includehidden": "true",
|
||||
# HTML navbar class (Default: "navbar") to attach to <div> element.
|
||||
# For black navbar, do "navbar navbar-inverse"
|
||||
"navbar_class": "navbar",
|
||||
# Fix navigation bar to top of page?
|
||||
# Values: "true" (default) or "false"
|
||||
"navbar_fixed_top": "true",
|
||||
# Location of link to source.
|
||||
# Options are "nav" (default), "footer" or anything else to exclude.
|
||||
"source_link_position": "footer",
|
||||
# Bootswatch (http://bootswatch.com/) theme.
|
||||
#
|
||||
# Options are nothing with "" (default) or the name of a valid theme
|
||||
# such as "amelia" or "cosmo".
|
||||
#
|
||||
# Note that this is served off CDN, so won't be available offline.
|
||||
"bootswatch_theme": "united",
|
||||
}
|
||||
|
||||
# Add any paths that contain custom themes here, relative to this directory.
|
||||
html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
# html_title = None
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
# html_short_title = None
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
# html_logo = None
|
||||
|
||||
# The name of an image file (within the static path) to use as favicon of the
|
||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||
# pixels large.
|
||||
# html_favicon = None
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
# relative to this directory. They are copied after the builtin static files,
|
||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||
html_static_path = ["_static"]
|
||||
|
||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||
# using the given strftime format.
|
||||
# html_last_updated_fmt = '%b %d, %Y'
|
||||
|
||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||
# typographically correct entities.
|
||||
# html_use_smartypants = True
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
# html_sidebars = {}
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
# html_additional_pages = {}
|
||||
|
||||
# If false, no module index is generated.
|
||||
# html_domain_indices = True
|
||||
|
||||
# If false, no index is generated.
|
||||
# html_use_index = True
|
||||
|
||||
# If true, the index is split into individual pages for each letter.
|
||||
# html_split_index = False
|
||||
|
||||
# If true, links to the reST sources are added to the pages.
|
||||
# html_show_sourcelink = True
|
||||
|
||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||
# html_show_sphinx = True
|
||||
|
||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||
# html_show_copyright = True
|
||||
|
||||
# If true, an OpenSearch description file will be output, and all pages will
|
||||
# contain a <link> tag referring to it. The value of this option must be the
|
||||
# base URL from which the finished HTML is served.
|
||||
# html_use_opensearch = ''
|
||||
|
||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||
# html_file_suffix = None
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = "connector-doc"
|
||||
|
||||
|
||||
# -- Options for LaTeX output --------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ('letterpaper' or 'a4paper').
|
||||
#'papersize': 'letterpaper',
|
||||
# The font size ('10pt', '11pt' or '12pt').
|
||||
#'pointsize': '10pt',
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#'preamble': '',
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||
latex_documents = [
|
||||
("index", "Connector.tex", "Connector Documentation", "Camptocamp SA", "manual")
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
# latex_logo = None
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
# latex_use_parts = False
|
||||
|
||||
# If true, show page references after internal links.
|
||||
# latex_show_pagerefs = False
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
# latex_show_urls = False
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
# latex_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
# latex_domain_indices = True
|
||||
|
||||
|
||||
# -- Options for manual page output --------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
man_pages = [("index", "connector", "Connector Documentation", ["Camptocamp SA"], 1)]
|
||||
|
||||
# If true, show URL addresses after external links.
|
||||
# man_show_urls = False
|
||||
|
||||
|
||||
# -- Options for Texinfo output ------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
# dir menu entry, description, category)
|
||||
texinfo_documents = [
|
||||
(
|
||||
"index",
|
||||
"Connector",
|
||||
"Connector Documentation",
|
||||
"Camptocamp SA",
|
||||
"Connector",
|
||||
"Framework for Odoo Connectors.",
|
||||
"Miscellaneous",
|
||||
)
|
||||
]
|
||||
|
||||
# Documents to append as an appendix to all manuals.
|
||||
# texinfo_appendices = []
|
||||
|
||||
# If false, no module index is generated.
|
||||
# texinfo_domain_indices = True
|
||||
|
||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||
# texinfo_show_urls = 'footnote'
|
||||
|
||||
|
||||
# Example configuration for intersphinx: refer to the Python standard library.
|
||||
intersphinx_mapping = {
|
||||
"http://docs.python.org/": None,
|
||||
"odooweb": ("https://www.odoo.com/documentation/10.0/", None),
|
||||
"odoodev": ("https://www.odoo.com/documentation/10.0/", None),
|
||||
"connectormagento": ("http://www.odoo-magento-connector.com", None),
|
||||
}
|
||||
|
|
@ -0,0 +1,152 @@
|
|||
.. _bootstrap-connector:
|
||||
|
||||
|
||||
########################
|
||||
Boostrapping a connector
|
||||
########################
|
||||
|
||||
We'll see the steps to bootstrap a new connector.
|
||||
|
||||
Besides that, you may want to use the existing connectors to have some
|
||||
real implementation examples:
|
||||
|
||||
* `Odoo Magento Connector`_
|
||||
* `Odoo Prestashop Connector`_
|
||||
|
||||
Be aware that the connector API has changed in Odoo 10.0, so the examples
|
||||
might be outdated.
|
||||
|
||||
Some boilerplate is necessary, so this document will guide you through
|
||||
some steps. Please also take a look on the :ref:`naming-convention`.
|
||||
|
||||
For the sake of the example, we'll imagine we have to synchronize
|
||||
Odoo with a coffee machine.
|
||||
|
||||
*************
|
||||
Odoo Manifest
|
||||
*************
|
||||
|
||||
As we want to synchronize Odoo with a coffee machine, we'll name
|
||||
our connector connector_coffee.
|
||||
|
||||
First, we need to create the Odoo addons itself, editing the
|
||||
``connector_coffee/__manifest__.py`` manifest.
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
:emphasize-lines: 3,4
|
||||
|
||||
{'name': 'Coffee Connector',
|
||||
'version': '1.0.0',
|
||||
'category': 'Connector',
|
||||
'depends': ['connector',
|
||||
],
|
||||
'author': 'Myself',
|
||||
'license': 'LGPL-3',
|
||||
'description': """
|
||||
Coffee Connector
|
||||
================
|
||||
|
||||
Connect Odoo to my coffee machine.
|
||||
|
||||
Features:
|
||||
|
||||
* Pour a coffee when Odoo is busy for too long
|
||||
""",
|
||||
'data': [],
|
||||
'installable': True,
|
||||
}
|
||||
|
||||
Nothing special but 2 things to note:
|
||||
|
||||
* It depends from ``connector``. ``connector`` itself depends from
|
||||
``queue_job``, ``component`` and ``component_event``. ``queue_job`` is in the
|
||||
`OCA/queue`_ repository.
|
||||
* The module category should be ``Connector``.
|
||||
|
||||
Of course, we also need to create the ``__init__.py`` file where we will
|
||||
put the imports of our python modules.
|
||||
|
||||
.. _OCA/queue: https://github.com/OCA/queue
|
||||
|
||||
|
||||
*************
|
||||
Backend Model
|
||||
*************
|
||||
|
||||
Reference: :ref:`api-backend-model`
|
||||
|
||||
We need to create a Backend representing the external service. Every record we
|
||||
synchronize will be linked with a record of ``coffee.backend``. This backend
|
||||
is our *collection* of Components.
|
||||
|
||||
The ``coffee.backend`` model is an ``_inherit`` of ``connector.backend``. In
|
||||
``connector_coffee/models/coffee_binding.py``::
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class CoffeeBackend(models.Model):
|
||||
_name = 'coffee.backend'
|
||||
_description = 'Coffee Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
location = fields.Char(string='Location')
|
||||
username = fields.Char(string='Username')
|
||||
password = fields.Char(string='Password')
|
||||
|
||||
Notes:
|
||||
|
||||
* We can other fields for the configuration of the connection or the
|
||||
synchronizations.
|
||||
|
||||
****************
|
||||
Abstract Binding
|
||||
****************
|
||||
|
||||
Reference: :ref:`api-binding-model`
|
||||
|
||||
In order to share common features between all the bindings (see
|
||||
:ref:`binding`), create an abstract binding model.
|
||||
|
||||
It can be as follows (in ``connector_coffee/models/coffee_binding.py``)::
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class CoffeeBinding(models.AbstractModel):
|
||||
_name = 'coffee.binding'
|
||||
_inherit = 'external.binding'
|
||||
_description = 'Coffee Binding (abstract)'
|
||||
|
||||
# odoo_id = odoo-side id must be declared in concrete model
|
||||
backend_id = fields.Many2one(
|
||||
comodel_name='coffee.backend',
|
||||
string='Coffee Backend',
|
||||
required=True,
|
||||
ondelete='restrict',
|
||||
)
|
||||
coffee_id = fields.Integer(string='ID in the Coffee Machine',
|
||||
index=True)
|
||||
|
||||
Notes:
|
||||
|
||||
* This model inherit from ``external.binding``
|
||||
* Any number of fields or methods can be added
|
||||
|
||||
|
||||
**********
|
||||
Components
|
||||
**********
|
||||
|
||||
Reference: :ref:`api-component`
|
||||
|
||||
We'll probably need to create synchronizers, mappers, backend adapters,
|
||||
binders and maybe our own kind of components.
|
||||
|
||||
Their implementation can vary from a project to another. Have a look on the
|
||||
`Odoo Magento Connector`_ and `Odoo Prestashop Connector`_ projects.
|
||||
|
||||
|
||||
.. _`Odoo Magento Connector`: https://github.com/OCA/connector-magento
|
||||
.. _`Odoo Prestashop Connector`: https://github.com/OCA/connector-prestashop
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
.. _code-overview:
|
||||
|
||||
#############
|
||||
Code Overview
|
||||
#############
|
||||
|
||||
Some simple code examples.
|
||||
|
||||
***************************
|
||||
Trigger and listen an event
|
||||
***************************
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class AccountInvoice(models.Model):
|
||||
_inherit = 'account.invoice'
|
||||
|
||||
@api.multi
|
||||
def action_invoice_paid(self):
|
||||
res = super(AccountInvoice, self).action_invoice_paid()
|
||||
for record in self:
|
||||
self._event('on_invoice_paid').notify(record)
|
||||
return res
|
||||
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
|
||||
class MyEventListener(Component):
|
||||
_name = 'my.event.listener'
|
||||
_inherit = 'base.event.listener'
|
||||
|
||||
def on_invoice_paid(self, record):
|
||||
_logger.info('invoice %s has been paid!', record.name)
|
||||
|
||||
Ref: :ref:`api-event`
|
||||
|
||||
|
||||
*************************
|
||||
Delay an Asynchronous Job
|
||||
*************************
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.queue_job.job import job
|
||||
|
||||
|
||||
class AccountInvoice(models.Model):
|
||||
_inherit = 'account.invoice'
|
||||
|
||||
@job
|
||||
@api.multi
|
||||
def export_payment(self):
|
||||
self.ensure_one()
|
||||
_logger.info("I'm exporting the payment for %s", self.name)
|
||||
|
||||
@api.multi
|
||||
def action_invoice_paid(self):
|
||||
res = super(AccountInvoice, self).action_invoice_paid()
|
||||
for record in self:
|
||||
record.with_delay(priority=5).export_payment()
|
||||
return res
|
||||
|
||||
Ref: :ref:`api-queue`
|
||||
|
||||
********************
|
||||
Work with components
|
||||
********************
|
||||
|
||||
This is a highly simplified version of a micro-connector, without using
|
||||
events or jobs, for the sake of the example.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import AbstractComponent
|
||||
|
||||
|
||||
class MagentoBackend(models.Model):
|
||||
_name = 'magento.backend'
|
||||
_description = 'Magento Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
location = fields.Char(string='Location', required=True)
|
||||
username = fields.Char(string='Username')
|
||||
password = fields.Char(string='Password')
|
||||
|
||||
def import_partner(self, external_id):
|
||||
with self.work_on(model_name='magento.res.partner') as work:
|
||||
importer = work.component(usage='record.importer')
|
||||
# returns an instance of PartnerImporter, which has been
|
||||
# found with:the collection name (magento.backend, the model,
|
||||
# and the usage).
|
||||
importer.run(partner_id)
|
||||
|
||||
# the next 2 components are abstract and are used by inheritance
|
||||
# by the others
|
||||
class BaseMagentoConnectorComponent(AbstractComponent):
|
||||
# same inheritance than Odoo models
|
||||
_name = 'base.magento.connector'
|
||||
_inherit = 'base.connector'
|
||||
# subscribe to:
|
||||
_collection = 'magento.backend'
|
||||
# the collection will be inherited to the components below,
|
||||
# because they inherit from this component
|
||||
|
||||
|
||||
class GenericAdapter(AbstractComponent):
|
||||
# same inheritance than Odoo models
|
||||
_name = 'magento.adapter'
|
||||
_inherit = ['base.backend.adapter', 'base.magento.connector']
|
||||
# usage is used for lookups of components
|
||||
_usage = 'backend.adapter'
|
||||
|
||||
_magento_model = None
|
||||
|
||||
def _call(self, *args, **kwargs):
|
||||
location = self.backend_record.location
|
||||
# use client API
|
||||
|
||||
def read(self, fields=None):
|
||||
""" Search records according to some criterias
|
||||
and returns a list of ids
|
||||
|
||||
:rtype: list
|
||||
"""
|
||||
return self._call('%s.info' % self._magento_model, fields)
|
||||
|
||||
|
||||
# these are the components we need for our synchronization
|
||||
class PartnerAdapter(Component):
|
||||
_name = 'magento.partner.adapter'
|
||||
_inherit = 'magento.adapter'
|
||||
_apply_on = ['magento.res.partner']
|
||||
_magento_model = 'customer'
|
||||
|
||||
|
||||
class PartnerMapper(Component):
|
||||
_name = 'magento.partner.import.mapper'
|
||||
_inherit = 'magento.import.mapper' # parent component omitted for brevity
|
||||
_apply_on = ['magento.res.partner']
|
||||
_usage = 'import.mapper'
|
||||
|
||||
|
||||
class PartnerBinder(Component):
|
||||
_name = 'magento.partner.binder'
|
||||
_inherit = 'magento.binder' # parent component omitted for brevity
|
||||
_apply_on = ['magento.res.partner']
|
||||
_usage = 'binder'
|
||||
|
||||
|
||||
class PartnerImporter(Component):
|
||||
_name = 'magento.partner.importer'
|
||||
_inherit = 'magento.importer' # parent component omitted for brevity
|
||||
_apply_on = ['magento.res.partner']
|
||||
_usage = 'record.importer'
|
||||
|
||||
def run(self, external_id):
|
||||
# get the components we need for the sync
|
||||
|
||||
# this one knows how to speak to magento
|
||||
backend_adapter = self.component(usage='backend.adapter')
|
||||
# this one knows how to convert magento data to odoo data
|
||||
mapper = self.component(usage='import.mapper')
|
||||
# this one knows how to link magento/odoo records
|
||||
binder = self.component(usage='binder')
|
||||
|
||||
# read external data from magento
|
||||
external_data = backend_adapter.read(external_id)
|
||||
# convert to odoo data
|
||||
internal_data = mapper.map_record(external_data).values()
|
||||
# find if the magento id already exists in odoo
|
||||
binding = binder.to_internal(external_id)
|
||||
if binding:
|
||||
# if yes, we update it
|
||||
binding.write(internal_data)
|
||||
else:
|
||||
# or we create it
|
||||
binding = self.model.create(internal_data)
|
||||
# finally, we bind both, so the next time we import
|
||||
# the record, we'll update the same record instead of
|
||||
# creating a new one
|
||||
binder.bind(external_id, binding)
|
||||
|
||||
|
||||
Ref: :ref:`api-component`
|
||||
|
|
@ -0,0 +1,242 @@
|
|||
.. _concepts:
|
||||
|
||||
##################
|
||||
Connector Concepts
|
||||
##################
|
||||
|
||||
The framework to develop connectors is decoupled in small pieces of
|
||||
codes interacting together. Each of them can be used or not in an
|
||||
implementation.
|
||||
|
||||
An example of implementation is the `Odoo Magento Connector`_.
|
||||
|
||||
This document describes them from a high-level point of view and gives
|
||||
pointers to more concrete 'how-to' or small tutorials.
|
||||
|
||||
.. _`Odoo Magento Connector`: http://www.odoo-magento-connector.com
|
||||
|
||||
******
|
||||
Events
|
||||
******
|
||||
|
||||
Reference: :ref:`api-event`
|
||||
|
||||
Events are hooks in Odoo on which we can plug some actions. They are
|
||||
based on an Observer pattern.
|
||||
|
||||
The same event can be shared across several connectors, easing their
|
||||
implementation.
|
||||
For instance, the module connector_ecommerce_ which extends the
|
||||
framework with common e-commerce capabilities, adds its own events
|
||||
common to e-commerce.
|
||||
|
||||
A connectors developer is mostly interested by:
|
||||
|
||||
* adding and listening to events (see :ref:`api-event`)
|
||||
|
||||
.. _jobs-queue:
|
||||
|
||||
**********
|
||||
Jobs Queue
|
||||
**********
|
||||
|
||||
Reference: :ref:`api-queue`
|
||||
|
||||
This feature is part of a standalone addon, but is a prerequisite for
|
||||
the connector framework.
|
||||
|
||||
The module is ``queue_job`` in https://github.com/OCA/queue.
|
||||
|
||||
A connectors developer is mostly interested by:
|
||||
|
||||
* Delay a job (see the decorator :py:func:`~odoo.addons.queue_job.job.job`)
|
||||
|
||||
|
||||
*******
|
||||
Backend
|
||||
*******
|
||||
|
||||
Reference: :ref:`api-backend-model`
|
||||
|
||||
The Backend Model is what represents the external service / system we
|
||||
synchronize with. The name on the backend indicates what is the collection the
|
||||
Components will be registered into. Put another way: every backend has its own
|
||||
collection of Components.
|
||||
|
||||
It must use an ``_inherit`` on ``connector.backend``.
|
||||
|
||||
``connector.backend`` inherits
|
||||
:class:`odoo.addons.component.models.collection.Collection` which has a
|
||||
:meth:`odoo.addons.component.models.collection.Collection.work_on` that will be
|
||||
used as entrypoint for the component system. This method returns a
|
||||
:class:`~odoo.addons.component.core.WorkContext`
|
||||
|
||||
***********
|
||||
WorkContext
|
||||
***********
|
||||
|
||||
Reference: :class:`~odoo.addons.component.core.WorkContext`
|
||||
|
||||
A :class:`~odoo.addons.component.core.WorkContext` is the work environment or
|
||||
context that will be passed transversally through all the components. This is
|
||||
also the entrypoint to the component system.
|
||||
|
||||
A connectors developer is mostly interested by:
|
||||
|
||||
* Get a Component from a WorkContext (:py:meth:`~odoo.addons.component.core.WorkContext.component`)
|
||||
|
||||
*********
|
||||
Component
|
||||
*********
|
||||
|
||||
Reference: :ref:`api-component`
|
||||
|
||||
:py:class:`~odoo.addons.component.core.Component` are pluggable classes used
|
||||
for the synchronizations with the external systems (or anything!)
|
||||
|
||||
The Components system has been extracted in a standalone addon (``component``),
|
||||
which means it can really be used in a totally different way.
|
||||
|
||||
The connector defines some base components, which you can find below. Note
|
||||
that you can and are encouraged to define your own Components as well.
|
||||
|
||||
Mappings
|
||||
========
|
||||
|
||||
The base class is :py:class:`connector.components.mapper.Mapper`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.import.mapper'``
|
||||
* ``_inherit = 'base.export.mapper'``
|
||||
|
||||
And the usages for the lookups are:
|
||||
|
||||
* ``import.mapper``
|
||||
* ``export.mapper``
|
||||
|
||||
A mapping translates an external record to an Odoo record and
|
||||
conversely.
|
||||
|
||||
It supports:
|
||||
|
||||
direct mappings
|
||||
Fields *a* is written in field *b*.
|
||||
|
||||
method mappings
|
||||
A method is used to convert one or many fields to one or many
|
||||
fields, with transformation.
|
||||
It can be filtered, for example only applied when the record is
|
||||
created or when the source fields are modified.
|
||||
|
||||
submapping
|
||||
a sub-record (lines of a sale order) is converted using another
|
||||
Mapper
|
||||
|
||||
See the documentation of the class for more details.
|
||||
|
||||
Synchronizers
|
||||
=============
|
||||
|
||||
The base class is :py:class:`connector.components.synchronizer.Synchronizer`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.importer'``
|
||||
* ``_inherit = 'base.exporter'``
|
||||
|
||||
And the usages for the lookups are:
|
||||
|
||||
* ``importer``
|
||||
* ``exporter``
|
||||
|
||||
However, in your implementation, it is advised to use more refined usages such
|
||||
as:
|
||||
|
||||
* ``record.importer``
|
||||
* ``record.exporter``
|
||||
* ``batch.importer``
|
||||
* ``batch.exporter``
|
||||
* ..
|
||||
|
||||
A synchronizer orchestrates a synchronization with a backend. It can be a
|
||||
record's import or export, a deletion of something, or anything else. For
|
||||
instance, it will use the mappings to convert the data between both systems,
|
||||
the backend adapters to read or write data on the backend and the binders to
|
||||
create the link between them.
|
||||
|
||||
Backend Adapters
|
||||
================
|
||||
|
||||
The base class is
|
||||
:py:class:`connector.components.backend_adapter.BackendAdapter`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.backend.adapter'``
|
||||
* ``_inherit = 'base.backend.adapter.crud'``
|
||||
|
||||
And the usages for the lookups are:
|
||||
|
||||
* ``backend.adapter``
|
||||
|
||||
An external adapter has a common interface to speak with the backend.
|
||||
It translates the basic orders (search, read, write) to the protocol
|
||||
used by the backend.
|
||||
|
||||
Binders
|
||||
=======
|
||||
|
||||
The base class is
|
||||
:py:class:`connector.components.binder.Binder`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.binder'``
|
||||
|
||||
And the usages for the lookups are:
|
||||
|
||||
* ``binder``
|
||||
|
||||
Binders are components that know how to find the external ID for an
|
||||
Odoo ID, how to find the Odoo ID for an external ID and how to
|
||||
create the binding between them. A default implementation is
|
||||
available and can be inherited if needed.
|
||||
|
||||
Listeners
|
||||
=========
|
||||
|
||||
The base class is
|
||||
:py:class:`connector.components.listener.ConnectorListener`.
|
||||
|
||||
In your components, you probably want to inherit from:
|
||||
|
||||
* ``_inherit = 'base.connector.listener'``
|
||||
|
||||
This is where you will register your event listeners.
|
||||
See :mod:`addons.component_event.components.event`.
|
||||
|
||||
|
||||
.. _binding:
|
||||
|
||||
********
|
||||
Bindings
|
||||
********
|
||||
|
||||
Reference: :ref:`api-binding-model`
|
||||
|
||||
A binding represents the link of a record between Odoo and a backend.
|
||||
|
||||
The proposed implementation for the connectors widely use the
|
||||
`_inherits` capabilities.
|
||||
|
||||
Say we import a customer from *Magento*.
|
||||
|
||||
We create a `magento.res.partner` model, which `_inherits`
|
||||
`res.partner`.
|
||||
|
||||
This model, called a *binding* model, knows the ID of the partner in
|
||||
Odoo, the ID in Magento and the relation to the backend model.
|
||||
|
||||
It also stores all the necessary metadata related to this customer
|
||||
coming from Magento.
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
.. _jobrunner:
|
||||
|
||||
|
||||
#######################################
|
||||
Configuring channels and the job runner
|
||||
#######################################
|
||||
|
||||
.. automodule:: odoo.addons.queue_job.jobrunner.runner
|
||||
|
||||
|
||||
What is a channel?
|
||||
------------------
|
||||
|
||||
.. autoclass:: odoo.addons.queue_job.jobrunner.channels.Channel
|
||||
:noindex:
|
||||
|
||||
How to configure Channels?
|
||||
--------------------------
|
||||
|
||||
The ``ODOO_QUEUE_JOB_CHANNELS`` environment variable must be
|
||||
set before starting Odoo in order to enable the job runner
|
||||
and configure the capacity of the channels.
|
||||
|
||||
The general syntax is ``channel(.subchannel)*(:capacity(:key(=value)?)*)?,...``.
|
||||
|
||||
Intermediate subchannels which are not configured explicitly are autocreated
|
||||
with an unlimited capacity (except the root channel which if not configured gets
|
||||
a default capacity of 1).
|
||||
|
||||
A delay in seconds between jobs can be set at the channel level with
|
||||
the ``throttle`` key.
|
||||
|
||||
Example ``ODOO_QUEUE_JOB_CHANNELS``:
|
||||
|
||||
* ``root:4``: allow up to 4 concurrent jobs in the root channel.
|
||||
* ``root:4,root.sub:2``: allow up to 4 concurrent jobs in the root channel and
|
||||
up to 2 concurrent jobs in the channel named ``root.sub``.
|
||||
* ``sub:2``: the same.
|
||||
* ``root:4:throttle=2``: wait at least 2 seconds before starting the next job
|
||||
|
|
@ -0,0 +1,900 @@
|
|||
.. _migration-guide:
|
||||
|
||||
########################################
|
||||
Migration Guide to the new Connector API
|
||||
########################################
|
||||
|
||||
During the year 2017, the connector evolved greatly.
|
||||
We can recognize three different aspect of the framework, they all have been
|
||||
rewritten:
|
||||
|
||||
* The Job Queue API (:ref:`api-queue`)
|
||||
* The Event API (:ref:`api-event`)
|
||||
* The ``ConnectorUnit`` API, which is the core of the composability
|
||||
of the Connector. It has been replaced by a standalone addon
|
||||
called ``component``. (:ref:`api-component`)
|
||||
|
||||
The Connector has been splitted in different addons:
|
||||
|
||||
* ``queue_job`` in https://github.com/OCA/queue
|
||||
* ``component`` in the same repository
|
||||
* ``component_event`` in the same repository
|
||||
* ``connector`` uses the 3 addons and the parts specifics to the connectors
|
||||
|
||||
This guide will show how to migrate from the old API to the new one.
|
||||
|
||||
The previous API will stay until the migration to Odoo 11.0.
|
||||
|
||||
.. contents:: Sections:
|
||||
:local:
|
||||
:backlinks: top
|
||||
:depth: 2
|
||||
|
||||
**************
|
||||
Migrating Jobs
|
||||
**************
|
||||
|
||||
Jobs are now more integrated within the Odoo API. They are no longer
|
||||
standalone functions but are applied on methods of Models. Another change is
|
||||
that they have been extracted into their own addon, so obviously the Python
|
||||
paths change.
|
||||
|
||||
Declaration of a job
|
||||
====================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.queue.job import job, related_action
|
||||
from ..related_action import unwrap_binding, link
|
||||
|
||||
# function at module-level
|
||||
@job(default_channel='root.magento')
|
||||
@related_action(action=link)
|
||||
def import_record(session, model_name, backend_id, magento_id, force=False):
|
||||
""" Import a record from Magento """
|
||||
# ...
|
||||
|
||||
@job(default_channel='root.magento')
|
||||
@related_action(action=unwrap_binding)
|
||||
def export_record(session, model_name, binding_id, fields=None):
|
||||
""" Import a record from Magento """
|
||||
# ...
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.queue_job.job import job, related_action
|
||||
from odoo import api, models
|
||||
|
||||
|
||||
class MagentoBinding(models.AbstractModel):
|
||||
_name = 'magento.binding'
|
||||
_inherit = 'external.binding'
|
||||
_description = 'Magento Binding (abstract)'
|
||||
|
||||
@job(default_channel='root.magento')
|
||||
@related_action(action='related_action_magento_link')
|
||||
@api.model
|
||||
def import_record(self, backend, external_id, force=False):
|
||||
""" Import a Magento record """
|
||||
backend.ensure_one()
|
||||
# ...
|
||||
|
||||
@job(default_channel='root.magento')
|
||||
@related_action(action='related_action_unwrap_binding')
|
||||
@api.multi
|
||||
def export_record(self, fields=None):
|
||||
""" Export a record on Magento """
|
||||
self.ensure_one()
|
||||
# ...
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The job is declared on the generic abstract binding model from which all
|
||||
bindings inherit. This is not a requirement, but for this kind of job it is
|
||||
the perfect fit.
|
||||
* ``session``, ``model_name`` and ``binding_id`` are no longer required as they
|
||||
are already known in ``self``. Jobs can be used as well on ``@api.multi`` and
|
||||
``@api.model``.
|
||||
* Passing arguments as records is supported, in the new version of
|
||||
``import_record``, no need to browse on the backend if a record was passed
|
||||
* The action of a related action is now the name of a method on the
|
||||
``queue.job`` model.
|
||||
* If you need to share a job between several models, put them in an
|
||||
AbstractModel and add an ``_inherit`` on the models.
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :meth:`odoo.addons.queue_job.job.job`
|
||||
* :meth:`odoo.addons.queue_job.job.related_action`
|
||||
|
||||
|
||||
Invocation of a job
|
||||
===================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.session import ConnectorSession
|
||||
from .unit.export_synchronizer import export_record
|
||||
|
||||
|
||||
class MyBinding(models.Model):
|
||||
_name = 'my.binding'
|
||||
_inherit = 'magento.binding'
|
||||
|
||||
@api.multi
|
||||
def button_trigger_export_sync(self):
|
||||
session = ConnectorSession.from_env(self.env)
|
||||
export_record(session, binding._name, self.id, fields=['name'])
|
||||
|
||||
@api.multi
|
||||
def button_trigger_export_async(self):
|
||||
session = ConnectorSession.from_env(self.env)
|
||||
export_record.delay(session, self._name, self.id,
|
||||
fields=['name'], priority=12)
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class MyBinding(models.Model):
|
||||
_name = 'my.binding'
|
||||
|
||||
@api.multi
|
||||
def button_trigger_export_sync(self):
|
||||
self.export_record(fields=['name'])
|
||||
|
||||
@api.multi
|
||||
def button_trigger_export_async(self):
|
||||
self.with_delay(priority=12).export_record(fields=['name'])
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* No more imports are needed for the invocation
|
||||
* ``ConnectorSession`` is now dead
|
||||
* Arguments for the job (such as ``priority``) are no longer mixed with the
|
||||
arguments passed to the method
|
||||
* When the job is called on a "browse" record, the job will be executed
|
||||
on an instance of this record:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> binding = self.env['my.binding'].browse(1)
|
||||
>>> binding.button_trigger_export_async()
|
||||
|
||||
In the execution of the job:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
@job
|
||||
def export_record(self, fields=None):
|
||||
print self
|
||||
print fields
|
||||
# =>
|
||||
# my.binding,1
|
||||
# ['name']
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :meth:`odoo.addons.queue_job.job.job`
|
||||
* :meth:`odoo.addons.queue_job.models.base.Base.with_delay`
|
||||
|
||||
****************
|
||||
Migrating Events
|
||||
****************
|
||||
|
||||
Events are now handled by the ``component_event`` addon.
|
||||
|
||||
Triggering an event
|
||||
===================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
First you had to create an :class:`~odoo.addons.connector.event.Event` instance:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
on_record_create = Event()
|
||||
|
||||
And then import and trigger it, passing a lot of arguments to it:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.event import on_record_create
|
||||
|
||||
class Base(models.AbstractModel):
|
||||
""" The base model, which is implicitly inherited by all models. """
|
||||
_inherit = 'base'
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
record = super(Base, self).create(vals)
|
||||
on_record_create.fire(self.env, self._name, record.id, vals)
|
||||
return record
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class Base(models.AbstractModel):
|
||||
_inherit = 'base'
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
record = super(Base, self).create(vals)
|
||||
self._event('on_record_create').notify(record, fields=vals.keys())
|
||||
return record
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* No more imports are needed for the invocation
|
||||
Only the arguments you want to pass should be passed to
|
||||
:meth:`odoo.addons.component_event.components.event.CollectedEvents.notify`.
|
||||
* The name of the event must start with ``'on_'``
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :mod:`odoo.addons.component_event.components.event`
|
||||
|
||||
|
||||
Listening to an event
|
||||
=====================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.event import on_record_create
|
||||
|
||||
@on_record_create
|
||||
def delay_export(env, model_name, record_id, vals):
|
||||
if session.context.get('connector_no_export'):
|
||||
return
|
||||
fields = vals.keys()
|
||||
export_record.delay(session, model_name, record_id, fields=fields)
|
||||
|
||||
@on_something
|
||||
def do_anything(env, model_name, record_id):
|
||||
# ...
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
from odoo.addons.component_event import skip_if
|
||||
|
||||
class MagentoListener(Component):
|
||||
_name = 'magento.event.listener'
|
||||
_inherit = 'base.connector.listener'
|
||||
|
||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||
def on_record_create(self, record, fields=None):
|
||||
""" Called when a record is created """
|
||||
record.with_delay().export_record(fields=fields)
|
||||
|
||||
def on_something(self, record):
|
||||
# ...
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The listeners are now components
|
||||
* The name of the method is the same than the one notified in the previous
|
||||
section
|
||||
* A listener Component might container several listener methods
|
||||
* It must inherit from ``'base.event.listener'``, or one of its descendants.
|
||||
* The check of the key ``connector_no_export`` in the context can
|
||||
be replaced by the decorator :func:`odoo.addons.component_event.skip_if`
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :mod:`odoo.addons.component_event.components.event`
|
||||
|
||||
|
||||
Listening to an event only for some Models
|
||||
==========================================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.event import on_record_create
|
||||
|
||||
@on_record_create(model_names=['magento.address', 'magento.res.partner'])
|
||||
def delay_export(env, model_name, record_id, vals):
|
||||
if session.context.get('connector_no_export'):
|
||||
return
|
||||
fields = vals.keys()
|
||||
export_record.delay(session, model_name, record_id, fields=fields)
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
from odoo.addons.component_event import skip_if
|
||||
|
||||
class MagentoListener(Component):
|
||||
_name = 'magento.event.listener'
|
||||
_inherit = 'base.event.listener'
|
||||
_apply_on = ['magento.address', 'magento.res.partner']
|
||||
|
||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||
def on_record_create(self, record, fields=None):
|
||||
""" Called when a record is created """
|
||||
record.with_delay().export_record(fields=fields)
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* Same than previous example but we added ``_apply_on`` on the Component.
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :mod:`odoo.addons.component_event.components.event`
|
||||
|
||||
|
||||
********************
|
||||
Migrating Components
|
||||
********************
|
||||
|
||||
Backends
|
||||
========
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
You could have several versions for a backend:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
magento = backend.Backend('magento')
|
||||
""" Generic Magento Backend """
|
||||
|
||||
magento1700 = backend.Backend(parent=magento, version='1.7')
|
||||
""" Magento Backend for version 1.7 """
|
||||
|
||||
magento1900 = backend.Backend(parent=magento, version='1.9')
|
||||
""" Magento Backend for version 1.9 """
|
||||
|
||||
|
||||
|
||||
It was linked with a Backend model such as:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class MagentoBackend(models.Model):
|
||||
_name = 'magento.backend'
|
||||
_description = 'Magento Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
_backend_type = 'magento'
|
||||
|
||||
@api.model
|
||||
def select_versions(self):
|
||||
""" Available versions in the backend.
|
||||
Can be inherited to add custom versions. Using this method
|
||||
to add a version from an ``_inherit`` does not constrain
|
||||
to redefine the ``version`` field in the ``_inherit`` model.
|
||||
"""
|
||||
return [('1.7', '1.7+')]
|
||||
|
||||
version = fields.Selection(selection='select_versions', required=True)
|
||||
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
All the :class:`backend.Backend` instances must be deleted.
|
||||
|
||||
And the ``_backend_type`` must be removed from the Backend model.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class MagentoBackend(models.Model):
|
||||
_name = 'magento.backend'
|
||||
_description = 'Magento Backend'
|
||||
_inherit = 'connector.backend'
|
||||
|
||||
@api.model
|
||||
def select_versions(self):
|
||||
""" Available versions in the backend.
|
||||
Can be inherited to add custom versions. Using this method
|
||||
to add a version from an ``_inherit`` does not constrain
|
||||
to redefine the ``version`` field in the ``_inherit`` model.
|
||||
"""
|
||||
return [('1.7', '1.7+')]
|
||||
|
||||
version = fields.Selection(selection='select_versions', required=True)
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The version is now optional in the Backend Models.
|
||||
* Backend Models are based on Component's Collections:
|
||||
:class:`odoo.addons.component.models.collection.Collection`
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
* :class:`odoo.addons.component.models.collection.Collection`
|
||||
|
||||
|
||||
Inheritance
|
||||
===========
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
You could inherit a ``ConnectorUnit`` by creating a custom Backend
|
||||
version and decorating your class with it
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
magento_custom = backend.Backend(parent=magento1700, version='custom')
|
||||
""" Custom Magento Backend """
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# base one
|
||||
@magento
|
||||
class MagentoPartnerAdapter(GenericAdapter):
|
||||
# ...
|
||||
|
||||
# other file...
|
||||
|
||||
from .backend import magento_custom
|
||||
|
||||
# custom one
|
||||
@magento_custom
|
||||
class MyPartnerAdapter(MagentoPartnerAdapter):
|
||||
# ...
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
You could also replace an existing class, this is mentionned in `Replace or
|
||||
unregister a component`_.
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
For an existing component:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MagentoPartnerAdapter(Component):
|
||||
_name = 'magento.partner.adapter'
|
||||
_inherit = 'magento.adapter'
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
You can extend it:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MyPartnerAdapter(Component):
|
||||
_inherit = 'magento.partner.adapter'
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
Or create a new different component with the existing one as base:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MyPartnerAdapter(Component):
|
||||
_name = 'my.magento.partner.adapter'
|
||||
_inherit = 'magento.partner.adapter'
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The inheritance is similar to the Odoo's one (without ``_inherits``.
|
||||
* All components have a Python inheritance on
|
||||
:class:`~odoo.addons.component.core.AbstractComponent` or
|
||||
:class:`~odoo.addons.component.core.Component`
|
||||
* The names are global (as in Odoo), so you should prefix them with a namespace
|
||||
* The name of the classes has no effect
|
||||
* As in Odoo Models, a Component can ``_inherit`` from a list of Components
|
||||
* All components implicitly inherits from a ``'base'`` component
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
* :class:`odoo.addons.component.core.AbstractComponent`
|
||||
|
||||
|
||||
|
||||
Entrypoint for working with components
|
||||
======================================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
Previously, when you had to work with ``ConnectorUnit`` from a Model or from a job,
|
||||
depending of the Odoo version you to:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.connector import ConnectorEnvironment
|
||||
|
||||
# ...
|
||||
|
||||
backend_record = session.env['magento.backend'].browse(backend_id)
|
||||
env = ConnectorEnvironment(backend_record, 'magento.res.partner')
|
||||
importer = env.get_connector_unit(MagentoImporter)
|
||||
importer.run(magento_id, force=force)
|
||||
|
||||
Or:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.connector.connector import ConnectorEnvironment
|
||||
from odoo.addons.connector.session import ConnectorSession
|
||||
|
||||
#...
|
||||
|
||||
backend_record = session.env['magento.backend'].browse(backend_id)
|
||||
session = ConnectorSession.from_env(self.env)
|
||||
env = ConnectorEnvironment(backend_record, session, 'magento.res.partner')
|
||||
importer = env.get_connector_unit(MagentoImporter)
|
||||
importer.run(external_id, force=force)
|
||||
|
||||
Which was commonly abstracted in a helper function such as:
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def get_environment(session, model_name, backend_id):
|
||||
""" Create an environment to work with. """
|
||||
backend_record = session.env['magento.backend'].browse(backend_id)
|
||||
env = ConnectorEnvironment(backend_record, session, 'magento.res.partner')
|
||||
lang = backend_record.default_lang_id
|
||||
lang_code = lang.code if lang else 'en_US'
|
||||
if lang_code == session.context.get('lang'):
|
||||
return env
|
||||
else:
|
||||
with env.session.change_context(lang=lang_code):
|
||||
return env
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# ...
|
||||
backend_record = self.env['magento.backend'].browse(backend_id)
|
||||
with backend_record.work_on('magento.res.partner') as work:
|
||||
importer = work.component(usage='record.importer')
|
||||
importer.run(external_id, force=force)
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* And when you are already in a Component, refer to `Find a component`_
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :class:`~odoo.addons.component.core.WorkContext`
|
||||
|
||||
|
||||
Find a component
|
||||
================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
To find a ``ConnectorUnit``, you had to ask for given class or subclass:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# our ConnectorUnit to find
|
||||
@magento
|
||||
class MagentoPartnerAdapter(GenericAdapter):
|
||||
_model_name = ['magent.res.partner']
|
||||
|
||||
# other file...
|
||||
|
||||
def run(self, record):
|
||||
backend_adapter = self.unit_for(GenericAdapter)
|
||||
|
||||
It was searched for the current model and the current backend.
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
For an existing component:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MagentoPartnerAdapter(Component):
|
||||
_name = 'magento.partner.adapter'
|
||||
_inherit = 'magento.adapter'
|
||||
|
||||
_usage = 'backend.adapter'
|
||||
_collection = 'magento.backend'
|
||||
_apply_on = ['res.partner']
|
||||
|
||||
# other file...
|
||||
|
||||
def run(self, record):
|
||||
backend_adapter = self.component(usage='backend.adapter')
|
||||
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* The model is compared with the ``_apply_on`` attribute
|
||||
* The Backend is compared with the ``_collection`` attribute, it must
|
||||
have the same name than the Backend Model.
|
||||
* The ``_usage`` indicates what the purpose of the component is, and
|
||||
allow to find the correct one for our task. It allow more dynamic
|
||||
usages than the previous usage of a class.
|
||||
* Usually, the ``_usage`` and the ``_collection`` will be ``_inherit`` 'ed from
|
||||
a component (here from ``'magento.adapter``), so they won't need to be
|
||||
repeated in all Components.
|
||||
* A good idea is to have a base abstract Component for the Collection, then
|
||||
an abstract Component for every usage::
|
||||
|
||||
class BaseMagentoConnectorComponent(AbstractComponent):
|
||||
|
||||
_name = 'base.magento.connector'
|
||||
_inherit = 'base.connector'
|
||||
_collection = 'magento.backend'
|
||||
|
||||
class MagentoBaseExporter(AbstractComponent):
|
||||
""" Base exporter for Magento """
|
||||
|
||||
_name = 'magento.base.exporter'
|
||||
_inherit = ['base.exporter', 'base.magento.connector']
|
||||
_usage = 'record.exporter'
|
||||
|
||||
class MagentoImportMapper(AbstractComponent):
|
||||
_name = 'magento.import.mapper'
|
||||
_inherit = ['base.magento.connector', 'base.import.mapper']
|
||||
_usage = 'import.mapper'
|
||||
|
||||
# ...
|
||||
|
||||
* The main usages are:
|
||||
* import.mapper
|
||||
* export.mapper
|
||||
* backend.adapter
|
||||
* importer
|
||||
* exporter
|
||||
* binder
|
||||
* event.listener
|
||||
* But for the importer and exporter, I recommend to use more precise ones in
|
||||
the connectors: record.importer, record.exporter, batch.importer,
|
||||
batch.exporter
|
||||
* You are allowed to be creative with the ``_usage``, it's the key that will
|
||||
allow you to find the right one component you need. (e.g. on
|
||||
``stock.picking`` you need to 1. export the record, 2. export the tracking.
|
||||
Then use ``record.exporter`` and ``tracking.exporter``).
|
||||
* AbstractComponent will never be returned by a lookup
|
||||
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
* :class:`odoo.addons.component.core.AbstractComponent`
|
||||
|
||||
|
||||
Backend Versions
|
||||
================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
You could have several versions for a backend:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
magento = backend.Backend('magento')
|
||||
""" Generic Magento Backend """
|
||||
|
||||
magento1700 = backend.Backend(parent=magento, version='1.7')
|
||||
""" Magento Backend for version 1.7 """
|
||||
|
||||
magento1900 = backend.Backend(parent=magento, version='1.9')
|
||||
""" Magento Backend for version 1.9 """
|
||||
|
||||
|
||||
And use them for a class-level dynamic dispatch
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.magentoerpconnect.backend import magento1700, magento1900
|
||||
|
||||
@magento1700
|
||||
class PartnerAdapter1700(GenericAdapter):
|
||||
# ...
|
||||
|
||||
def do_something(self):
|
||||
# do it this way
|
||||
|
||||
@magento1900
|
||||
class PartnerAdapter1900(GenericAdapter):
|
||||
# ...
|
||||
|
||||
def do_something(self):
|
||||
# do it that way
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
This feature has been removed, it introduced a lot of complexity (notably
|
||||
regarding inheritance) for few gain. The version is now optional on the
|
||||
backends and the version dispatch, if needed, should be handled manually.
|
||||
|
||||
In methods:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class PartnerAdapter(Component):
|
||||
# ...
|
||||
|
||||
def do_something(self):
|
||||
if self.backend_record.version == '1.7':
|
||||
# do it this way
|
||||
else:
|
||||
# do it that way
|
||||
|
||||
Or with a factory:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class PartnerAdapterFactory(Component):
|
||||
# ...
|
||||
|
||||
def get_component(self, version):
|
||||
if self.backend_record.version == '1.7':
|
||||
return self.component(usage='backend.adapter.1.7')
|
||||
else:
|
||||
return self.component(usage='backend.adapter.1.9')
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* None
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
|
||||
|
||||
Replace or unregister a component
|
||||
=================================
|
||||
|
||||
Before
|
||||
------
|
||||
|
||||
You could replace a ``ConnectorUnit`` with the ``replace`` argument passed to
|
||||
the backend decorator:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
@magento(replacing=product.ProductImportMapper)
|
||||
class ProductImportMapper(product.ProductImportMapper):
|
||||
|
||||
|
||||
After
|
||||
-----
|
||||
|
||||
First point: this should hardly be needed now, as you can inherit a component
|
||||
like Odoo Models. Still, if you need to totally replace a component by
|
||||
another, let's say there is this component:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class ProductImportMapper(Component):
|
||||
_name = 'magento.product.import.mapper'
|
||||
_inherit = 'magento.import.mapper'
|
||||
|
||||
_apply_on = ['magento.product.product']
|
||||
# normally the following attrs are inherited from the _inherit
|
||||
_usage = 'import.mapper'
|
||||
_collection = 'magento.backend'
|
||||
|
||||
|
||||
Then you can remove the usage of the component: it will never be used:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class ProductImportMapper(Component):
|
||||
_inherit = 'magento.product.import.mapper'
|
||||
_usage = None
|
||||
|
||||
And create your own, that will be picked up instead of the base one:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from odoo.addons.component.core import Component
|
||||
|
||||
class MyProductImportMapper(Component):
|
||||
_name = 'my.magento.product.import.mapper'
|
||||
_inherit = 'magento.import.mapper'
|
||||
|
||||
_apply_on = ['magento.product.product']
|
||||
# normally the following attrs are inherited from the _inherit
|
||||
_usage = 'import.mapper'
|
||||
_collection = 'magento.backend'
|
||||
|
||||
|
||||
Observations
|
||||
------------
|
||||
|
||||
* None
|
||||
|
||||
Links
|
||||
-----
|
||||
|
||||
* :ref:`api-component`
|
||||
|
||||
|
||||
Various hints
|
||||
=============
|
||||
|
||||
* The components and the jobs know how to work with Model instances,
|
||||
so prefer them over ids in parameters.
|
||||
126
odoo-bringout-oca-connector-connector/connector/doc/index.rst
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
.. Connectors documentation master file, created by
|
||||
sphinx-quickstart on Mon Feb 4 11:35:44 2013.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
##############
|
||||
Odoo Connector
|
||||
##############
|
||||
|
||||
Odoo Connector is a powerful framework to develop any kind of
|
||||
bi-directional connector between `Odoo`_ (Open Source ERP) and any other
|
||||
software or service.
|
||||
|
||||
This Odoo add-on has a modular and generic core, with the
|
||||
ability to be extended with additional modules for new features or
|
||||
customizations.
|
||||
|
||||
The development of Odoo Connector has been started by `Camptocamp`_ and is now
|
||||
maintained by `Camptocamp`_, `Akretion`_, `Acsone`_ and several :ref:`contributors`.
|
||||
|
||||
It got a major overhaul in 2017 (Odoo 10.0). A :ref:`migration-guide` is
|
||||
available.
|
||||
|
||||
*Subscribe to the* `project's mailing list (name: Connectors)`_
|
||||
|
||||
*Learn how to* :ref:`contribute`
|
||||
|
||||
*************
|
||||
Core Features
|
||||
*************
|
||||
|
||||
* **100% Open Source** (`LGPL version 3`_): the full `source code is available
|
||||
on GitHub`_
|
||||
* Not only designed to connect Odoo with e-commerce backends,
|
||||
rather it is **adaptable** to connect Odoo with any type of service.
|
||||
* **Robust for high volumetries** and **easy to monitor** thanks to a :ref:`jobs-queue`.
|
||||
* A flexible set of building blocks, it does not force to a certain
|
||||
implementation but leaves the final choice to the
|
||||
developer on how to use the proposed pieces.
|
||||
* See a :ref:`code-overview` with examples of code
|
||||
|
||||
.. _Odoo: https://www.odoo.com
|
||||
.. _Camptocamp: https://www.camptocamp.com
|
||||
.. _Akretion: http://www.akretion.com
|
||||
.. _Acsone: https://www.acsone.eu
|
||||
.. _`source code is available on GitHub`: https://github.com/OCA/connector
|
||||
.. _`LGPL version 3`: https://www.gnu.org/licenses/lgpl-3.0.html
|
||||
.. _`project's mailing list (name: Connectors)`: https://odoo-community.org/groups
|
||||
|
||||
*****************
|
||||
Developer's guide
|
||||
*****************
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
guides/migration_guide.rst
|
||||
guides/code_overview.rst
|
||||
guides/concepts.rst
|
||||
guides/bootstrap_connector.rst
|
||||
guides/jobrunner.rst
|
||||
|
||||
API Reference
|
||||
=============
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
api/api_components.rst
|
||||
api/api_backend.rst
|
||||
api/api_event.rst
|
||||
api/api_queue.rst
|
||||
api/api_exception.rst
|
||||
api/api_channels.rst
|
||||
|
||||
*******
|
||||
Project
|
||||
*******
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
project/contribute
|
||||
project/contributors
|
||||
project/license
|
||||
project/roadmap
|
||||
|
||||
*********************************
|
||||
Connectors based on the framework
|
||||
*********************************
|
||||
|
||||
* `Magento Connector <http://www.odoo-magento-connector.com>`_
|
||||
* `Prestashop Connector <https://github.com/OCA/connector-prestashop>`_
|
||||
* `Search Engine Connector <https://github.com/akretion/connector-search-engine>`_
|
||||
* `CMIS <https://github.com/OCA/connector-cmis>`_
|
||||
* `Odoo Asynchronous import module <https://github.com/OCA/connector-interfaces/tree/8.0/base_import_async>`_
|
||||
* `Salesforce Connector <https://github.com/OCA/connector-salesforce>`_
|
||||
* `JIRA Connector <https://github.com/camptocamp/connector-jira>`_
|
||||
* `Google Spreadsheet Connector <https://github.com/akretion/connector-google-spreadsheet>`_
|
||||
* `Connector Exchange <https://github.com/camptocamp/connector-exchange/tree/10.0>`_
|
||||
* `Infor Connector <https://github.com/OCA/connector-infor>`_
|
||||
* `Voicent Connector <https://github.com/ursais/osi-addons>`_
|
||||
* Develop easily and rapidly your own connector based on this powerful
|
||||
framework and list your project on this page! Examples:
|
||||
|
||||
* E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce connector, Odoo Spree connector, Odoo Ebay connector, Odoo Amazon connector…
|
||||
* CMS: Odoo Wordpress connector…
|
||||
* CRM: Odoo SugarCRM connector, Odoo Zabbix connector…
|
||||
* Project Management: Odoo Redmine connector…
|
||||
* Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…
|
||||
|
||||
|
||||
*****
|
||||
Talks
|
||||
*****
|
||||
|
||||
* `A jobs queue for processing tasks asynchronously. Leonardo Pistone & Guewen Baconnier (2015) <https://fr.slideshare.net/camptocamp/a-jobs-queue-for-processing-tasks-asynchronously>`_
|
||||
* `E-commerce: the new Magento - OpenERP Connector: a generic connector to any apps. Luc Maurer & Guewen Baconnier, Camptocamp (2013) <https://fr.slideshare.net/openobject/ecommerce-the-new-magento-open-erp-connector-a-generic-connector-to-any-apps-luc-maurer-guewen-baconnier-camptocamp>`_
|
||||
|
||||
******************
|
||||
Indices and tables
|
||||
******************
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
|
|
@ -0,0 +1,281 @@
|
|||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Connector\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-04-15 22:28+0300\n"
|
||||
"PO-Revision-Date: 2015-05-05 11:52+0100\n"
|
||||
"Last-Translator: Guewen Baconnier <guewen.baconnier@camptocamp.com>\n"
|
||||
"Language-Team: fr <LL@li.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.5.4\n"
|
||||
|
||||
#: ../../index.rst:21
|
||||
msgid "*Subscribe to the* `project's mailing list`_"
|
||||
msgstr "*Inscrivez-vous à la* `project's mailing list`_ *(en anglais)*"
|
||||
|
||||
#: ../../index.rst:23
|
||||
msgid "*Learn how to* :ref:`contribute`"
|
||||
msgstr "*Découvrez comment* :ref:`contribute`"
|
||||
|
||||
#: ../../index.rst:27
|
||||
msgid "Core Features"
|
||||
msgstr "Fonctionnalités de base"
|
||||
|
||||
#: ../../index.rst:29
|
||||
msgid ""
|
||||
"**100% Open Source** (`LGPL version 3`_): the full `source code is available "
|
||||
"on GitHub`_"
|
||||
msgstr ""
|
||||
"**100% Open Source** (`LGPL version 3`_): la totalité du `code source est "
|
||||
"disponible sur GitHub`_"
|
||||
|
||||
#: ../../index.rst:33
|
||||
msgid ""
|
||||
"**Robust for high volumetries** and **easy to monitor** thanks to a :ref:"
|
||||
"`jobs-queue`."
|
||||
msgstr ""
|
||||
"**Robuste pour des volumétries importantes** et **faciler à surveiller** "
|
||||
"grâce à la :ref:`jobs-queue`."
|
||||
|
||||
#: ../../index.rst:34
|
||||
msgid ""
|
||||
"A flexible set of building blocks, it does not force to a certain "
|
||||
"implementation but leaves the final choice to the developer on how to use "
|
||||
"the proposed pieces."
|
||||
msgstr ""
|
||||
"Un ensemble flexible de blocs de construction : il n'oblige pas à respecter "
|
||||
"une implémentation particulière mais laisse le choix final au développeur "
|
||||
"sur la manière d'utiliser les composants."
|
||||
|
||||
#: ../../index.rst:37
|
||||
msgid "See a :ref:`code-overview` with examples of code"
|
||||
msgstr "Voir le :ref:`code-overview` et les exemples de code"
|
||||
|
||||
#: ../../index.rst:48
|
||||
msgid "Connectors based on the framework"
|
||||
msgstr "Connecteurs basés sur le framework"
|
||||
|
||||
#: ../../index.rst:50
|
||||
msgid "`Magento Connector <http://www.odoo-magento-connector.com>`_"
|
||||
msgstr "`Connecteur Magento <http://www.odoo-magento-connector.com>`_"
|
||||
|
||||
#: ../../index.rst:51
|
||||
msgid "`Prestashop Connector <https://github.com/OCA/connector-prestashop>`_"
|
||||
msgstr "`Connecteur Prestashop <https://github.com/OCA/connector-prestashop>`_"
|
||||
|
||||
#: ../../index.rst:52
|
||||
msgid "`solerp (Solr Connector) <https://github.com/akretion/solerp>`_"
|
||||
msgstr "`solerp (Connecteur Solr) <https://github.com/akretion/solerp>`_"
|
||||
|
||||
#: ../../index.rst:54
|
||||
msgid "`CMIS <https://github.com/OCA/connector-cmis>`_"
|
||||
msgstr "`Connecteur CMIS <https://github.com/OCA/connector-cmis>`_"
|
||||
|
||||
#: ../../index.rst:58
|
||||
msgid ""
|
||||
"Develop easily and rapidly your own connector based on this powerful "
|
||||
"framework and list your project on this page! Examples:"
|
||||
msgstr ""
|
||||
"Développez facilement et rapidement votre propre connecteur basé sur ce "
|
||||
"puissant framework et ajoutez votre projet sur cette page ! Exemples :"
|
||||
|
||||
#: ../../index.rst:69
|
||||
msgid "Overview"
|
||||
msgstr "Présentation"
|
||||
|
||||
#: ../../index.rst:79
|
||||
msgid "Top financial contributors"
|
||||
msgstr "Principaux contributeurs financiers"
|
||||
|
||||
#: ../../index.rst:90
|
||||
msgid "*See all the project's* :ref:`financial-contributors`."
|
||||
msgstr "*Voir tous les* :ref:`financial-contributors` *du projet*."
|
||||
|
||||
#: ../../index.rst:94
|
||||
msgid "Project"
|
||||
msgstr "Projet"
|
||||
|
||||
#: ../../index.rst:107
|
||||
msgid "Developer's guide"
|
||||
msgstr "Guide du développeur"
|
||||
|
||||
#: ../../index.rst:118
|
||||
msgid "API Reference"
|
||||
msgstr "Référence de l'API"
|
||||
|
||||
#: ../../index.rst:136
|
||||
msgid "Indices and tables"
|
||||
msgstr "Index et tables"
|
||||
|
||||
#: ../../index.rst:138
|
||||
msgid ":ref:`genindex`"
|
||||
msgstr ":ref:`genindex`"
|
||||
|
||||
#: ../../index.rst:139
|
||||
msgid ":ref:`modindex`"
|
||||
msgstr ":ref:`modindex`"
|
||||
|
||||
#: ../../index.rst:140
|
||||
msgid ":ref:`search`"
|
||||
msgstr ":ref:`search`"
|
||||
|
||||
#: ../../index.rst:8
|
||||
msgid "Odoo Connector"
|
||||
msgstr "Odoo Connector"
|
||||
|
||||
#: ../../index.rst:10
|
||||
msgid ""
|
||||
"Odoo Connector is a powerful framework to develop any kind of bi-directional "
|
||||
"connector between `Odoo`_ (Open Source ERP) and any other software or "
|
||||
"service."
|
||||
msgstr ""
|
||||
"`Odoo Connector` est un puissant framework de développement de connecteur bi-"
|
||||
"directionnel entre `Odoo`_ (ERP Open Source) et tout autre logiciel ou "
|
||||
"service."
|
||||
|
||||
#: ../../index.rst:14
|
||||
msgid ""
|
||||
"This Odoo add-on has a modular and generic core, with the ability to be "
|
||||
"extended with additional modules for new features or customizations."
|
||||
msgstr ""
|
||||
"Ce module Odoo a un cœur modulaire et générique, capable d'être lui-même "
|
||||
"étendu grâce à des modules additionnels, pour ajouter des nouvelles "
|
||||
"fonctions ou des personnalisations."
|
||||
|
||||
#: ../../index.rst:18
|
||||
msgid ""
|
||||
"The development of Odoo Connector has been started by `Camptocamp`_ and is "
|
||||
"now maintained by `Camptocamp`_, `Akretion`_ and several :ref:`contributors`."
|
||||
msgstr ""
|
||||
"Le développement du Connecteur Odoo a été démarré par `Camptocamp`_ et est "
|
||||
"maintenu par `Camptocamp`_, `Akretion`_ et d'autres :ref:`contributors`."
|
||||
|
||||
#: ../../index.rst:31
|
||||
msgid ""
|
||||
"Not only designed to connect Odoo with e-commerce backends, rather it is "
|
||||
"**adaptable** to connect Odoo with any type of service."
|
||||
msgstr ""
|
||||
"Pas uniquement conçu pour connecter Odoo à des backend e-commerce, mais "
|
||||
"**adaptable** pour connecter Odoo à tout type de service."
|
||||
|
||||
#: ../../index.rst:53
|
||||
msgid ""
|
||||
"`Odoo Multi Company <http://www.odoo.net.cn/new-intercompany-process-"
|
||||
"module/>`_"
|
||||
msgstr ""
|
||||
"`Odoo Multi-sociétés <http://www.odoo.net.cn/new-intercompany-process-"
|
||||
"module/>`_"
|
||||
|
||||
#: ../../index.rst:55
|
||||
msgid ""
|
||||
"`Odoo Asynchronous import module <https://github.com/OCA/connector-"
|
||||
"interfaces/tree/8.0/base_import_async>`_"
|
||||
msgstr ""
|
||||
"`Module Odoo d'import asynchrone <https://github.com/OCA/connector-"
|
||||
"interfaces/tree/8.0/base_import_async>`_"
|
||||
|
||||
#: ../../index.rst:56
|
||||
msgid "`Salesforce Connector <https://github.com/OCA/connector-salesforce>`_"
|
||||
msgstr "`Connecteur Salesforce <https://github.com/OCA/connector-salesforce>`_"
|
||||
|
||||
#: ../../index.rst:57
|
||||
msgid ""
|
||||
"`Google Spreadsheet Connector <https://github.com/akretion/connector-google-"
|
||||
"spreadsheet>`_"
|
||||
msgstr ""
|
||||
"`Connecteur Google Spreadsheet <https://github.com/akretion/connector-google-"
|
||||
"spreadsheet>`_"
|
||||
|
||||
#: ../../index.rst:61
|
||||
msgid ""
|
||||
"E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce connector, Odoo "
|
||||
"Spree connector, Odoo Ebay connector, Odoo Amazon connector…"
|
||||
msgstr ""
|
||||
"E-Commerce : connecteur Odoo OsCommerce, connecteur Odoo Drupal Commerce, "
|
||||
"connecteur Odoo Spree, connecteur Odoo Ebay, connecteur Odoo Amazon…"
|
||||
|
||||
#: ../../index.rst:62
|
||||
msgid "CMS: Odoo Wordpress connector…"
|
||||
msgstr "CMS : connecteur Odoo Wordpress…"
|
||||
|
||||
#: ../../index.rst:63
|
||||
msgid "CRM: Odoo SugarCRM connector, Odoo Zabbix connector…"
|
||||
msgstr "CRM : connecteur Odoo SugarCRM, connecteur Odoo Zabbix…"
|
||||
|
||||
#: ../../index.rst:64
|
||||
msgid "Project Management: Odoo Redmine connector…"
|
||||
msgstr "Gestion de projets : connecteur Odoo Redmine…"
|
||||
|
||||
#: ../../index.rst:65
|
||||
msgid "Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…"
|
||||
msgstr "Ticketing : connecteur Odoo Request Tracker, connecteur Odoo GLPI…"
|
||||
|
||||
#~ msgid "Odoo Connector"
|
||||
#~ msgstr "Odoo Connector"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Odoo Connector is a powerful framework to develop any kind of bi-"
|
||||
#~ "directional connector between `Odoo`_ (Open Source ERP) and any other "
|
||||
#~ "software or service."
|
||||
#~ msgstr ""
|
||||
#~ "`Odoo Connector` est un puissant framework de développement de "
|
||||
#~ "connecteur bi-directionnel entre `Odoo`_ (ERP Open Source) et tout "
|
||||
#~ "autre logiciel ou service."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "This Odoo add-on has a modular and generic core, with the ability to "
|
||||
#~ "be extended with additional modules for new features or customizations."
|
||||
#~ msgstr ""
|
||||
#~ "Ce module Odoo a un cœur modulaire et générique, capable d'être lui-"
|
||||
#~ "même étendu grâce à des modules additionnels, pour ajouter des nouvelles "
|
||||
#~ "fonctions ou des personnalisations."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "The development of Odoo Connector has been started by `Camptocamp`_ "
|
||||
#~ "and is now maintained by `Camptocamp`_, `Akretion`_ and several :ref:"
|
||||
#~ "`contributors`."
|
||||
#~ msgstr ""
|
||||
#~ "Le développement du Connecteur Odoo a été démarré par `Camptocamp`_ et "
|
||||
#~ "est maintenu par `Camptocamp`_, `Akretion`_ et d'autres :ref:"
|
||||
#~ "`contributors`."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Not only designed to connect Odoo with e-commerce backends, rather it "
|
||||
#~ "is **adaptable** to connect Odoo with any type of service."
|
||||
#~ msgstr ""
|
||||
#~ "Pas uniquement conçu pour connecter Odoo à des backend e-commerce, "
|
||||
#~ "mais **adaptable** pour connecter Odoo à tout type de service."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "`Odoo Multi Company <http://www.odoo.net.cn/new-intercompany-"
|
||||
#~ "process-module/>`_"
|
||||
#~ msgstr ""
|
||||
#~ "`Odoo Multi-sociétés <http://www.odoo.net.cn/new-intercompany-"
|
||||
#~ "process-module/>`_"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "E-Commerce: Odoo OsCommerce connector, Odoo Drupal Commerce "
|
||||
#~ "connector, Odoo Spree connector, Odoo Ebay connector, Odoo "
|
||||
#~ "Amazon connector…"
|
||||
#~ msgstr ""
|
||||
#~ "E-Commerce : connecteur Odoo OsCommerce, connecteur Odoo Drupal "
|
||||
#~ "Commerce, connecteur Odoo Spree, connecteur Odoo Ebay, connecteur "
|
||||
#~ "Odoo Amazon…"
|
||||
|
||||
#~ msgid "CMS: Odoo Wordpress connector…"
|
||||
#~ msgstr "CMS : connecteur Odoo Wordpress…"
|
||||
|
||||
#~ msgid "CRM: Odoo SugarCRM connector, Odoo Zabbix connector…"
|
||||
#~ msgstr "CRM : connecteur Odoo SugarCRM, connecteur Odoo Zabbix…"
|
||||
|
||||
#~ msgid "Project Management: Odoo Redmine connector…"
|
||||
#~ msgstr "Gestion de projets : connecteur Odoo Redmine…"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Ticketing: Odoo Request Tracker connector, Odoo GLPI connector…"
|
||||
#~ msgstr ""
|
||||
#~ "Ticketing : connecteur Odoo Request Tracker, connecteur Odoo GLPI…"
|
||||
|
|
@ -0,0 +1,777 @@
|
|||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Connector\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-04-15 22:28+0300\n"
|
||||
"PO-Revision-Date: 2015-05-05 11:48+0100\n"
|
||||
"Last-Translator: Guewen Baconnier <guewen.baconnier@camptocamp.com>\n"
|
||||
"Language-Team: fr <LL@li.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.5.4\n"
|
||||
|
||||
#: ../../project/changes.rst:5
|
||||
msgid "Changes"
|
||||
msgstr "Changements"
|
||||
|
||||
#: ../../../CHANGES.rst:2
|
||||
msgid "3.0.0 (2015-04-01)"
|
||||
msgstr "3.0.0 (2015-04-01)"
|
||||
|
||||
#: ../../../CHANGES.rst:4
|
||||
msgid "/!\\ Backwards incompatible changes inside."
|
||||
msgstr "Attention : changements non rétro-compatibles dans cette version."
|
||||
|
||||
#: ../../../CHANGES.rst:6
|
||||
msgid ""
|
||||
"Add ``odoo.api.Environment`` in ``Session`` It is accessible in ``self."
|
||||
"env`` in ``Session`` and all ``ConnectorUnit`` instances. Also in "
|
||||
"``ConnectorUnit``, ``model`` returns the current (new api!) model:"
|
||||
msgstr ""
|
||||
"Ajout de ``odoo.api.Environment`` dans ``Session`` Accessible via ``self."
|
||||
"env`` dans ``Session`` et toutes les instances ``ConnectorUnit``. Également "
|
||||
"dans ``ConnectorUnit``, ``model`` renvoie le modèle en cours (nouvelle "
|
||||
"API!) :"
|
||||
|
||||
#: ../../../CHANGES.rst:20
|
||||
msgid "Deprecate the CRUD methods in ``Session``"
|
||||
msgstr "Dépréciation des méthodes CRUD dans ``Session``"
|
||||
|
||||
#: ../../../CHANGES.rst:32
|
||||
msgid ""
|
||||
"``Environment.set_lang()`` is removed. It was modifying the context in place "
|
||||
"which is not possible with the new frozendict context. It should be done "
|
||||
"with:"
|
||||
msgstr ""
|
||||
"``Environment.set_lang()`` est supprimé. Il modifiait le contexte sur place "
|
||||
"ce qui n'est pas possible avec les nouveaux context en frozendict. Doit être "
|
||||
"fait avec:"
|
||||
|
||||
#: ../../../CHANGES.rst:41
|
||||
msgid "Add an argument on the Binders methods to return a browse record"
|
||||
msgstr ""
|
||||
"Ajout d'un argument sur les méthodes des Binders pour renvoyer un `browse "
|
||||
"record`"
|
||||
|
||||
#: ../../../CHANGES.rst:47
|
||||
msgid ""
|
||||
"Shorten ``ConnectorUnit.get_binder_for_model`` to ``ConnectorUnit."
|
||||
"binder_for``"
|
||||
msgstr ""
|
||||
"Renommage de ``ConnectorUnit.get_binder_for_model`` vers ``ConnectorUnit."
|
||||
"binder_for``"
|
||||
|
||||
#: ../../../CHANGES.rst:49
|
||||
msgid ""
|
||||
"Shorten ``ConnectorUnit.get_connector_unit_for_model`` to ``ConnectorUnit."
|
||||
"unit_for``"
|
||||
msgstr ""
|
||||
"Renommage de ``ConnectorUnit.get_connector_unit_for_model`` vers "
|
||||
"``ConnectorUnit.unit_for``"
|
||||
|
||||
#: ../../../CHANGES.rst:51
|
||||
msgid ""
|
||||
"Renamed ``Environment`` to ``ConnectorEnvironment`` to avoid confusion with "
|
||||
"``odoo.api.Environment``"
|
||||
msgstr ""
|
||||
"Renommage d'``Environment`` vers ``ConnectorEnvironment`` pour éviter la "
|
||||
"confusion avec ``odoo.api.Environment``"
|
||||
|
||||
#: ../../../CHANGES.rst:53
|
||||
msgid ""
|
||||
"Renamed the class attribute ``ConnectorUnit.model_name`` to ``ConnectorUnit."
|
||||
"for_model_name``."
|
||||
msgstr ""
|
||||
"Renommage de l'attribut de classe ``ConnectorUnit.model_name`` vers "
|
||||
"``ConnectorUnit.for_model_name``."
|
||||
|
||||
#: ../../../CHANGES.rst:55
|
||||
msgid ""
|
||||
"Added ``_base_binder``, ``_base_mapper``, ``_base_backend_adapter`` in the "
|
||||
"synchronizers (Importer, Exporter) so it is no longer required to override "
|
||||
"the ``binder``, ``mapper``, ``backend_adapter`` property methods"
|
||||
msgstr ""
|
||||
"Ajout de ``_base_binder``, ``_base_mapper``, ``_base_backend_adapter`` dans "
|
||||
"les synchroniseurs (Importer, Exporter) donc ce n'est plus nécessaire pour "
|
||||
"surcharger les méthodes property ``binder``, ``mapper``, ``backend_adapter``"
|
||||
|
||||
#: ../../../CHANGES.rst:59
|
||||
msgid ""
|
||||
"``Session.change_context()`` now supports the same argument/keyword "
|
||||
"arguments semantics than ``odoo.model.BaseModel.with_context()``."
|
||||
msgstr ""
|
||||
"``Session.change_context()`` prend maintenant en charge la même sémantique "
|
||||
"d'arguments que ``odoo.model.BaseModel.with_context()``."
|
||||
|
||||
#: ../../../CHANGES.rst:62
|
||||
msgid "Renamed ``ExportSynchronizer`` to ``Exporter``"
|
||||
msgstr "Renommage de ``ExportSynchronizer`` vers ``Exporter``"
|
||||
|
||||
#: ../../../CHANGES.rst:63
|
||||
msgid "Renamed ``ImportSynchronizer`` to ``Importer``"
|
||||
msgstr "Renommage de ``ImportSynchronizer`` vers ``Importer``"
|
||||
|
||||
#: ../../../CHANGES.rst:64
|
||||
msgid "Renamed ``DeleteSynchronizer`` to ``Deleter``"
|
||||
msgstr "Renommage de ``DeleteSynchronizer`` vers ``Deleter``"
|
||||
|
||||
#: ../../../CHANGES.rst:65
|
||||
msgid "``Session.commit`` do not commit when tests are running"
|
||||
msgstr "``Session.commit`` ne commite pas pendant les tests"
|
||||
|
||||
#: ../../../CHANGES.rst:66
|
||||
msgid "Cleaned the methods that have been deprecated in version 2.x"
|
||||
msgstr "Nettoyage des méthodes dépréciées en version 2.x"
|
||||
|
||||
#: ../../../CHANGES.rst:70
|
||||
msgid "2.2.0 (2014-05-26)"
|
||||
msgstr "2.2.0 (2014-05-26)"
|
||||
|
||||
#: ../../../CHANGES.rst:72
|
||||
msgid ""
|
||||
"Job arguments can now contain unicode strings (thanks to Stéphane Bidoul) "
|
||||
"lp:1288187"
|
||||
msgstr ""
|
||||
"Les arguments d'un Job peuvent maintenant contenir des chaînes unicode "
|
||||
"(merci à Stéphane Bidoul) lp:1288187"
|
||||
|
||||
#: ../../../CHANGES.rst:73
|
||||
msgid "List view of the jobs improved"
|
||||
msgstr "Amélioration de la vue en liste des jobs"
|
||||
|
||||
#: ../../../CHANGES.rst:74
|
||||
msgid ""
|
||||
"Jobs now support multicompany (thanks to Laurent Mignon) https://lists."
|
||||
"launchpad.net/odoo-connector-community/msg00253.html)"
|
||||
msgstr ""
|
||||
"Les jobs fonctionnement maintenant en multi-sociétés (merci à Laurent "
|
||||
"Mignon) https://lists.launchpad.net/odoo-connector-community/msg00253."
|
||||
"html)"
|
||||
|
||||
#: ../../../CHANGES.rst:75
|
||||
msgid ""
|
||||
"An action can be assigned to a job. The action is called with a button on "
|
||||
"the job and could be something like open a form view or an url."
|
||||
msgstr ""
|
||||
"Une action peut être affectée à un job. L'action est appelée via un bouton "
|
||||
"sur le job et peut appeler une ouverture de formulaire ou une URL."
|
||||
|
||||
#: ../../../CHANGES.rst:78
|
||||
msgid "2.1.1 (2014-02-06)"
|
||||
msgstr "2.1.1 (2014-02-06)"
|
||||
|
||||
#: ../../../CHANGES.rst:80
|
||||
msgid ""
|
||||
"A user can be blocked because he has no access to the model queue.job when a "
|
||||
"job has been delayed. The creation of a job is low level and should not be "
|
||||
"restrained by the accesses of the user. (lp:1276182)"
|
||||
msgstr ""
|
||||
"Un utilisateur peut être bloqué s'il n'a pas accès au modèle queue.job quand "
|
||||
"un job a été retardé. La création d'un job est à bas niveau et ne devrait "
|
||||
"pas être contrainte par les accès de l'utilisateur. (lp:1276182)"
|
||||
|
||||
#: ../../../CHANGES.rst:85
|
||||
msgid "2.1.0 (2014-01-15 - warning: breaks compatibility)"
|
||||
msgstr "2.1.0 (2014-01-15 - attention : rupture de compatibilité)"
|
||||
|
||||
#: ../../../CHANGES.rst:87
|
||||
msgid ""
|
||||
"Add a new optional keyword argument 'description' to the delay() function of "
|
||||
"a job. If given, the description is used as name of the queue.job record "
|
||||
"stored in Odoo and displayed in the list of jobs."
|
||||
msgstr ""
|
||||
"Ajout d'un nouvel argument nommé 'description' pour la fonction delay() d'un "
|
||||
"job. Si fournie, la description est utilisée comme nom pour "
|
||||
"l'enregistrement ``queue.job`` stocké dans Odoo et affiché dans la liste "
|
||||
"des jobs."
|
||||
|
||||
#: ../../../CHANGES.rst:90
|
||||
msgid ""
|
||||
"Fix: assignment of jobs to workers respect the priority of the jobs "
|
||||
"(lp:1252681)"
|
||||
msgstr ""
|
||||
"Correction: l'affectation des jobs aux workers respecte la priorité des jobs "
|
||||
"(lp:1252681)"
|
||||
|
||||
#: ../../../CHANGES.rst:91
|
||||
msgid ""
|
||||
"Pass a new parameter to listeners of 'on_record_create' ( vals: field "
|
||||
"values of the new record, e.g {'field_name': field_value, ...})"
|
||||
msgstr ""
|
||||
"Passage d'un nouveau paramètre aux abonnés à 'on_record_create' ( vals: "
|
||||
"valeurs du champ du nouvel enregistrement, par ex : {'field_name': "
|
||||
"field_value, ...})"
|
||||
|
||||
#: ../../../CHANGES.rst:93
|
||||
msgid ""
|
||||
"Replace the list of updated fields passed to listeners of 'on_record_write' "
|
||||
"by a dictionary of updated field values e.g {'field_name': field_value, ...}"
|
||||
msgstr ""
|
||||
"Remplacement de la liste des champs modifiés transmis aux abonnés à "
|
||||
"'on_record_write' par un dictionnaire des valeurs des champs modifiés. Par "
|
||||
"ex : {'field_name': field_value, ...}"
|
||||
|
||||
#: ../../../CHANGES.rst:95
|
||||
msgid ""
|
||||
"Add the possibility to use 'Modifiers' functions in the 'direct "
|
||||
"mappings' (details in the documentation of the Mapper class)"
|
||||
msgstr ""
|
||||
"Ajout de la possibilité d'utiliser des fonctions 'Modificatrices' dans les "
|
||||
"'mappings directs' (détails dans la documentation de la classe Mapper)"
|
||||
|
||||
#: ../../../CHANGES.rst:97
|
||||
msgid ""
|
||||
"When a job a delayed, the job's UUID is returned by the delay() function"
|
||||
msgstr ""
|
||||
"Quand un job est retardé, le UUID du job est renvoyé par la fonction delay()"
|
||||
|
||||
#: ../../../CHANGES.rst:98
|
||||
msgid ""
|
||||
"Refactoring of mappers. Much details here: https://code.launchpad.net/"
|
||||
"~odoo-connector-core-editors/odoo-connector/7.0-connector-mapper-"
|
||||
"refactor/+merge/194485"
|
||||
msgstr ""
|
||||
"Refactorisation des mappers. Plus de détails ici : https://code.launchpad."
|
||||
"net/~odoo-connector-core-editors/odoo-connector/7.0-connector-mapper-"
|
||||
"refactor/+merge/194485"
|
||||
|
||||
#: ../../../CHANGES.rst:102
|
||||
msgid "2.0.1 (2013-09-12)"
|
||||
msgstr "2.0.1 (2013-09-12)"
|
||||
|
||||
#: ../../../CHANGES.rst:104
|
||||
msgid ""
|
||||
"Developers of addons do no longer need to create an AbstractModel with a "
|
||||
"_name 'name_of_the_module.installed', instead, they just have to call "
|
||||
"connector.connector.install_in_connector() lp:1196859"
|
||||
msgstr ""
|
||||
"Les développeurs d'addons n'ont plus besoin de créer un AbstractModel avec "
|
||||
"un _name 'nom_module.installed', ils doivent simplement appeler ``connector."
|
||||
"connector.install_in_connector()`` lp:1196859"
|
||||
|
||||
#: ../../../CHANGES.rst:106
|
||||
msgid ""
|
||||
"Added a script `odoo-connector-worker` to start processes for Jobs "
|
||||
"Workers when running Odoo is multiprocessing"
|
||||
msgstr ""
|
||||
"Ajout d'un script `odoo-connector-worker` pour lancer les processus des "
|
||||
"workers de jobs en fonctionnement multi-processus d'Odoo"
|
||||
|
||||
#: ../../../CHANGES.rst:108
|
||||
msgid ""
|
||||
"Fix: do no fail to start when Odoo has access to a not-Odoo database "
|
||||
"(lp:1233388)"
|
||||
msgstr ""
|
||||
"Correction : n'échoue pas au démarrage quand Odoo a accès à une base de "
|
||||
"données non-Odoo (lp:1233388)"
|
||||
|
||||
#: ../../../CHANGES.rst:112
|
||||
msgid "2.0.0"
|
||||
msgstr "2.0.0"
|
||||
|
||||
#: ../../../CHANGES.rst:114
|
||||
msgid "First release"
|
||||
msgstr "Première version"
|
||||
|
||||
#: ../../project/contribute.rst:5
|
||||
msgid "Contribute"
|
||||
msgstr "Contribuer"
|
||||
|
||||
#: ../../project/contribute.rst:7
|
||||
msgid "We accept with pleasure all type of contributions:"
|
||||
msgstr "Nous acceptons avec plaisir tous types de contributions :"
|
||||
|
||||
#: ../../project/contribute.rst:9
|
||||
msgid "bug reports"
|
||||
msgstr "Signalement d'anomalies"
|
||||
|
||||
#: ../../project/contribute.rst:10
|
||||
msgid "merge proposals"
|
||||
msgstr "Propositions de corrections"
|
||||
|
||||
#: ../../project/contribute.rst:11
|
||||
msgid "ideas"
|
||||
msgstr "idées"
|
||||
|
||||
#: ../../project/contribute.rst:12
|
||||
msgid "translations"
|
||||
msgstr "traductions"
|
||||
|
||||
#: ../../project/contribute.rst:13
|
||||
msgid "..."
|
||||
msgstr "..."
|
||||
|
||||
#: ../../project/contribute.rst:15
|
||||
msgid ""
|
||||
"Have a look on the :ref:`Magento Connector Developer's Guide "
|
||||
"<connectormagento:contribute>` which is more complete, most of the "
|
||||
"information is the same."
|
||||
msgstr ""
|
||||
"Jetez un œil au :ref:`Guide du développeur du Connecteur Magento "
|
||||
"<connectormagento:contribute>` qui est plus complet, la plupart des "
|
||||
"informations sont les mêmes."
|
||||
|
||||
#: ../../project/contribute.rst:19
|
||||
msgid "The GitHub project is: https://github.com/OCA/connector"
|
||||
msgstr "Le projet GitHub est : https://github.com/OCA/connector"
|
||||
|
||||
#: ../../project/contribute.rst:23
|
||||
msgid "Want to start a new connector"
|
||||
msgstr "Démarrer un nouveau connecteur"
|
||||
|
||||
#: ../../project/contribute.rst:25
|
||||
msgid ""
|
||||
"If you want to start a new connector based on the framework, a sane approach "
|
||||
"is to read this documentation, especially :ref:`concepts` and :ref:"
|
||||
"`bootstrap-connector`."
|
||||
msgstr ""
|
||||
"Si vous voulez fabriquer un nouveau connecteur basé sur le framework, "
|
||||
"l'approche conseillée est de lire cette documentation, en particulier les :"
|
||||
"ref:`concepts` et :ref:`bootstrap-connector`."
|
||||
|
||||
#: ../../project/contribute.rst:33
|
||||
msgid ""
|
||||
"If the connector belongs to the e-commerce domain, you may want to reuse the "
|
||||
"pieces of the `E-Commerce Connector`_ module."
|
||||
msgstr ""
|
||||
"Si le connecteur est dans le domaine e-commerce, vous devriez réutiliser les "
|
||||
"composants du module `E-Commerce Connector`_."
|
||||
|
||||
#: ../../project/contribute.rst:39
|
||||
msgid "Naming conventions"
|
||||
msgstr "Conventions de nommage"
|
||||
|
||||
#: ../../project/contribute.rst:41
|
||||
msgid "The naming conventions for the new projects are the following:"
|
||||
msgstr ""
|
||||
"Les conventions de nommage pour les nouveaux projets sont les suivantes :"
|
||||
|
||||
#: ../../project/contribute.rst:43
|
||||
msgid "Name of the project if it is in the OCA:"
|
||||
msgstr "Nom du projet s'il est dans l'OCA :"
|
||||
|
||||
#: ../../project/contribute.rst:45
|
||||
msgid "connector-xxx"
|
||||
msgstr "connector-xxx"
|
||||
|
||||
#: ../../project/contribute.rst:48
|
||||
msgid "connector_xxx"
|
||||
msgstr "connector_xxx"
|
||||
|
||||
#: ../../project/contribute.rst:53
|
||||
msgid "Example:"
|
||||
msgstr "Exemple :"
|
||||
|
||||
#: ../../project/contribute.rst:51
|
||||
msgid "https://github.com/OCA/connector-magento"
|
||||
msgstr "https://github.com/OCA/connector-magento"
|
||||
|
||||
#: ../../project/contribute.rst:53
|
||||
msgid "``connector_magento``"
|
||||
msgstr "``connector_magento``"
|
||||
|
||||
#: ../../project/contribute.rst:55
|
||||
msgid ""
|
||||
"Actually, the Magento and Prestashop connectors do not respect this "
|
||||
"convention for historical reasons (magentoerpconnect, prestashoperpconnect). "
|
||||
"New projects should ideally respect it."
|
||||
msgstr ""
|
||||
"En réalité les connecteurs Magento et Prestashop ne respectent pas cette "
|
||||
"convention pour des raisons historiques (magentoerpconnect, "
|
||||
"prestashoperpconnect). Les nouveaux projets devraient idéalement la "
|
||||
"respecter."
|
||||
|
||||
#: ../../project/contributors.rst:5
|
||||
msgid "Contributors"
|
||||
msgstr "Contributeurs"
|
||||
|
||||
#: ../../project/contributors.rst:7
|
||||
msgid "List of contributors:"
|
||||
msgstr "Liste des contributeurs :"
|
||||
|
||||
#: ../../../AUTHORS:1
|
||||
msgid "Guewen Baconnier at Camptocamp"
|
||||
msgstr "Guewen Baconnier chez Camptocamp"
|
||||
|
||||
#: ../../../AUTHORS:2
|
||||
msgid "Alexandre Fayolle at Camptocamp"
|
||||
msgstr "Alexandre Fayolle chez Camptocamp"
|
||||
|
||||
#: ../../../AUTHORS:3
|
||||
msgid "Benoit Guillot at Akretion"
|
||||
msgstr "Benoit Guillot chez Akretion"
|
||||
|
||||
#: ../../../AUTHORS:4
|
||||
msgid "Nicolas Bessi at Camptocamp (tiny change)"
|
||||
msgstr "Nicolas Bessi chez Camptocamp (changement minuscule)"
|
||||
|
||||
#: ../../../AUTHORS:5
|
||||
msgid "Joël Grand-Guillaume at Camptocamp (tiny change)"
|
||||
msgstr "Joël Grand-Guillaume chez Camptocamp (changement minuscule)"
|
||||
|
||||
#: ../../../AUTHORS:6
|
||||
msgid "Arthur Vuillard at Akretion (tiny change)"
|
||||
msgstr "Arthur Vuillard chez Akretion (changement minuscule)"
|
||||
|
||||
#: ../../../AUTHORS:7
|
||||
msgid "Sebastien Beau at Akretion (tiny change)"
|
||||
msgstr "Sebastien Beau chez Akretion (changement minuscule)"
|
||||
|
||||
#: ../../../AUTHORS:8
|
||||
msgid "Laurent Mignon at Acsone"
|
||||
msgstr "Laurent Mignon chez Acsone"
|
||||
|
||||
#: ../../../AUTHORS:9
|
||||
msgid "Leonardo Pistone at Camptocamp"
|
||||
msgstr "Leonardo Pistone chez Camptocamp"
|
||||
|
||||
#: ../../../AUTHORS:10
|
||||
msgid "David Béal at Akretion (tiny change)"
|
||||
msgstr "David Béal chez Akretion (changement minuscule)"
|
||||
|
||||
#: ../../project/contributors.rst:16
|
||||
msgid "Financial Contributors"
|
||||
msgstr "Contributeurs financiers"
|
||||
|
||||
#: ../../project/contributors.rst:18
|
||||
msgid ""
|
||||
"A fund raising has been done during the year 2013, allowing us to develop "
|
||||
"the connector framework and the Magento connector."
|
||||
msgstr ""
|
||||
"Une levée de fond a été réalisée en 2013, et a permis de développer le "
|
||||
"framework Connecteur et le Connecteur Magento."
|
||||
|
||||
#: ../../project/contributors.rst:21
|
||||
msgid ""
|
||||
"Here is the list of the funders, ordered by the amount of the contribution:"
|
||||
msgstr "Voici la liste des fondateurs, classée par volume de contribution :"
|
||||
|
||||
#: ../../project/contributors.rst:23
|
||||
msgid "**Logic Supply**"
|
||||
msgstr "**Logic Supply**"
|
||||
|
||||
#: ../../project/contributors.rst:24
|
||||
msgid "**Debonix**"
|
||||
msgstr "**Debonix**"
|
||||
|
||||
#: ../../project/contributors.rst:25
|
||||
msgid "Apertoso"
|
||||
msgstr "Apertoso"
|
||||
|
||||
#: ../../project/contributors.rst:26
|
||||
msgid "OpenBIG"
|
||||
msgstr "OpenBIG"
|
||||
|
||||
#: ../../project/contributors.rst:27
|
||||
msgid "Smile"
|
||||
msgstr "Smile"
|
||||
|
||||
#: ../../project/contributors.rst:28
|
||||
msgid "IT Service Partners"
|
||||
msgstr "IT Service Partners"
|
||||
|
||||
#: ../../project/contributors.rst:29
|
||||
msgid "WillowIT"
|
||||
msgstr "WillowIT"
|
||||
|
||||
#: ../../project/contributors.rst:30
|
||||
msgid "Eezee-It"
|
||||
msgstr "Eezee-It"
|
||||
|
||||
#: ../../project/contributors.rst:31
|
||||
msgid "Auguria"
|
||||
msgstr "Auguria"
|
||||
|
||||
#: ../../project/contributors.rst:32
|
||||
msgid "Enova"
|
||||
msgstr "Enova"
|
||||
|
||||
#: ../../project/contributors.rst:33
|
||||
msgid "Mr. Goran Sunjka"
|
||||
msgstr "M. Goran Sunjka"
|
||||
|
||||
#: ../../project/contributors.rst:34
|
||||
msgid "Taktik"
|
||||
msgstr "Taktik"
|
||||
|
||||
#: ../../project/contributors.rst:35
|
||||
msgid "Maison del Gusto"
|
||||
msgstr "Maison del Gusto"
|
||||
|
||||
#: ../../project/contributors.rst:36
|
||||
msgid "Open2bizz Software"
|
||||
msgstr "Open2bizz Software"
|
||||
|
||||
#: ../../project/contributors.rst:37
|
||||
msgid "Bee Company"
|
||||
msgstr "Bee Company"
|
||||
|
||||
#: ../../project/contributors.rst:38
|
||||
msgid "initOS"
|
||||
msgstr "initOS"
|
||||
|
||||
#: ../../project/contributors.rst:39
|
||||
msgid "Rhônalia"
|
||||
msgstr "Rhônalia"
|
||||
|
||||
#: ../../project/contributors.rst:40
|
||||
msgid "Julius Network Solutions"
|
||||
msgstr "Julius Network Solutions"
|
||||
|
||||
#: ../../project/contributors.rst:41
|
||||
msgid "Elico Corp"
|
||||
msgstr "Elico Corp"
|
||||
|
||||
#: ../../project/contributors.rst:42
|
||||
msgid "Linko Solutions"
|
||||
msgstr "Linko Solutions"
|
||||
|
||||
#: ../../project/contributors.rst:43
|
||||
msgid "HSP Hanse Shopping"
|
||||
msgstr "HSP Hanse Shopping"
|
||||
|
||||
#: ../../project/contributors.rst:44
|
||||
msgid "Burn Out Italy"
|
||||
msgstr "Burn Out Italy"
|
||||
|
||||
#: ../../project/contributors.rst:45
|
||||
msgid "Mr. Peter Dijkstra"
|
||||
msgstr "M. Peter Dijkstra"
|
||||
|
||||
#: ../../project/contributors.rst:46
|
||||
msgid "Mr. Luc Maurer"
|
||||
msgstr "M. Luc Maurer"
|
||||
|
||||
#: ../../project/contributors.rst:47
|
||||
msgid "Mr. Maxime Chambreuil"
|
||||
msgstr "M. Maxime Chambreuil"
|
||||
|
||||
#: ../../project/contributors.rst:48
|
||||
msgid "Mr. Eric Vernichon"
|
||||
msgstr "M. Eric Vernichon"
|
||||
|
||||
#: ../../project/contributors.rst:49
|
||||
msgid "Avanzosc"
|
||||
msgstr "Avanzosc"
|
||||
|
||||
#: ../../project/contributors.rst:50
|
||||
msgid "Mr. Fabio Martinelli"
|
||||
msgstr "M. Fabio Martinelli"
|
||||
|
||||
#: ../../project/contributors.rst:51
|
||||
msgid "Mr. Marcelo Bello"
|
||||
msgstr "M. Marcelo Bello"
|
||||
|
||||
#: ../../project/contributors.rst:52
|
||||
msgid "Rove.design"
|
||||
msgstr "Rove.design"
|
||||
|
||||
#: ../../project/contributors.rst:53
|
||||
msgid "Mr. Mark Felling"
|
||||
msgstr "M. Mark Felling"
|
||||
|
||||
#: ../../project/contributors.rst:55
|
||||
msgid "Thanks to all of them!"
|
||||
msgstr "Merci à eux !"
|
||||
|
||||
#: ../../project/license.rst:5
|
||||
msgid "License"
|
||||
msgstr "Licence"
|
||||
|
||||
#: ../../project/license.rst:7
|
||||
msgid "This work is licensed under the LGPL3 license."
|
||||
msgstr "Ce travail est publié sous licence LGPL3."
|
||||
|
||||
#: ../../project/roadmap.rst:5
|
||||
msgid "Roadmap"
|
||||
msgstr "Roadmap"
|
||||
|
||||
#: ../../project/roadmap.rst:7
|
||||
msgid "Here is a list of things we may agree to merge."
|
||||
msgstr "Voici une liste de choses qu'on peut s'accorder à intégrer"
|
||||
|
||||
#: ../../project/roadmap.rst:9
|
||||
msgid "Queue: use PostgreSQL `notify` for direct enqueue of jobs"
|
||||
msgstr ""
|
||||
"Queue : utiliser `notify` de PostgreSQL pour une mise en queue directe des "
|
||||
"jobs"
|
||||
|
||||
#: ../../project/roadmap.rst:13
|
||||
msgid ""
|
||||
"Add facilities to parse the errors from the jobs so we can replace it by "
|
||||
"more contextual and helpful errors."
|
||||
msgstr ""
|
||||
"Ajouter des facilités pour analyser les erreurs des jobs pour pouvoir les "
|
||||
"remplacer par des erreurs plus contextuelles et utiles"
|
||||
|
||||
#: ../../project/roadmap.rst:16
|
||||
msgid ""
|
||||
"A logger which keeps in a buffer all the logs and flushes them when an error "
|
||||
"occurs in a synchronization, clears them if it succeeded"
|
||||
msgstr ""
|
||||
"Un `logger` qui garde en tampon tous les logs et les vide quand une erreur "
|
||||
"survient pendant une synchronisation, et les efface s'ils ont réussi"
|
||||
|
||||
#: ../../project/roadmap.rst:19
|
||||
msgid ""
|
||||
"Job Channels: each job is owned by a channel and workers can be dedicated to "
|
||||
"one channel only"
|
||||
msgstr ""
|
||||
"Canal de job : chaque job appartient à un canal et les workers peuvent être "
|
||||
"dédiés à un canal"
|
||||
|
||||
#: ../../../CHANGES.rst:107
|
||||
msgid ""
|
||||
"Fix: inheritance broken when an orm.Model inherit from an orm.AbstractModel. "
|
||||
"One effect was that the mail.thread features were no longer working "
|
||||
"(lp:1233355)"
|
||||
msgstr ""
|
||||
"Correction : héritage cassé quand un orm.Model hérite d'un orm."
|
||||
"AbstractModel. Un effet était que les fonctionnalités de mail.thread ne "
|
||||
"fonctionnaient plus (lp:1233355)"
|
||||
|
||||
#: ../../../AUTHORS:11
|
||||
msgid "Christophe Combelles at Anybox (french translation)"
|
||||
msgstr "Christophe Combelles chez Anybox (trad française)"
|
||||
|
||||
#: ../../project/contribute.rst:65
|
||||
msgid "Creating or maintaining a translation of this doc"
|
||||
msgstr "Créer ou maintenir une traduction de cette doc"
|
||||
|
||||
#: ../../project/contribute.rst:67
|
||||
msgid ""
|
||||
"Install Odoo, its dependencies, sphinx, sphinx_bootstrap_theme and sphinx-"
|
||||
"intl"
|
||||
msgstr ""
|
||||
"Installez Odoo, ses dépendances, sphinx, sphinx_bootstrap_theme et sphinx-"
|
||||
"intl"
|
||||
|
||||
#: ../../project/contribute.rst:72
|
||||
msgid "create an empty database with the connector module installed"
|
||||
msgstr "créez une nouvelle base de donnée avec le module connector installé"
|
||||
|
||||
#: ../../project/contribute.rst:73
|
||||
msgid "``cd connector/doc``"
|
||||
msgstr "``cd connector/doc``"
|
||||
|
||||
#: ../../project/contribute.rst:74
|
||||
msgid "rebuild the gettext .pot source catalogs: ``make gettext``"
|
||||
msgstr "reconstruisez les catalogues gettext sources .pot: ``make gettext``"
|
||||
|
||||
#: ../../project/contribute.rst:75
|
||||
msgid ""
|
||||
"update the .po translation files from the latest .pot files (here for "
|
||||
"language 'fr'): ``sphinx-intl update -l fr -p _build/locale``"
|
||||
msgstr ""
|
||||
"mettez à jour les fichiers de traduction .po depuis les derniers fichiers ."
|
||||
"pot (ici pour la langue 'fr'): ``sphinx-intl update -l fr -p _build/locale``"
|
||||
|
||||
#: ../../project/contribute.rst:77
|
||||
msgid ""
|
||||
"create or edit the translation in the .po files: ``poedit locale/fr/"
|
||||
"LC_MESSAGES/*.po``"
|
||||
msgstr ""
|
||||
"créez ou modifiez la traduction dans les fichiers .po : ``poedit locale/fr/"
|
||||
"LC_MESSAGES/*.po``"
|
||||
|
||||
#: ../../project/contribute.rst:79
|
||||
msgid "compile the .po files into .mo files: ``sphinx-intl build``"
|
||||
msgstr "compilez les fichiers .po en fichiers .mo : ``sphinx-intl build``"
|
||||
|
||||
#: ../../project/contribute.rst:80
|
||||
msgid ""
|
||||
"build the translated documentation to html: ``make SPHINXOPTS=\"-Dlanguage=fr"
|
||||
"\" html``"
|
||||
msgstr ""
|
||||
"construisez en html la documentation traduite : ``make SPHINXOPTS=\"-"
|
||||
"Dlanguage=fr\" html``"
|
||||
|
||||
#: ../../project/contribute.rst:83
|
||||
msgid ""
|
||||
"The same using a `buildout <https://bitbucket.org/anybox/"
|
||||
"public_buildbot_buildouts/src/tip/odoo-connector.cfg>`_::"
|
||||
msgstr ""
|
||||
"La même chose en utilisant un `buildout <https://bitbucket.org/anybox/"
|
||||
"public_buildbot_buildouts/src/tip/odoo-connector.cfg>`_::"
|
||||
|
||||
#: ../../project/contribute.rst:69
|
||||
msgid ""
|
||||
"Add `this patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
|
||||
"request/9/>`_ to sphinx-intl (until merged) to support *fuzzy* translations"
|
||||
msgstr ""
|
||||
"Ajoutez `ce patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
|
||||
"request/9/>`_ à sphinx-intl (jusqu'à ce que ce soit mergé) pour gérer les "
|
||||
"traductions *fuzzy*"
|
||||
|
||||
#: ../../project/contribute.rst:29
|
||||
msgid ""
|
||||
"Then, my personal advice is to look at the existing connectors (`Odoo "
|
||||
"Magento Connector`_, `Odoo Prestashop Connector`_). You will also probably "
|
||||
"need to dive a bit in the framework's code."
|
||||
msgstr ""
|
||||
"Ensuite, il est conseillé de parcourir les connecteurs existants "
|
||||
"(`Connecteur Odoo Magento`_, `Connecteur Odoo Prestashop`_). Vous devrez "
|
||||
"aussi plonger peut-être un peu dans le code du framework."
|
||||
|
||||
#: ../../project/contribute.rst:48
|
||||
msgid "Name of the Odoo module:"
|
||||
msgstr "Nom du module Odoo :"
|
||||
|
||||
#: ../../project/contribute.rst:100
|
||||
msgid ""
|
||||
"Then you can see the result in _build/html/ and submit a Pull Request. "
|
||||
"Repeat the 5 last steps to update the translation if modified upstream."
|
||||
msgstr ""
|
||||
"Vous pouvez ensuite voir le résultat dans _build/html/ et soumettre un "
|
||||
"\"Pull Request\". Répétez les 5 dernières étapes pour remettre à jour les "
|
||||
"traductions en cas de modification dans le tronc principal."
|
||||
|
||||
#: ../../project/roadmap.rst:11 ../../project/roadmap.rst:22
|
||||
msgid "See: https://github.com/OCA/connector/pull/52"
|
||||
msgstr "See: https://github.com/OCA/connector/pull/52"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Then, my personal advice is to look at the existing connectors (`Odoo "
|
||||
#~ "Magento Connector`_, `Odoo Prestashop Connector`_). You will also "
|
||||
#~ "probably need to dive a bit in the framework's code."
|
||||
#~ msgstr ""
|
||||
#~ "Ensuite, il est conseillé de parcourir les connecteurs existants "
|
||||
#~ "(`Connecteur Odoo Magento`_, `Connecteur Odoo Prestashop`_). Vous "
|
||||
#~ "devrez aussi plonger peut-être un peu dans le code du framework."
|
||||
|
||||
#~ msgid "Name of the Odoo module:"
|
||||
#~ msgstr "Nom du module Odoo :"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Experimental branch: lp:~odoo-connector-core-editors/odoo-"
|
||||
#~ "connector/7.0-connector-pg-notify-listen-experimental"
|
||||
#~ msgstr ""
|
||||
#~ "Branche expérimentale : lp:~odoo-connector-core-editors/odoo-"
|
||||
#~ "connector/7.0-connector-pg-notify-listen-experimental"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Then you can see the result in _build/html/ and submit a Pull Request"
|
||||
#~ msgstr ""
|
||||
#~ "Vous pouvez ensuite voir le résultat dans _build/html/ et soumettre un "
|
||||
#~ "Pull Request"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Add `this patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
|
||||
#~ "request/9/issue-9-support-fuzzy-translations>`_ to sphinx-intl (until "
|
||||
#~ "merged)"
|
||||
#~ msgstr ""
|
||||
#~ "Ajoutez `ce patch <https://bitbucket.org/shimizukawa/sphinx-intl/pull-"
|
||||
#~ "request/9/issue-9-support-fuzzy-translations>`_ to sphinx-intl (jusqu'à "
|
||||
#~ "ce qu'il soit mergé)"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Fix: inheritance broken when an orm.Model inherit from an or."
|
||||
#~ "AbstractModel. One effect was that the mail.thread features were no "
|
||||
#~ "longer working (lp:1233355)"
|
||||
#~ msgstr ""
|
||||
#~ "Correction : héritage cassé quand un orm.Model hérite d'un or."
|
||||
#~ "AbstractModel. Une conséquence est que les fonctionnalités de mail.thread "
|
||||
#~ "ne fonctionnaient plus (lp:1233355)"
|
||||
190
odoo-bringout-oca-connector-connector/connector/doc/make.bat
Normal file
|
|
@ -0,0 +1,190 @@
|
|||
@ECHO OFF
|
||||
|
||||
REM Command file for Sphinx documentation
|
||||
|
||||
if "%SPHINXBUILD%" == "" (
|
||||
set SPHINXBUILD=sphinx-build
|
||||
)
|
||||
set BUILDDIR=_build
|
||||
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
|
||||
set I18NSPHINXOPTS=%SPHINXOPTS% .
|
||||
if NOT "%PAPER%" == "" (
|
||||
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
|
||||
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
|
||||
)
|
||||
|
||||
if "%1" == "" goto help
|
||||
|
||||
if "%1" == "help" (
|
||||
:help
|
||||
echo.Please use `make ^<target^>` where ^<target^> is one of
|
||||
echo. html to make standalone HTML files
|
||||
echo. dirhtml to make HTML files named index.html in directories
|
||||
echo. singlehtml to make a single large HTML file
|
||||
echo. pickle to make pickle files
|
||||
echo. json to make JSON files
|
||||
echo. htmlhelp to make HTML files and a HTML help project
|
||||
echo. qthelp to make HTML files and a qthelp project
|
||||
echo. devhelp to make HTML files and a Devhelp project
|
||||
echo. epub to make an epub
|
||||
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
|
||||
echo. text to make text files
|
||||
echo. man to make manual pages
|
||||
echo. texinfo to make Texinfo files
|
||||
echo. gettext to make PO message catalogs
|
||||
echo. changes to make an overview over all changed/added/deprecated items
|
||||
echo. linkcheck to check all external links for integrity
|
||||
echo. doctest to run all doctests embedded in the documentation if enabled
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "clean" (
|
||||
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
|
||||
del /q /s %BUILDDIR%\*
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "html" (
|
||||
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "dirhtml" (
|
||||
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "singlehtml" (
|
||||
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "pickle" (
|
||||
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the pickle files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "json" (
|
||||
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can process the JSON files.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "htmlhelp" (
|
||||
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run HTML Help Workshop with the ^
|
||||
.hhp project file in %BUILDDIR%/htmlhelp.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "qthelp" (
|
||||
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; now you can run "qcollectiongenerator" with the ^
|
||||
.qhcp project file in %BUILDDIR%/qthelp, like this:
|
||||
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Connectors.qhcp
|
||||
echo.To view the help file:
|
||||
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Connectors.ghc
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "devhelp" (
|
||||
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "epub" (
|
||||
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The epub file is in %BUILDDIR%/epub.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "latex" (
|
||||
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "text" (
|
||||
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The text files are in %BUILDDIR%/text.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "man" (
|
||||
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The manual pages are in %BUILDDIR%/man.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "texinfo" (
|
||||
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "gettext" (
|
||||
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "changes" (
|
||||
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.The overview file is in %BUILDDIR%/changes.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "linkcheck" (
|
||||
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Link check complete; look for any errors in the above output ^
|
||||
or in %BUILDDIR%/linkcheck/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
if "%1" == "doctest" (
|
||||
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
|
||||
if errorlevel 1 exit /b 1
|
||||
echo.
|
||||
echo.Testing of doctests in the sources finished, look at the ^
|
||||
results in %BUILDDIR%/doctest/output.txt.
|
||||
goto end
|
||||
)
|
||||
|
||||
:end
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
.. _contribute:
|
||||
|
||||
##########
|
||||
Contribute
|
||||
##########
|
||||
|
||||
We accept with pleasure all type of contributions:
|
||||
|
||||
* bug reports
|
||||
* merge proposals
|
||||
* ideas
|
||||
* translations
|
||||
* ...
|
||||
|
||||
Have a look on the :ref:`Magento Connector Developer's Guide
|
||||
<connectormagento:contribute>` which is more complete, most of the
|
||||
information is the same.
|
||||
|
||||
The GitHub project is: https://github.com/OCA/connector
|
||||
|
||||
*****************************
|
||||
Want to start a new connector
|
||||
*****************************
|
||||
|
||||
If you want to start a new connector based on the framework,
|
||||
a sane approach is to read this documentation, especially
|
||||
:ref:`concepts` and :ref:`bootstrap-connector`.
|
||||
|
||||
Then, my personal advice is to look at the existing connectors (`Odoo
|
||||
Magento Connector`_, `Odoo Prestashop Connector`_). You will also probably
|
||||
need to dive a bit in the framework's code.
|
||||
|
||||
If the connector belongs to the e-commerce domain, you may want to reuse the pieces
|
||||
of the `E-Commerce Connector`_ module.
|
||||
|
||||
.. _naming-convention:
|
||||
|
||||
Naming conventions
|
||||
==================
|
||||
|
||||
The naming conventions for the new projects are the following:
|
||||
|
||||
Name of the project if it is in the OCA:
|
||||
|
||||
connector-xxx
|
||||
|
||||
Name of the Odoo module:
|
||||
connector_xxx
|
||||
|
||||
Example:
|
||||
https://github.com/OCA/connector-magento
|
||||
|
||||
``connector_magento``
|
||||
|
||||
Actually, the Magento and Prestashop connectors do not respect this convention
|
||||
for historical reasons (magentoerpconnect, prestashoperpconnect).
|
||||
New projects should ideally respect it.
|
||||
|
||||
.. _`Odoo Magento Connector`: https://github.com/OCA/connector-magento
|
||||
.. _`Odoo Prestashop Connector`: https://github.com/OCA/connector-prestashop
|
||||
.. _`E-Commerce Connector`: https://github.com/OCA/connector-ecommerce
|
||||
|
||||
*************************************************
|
||||
Creating or maintaining a translation of this doc
|
||||
*************************************************
|
||||
|
||||
- Install Odoo, its dependencies, sphinx, sphinx_bootstrap_theme and
|
||||
sphinx-intl
|
||||
- Add `this patch
|
||||
<https://bitbucket.org/shimizukawa/sphinx-intl/pull-request/9/>`_
|
||||
to sphinx-intl (until merged) to support *fuzzy* translations
|
||||
- create an empty database with the connector module installed
|
||||
- ``cd connector/doc``
|
||||
- rebuild the gettext .pot source catalogs: ``make gettext``
|
||||
- update the .po translation files from the latest .pot files (here for
|
||||
language 'fr'): ``sphinx-intl update -l fr -p _build/locale``
|
||||
- create or edit the translation in the .po files: ``poedit
|
||||
locale/fr/LC_MESSAGES/*.po``
|
||||
- compile the .po files into .mo files: ``sphinx-intl build``
|
||||
- build the translated documentation to html: ``make SPHINXOPTS="-Dlanguage=fr"
|
||||
html``
|
||||
|
||||
The same using a `buildout
|
||||
<https://bitbucket.org/anybox/public_buildbot_buildouts/src/tip/odoo-connector.cfg>`_::
|
||||
|
||||
$ mkdir buildout && cd buildout
|
||||
$ wget https://bitbucket.org/anybox/public_buildbot_buildouts/raw/tip/odoo-connector.cfg -O buildout.cfg
|
||||
$ wget https://bitbucket.org/anybox/public_buildbot_buildouts/raw/tip/bootstrap.py
|
||||
$ python bootstrap.py
|
||||
$ bin/buildout
|
||||
$ createdb connectordb
|
||||
$ bin/start_odoo -d connectordb --stop-after-init
|
||||
$ cd connector/connector/doc/
|
||||
$ ../../../bin/sphinx-build -d connectordb -- -b gettext ./ _build/locale/
|
||||
$ ../../../bin/sphinx-intl -d connectordb -- update -l fr -p _build/locale/
|
||||
$ poedit locale/fr/LC_MESSAGES/*po
|
||||
$ ../../../bin/sphinx-intl -d connectordb -- build
|
||||
$ ../../../bin/sphinx-build -d connectordb -- -D language=fr -b html ./ _build/html/
|
||||
|
||||
Then you can see the result in _build/html/ and submit a Pull Request. Repeat the 5 last steps to update the translation if modified upstream.
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
.. _contributors:
|
||||
|
||||
############
|
||||
Contributors
|
||||
############
|
||||
|
||||
List of contributors:
|
||||
|
||||
.. include:: ../../AUTHORS
|
||||
|
||||
|
||||
.. _financial-contributors:
|
||||
|
||||
######################
|
||||
Financial Contributors
|
||||
######################
|
||||
|
||||
A fund raising has been done during the year 2013, allowing us to develop
|
||||
the connector framework and the Magento connector.
|
||||
|
||||
Here is the list of the funders, ordered by the amount of the contribution:
|
||||
|
||||
* **Logic Supply**
|
||||
* **Debonix**
|
||||
* Apertoso
|
||||
* OpenBIG
|
||||
* Smile
|
||||
* IT Service Partners
|
||||
* WillowIT
|
||||
* Eezee-It
|
||||
* Auguria
|
||||
* Enova
|
||||
* Mr. Goran Sunjka
|
||||
* Taktik
|
||||
* Maison del Gusto
|
||||
* Open2bizz Software
|
||||
* Bee Company
|
||||
* initOS
|
||||
* Rhônalia
|
||||
* Julius Network Solutions
|
||||
* Elico Corp
|
||||
* Linko Solutions
|
||||
* HSP Hanse Shopping
|
||||
* Burn Out Italy
|
||||
* Mr. Peter Dijkstra
|
||||
* Mr. Luc Maurer
|
||||
* Mr. Maxime Chambreuil
|
||||
* Mr. Eric Vernichon
|
||||
* Avanzosc
|
||||
* Mr. Fabio Martinelli
|
||||
* Mr. Marcelo Bello
|
||||
* Rove.design
|
||||
* Mr. Mark Felling
|
||||
|
||||
Thanks to all of them!
|
||||
|
|
@ -0,0 +1,674 @@
|
|||
.. _license:
|
||||
|
||||
#######
|
||||
License
|
||||
#######
|
||||
|
||||
This work is licensed under the LGPL3 license.
|
||||
|
||||
------
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU LGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
.. _roadmap:
|
||||
|
||||
#######
|
||||
Roadmap
|
||||
#######
|
||||
|
||||
Here is a list of things we may agree to merge.
|
||||
|
||||
* Add facilities to parse the errors from the jobs so we can replace it
|
||||
by more contextual and helpful errors.
|
||||
|
||||
* A logger which keeps in a buffer all the logs and flushes them when an error
|
||||
occurs in a synchronization, clears them if it succeeded
|
||||