diff --git a/.badges/code_style-black-000000.svg b/.badges/code_style-black-000000.svg
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LmJhZGdlcy9jb2RlX3N0eWxlLWJsYWNrLTAwMDAwMC5zdmc=
--- /dev/null
+++ b/.badges/code_style-black-000000.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg xmlns="http://www.w3.org/2000/svg" width="114" height="20">
+  <linearGradient id="b" x2="0" y2="100%">
+    <stop offset="0" stop-color="#bbb" stop-opacity=".1" />
+    <stop offset="1" stop-opacity=".1" />
+  </linearGradient>
+  <mask id="anybadge_1">
+    <rect width="114" height="20" rx="3" fill="#fff" />
+  </mask>
+  <g mask="url(#anybadge_1)">
+    <path fill="#555" d="M0 0h72v20H0z" />
+    <path fill="#000000" d="M72 0h42v20H72z" />
+    <path fill="url(#b)" d="M0 0h114v20H0z" />
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="37.0" y="15" fill="#010101" fill-opacity=".3">code style</text>
+    <text x="36.0" y="14">code style</text>
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="94.0" y="15" fill="#010101" fill-opacity=".3">black</text>
+    <text x="93.0" y="14">black</text>
+  </g>
+</svg>
diff --git a/.badges/code_style-prettier-ff69b4.svg b/.badges/code_style-prettier-ff69b4.svg
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LmJhZGdlcy9jb2RlX3N0eWxlLXByZXR0aWVyLWZmNjliNC5zdmc=
--- /dev/null
+++ b/.badges/code_style-prettier-ff69b4.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg xmlns="http://www.w3.org/2000/svg" width="129" height="20">
+  <linearGradient id="b" x2="0" y2="100%">
+    <stop offset="0" stop-color="#bbb" stop-opacity=".1" />
+    <stop offset="1" stop-opacity=".1" />
+  </linearGradient>
+  <mask id="anybadge_1">
+    <rect width="129" height="20" rx="3" fill="#fff" />
+  </mask>
+  <g mask="url(#anybadge_1)">
+    <path fill="#555" d="M0 0h72v20H0z" />
+    <path fill="#ff69b4" d="M72 0h57v20H72z" />
+    <path fill="url(#b)" d="M0 0h129v20H0z" />
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="37.0" y="15" fill="#010101" fill-opacity=".3">code style</text>
+    <text x="36.0" y="14">code style</text>
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="101.5" y="15" fill="#010101" fill-opacity=".3">prettier</text>
+    <text x="100.5" y="14">prettier</text>
+  </g>
+</svg>
diff --git a/.badges/coverage.svg b/.badges/coverage.svg
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LmJhZGdlcy9jb3ZlcmFnZS5zdmc=
--- /dev/null
+++ b/.badges/coverage.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg xmlns="http://www.w3.org/2000/svg" width="124" height="20">
+  <linearGradient id="b" x2="0" y2="100%">
+    <stop offset="0" stop-color="#bbb" stop-opacity=".1" />
+    <stop offset="1" stop-opacity=".1" />
+  </linearGradient>
+  <mask id="anybadge_1">
+    <rect width="124" height="20" rx="3" fill="#fff" />
+  </mask>
+  <g mask="url(#anybadge_1)">
+    <path fill="#555" d="M0 0h65v20H0z" />
+    <path fill="#808080" d="M65 0h59v20H65z" />
+    <path fill="url(#b)" d="M0 0h124v20H0z" />
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text>
+    <text x="32.5" y="14">coverage</text>
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="95.5" y="15" fill="#010101" fill-opacity=".3">unknown</text>
+    <text x="94.5" y="14">unknown</text>
+  </g>
+</svg>
diff --git a/.badges/licence-AGPL--3-blue.svg b/.badges/licence-AGPL--3-blue.svg
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LmJhZGdlcy9saWNlbmNlLUFHUEwtLTMtYmx1ZS5zdmc=
--- /dev/null
+++ b/.badges/licence-AGPL--3-blue.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg xmlns="http://www.w3.org/2000/svg" width="107" height="20">
+  <linearGradient id="b" x2="0" y2="100%">
+    <stop offset="0" stop-color="#bbb" stop-opacity=".1" />
+    <stop offset="1" stop-opacity=".1" />
+  </linearGradient>
+  <mask id="anybadge_1">
+    <rect width="107" height="20" rx="3" fill="#fff" />
+  </mask>
+  <g mask="url(#anybadge_1)">
+    <path fill="#555" d="M0 0h53v20H0z" />
+    <path fill="#0000FF" d="M53 0h54v20H53z" />
+    <path fill="url(#b)" d="M0 0h107v20H0z" />
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="27.5" y="15" fill="#010101" fill-opacity=".3">licence</text>
+    <text x="26.5" y="14">licence</text>
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="81.0" y="15" fill="#010101" fill-opacity=".3">AGPL-3</text>
+    <text x="80.0" y="14">AGPL-3</text>
+  </g>
+</svg>
diff --git a/.badges/maturity.svg b/.badges/maturity.svg
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LmJhZGdlcy9tYXR1cml0eS5zdmc=
--- /dev/null
+++ b/.badges/maturity.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg xmlns="http://www.w3.org/2000/svg" width="103" height="20">
+  <linearGradient id="b" x2="0" y2="100%">
+    <stop offset="0" stop-color="#bbb" stop-opacity=".1" />
+    <stop offset="1" stop-opacity=".1" />
+  </linearGradient>
+  <mask id="anybadge_1">
+    <rect width="103" height="20" rx="3" fill="#fff" />
+  </mask>
+  <g mask="url(#anybadge_1)">
+    <path fill="#555" d="M0 0h61v20H0z" />
+    <path fill="#e05d44" d="M61 0h42v20H61z" />
+    <path fill="url(#b)" d="M0 0h103v20H0z" />
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="31.5" y="15" fill="#010101" fill-opacity=".3">maturity</text>
+    <text x="30.5" y="14">maturity</text>
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="83.0" y="15" fill="#010101" fill-opacity=".3">Alpha</text>
+    <text x="82.0" y="14">Alpha</text>
+  </g>
+</svg>
diff --git a/.badges/pylint.svg b/.badges/pylint.svg
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LmJhZGdlcy9weWxpbnQuc3Zn
--- /dev/null
+++ b/.badges/pylint.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg xmlns="http://www.w3.org/2000/svg" width="103" height="20">
+  <linearGradient id="b" x2="0" y2="100%">
+    <stop offset="0" stop-color="#bbb" stop-opacity=".1" />
+    <stop offset="1" stop-opacity=".1" />
+  </linearGradient>
+  <mask id="anybadge_1">
+    <rect width="103" height="20" rx="3" fill="#fff" />
+  </mask>
+  <g mask="url(#anybadge_1)">
+    <path fill="#555" d="M0 0h44v20H0z" />
+    <path fill="#808080" d="M44 0h59v20H44z" />
+    <path fill="url(#b)" d="M0 0h103v20H0z" />
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="23.0" y="15" fill="#010101" fill-opacity=".3">pylint</text>
+    <text x="22.0" y="14">pylint</text>
+  </g>
+  <g
+    fill="#fff"
+    text-anchor="middle"
+    font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
+    font-size="11"
+  >
+    <text x="74.5" y="15" fill="#010101" fill-opacity=".3">unknown</text>
+    <text x="73.5" y="14">unknown</text>
+  </g>
+</svg>
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LmVkaXRvcmNvbmZpZw==
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,20 @@
+# Configuration for known file extensions
+[*.{css,htm,html,js,json,jsx,less,markdown,md,py,rst,sass,scss,toml,xml,yaml,yml}]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.{json,yml,yaml,rst,markdown,md,toml}]
+indent_size = 2
+
+# Do not configure editor for libs
+[{*/static/{lib,src/lib}/**}]
+charset = unset
+end_of_line = unset
+indent_size = unset
+indent_style = unset
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ce876f512ed0844c957fb625e5f5d91c9ca28d31_LmdpdGxhYi1jaS55bWw=..530167006d4f9c41268ec369dab91692b1d3afa4_LmdpdGxhYi1jaS55bWw= 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,3 @@
 include:
   - project: xcg/ci-templates
     file: /odoo/11.0/gitlab-ci.yaml
-
-# vim: set shiftwidth=2:
diff --git a/.prettierrc.yml b/.prettierrc.yml
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LnByZXR0aWVycmMueW1s
--- /dev/null
+++ b/.prettierrc.yml
@@ -0,0 +1,8 @@
+# Defaults for all prettier-supported languages.
+# Prettier will complete this with settings from .editorconfig file.
+bracketSpacing: false
+printWidth: 88
+proseWrap: always
+semi: true
+trailingComma: "es5"
+xmlWhitespaceSensitivity: "ignore"
diff --git a/.yamllint.yaml b/.yamllint.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_LnlhbWxsaW50LnlhbWw=
--- /dev/null
+++ b/.yamllint.yaml
@@ -0,0 +1,4 @@
+rules:
+  document-start: disable
+  indentation:
+    indent-sequences: true
diff --git a/README.rst b/README.rst
index ce876f512ed0844c957fb625e5f5d91c9ca28d31_UkVBRE1FLnJzdA==..530167006d4f9c41268ec369dab91692b1d3afa4_UkVBRE1FLnJzdA== 100644
--- a/README.rst
+++ b/README.rst
@@ -2,4 +2,28 @@
 Base Context
 ============
 
-Provide a ``get_clean_context`` and ``with_lang`` method on models.
\ No newline at end of file
+.. Update the path to the module below and to the branch
+.. |coverage| image:: .badges/coverage.svg
+    :target: https://orus.io/xcg/odoo-modules/base_context/-/pipelines?ref=branch/11.0
+    :alt: Coverage report
+.. the image is updated by the CI when building the documentation
+.. |pylint| image:: .badges/pylint.svg
+    :target: https://orus.io/xcg/odoo-modules/base_context/-/pipelines?ref=branch/11.0
+    :alt: pylint score
+.. Update the badge below depending on status
+.. |maturity| image:: .badges/maturity.svg
+    :target: https://odoo-community.org/page/development-status
+    :alt: Alpha
+.. |license| image:: .badges/licence-AGPL--3-blue.svg
+    :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+    :alt: License: AGPL-3
+.. |black| image:: .badges/code_style-black-000000.svg
+    :target: https://github.com/psf/black
+    :alt: Black
+.. |prettier| image:: .badges/code_style-prettier-ff69b4.svg
+    :target: https://github.com/prettier/prettier
+    :alt: Prettier
+
+|coverage| |pylint| |maturity| |license| |black| |prettier|
+
+Provide a ``get_clean_context`` and ``with_lang`` method on models.
diff --git a/doc/.badges b/doc/.badges
new file mode 120000
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_ZG9jLy5iYWRnZXM=
--- /dev/null
+++ b/doc/.badges
@@ -0,0 +1,1 @@
+../.badges
\ No newline at end of file
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_ZG9jL01ha2VmaWxl
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,42 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS     ?=
+SPHINXBUILD    ?= sphinx-build
+SOURCEDIR      = .
+BUILDDIR       = _build
+LANGUAGE       ?= en
+BUILDDIRSUFFIX =
+
+# User-friendly check for sphinx-build
+ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
+endif
+
+.PHONY: help Makefile gettext clean
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)/$(LANGUAGE)$(BUILDDIRSUFFIX)" $(SPHINXOPTS) $(O)
+
+clean:
+	rm -rf $(BUILDDIR)/*
+	rm -f autotodo
+
+# depends on autotodo.py but that does not work well with the catch-all below
+autotodo:
+	@./autotodo.py ../ .py TODO,FIXME,XXX
+
+gettext: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)$(BUILDDIRSUFFIX)" $(SPHINXOPTS) $(O)
+
+# Use to update *.po files
+update_locale: Makefile gettext
+	@sphinx-intl update -p "$(BUILDDIR)$(BUILDDIRSUFFIX)/gettext" -l $(LANGUAGE)
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile autotodo
+	@$(SPHINXBUILD) -b $@ "$(SOURCEDIR)" "$(BUILDDIR)/$@/$(LANGUAGE)$(BUILDDIRSUFFIX)" -d "$(BUILDDIR)$(BUILDDIRSUFFIX)/doctrees/$(LANGUAGE)" $(SPHINXOPTS) -D language=$(LANGUAGE) $(O)
diff --git a/doc/NEWS.rst b/doc/NEWS.rst
new file mode 120000
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_ZG9jL05FV1MucnN0
--- /dev/null
+++ b/doc/NEWS.rst
@@ -0,0 +1,1 @@
+../NEWS.rst
\ No newline at end of file
diff --git a/doc/README.rst b/doc/README.rst
new file mode 120000
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_ZG9jL1JFQURNRS5yc3Q=
--- /dev/null
+++ b/doc/README.rst
@@ -0,0 +1,1 @@
+../README.rst
\ No newline at end of file
diff --git a/doc/TODO.rst b/doc/TODO.rst
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_ZG9jL1RPRE8ucnN0
--- /dev/null
+++ b/doc/TODO.rst
@@ -0,0 +1,7 @@
+====
+TODO
+====
+
+.. todolist::
+
+.. include:: autotodo
diff --git a/doc/autotodo.py b/doc/autotodo.py
new file mode 100755
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_ZG9jL2F1dG90b2RvLnB5
--- /dev/null
+++ b/doc/autotodo.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python3
+##############################################################################
+#
+#    OpenERP, Open Source Management Solution
+#    Copyright (C) 2014, 2018, 2022 XCG Consulting
+#
+#    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/>.
+#
+##############################################################################
+
+import os
+import os.path
+import sys
+
+
+def main():
+    if len(sys.argv) != 4:
+        print("usage: autotodo.py <folder> <exts> <tags>")
+        sys.exit(1)
+
+    folder = sys.argv[1]
+    exts = sys.argv[2].split(",")
+    tags = sys.argv[3].split(",")
+    todolist = {tag: [] for tag in tags}
+
+    for root, _dirs, files in os.walk(folder):
+        scan_folder((exts, tags, todolist), root, files)
+    create_autotodo(folder, todolist)
+
+
+def write_info(f, infos, folder):
+    # Check sphinx version for lineno-start support
+
+    import sphinx
+
+    if sphinx.version_info < (1, 3):
+        lineno_start = False
+    else:
+        lineno_start = True
+
+    for i in infos:
+        path = i[0]
+        line = i[1]
+        lines = (line - 3, line + 4)
+        class_name = ":class:`%s`" % os.path.basename(
+            os.path.splitext(path)[0]
+        )
+        f.write(
+            "%s\n"
+            "%s\n\n"
+            "Line %s\n"
+            "\t.. literalinclude:: %s\n"
+            "\t\t:language: python\n"
+            "\t\t:lines: %s-%s\n"
+            "\t\t:emphasize-lines: %s\n"
+            % (
+                class_name,
+                "-" * len(class_name),
+                line,
+                path,
+                lines[0],
+                lines[1],
+                line,
+            )
+        )
+        if lineno_start:
+            f.write("\t\t:lineno-start: %s\n" % lines[0])
+        f.write("\n")
+
+
+def create_autotodo(folder, todolist):
+    with open("autotodo", "w+") as f:
+        for tag, info in list(todolist.items()):
+            f.write("%s\n%s\n\n" % (tag, "=" * len(tag)))
+            write_info(f, info, folder)
+
+
+def scan_folder(data_tuple, dirname, names):
+    (exts, tags, res) = data_tuple
+    file_info = {}
+    for name in names:
+        (root, ext) = os.path.splitext(name)
+        if ext in exts:
+            file_info = scan_file(os.path.join(dirname, name), tags)
+            for tag, info in list(file_info.items()):
+                if info:
+                    res[tag].extend(info)
+
+
+def scan_file(filename, tags):
+    res = {tag: [] for tag in tags}
+    with open(filename, "r") as f:
+        for line_num, line in enumerate(f):
+            for tag in tags:
+                if tag in line:
+                    res[tag].append((filename, line_num, line[:-1].strip()))
+    return res
+
+
+if __name__ == "__main__":
+    main()
diff --git a/doc/conf.py b/doc/conf.py
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_ZG9jL2NvbmYucHk=
--- /dev/null
+++ b/doc/conf.py
@@ -0,0 +1,198 @@
+# 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.
+
+import ast
+import configparser
+import os
+import sys
+
+import odoo
+
+from odoo_scripts.config import Configuration
+
+# 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("."))
+
+# -- General configuration ------------------------------------------------
+
+# 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.doctest",
+    "sphinx.ext.intersphinx",
+    "sphinx.ext.todo",
+    "sphinx.ext.coverage",
+    "sphinx.ext.graphviz",
+    "sphinxodoo.ext.autodoc",
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+source_suffix = ".rst"
+
+# The master toctree document.
+master_doc = "index"
+
+# 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.
+#
+with open(os.path.join("..", "__manifest__.py"), "r") as f:
+    read_data = f.read()
+d = ast.literal_eval(read_data)
+# The full version, including alpha/beta/rc tags.
+release = d["version"]
+# The short X.Y version.
+version = ".".join(release.split(".")[:4])
+
+# General information about the project.
+project = d["name"]
+copyright = "2021 XCG Consulting"
+author = d["author"]
+module_nospace = project.replace(" ", "")
+module_description = d.get("summary", "")
+module_lowercase = module_nospace.lower()
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+locale_dirs = ["locale"]
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ["_build"]
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = "sphinx"
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = True
+
+
+# -- 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 = "default"
+
+# 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"]
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = "%sdoc" % module_nospace
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+latex_documents = [
+    (
+        master_doc,
+        "%s.tex" % module_nospace,
+        "%s Documentation" % project,
+        author,
+        "manual",
+    )
+]
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (master_doc, module_lowercase, "%s Documentation" % project, [author], 1)
+]
+
+# -- 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 = [
+    (
+        master_doc,
+        module_nospace,
+        "%s Documentation" % project,
+        author,
+        module_nospace,
+        module_description,
+        "Miscellaneous",
+    )
+]
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {"https://docs.python.org/3/": None}
+
+
+#
+# odoo-sphinx-autodoc
+#
+
+# sphinxodoo_addons: List of addons name to load (if empty, no addon will be
+# loaded)
+this_module = os.path.basename(
+    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+)
+sphinxodoo_addons = [this_module]
+# sphinxodoo_root_path : Path of the Odoo root directory
+sphinxodoo_root_path = os.path.dirname(
+    os.path.dirname(os.path.abspath(odoo.__file__))
+)
+# sphinxodoo_addons_path : List of paths were Odoo addons to load are located
+c = None
+# find setup file of superproject, if any
+directory = os.path.dirname(os.getenv("PWD"))
+while not c and directory:
+    setup_path = os.path.join(directory, "setup.cfg")
+    if os.path.isfile(setup_path):
+        c = configparser.ConfigParser()
+        c.read(setup_path)
+        if c.has_section("odoo_scripts"):
+            # reload with odoo_scripts
+            c = Configuration(setup_path)
+        else:
+            c = None
+    if not c:
+        if os.path.dirname(directory) != directory:
+            directory = os.path.dirname(directory)
+        else:
+            directory = None
+
+sphinxodoo_addons_path = []
+
+if c:
+    addon_dirs = set(os.path.dirname(path) for path in c.modules)
+
+    for line in addon_dirs:
+        sphinxodoo_addons_path.append(os.path.join(directory, line))
+else:
+    # add this directory top dir
+    sphinxodoo_addons_path.append(
+        os.path.dirname(os.path.dirname(os.getenv("PWD")))
+    )
+    other_addons = os.getenv("ODOO_ADDONS_PATH", default=None)
+    if other_addons:
+        for addon_path in other_addons.split(","):
+            sphinxodoo_addons_path.append(addon_path)
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..530167006d4f9c41268ec369dab91692b1d3afa4_ZG9jL2luZGV4LnJzdA==
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,18 @@
+.. include:: README.rst
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   modules
+   NEWS
+   TODO
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+