diff --git a/_extensions/odoo/__init__.py b/_extensions/odoo/__init__.py
index e02deaaff..e3473c996 100644
--- a/_extensions/odoo/__init__.py
+++ b/_extensions/odoo/__init__.py
@@ -28,9 +28,9 @@ def setup(app):
app.connect('html-page-context', update_meta)
def update_meta(app, pagename, templatename, context, doctree):
- meta = context.get('meta')
- if meta is None:
- meta = context['meta'] = {}
+ if not context.get('meta'): # context['meta'] can be None
+ context['meta'] = {}
+ meta = context.setdefault('meta', {}) # we want {} by default
meta.setdefault('banner', app.config.odoo_cover_default)
def navbarify(node, navbar=None):
diff --git a/_extensions/odoo/layout.html b/_extensions/odoo/layout.html
index d2c155ac4..9b4028883 100644
--- a/_extensions/odoo/layout.html
+++ b/_extensions/odoo/layout.html
@@ -1,11 +1,11 @@
{% extends "basic/layout.html" %}
-
-{% set script_files = script_files + [
-'_static/jquery.min.js',
-'_static/bootstrap.js',
-'_static/doc.js',
-'_static/jquery.noconflict.js',
-] %}
+{%- block scripts %}
+ {{ super() }}
+
+
+
+
+{%- endblock %}
{% set classes = [] %}
{% if pagename == master_doc %}
diff --git a/_extensions/odoo/pycompat.py b/_extensions/odoo/pycompat.py
deleted file mode 100644
index 804a2a0ba..000000000
--- a/_extensions/odoo/pycompat.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-import sys
-
-PY2 = sys.version_info[0] == 2
-
-if PY2:
- text_type = unicode
-else:
- text_type = str
-
-def to_text(source):
- """ Generates a text value (an instance of text_type) from an arbitrary
- source.
-
- * False and None are converted to empty strings
- * text is passed through
- * bytes are decoded as UTF-8
- * rest is textified via the current version's relevant data model method
- """
- if source is None or source is False:
- return u''
-
- if isinstance(source, bytes):
- return source.decode('utf-8')
-
- return text_type(source)
-
diff --git a/_extensions/odoo/translator.py b/_extensions/odoo/translator.py
index 769496f8a..beac304ff 100644
--- a/_extensions/odoo/translator.py
+++ b/_extensions/odoo/translator.py
@@ -2,19 +2,12 @@
import os.path
import posixpath
import re
-import urllib
from docutils import nodes
-from sphinx import addnodes, util
+from sphinx import addnodes, util, builders
from sphinx.locale import admonitionlabels
-from . import pycompat
-
-try:
- from urllib import url2pathname
-except ImportError:
- # P3
- from urllib.request import url2pathname
+from urllib.request import url2pathname
def _parents(node):
@@ -45,6 +38,11 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
]
def __init__(self, builder, document):
+ # order of parameter swapped between Sphinx 1.x and 2.x, check if
+ # we're running 1.x and swap back
+ if not isinstance(builder, builders.Builder):
+ builder, document = document, builder
+
super(BootstrapTranslator, self).__init__(document)
self.builder = builder
self.body = []
@@ -58,6 +56,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
self.context = []
self.section_level = 0
+ self.config = builder.config
self.highlightlang = self.highlightlang_base = self.builder.config.highlight_language
self.highlightopts = getattr(builder.config, 'highlight_options', {})
@@ -67,7 +66,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
self.param_separator = ','
def encode(self, text):
- return pycompat.to_text(text).translate({
+ return text.translate({
ord('&'): u'&',
ord('<'): u'<',
ord('"'): u'"',
@@ -76,7 +75,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
})
def starttag(self, node, tagname, **attributes):
- tagname = pycompat.to_text(tagname).lower()
+ tagname = tagname.lower()
# extract generic attributes
attrs = {name.lower(): value for name, value in attributes.items()}
@@ -111,7 +110,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
# only "space characters" SPACE, CHARACTER TABULATION, LINE FEED,
# FORM FEED and CARRIAGE RETURN should be collapsed, not al White_Space
def attval(self, value, whitespace=re.compile(u'[ \t\n\f\r]')):
- return self.encode(whitespace.sub(u' ', pycompat.to_text(value)))
+ return self.encode(whitespace.sub(u' ', str(value)))
def astext(self):
return u''.join(self.body)
@@ -432,7 +431,12 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
tagname = 'th'
else:
tagname = 'td'
- self.body.append(self.starttag(node, tagname))
+ attrs = {}
+ if 'morerows' in node:
+ attrs['rowspan'] = node['morerows']+1
+ if 'morecols' in node:
+ attrs['colspan'] = node['morecols']+1
+ self.body.append(self.starttag(node, tagname, **attrs))
self.context.append(tagname)
def depart_entry(self, node):
self.body.append(u'{}>'.format(self.context.pop()))
@@ -647,7 +651,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
self.body.append(title if title else util.nodes.clean_astext(env.titles[ref]))
self.body.append(u'')
- entries = [(title, ref)] if not toc else ((e[0], e[1]) for e in toc[0]['entries'])
+ entries = [(title, ref)] if not toc else ((e[0], e[1]) for e in list(toc)[0]['entries'])
for subtitle, subref in entries:
baseuri = self.builder.get_target_uri(node['parent'])
diff --git a/_static/banners/contributing.png b/_static/banners/contributing.png
new file mode 100644
index 000000000..88b38f11b
Binary files /dev/null and b/_static/banners/contributing.png differ
diff --git a/contributing.rst b/contributing.rst
new file mode 100644
index 000000000..d0931edb8
--- /dev/null
+++ b/contributing.rst
@@ -0,0 +1,10 @@
+:banner: banners/contributing.png
+
+============
+Contributing
+============
+
+.. toctree::
+ :titlesonly:
+
+ contributing/documentation
\ No newline at end of file
diff --git a/contributing/documentation.rst b/contributing/documentation.rst
new file mode 100644
index 000000000..e91e241a9
--- /dev/null
+++ b/contributing/documentation.rst
@@ -0,0 +1,12 @@
+:banner: banners/contributing.png
+
+=================================
+Contributing to the documentation
+=================================
+
+.. toctree::
+ :titlesonly:
+
+ documentation/introduction_guide
+ documentation/rst_cheat_sheet
+ documentation/guidelines
\ No newline at end of file
diff --git a/contributing/documentation/guidelines.rst b/contributing/documentation/guidelines.rst
new file mode 100644
index 000000000..6e890126e
--- /dev/null
+++ b/contributing/documentation/guidelines.rst
@@ -0,0 +1,162 @@
+:banner: banners/contributing.png
+
+==========
+Guidelines
+==========
+
+.. _contributing/relative-links:
+
+Use relative links for internal URLs
+====================================
+
+If you need to reference an internal documentation page or a file that is not sitting in the same
+directory as your current page, always make use of *relative file paths* rather than *absolute file
+paths*. An absolute file path indicates the location of the target from the root of its file tree. A
+relative file path makes use of smart notations (such as ``../`` git that redirects to the parent
+folder) to indicate the location of the target *relative* to that of the source document.
+
+Example
+-------
+
+Given the following source file tree:
+
+::
+
+ documentation-user
+ ├── sales
+ │ └── products_prices
+ │ │ └── products
+ │ │ │ └── import.rst
+ │ │ │ └── variants.rst
+ │ │ └── prices.rst
+
+A reference to the rendered :file:`prices.html` and :file:`variants.html` could be made from
+:file:`import.rst` as follows:
+
+#. Absolute:
+
+ - ``https://odoo.com/documentation/user/13.0/sales/products_prices/prices.html``
+ - ``https://odoo.com/documentation/user/13.0/sales/products_prices/products/variants.html``
+
+#. Relative:
+
+ - ``../prices.html``
+ - ``variants.html``
+
+The relative links are clearly superior in terms of readability and stability: the references
+survive version updates, folder name changes and file tree restructurations.
+
+.. _contributing/line-length-limit:
+
+Start a new line before the 100th character
+===========================================
+
+In RST, it is possible to break a line without forcing a line break on the rendered HTML. Make use
+of this feature to write **lines of maximum 100 characters**. A line break in a sentence results in
+an additional whitespace in HTML. That means that you do not need to leave a trailing whitespace at
+the end of a line to separate words.
+
+.. tip::
+ You can safely break a line around the separators (``-->``) of ``menuselection`` directives and
+ anywhere in a hyperlink reference. For the ``doc``, ``ref`` and ``download`` directives, this is
+ only true for the label part of the reference.
+
+Example: Line breaks within directive and inline markup
+-------------------------------------------------------
+
+.. code-block:: rst
+
+ To register your seller account in Odoo, navigate to :menuselection:`Sales --> Configuration
+ --> Settings --> Amazon Connector --> Amazon Accounts` and click on **CREATE**. The **Seller
+ ID** can be found under the link **Your Merchant Token**.
+
+Be consistent with indentation
+==============================
+
+Use only spaces (never tabs).
+
+Use as many spaces at the beginning of an indented line as needed to align it with the first
+character of the directive in the line above. This usually implies 3 spaces but you only need 2 for
+bulleted lists.
+
+Example: The first ``:`` is below the ``i`` (3 spaces)
+------------------------------------------------------
+
+.. code-block:: rst
+
+ .. image:: media/example.png
+ :align: center
+ :alt: example
+
+Example: The ``:titlesonly:`` and page references start below the ``t`` (3 spaces)
+----------------------------------------------------------------------------------
+
+.. code-block:: rst
+
+ .. toctree::
+ :titlesonly:
+
+ payables/supplier_bills
+ payables/pay
+
+Example: Continuation lines resume below the ``I``’s of “Invoice” (2 spaces)
+----------------------------------------------------------------------------
+
+.. code-block:: rst
+
+ - Invoice on ordered quantity: invoice the full order as soon as the sales order is confirmed.
+ - Invoice on delivered quantity: invoice on what you delivered even if it's a partial delivery.
+
+.. _contributing/menuselection:
+
+Use the menuselection directive
+===============================
+
+Although chaining characters ``‣`` and menu names works fine to indicate a user which menus to
+click, it is best to use the ``menuselection`` directive (see
+:ref:`contributing/specialized-directives`) for the same result. Indeed, it renders the menus chain
+consistently with the rest of the documentation and would automatically adapt to the new graphic
+chart if we were to switch to a new one. This directive is used inline as follows:
+``:menuselection:`Settings --> Products --> Variants```.
+
+.. _contributing/resilient-code:
+
+Write resilient code
+====================
+
+- Prefer the use of ``#.`` in numbered lists instead of ``1.``, ``2.``, etc. This removes the risk
+ of breaking the numbering when adding new elements to the list and is easier to maintain.
+- Avoid using implicit hyperlink targets and prefer internal hyperlink targets instead. Referencing
+ the implicit target ``How to print quotations?`` is more prone to break than a reference to the
+ explicit target ``_print_quotation`` which never appears in the rendered HTML and is thus even
+ less likely to be modified.
+
+.. _contributing/hyperlink-target-prefix:
+
+Prefix hyperlink targets with application names
+===============================================
+
+As hyperlink targets are visible from the entire documentation when referenced with the ``ref``
+directive, it is recommended to prefix the target name with that of the related application. For
+instance, naming a target ``_amazon/form`` instead of ``_form`` avoids unwanted behaviors and makes
+the purpose of the target clear.
+
+.. _contributing/hyperlink-target-resilience:
+
+Don’t break hyperlink targets
+=============================
+
+When refactoring (improving without adding new content) section headings or hyperlink targets, take
+care not to break any hyperlink reference to these targets or update them accordingly.
+
+.. _contributing/single-underscore:
+
+Use single-underscore suffixes for hyperlink references
+=======================================================
+
+| Although using a double-underscore suffix works most of the time for classic hyperlink references,
+ it is not recommended as double-underscores normally indicate an anonymous hyperlink reference.
+ This is a special kind of hyperlink reference that makes use of nameless hyperlink targets
+ consisting only of two underscore.
+| tl;dr: Double-underscore suffixes work until they don’t and are bad practice, use
+ single-underscore suffixes instead.
diff --git a/contributing/documentation/introduction_guide.rst b/contributing/documentation/introduction_guide.rst
new file mode 100644
index 000000000..4986aa594
--- /dev/null
+++ b/contributing/documentation/introduction_guide.rst
@@ -0,0 +1,399 @@
+:banner: banners/contributing.png
+
+==================
+Introduction guide
+==================
+
+**First of all, thank you for landing here and helping us improve the user documentation of Odoo!**
+
+This introductory guide will help you acquire the tools and knowledge you need to write
+documentation, whether you plan to make a minor content change or document an application from
+scratch.
+
+.. note::
+ This tutorial only concern the `user documentation
+ `_ of Odoo. The documentation for `developing
+ in Odoo `_ in maintained alongside the
+ source code of Odoo at `github.com/odoo/odoo `_.
+
+.. _contributing/rst-intro:
+
+reStructuredText
+================
+
+Our documentation is written in **reStructuredText** (RST), a `lightweight markup language
+`_ consisting of normal text augmented
+with markup which allows including headings, images, notes, and so on. This might seem a bit
+abstract but there is no need to worry. :abbr:`RST (reStructuredText)` is not hard to learn,
+especially if you intend to make only small changes to the content.
+
+If you need to learn about a specific markup, head over to :doc:`our cheat sheet for RST
+` which contains all the information that you should ever need for the user
+documentation of Odoo.
+
+.. important::
+ We kindly ask you to observe a set of :doc:`guidelines ` as you write :abbr:`RST
+ (reStructuredText)`. This ensures that you stay consistent with the rest of the documentation and
+ facilitates the approval of your content changes as they are reviewed by a redactor at Odoo.
+
+.. seealso::
+ - :doc:`rst_cheat_sheet`
+ - :doc:`guidelines`
+
+.. _contributing/getting-started:
+
+Getting started
+===============
+
+As our documentation is maintained on GitHub, you will need a free GitHub account. Click `here
+`_ to create one.
+
+Now, depending on whether you want to update existing content, or rather work on new content and
+make file changes, you have two courses of action:
+
+#. **For small changes** in ``.rst`` files only, i.e. addition/edition of paragraphs or typos, **we
+ suggest that you use the GitHub interface**. This is the easiest and fasted way to submit your
+ request for changes for the documentation and is suitable for non-technical people. Read
+ :ref:`contributing/github-interface` to learn how to use this method.
+#. **For more complex cases**, it is necessary to **use Git and work from a local copy of the
+ documentation**. This method seems intimidating but only requires basic knowledge of Git. See
+ :ref:`contributing/canonical-git-workflow` for more information on this method.
+
+.. _contributing/github-interface:
+
+Use the GitHub interface
+========================
+
+#. Verify that you are browsing the documentation in the version that you intend to change. The
+ version can be selected from the dropdown in the top menu.
+
+ .. image:: media/version-selector.png
+
+#. Head over to the page that you want to change and click on the **Edit on GitHub** button in the
+ bottom of the left menu.
+
+ .. image:: media/edit-on-github.png
+
+#. If you do not have edit rights on the repository (`odoo/documentation-user
+ `_), you need to fork it by clicking on the
+ appropriate button. In other terms, you create a copy of the entire repository on your own
+ account. If you do have the edit rights, skip this step.
+
+ .. image:: media/fork-repository.png
+
+#. Make the appropriate changes while taking care of following the :doc:`guidelines `.
+
+#. Click on the **Preview changes** button to review your contribution in a more human-readable
+ format. Be aware that the preview is not able to handle all markups correctly. Notes and tips,
+ for instance, are not correctly rendered. The version of your content published to the website
+ will be, however.
+
+#. Go to the bottom of the page to create a commit (:dfn:`what packs your changes together and
+ labels them with a commit message`) of your changes.
+
+ #. | In first text box, describe your changes. For instance, "Fix a typo" and "Add documentation
+ for invoicing of sales orders" are two clear commit messages.
+ | In the second text box, justify *why* you made these changes, if you feel that it is not
+ obvious.
+ #. Select the option "Create a new branch for this commit and start a pull request." if you have
+ the choice (if you have partial or full edit writes on the repository). If not, skip this
+ step.
+ #. Click on the green button. It is either labelled "Commit changes" or "Propose file change".
+
+ .. image:: media/commit-changes.png
+
+#. In the dropdown for the selection of the base branch (i.e., the version of the documentation that
+ your changes concern), make sure to select the same version as in the first step of this guide
+ and click on the **Create pull request** button.
+
+ .. image:: media/select-branches-base.png
+
+#. Double-check your :abbr:`PR (Pull Request)` and, when ready, click again on the **Create pull
+ request** button to submit your changes for review by a redactor at Odoo.
+
+ .. image:: media/create-pull-request.png
+
+#. You're done! If your changes are approved straight away they will appear in the documentation the
+ very next day. It may also be the case that the reviewer has a question or a remark, so make sure
+ to check your notifications or your emails, depending on your account settings.
+
+.. _contributing/canonical-git-workflow:
+
+Use the canonical Git workflow
+==============================
+
+.. _contributing/prepare-machine:
+
+Prepare your machine
+--------------------
+
+.. _contributing/install-git:
+
+Install Git
+~~~~~~~~~~~
+
+We use `Git `_ to manage the files of the user documentation.
+It is a tool that allows to track the history of changes made to a file and, more importantly, to
+work on different versions of those files at the same time. It means that you do not need to worry
+about overwriting someone else’s pending work when you start editing the documentation.
+
+You must then configure Git to identify yourself as the author of your future contribution. Enter
+the same email address as the one you used to register on GitHub.
+
+#. Download and install **Git** on your machine.
+#. Verify that `the installation folder of Git is included in your system's PATH variable
+ `_.
+#. Execute the following commands in a terminal:
+
+ .. code-block:: console
+
+ $ git config --global user.name “Your Name”
+ $ git config --global user.email “youremail@example.com”
+
+.. _contributing/fetch-sources:
+
+Fetch the sources
+~~~~~~~~~~~~~~~~~
+
+As stated earlier, our documentation (in all its versions) is maintained on GitHub at
+`github.com/odoo/documentation-user `_. A modification
+is made by the mean of a :abbr:`PR (Pull Request)` (:dfn:`proposal of content changes`) to allow for
+a review of the changes before updating the sources of the documentation.
+
+Prior to submitting a modification, you need to make a copy of the sources and download that copy on
+your machine.
+
+#. Go to `github.com/odoo/documentation-user `_ and
+ click on the **Fork** button in the top right corner.
+
+ .. image:: media/fork-button.png
+
+#. Execute the following commands in a terminal:
+
+ .. code-block:: console
+
+ $ git clone https://github.com/odoo/documentation-user
+ $ cd documentation-user/
+
+ .. important::
+ If you do not have edit rights on the repository owned by Odoo, replace "odoo" with your
+ Github username in the URL of the command above. If you do have edit rights, it is not
+ necessary to fork the repository.
+
+#. In order to ease the collaboration between writers coming from many different systems and teams,
+ execute the following group of commands that correspond to your :abbr:`OS (Operating System)` in
+ a terminal.
+
+ - Windows:
+
+ .. code-block:: doscon
+
+ $ cd documentation-user/
+ $ git config --global core.autocrlf true
+ $ git config commit.template %CD%\commit_template.txt
+
+ - Linux or Mac OS:
+
+ .. code-block:: console
+
+ $ cd documentation-user/
+ $ git config --global core.autocrlf input
+ $ git config commit.template `pwd`/commit_template.txt
+
+.. _contributing/python:
+
+Python
+~~~~~~
+
+Because the documentation is written in :abbr:`RST (reStructuredText)`, it needs to be built
+(:dfn:`converted to HTML`) in order to display nicely. This is done by the documentation generator
+which takes the original :abbr:`RST (reStructuredText)` files as input, transforms the markups
+in a human-readable format, and outputs HTML files to be read in your web browser.
+
+The documentation generator that we use is called `Sphinx `_.
+and is written in `Python `_. You have
+to install Python in order to use Sphinx. For the record, Sphinx is the program and Python the
+programming language, but you do not need to know much more about them so don't panic!
+
+Python comes with its own package manager: `pip
+`_. It allows installing Python dependencies in
+a single command.
+
+#. Download and install the latest release of **Python 3** on your machine.
+#. Make sure to have **pip** installed on your machine (on Windows, you can install pip alongside
+ Python).
+#. Execute the following commands in a terminal to verify that both installations finished
+ successfully:
+
+ .. code-block:: console
+
+ $ python3 --version
+ $ pip3 --version
+
+#. Execute the following commands in a terminal to install the Python dependencies of the
+ documentation:
+
+ .. code-block:: console
+
+ $ cd documentation-user/
+ $ pip3 install -r requirements.txt
+
+.. note::
+ Depending on your :abbr:`OS (Operating System)`, you may need to run the commands ``python`` and
+ ``pip`` instead of ``python3`` and ``pip3``
+
+.. _contributing/make:
+
+Make
+~~~~
+
+`Make `_ is a tool that packs a bunch of
+command-lines into one to be easier to remember and to type. In our case, it is used to execute
+complex Sphinx build commands by using a single and simpler one instead.
+
+#. Download and install **Make** on your machine.
+#. Verify that `the installation folder of Make is included in your system's PATH variable
+ `_.
+
+.. _contributing/pngquant:
+
+pngquant
+~~~~~~~~
+
+`pngquant `_ is a tool that we use to compress PNG images so that the
+documentation does not end up weighting several Gigabytes in a few year span.
+
+#. Download and install **pngquant** on your machine.
+#. Verify that `the installation folder of pngquant is included in your system's PATH variable
+ `_.
+
+.. _contributing/prepare-version:
+
+Prepare your version
+--------------------
+
+Now that your machine is all set up, it is time to do the same for your version of the documentation
+files. As it would not be convenient to have several people working on the version 13.0 in parallel
+(conflicts of content would occur all the time), and in order to be able to create a :abbr:`PR
+(Pull Request)`, you must `create a new branch
+`_ starting from the branch 13.0. In other
+words, you copy the entirety of this version’s files and give it another name. For this example, we
+will go with ``13.0-my_contribution``.
+
+Execute the following commands in a terminal to...
+
+#. Navigate to the documentation folder:
+
+ .. code-block:: console
+
+ $ cd documentation-user/
+
+#. Switch to the version 13.0:
+
+ .. code-block:: console
+
+ $ git checkout 13.0
+
+#. Create your own branch which will be a copy of 13.0:
+
+ .. code-block:: console
+
+ $ git checkout -b 13.0-my_contribution
+
+.. _contributing/perform-changes:
+
+Perform your changes
+--------------------
+
+You can now perform any change you want to the documentation files. These changes must be compliant
+with :abbr:`RST (reStructuredText)` syntax (see :doc:`rst_cheat_sheet`) and with our
+:doc:`guidelines `.
+
+.. important::
+ If your changes include the addition of a new image, for instance :file:`my_image.png`, proceed
+ as follows:
+
+ #. Make sure that the image is in ``.png`` format.
+ #. Execute the following commands in a terminal:
+
+ .. code-block:: console
+
+ $ cd path-to-the-directory-of-the-image/
+ $ pngquant my_image.png
+
+ #. Delete :file:`my_image.png`.
+ #. Rename :file:`my_image-fs8.png` to :file:`my_image.png`.
+
+.. _contributing/preview-changes:
+
+Preview your changes
+--------------------
+
+To preview your changes in a generated documentation, proceed as follows:
+
+#. Execute the following commands in a terminal:
+
+ .. code-block:: console
+
+ $ cd documentation-user/
+ $ make clean
+ $ make html
+
+ .. tip::
+ You can omit the :command:`make clean` command when no recent change has been made to the
+ hierarchy of documentation files.
+
+#. Fix any error or warning shown in the logs of the build.
+#. Open the file :file:`documentation-user/_build/html/index.html` with your default web browser.
+
+.. note::
+ These steps have for only purpose to show you the final results of your changes. They have no
+ impact on the documentation source files.
+
+.. _contributing/submit-changes:
+
+Submit your changes
+-------------------
+
+.. important::
+ We expect you to have basic knowledge of Git, which should be enough to cover the basic flow of a
+ one-time contribution. If you plan on submitting several contributions, work on older versions of
+ the documentation or perform any other advanced action, we recommend you to be confident with
+ Git. Help yourself with `this manual of Git `_ and `this
+ interactive tutorial `_.
+
+#. Execute the following commands in a terminal:
+
+ .. code-block:: console
+
+ $ git add *
+ $ git commit
+ $ git push -u origin 13.0-my_contribution
+
+#. Go to `github.com/odoo/documentation-user/pulls
+ `_ and click on the **New pull request**
+ button.
+
+ .. image:: media/new-pull-request.png
+
+#. If you forked the base repository in the section :ref:`contributing/fetch-sources`, click on the
+ link **compare across forks** If not, skip this step.
+
+ .. image:: media/compare-across-forks.png
+
+#. In the dropdown for the selection of the base branch (i.e., the version of the documentation that
+ your changes concern), make sure to select the version that your changes target (here **13.0**).
+
+ .. image:: media/select-branches-fork.png
+
+#. Double-check your :abbr:`PR (Pull Request)` and, when ready, click again on the **Create pull
+ request** button to submit your changes for review by a redactor at Odoo.
+
+ .. image:: media/create-pull-request.png
+
+#. You're done! If your changes are approved straight away they will appear in the documentation the
+ very next day. It may also be the case that the reviewer has a question or a remark, so make sure
+ to check your notifications or your emails, depending on your account settings.
+
+
+.. _win-add-to-path: https://www.howtogeek.com/118594/how-to-edit-your-system-path-for-easy-command-line-access/
diff --git a/contributing/documentation/media/commit-changes.png b/contributing/documentation/media/commit-changes.png
new file mode 100644
index 000000000..f020ac025
Binary files /dev/null and b/contributing/documentation/media/commit-changes.png differ
diff --git a/contributing/documentation/media/compare-across-forks.png b/contributing/documentation/media/compare-across-forks.png
new file mode 100644
index 000000000..36dd14806
Binary files /dev/null and b/contributing/documentation/media/compare-across-forks.png differ
diff --git a/contributing/documentation/media/create-invoice.png b/contributing/documentation/media/create-invoice.png
new file mode 100644
index 000000000..b02b2c288
Binary files /dev/null and b/contributing/documentation/media/create-invoice.png differ
diff --git a/contributing/documentation/media/create-pull-request.png b/contributing/documentation/media/create-pull-request.png
new file mode 100644
index 000000000..fa559c7e0
Binary files /dev/null and b/contributing/documentation/media/create-pull-request.png differ
diff --git a/contributing/documentation/media/edit-on-github.png b/contributing/documentation/media/edit-on-github.png
new file mode 100644
index 000000000..a1fa44351
Binary files /dev/null and b/contributing/documentation/media/edit-on-github.png differ
diff --git a/contributing/documentation/media/fork-button.png b/contributing/documentation/media/fork-button.png
new file mode 100644
index 000000000..9b7179288
Binary files /dev/null and b/contributing/documentation/media/fork-button.png differ
diff --git a/contributing/documentation/media/fork-repository.png b/contributing/documentation/media/fork-repository.png
new file mode 100644
index 000000000..af76cafa7
Binary files /dev/null and b/contributing/documentation/media/fork-repository.png differ
diff --git a/contributing/documentation/media/new-pull-request.png b/contributing/documentation/media/new-pull-request.png
new file mode 100644
index 000000000..158055cef
Binary files /dev/null and b/contributing/documentation/media/new-pull-request.png differ
diff --git a/contributing/documentation/media/select-branches-base.png b/contributing/documentation/media/select-branches-base.png
new file mode 100644
index 000000000..efd6ac1c1
Binary files /dev/null and b/contributing/documentation/media/select-branches-base.png differ
diff --git a/contributing/documentation/media/select-branches-fork.png b/contributing/documentation/media/select-branches-fork.png
new file mode 100644
index 000000000..4305e2f91
Binary files /dev/null and b/contributing/documentation/media/select-branches-fork.png differ
diff --git a/contributing/documentation/media/version-selector.png b/contributing/documentation/media/version-selector.png
new file mode 100644
index 000000000..ba478332c
Binary files /dev/null and b/contributing/documentation/media/version-selector.png differ
diff --git a/contributing/documentation/rst_cheat_sheet.rst b/contributing/documentation/rst_cheat_sheet.rst
new file mode 100644
index 000000000..d391d363d
--- /dev/null
+++ b/contributing/documentation/rst_cheat_sheet.rst
@@ -0,0 +1,549 @@
+:banner: banners/contributing.png
+
+===============
+RST cheat sheet
+===============
+
+.. _contributing/headings:
+
+Headings
+========
+
+| For each formatting line (e.g., ``===``), write as many symbols (``=``) as there are characters in
+ the header.
+| The symbols used for the formatting are, in fact, not important. Only the order in which they are
+ written matters, as it determines the size of the decorated heading. This means that you may
+ encounter different heading formatting and in a different order, in which case you should follow
+ the formatting in place in the document. In any other case, use the formatting shown below.
+
++--------------+---------------+-------------------------------+
+| Heading size | Formatting | Min/Max number of occurrences |
++==============+===============+===============================+
+| H1 | | ``=======`` | 1/1 |
+| | | ``Heading`` | |
+| | | ``=======`` | |
++--------------+---------------+-------------------------------+
+| H2 | | ``Heading`` | 0/∞ |
+| | | ``=======`` | |
++--------------+---------------+-------------------------------+
+| H3 | | ``Heading`` | 0/∞ |
+| | | ``-------`` | |
++--------------+---------------+-------------------------------+
+| H4 | | ``Heading`` | 0/∞ |
+| | | ``~~~~~~~`` | |
++--------------+---------------+-------------------------------+
+| H5 | | ``Heading`` | 0/∞ |
+| | | ``*******`` | |
++--------------+---------------+-------------------------------+
+| H6 | | ``Heading`` | 0/∞ |
+| | | ``^^^^^^^`` | |
++--------------+---------------+-------------------------------+
+
+.. _contributing/markup:
+
+Markup
+======
+
+.. _contributing/inline-markup:
+
+Inline markup
+-------------
+
+Use the following markups to emphasize your text to your liking:
+
++--------------+----------+
+| \*\*Text\*\* | **Text** |
++--------------+----------+
+| \*Text\* | *Text* |
++--------------+----------+
+| \`\`Text\`\` | ``Text`` |
++--------------+----------+
+
+.. seealso::
+ - :ref:`contributing/specialized-directives`
+
+.. _contributing/bulleted-list:
+
+Bulleted list
+-------------
+
+.. code-block:: rst
+
+ - This is a bulleted list.
+ - It has two items, the second
+ item uses two lines.
+
+.. code-block:: rst
+
+ * This is a bulleted list too.
+ * The principle stays the same.
+
+.. _contributing/numbered-list:
+
+Numbered list
+-------------
+
+.. code-block:: rst
+
+ #. This is a numbered list.
+ #. Numbering is automatic.
+
+.. code-block:: rst
+
+ 1. This is a numbered list too.
+ 2. Use this format to specify the numbering.
+
+.. _contributing/nested-list:
+
+Nested lists
+------------
+
+.. code-block:: rst
+
+ - This is the first item of a bulleted list.
+
+ 1. It has a nested numbered list
+ 2. with two items.
+
+.. _contributing/hyperlinks:
+
+Hyperlinks
+==========
+
+.. _contributing/hyperlink-references:
+
+Hyperlink references
+--------------------
+
+Hyperlink references are links to a URL with a custom label. They follow this syntax:
+```label `_``
+
+.. note::
+ The URL can be a relative path to a file within the documentation.
+
+Example
+~~~~~~~
+
+This excerpt of :abbr:`RST (reStructuredText)`: ``For instance, `this is a hyperlink reference
+`_.`` is rendered as follows in HTML: “For instance, `this is a hyperlink
+reference `_.”
+
+.. _contributing/external-hyperlink-targets:
+
+External hyperlink targets
+--------------------------
+
+| External hyperlink targets allow creating shortcuts for hyperlink references.
+| The definition syntax is as follows: ``.. _target: URL``
+| There are two ways to reference them, depending on the use case:
+
+#. ``target_`` creates a hyperlink with the target name as label and the URL as reference. Note that
+ the ``_`` moved after the target!
+#. ```label `_`` does exactly what you expect: the label replaces the name of the target,
+ and the target is replaced by the URL.
+
+Example
+~~~~~~~
+
+RST
+***
+
+.. code-block:: rst
+
+ .. _proof-of-concept: https://en.wikipedia.org/wiki/Proof_of_concept
+
+ A proof-of-concept_ is a simplified version, a prototype of what is expected to agree on the main
+ lines of expected changes. `PoC `_ is a common abbreviation.
+
+Render
+******
+
+A `proof-of-concept `_ is a simplified version, a
+prototype of what is expected to agree on the main lines of expected changes. `PoC
+`_ is a common abbreviation.
+
+.. _contributing/internal-hyperlink-targets:
+
+Internal hyperlink targets
+--------------------------
+
+Internal hyperlink targets follow the same syntax as external hyperlink targets but without any URL.
+Indeed, they are internal. They allow referencing a specific part of a document by using the target
+as an anchor. When the user clicks on the reference, the documentation scrolls to the part of the
+page containing the target.
+
+.. important::
+ Targets can be referenced from other files than the ones in which they are defined.
+
+| The definition syntax is: ``.. _target:``
+| There are two ways to reference them, both using the ``ref`` directive:
+
+#. ``:ref:`target``` creates a hyperlink to the anchor with the heading defined below as label.
+#. ``:ref:`label ``` creates a hyperlink to the anchor with the given label.
+
+See :ref:`contributing/relative-links` to learn how to write proper relative links for internal
+references.
+
+.. note::
+ Notice that there is no ``_`` at the end, as it is done with :ref:`hyperlink targets
+ `.
+
+Example
+~~~~~~~
+
+RST
+***
+
+.. code-block:: rst
+
+ .. _sales/quotation/start-of-page:
+
+ This can easily be done by creating a new product, see :ref:`product` for additional help.
+
+ .. _sales/quotation/product:
+
+ How to create a product?
+ =========================
+
+ As explained at the :ref:`start of the page `, ...
+
+Render
+******
+
+This can easily be done by creating a new product, see `How to create a product?
+`_ for additional help.
+
+**How to create a product?**
+
+As explained at the `start of the page `_, ...
+
+.. _contributing/implicit-hyperlink-targets:
+
+Implicit hyperlink targets
+--------------------------
+
+| Implicit hyperlink targets are a special kind of internal hyperlink targets: they are
+ automatically generated by section titles, footnotes, etc. Consequently, they don’t have a
+ definition syntax.
+| They can be referenced the same first way as external hyperlink targets by using the name of the
+ section title as URL.
+
+Example
+~~~~~~~
+
+RST
+***
+
+.. code-block:: rst
+
+ This can easily be done by creating a new user, see `How to create a new user?`_ for
+ additional help. ...
+
+Render
+******
+
+This can easily be done by creating a new user, see `How to create a new user?
+`_ for additional help. ...
+
+.. _contributing/doc:
+
+The ``doc`` directive
+---------------------
+
+| The ``doc`` directive allows referencing a documentation page wherever it is in the file tree
+ through a relative file path.
+| As usual, there are two ways to use the directive:
+
+#. ``:doc:`path_to_doc_page``` creates a hyperlink reference to the documentation page with the
+ title of the page as label.
+#. ``:doc:`label ``` creates a hyperlink reference to the documentation page with
+ the given label.
+
+Example
+~~~~~~~
+
+RST
+***
+
+.. code-block:: rst
+
+ Please refer to :doc:`this documentation ` and to
+ :doc:`../sales/invoicing/proforma`.
+
+Render
+******
+
+Please refer to `this documentation `_ and to
+`Send a pro-forma invoice `_.
+
+.. _contributing/download:
+
+The ``download`` directive
+--------------------------
+
+The ``download`` directive allows referencing files (that are not necessarily :abbr:`RST
+(reStructuredText)` documents) within the source tree to be downloaded.
+
+Example
+~~~~~~~
+
+RST
+***
+
+.. code-block:: rst
+
+ Download this :download:`module structure template ` to start building your
+ module in no time.
+
+Render
+******
+
+Download this `module structure template `_ to
+start building your module in no time.
+
+.. _contributing/image:
+
+The ``image`` directive
+-----------------------
+
+The ``image`` directive allows inserting images in a document. It comes with a set of optional
+parameter directives that can individually be omitted if considered redundant.
+
+Example
+~~~~~~~
+
+RST
+***
+
+.. code-block:: rst
+
+ .. image:: media/create_invoice.png
+ :align: center
+ :alt: Create an invoice
+ :height: 100
+ :width: 200
+ :scale: 50
+ :class: img-thumbnail
+ :target: ../invoicing.html#create-an-invoice
+
+Render
+******
+
+.. image:: media/create-invoice.png
+ :align: center
+ :alt: Create an invoice
+ :height: 100
+ :width: 200
+ :scale: 50
+ :class: img-thumbnail
+ :target: https://example.com/doc/sales/invoicing.html#create-an-invoice
+
+.. _contributing/admonitions:
+
+Admonitions (alert blocks)
+==========================
+
+.. _contributing/seealso:
+
+Seealso
+-------
+
+RST
+~~~
+
+.. code-block:: rst
+
+ .. seealso::
+ - :doc:`customer_invoices`
+ - `Pro-forma invoices <../sales/invoicing/proforma.html#activate-the-feature>`_
+
+Render
+~~~~~~
+
+.. seealso::
+ - `Customer invoices `_
+ - `Pro-forma invoices `_
+
+.. _contributing/note:
+
+Note
+----
+
+RST
+~~~
+
+.. code-block:: rst
+
+ .. note::
+ Use this to get the attention of the reader about additional information.
+
+Render
+~~~~~~
+
+.. note::
+ Use this to get the attention of the reader about additional information.
+
+.. _contributing/tip:
+
+Tip
+---
+
+RST
+~~~
+
+.. code-block:: rst
+
+ .. tip::
+ Use this to inform the reader about a useful trick that requires an
+ action.
+
+Render
+~~~~~~
+
+.. tip::
+ Use this to inform the reader about a useful trick that requires an
+ action.
+
+.. _contributing/important:
+
+Important
+---------
+
+RST
+~~~
+
+.. code-block:: rst
+
+ .. important::
+ Use this to notify the reader about an important information.
+
+Render
+~~~~~~
+
+.. important::
+ Use this to notify the reader about an important information.
+
+.. _contributing/warning:
+
+Warning
+-------
+
+RST
+~~~
+
+.. code-block:: rst
+
+ .. warning::
+ Use this to require the reader to proceed with caution with what is
+ described in the warning.
+
+Render
+~~~~~~
+
+.. warning::
+ Use this to require the reader to proceed with caution with what is
+ described in the warning.
+
+.. _contributing/danger:
+
+Danger
+------
+
+RST
+~~~
+
+.. code-block:: rst
+
+ .. danger::
+ Use this to alarm the reader about a serious threat.
+
+Render
+~~~~~~
+
+.. danger::
+ Use this to alarm the reader about a serious threat.
+
+.. _contributing/formatting-tips:
+
+Formatting tips
+===============
+
+.. _contributing/line-break:
+
+Break the line but not the paragraph
+------------------------------------
+
+RST
+~~~
+
+.. code-block:: rst
+
+ | First super long line that you break in two…
+ here is rendered as a single line.
+ | Second line that follows a line break.
+
+Render
+~~~~~~
+
+| First super long line that you break in two…
+ here is rendered as a single line.
+| Second line that follows a line break.
+
+.. _contributing/comments:
+
+Add comments
+------------
+
+If you made a particular choice of writing or formatting that a future writer should be able to
+understand and take into account, consider writing a comment. Comments are blocks of text that do
+not count as a part of the documentation and that are used to pass a message to writers of the
+source code. They consist of a line starting with two dots and a space, followed by the comment.
+
+``.. For instance, this line will not be rendered in the documentation.``
+
+.. _contributing/tables:
+
+Use tables
+----------
+
+Make use of `this convenient table generator `_ to
+build your tables. Then, copy-paste the generated formatting into your document.
+
+.. _contributing/specialized-directives:
+
+Spice your writing with specialized directives
+----------------------------------------------
+
+Use these additional directives to fine-tune your content:
+
++-------------------+------------------------------------------+-------------------------------------------------------------------------------------------------------------------+
+| **Directive** | **Purpose** | **Example** |
+| | +-----------------------------------------------------------+-------------------------------------------------------+
+| | | **RST** | **HTML** |
++-------------------+------------------------------------------+-----------------------------------------------------------+-------------------------------------------------------+
+| ``abbr`` | Self-defining abbreviations | ``:abbr:`SO (Sales Order)``` | :abbr:`SO (Sales Order)` |
++-------------------+------------------------------------------+-----------------------------------------------------------+-------------------------------------------------------+
+| ``command`` | Highlight a command | ``:command:`python example.py``` | :command:`python example.py` |
++-------------------+------------------------------------------+-----------------------------------------------------------+-------------------------------------------------------+
+| ``dfn`` | Define a term | ``:dfn:`a definition for a new term``` | :dfn:`a definition for a new term` |
++-------------------+------------------------------------------+-----------------------------------------------------------+-------------------------------------------------------+
+| ``file`` | Indicate a file path | ``:file:`~/odoo/odoo-bin``` | :file:`~/odoo/odoo-bin` |
++-------------------+------------------------------------------+-----------------------------------------------------------+-------------------------------------------------------+
+| ``menuselection`` | Guide a user through a sequence of menus | ``:menuselection:`Sales --> Configuration --> Settings``` | :menuselection:`Sales --> Configuration --> Settings` |
++-------------------+------------------------------------------+-----------------------------------------------------------+-------------------------------------------------------+
+
+.. _contributing/escaping:
+
+Escape markup symbols (Advanced)
+--------------------------------
+
+Markup symbols escaped with backslashes (``\``) are rendered normally. For instance, ``this
+\*\*line of text\*\* with \*markup\* symbols`` is rendered as “this \*\*line of text\*\* with
+\*markup\* symbols”.
+
+When it comes to backticks (`````), which are used in many case such as :ref:`hyperlink references
+`, using backslashes for escaping is no longer an option because
+the outer backticks interpret enclosed backslashes and thus prevent them from escaping inner
+backticks. For instance, ```\`this formatting\```` produces an ``[UNKNOWN NODE title_reference]``
+error. Instead, `````this formatting````` should be used to produce the following result:
+```this formatting```.
diff --git a/practical.rst b/practical.rst
index 83efa5e11..46b35d221 100644
--- a/practical.rst
+++ b/practical.rst
@@ -13,3 +13,4 @@ Practical Information
portal/my_odoo_portal
support
legal
+ contributing
diff --git a/requirements.txt b/requirements.txt
index 71121d994..95726293f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1 +1,2 @@
-Sphinx<2
\ No newline at end of file
+Sphinx>=2.4.0
+Werkzeug==0.14.1
\ No newline at end of file
diff --git a/support.rst b/support.rst
index 6580fba93..83164ef8e 100644
--- a/support.rst
+++ b/support.rst
@@ -10,4 +10,3 @@ Support
support/where_can_i_get_support
support/what_can_i_expect
support/supported_versions
- support/user_doc
diff --git a/support/user_doc.rst b/support/user_doc.rst
deleted file mode 100644
index 112445751..000000000
--- a/support/user_doc.rst
+++ /dev/null
@@ -1,152 +0,0 @@
-.. :banner: banners/support.png
-
-
-===============================
-Contribute to the documentation
-===============================
-
-First of all...
-===============
-
-**... Thank you for landing here and helping us to improve the user documentation of Odoo.**
-
-
-Edit an existing page
-=====================
-
-#. As our documentation is maintained on GitHub, you'll need a free `GitHub account
- `_.
-#. Pick a page in our :doc:`user documentation <../index>`.
- **Please take care of selecting the right version of Odoo.**
-#. Click on **Edit on Github** in the left menu.
-
- .. image:: ./media/edit_on_github.png
- :align: center
- :alt: Click on "Edit on Github".
-
-#. If this is the first time you edit our documentation, click on **Fork repository**, otherwise
- you won't see this step.
-#. Use Github's editor to add your text. Text is tagged with a simple syntax called `RST
- `_. Don't worry, it's not so hard to learn 🤓...
- See the following section of this document for a quick overview of RST commands.
-
- .. image:: ./media/add_text.png
- :align: center
- :alt: Use Github's editor to add your text.
-
-#. Click on **Preview changes** to review your contribution in a human-readable format.
-
- .. image:: ./media/preview_changes.png
- :align: center
- :alt: Click on "Preview changes" to review your contribution.
-
-#. In the **Propose file change** section, add a short title to your contribution.
- The title should summarize your changes. You may use the second box to add an extended
- description if your contribution requires a longer explanation.
-
- .. image:: ./media/propose_changes.png
- :align: center
- :alt: Add a title and submit your contribution.
-
-#. Submit your contribution by clicking on **Propose file change**.
-#. Click on **Create pull request**.
-#. Wait for an Odoo maintainer to add your contribution. Thank you for your help!
-
-.. warning::
- There is no automatic port of your edit to another version of the documentation.
-
- If your change should apply to multiple versions of Odoo, please warn us in your contribution message.
-
-
-RST Cheat Sheet
----------------
-
-.. TODO merge with our internal tutorial : https://docs.google.com/document/d/19QkK9zDpoHJ57QtBgAs0sjInfO8zR_3mfCIr-CxS85Y/
-
-Here is a summary of the markup elements you may use while editing our documentation.
-
-+------------------------------+--------------------------+---------------------------------------+
-| Code | Display | Comments |
-+==============================+==========================+=======================================+
-| .. code-block:: rst | Text in *italics* | |
-| | | |
-| Text in *italics* | | |
-+------------------------------+--------------------------+---------------------------------------+
-| .. code-block:: rst | Text in **bold** letters | |
-| | | |
-| Text in **bold** letters | | |
-+------------------------------+--------------------------+---------------------------------------+
-| .. code-block:: rst | 1. Numbered | - Must be surrounded by white lines. |
-| | 2. Bullet | |
-| 1. Numbered | 3. List | |
-| 2. Bullet | | |
-| 3. List | | |
-+------------------------------+--------------------------+---------------------------------------+
-| .. code-block:: rst | - Numbered | - Must be surrounded by white lines. |
-| | - Bullet | |
-| - Bullet | - List | |
-| - Point | | |
-| - List | | |
-+------------------------------+--------------------------+---------------------------------------+
-| .. code-block:: rst | This is `a hyper link | - Here is `how to enter backticks |
-| | `_.| on your keyboard |
-| This is `a hyper link | | `_. |
-| `_. | | - Don't forget terminal *underscore*. |
-+------------------------------+--------------------------+---------------------------------------+
-
-
-.. note::
- There are many more commands available, see `comprehensive documentation
- `_ of RST.
-
-
-Add images to your documents
-============================
-
-
-.. warning::
- This procedure is possible only for users who have **push** access on the documentation repository (eg: mainly, Odoo maintainers).
- We are working on improving this.
-
-1. First of all, prepare your screenshots.
-
- - They must be good-quality PNG images.
- - Crop your screenshots to display only the relevant part of the screen. Large screenshots are hard
- to read and don't display well in a documentation.
- - Always take your screenshots on a demo instance of Odoo; **never** include any personal data.
-
-2. Upload them to the ``media/`` directory which is located next to the page you are editing. If the directory does not exist, create it.
-3. When editing your page, use this code piece in order to load your image:
-
- .. code-block:: rst
-
- .. image:: ./media/your_image_file.png
- :align: center
- :alt: Text that is displayed when your image is not available (eg: for screen readers and other accessibility tools)
-
-4. Submit your changes
-
-
-.. Add a page about a new topic
-.. ============================
-
-.. TODO publish our internal tutorial : https://docs.google.com/document/d/1EP32VFjN08piZoGn1BXT6ZOVb5AKUTieeeuK10nxZz8/
-
-
-Technical Details for Nerds
-===========================
-
-Advanced users may, of course, fork and clone the `GitHub repository `_.
-Then submit a pull request with the canonical Git/GitHub workflow.
-
-See our `README `_ file about building
-the documentation.
-
-
-Developer documentation
-=======================
-
-Documentation that targets developers of Odoo apps is maintained alongside `the source code of Odoo `_.
-
-.. note::
- User documentation might contain technicalities yet, when they are related to configuration and everyday use of Odoo.