From 9d4233eed0127448137ec607ab02e6ef4f9092d4 Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Wed, 28 Apr 2021 11:33:00 +0200 Subject: [PATCH 1/5] translator.py: remove commented code --- extensions/odoo_theme/translator.py | 439 +--------------------------- 1 file changed, 1 insertion(+), 438 deletions(-) diff --git a/extensions/odoo_theme/translator.py b/extensions/odoo_theme/translator.py index 637082d99..99f85d920 100644 --- a/extensions/odoo_theme/translator.py +++ b/extensions/odoo_theme/translator.py @@ -76,9 +76,6 @@ class BootstrapTranslator(HTML5Translator): self.context = [] self.section_level = 0 - # self.config = self.builder.config - # self.highlightlang = self.highlightlang_base = self.builder.config.highlight_language - self.first_param = 1 self.param_separator = ',' @@ -91,32 +88,17 @@ class BootstrapTranslator(HTML5Translator): 0xa0: u' ' }) - # def add_meta(self, meta): - # self.meta.append('\n ' + meta) - - # only "space characters" SPACE, CHARACTER TABULATION, LINE FEED, - # FORM FEED and CARRIAGE RETURN should be collapsed, not al White_Space - - def unknown_visit(self, node): print("unknown node", node.__class__.__name__) self.body.append(u'[UNKNOWN NODE {}]'.format(node.__class__.__name__)) raise nodes.SkipNode - # VFE NOTE: seems that when we remove/comment this, we get 5 times the tiles in the global toc :D + # VFE NOTE: seems that when we remove/comment this, we get the titles 5 timesin the global toc :D def visit_document(self, node): self.first_title = True def depart_document(self, node): pass - # def visit_meta(self, node): - # if node.hasattr('lang'): - # node['xml:lang'] = node['lang'] - # meta = self.starttag(node, 'meta', **node.non_default_attributes()) - # self.add_meta(meta) - # def depart_meta(self, node): - # pass - # Breaks Accounting memento if commented def visit_section(self, node): # close "parent" or preceding section, unless this is the opening of @@ -132,13 +114,6 @@ class BootstrapTranslator(HTML5Translator): if not self.section_level: self.body.append(u'') - # # VFE FIXME do we need to keep this logic ? - # # Seems that the only change is the use of a nav instead of a div. - # def visit_topic(self, node): - # self.body.append(self.starttag(node, 'nav')) - # def depart_topic(self, node): - # self.body.append(u'') - # overwritten # Class mapping: # admonition [name] -> alert-[name] @@ -185,415 +160,3 @@ class BootstrapTranslator(HTML5Translator): classes.append('align-%s' % node['align']) tag = self.starttag(node, 'table', CLASS=' '.join(classes)) self.body.append(tag) - - # def is_compact_paragraph(self, node): - # parent = node.parent - # if isinstance(parent, (nodes.document, nodes.compound, - # addnodes.desc_content, - # addnodes.versionmodified)): - # # Never compact paragraphs in document or compound. - # return False - - # for key, value in node.attlist(): - # # we can ignore a few specific classes, all other non-default - # # attributes require that a

node remains - # if key != 'classes' or value not in ([], ['first'], ['last'], ['first', 'last']): - # return False - - # first = isinstance(node.parent[0], nodes.label) - # for child in parent.children[first:]: - # # only first paragraph can be compact - # if isinstance(child, nodes.Invisible): - # continue - # if child is node: - # break - # return False - # parent_length = len([ - # 1 for n in parent - # if not isinstance(n, (nodes.Invisible, nodes.label)) - # ]) - # return parent_length == 1 - - # def visit_paragraph(self, node): - # if self.is_compact_paragraph(node): - # self.context.append(u'') - # return - # self.body.append(self.starttag(node, 'p')) - # self.context.append(u'

') - # def depart_paragraph(self, node): - # self.body.append(self.context.pop()) - - # def visit_problematic(self, node): - # if node.hasattr('refid'): - # self.body.append('' % node['refid']) - # self.context.append('') - # else: - # self.context.append('') - # self.body.append(self.starttag(node, 'span', CLASS='problematic')) - - # def depart_problematic(self, node): - # self.body.append('') - # self.body.append(self.context.pop()) - - # def visit_bullet_list(self, node): - # self.body.append(self.starttag(node, 'ul')) - # def depart_bullet_list(self, node): - # self.body.append(u'') - # def visit_enumerated_list(self, node): - # self.body.append(self.starttag(node, 'ol')) - # def depart_enumerated_list(self, node): - # self.body.append(u'') - # def visit_list_item(self, node): - # self.body.append(self.starttag(node, 'li')) - # def depart_list_item(self, node): - # self.body.append(u'') - # def visit_definition_list(self, node): - # self.body.append(self.starttag(node, 'dl')) - # def depart_definition_list(self, node): - # self.body.append(u'') - # def visit_definition_list_item(self, node): - # pass - # def depart_definition_list_item(self, node): - # pass - # def visit_term(self, node): - # self.body.append(self.starttag(node, 'dt')) - # def depart_term(self, node): - # self.body.append(u'') - # def visit_termsep(self, node): - # self.body.append(self.starttag(node, 'br')) - # raise nodes.SkipNode - # def visit_definition(self, node): - # self.body.append(self.starttag(node, 'dd')) - # def depart_definition(self, node): - # self.body.append(u'') - - # def visit_admonition(self, node, type=None): - # clss = { - # # ???: 'alert-success', - - # 'note': 'alert-info', - # 'hint': 'alert-info', - # 'tip': 'alert-info', - # 'seealso': 'alert-go_to', - - # 'warning': 'alert-warning', - # 'attention': 'alert-warning', - # 'caution': 'alert-warning', - # 'important': 'alert-warning', - - # 'danger': 'alert-danger', - # 'error': 'alert-danger', - - # 'exercise': 'alert-exercise', - # } - # self.body.append(self.starttag(node, 'div', role='alert', CLASS='alert {}'.format( - # clss.get(type, '') - # ))) - # if 'alert-dismissible' in node.get('classes', []): - # self.body.append( - # u'') - # if type: - # node.insert(0, nodes.title(type, admonitionlabels[type])) - # def depart_admonition(self, node): - # self.body.append(u'') - - # def visit_versionmodified(self, node): - # self.body.append(self.starttag(node, 'div', CLASS=node['type'])) - # def depart_versionmodified(self, node): - # self.body.append(u'') - - # # the rubric should be a smaller heading than the current section, up to - # # h6... maybe "h7" should be a ``p`` instead? - # def visit_rubric(self, node): - # self.body.append(self.starttag(node, 'h{}'.format(min(self.section_level + 1, 6)))) - # def depart_rubric(self, node): - # self.body.append(u''.format(min(self.section_level + 1, 6))) - - # # one more div in the base class: keep it? - # # def visit_block_quote(self, node): - # # self.body.append(self.starttag(node, 'blockquote')) - # # def depart_block_quote(self, node): - # # self.body.append(u'') - # def visit_attribution(self, node): - # self.body.append(self.starttag(node, 'footer')) - # def depart_attribution(self, node): - # self.body.append(u'') - - # def visit_container(self, node): - # self.body.append(self.starttag(node, 'div')) - # def depart_container(self, node): - # self.body.append(u'') - # def visit_compound(self, node): - # self.body.append(self.starttag(node, 'div')) - # def depart_compound(self, node): - # self.body.append(u'') - - # # overwritten, check if super can still be used - # def visit_image(self, node): - # uri = node['uri'] - # if uri in self.builder.images: - # uri = posixpath.join(self.builder.imgpath, - # self.builder.images[uri]) - # attrs = {'src': uri, 'class': 'img-fluid'} - # if 'alt' in node: - # attrs['alt'] = node['alt'] - # if 'align' in node: - # if node['align'] == 'center': - # attrs['class'] += ' center-block' - # else: - # doc = None - # if node.source: - # doc = node.source - # if node.line: - # doc += ':%d' % node.line - # self.builder.app.warn( - # "Unsupported alignment value \"%s\"" % node['align'], - # location=doc - # ) - # elif 'align' in node.parent and node.parent['align'] == 'center': - # # figure > image - # attrs['class'] += ' center-block' - - # # todo: explicit width/height/scale? - # self.body.append(self.starttag(node, 'img', **attrs)) - # def depart_image(self, node): pass - # def visit_figure(self, node): - # self.body.append(self.starttag(node, 'div')) - # def depart_figure(self, node): - # self.body.append(u'') - # # def visit_caption(self, node): - # # # first paragraph of figure content - # # self.body.append(self.starttag(node, 'h4')) - # # def depart_caption(self, node): - # # self.body.append(u'') - # def visit_legend(self, node): pass - # def depart_legend(self, node): pass - - # def visit_line(self, node): - # self.body.append(self.starttag(node, 'div', CLASS='line')) - # # ensure the line still takes the room it needs - # if not len(node): self.body.append(u'
') - # def depart_line(self, node): - # self.body.append(u'') - - # def visit_line_block(self, node): - # self.body.append(self.starttag(node, 'div', CLASS='line-block')) - # def depart_line_block(self, node): - # self.body.append(u'') - - # # def visit_table(self, node): - # # self.body.append(self.starttag(node, 'table', CLASS='table')) - # # def depart_table(self, node): - # # self.body.append(u'') - # def visit_tgroup(self, node): pass - # def depart_tgroup(self, node): pass - # def visit_colspec(self, node): raise nodes.SkipNode - # def visit_thead(self, node): - # self.body.append(self.starttag(node, 'thead')) - # def depart_thead(self, node): - # self.body.append(u'') - # def visit_tbody(self, node): - # self.body.append(self.starttag(node, 'tbody')) - # def depart_tbody(self, node): - # self.body.append(u'') - # def visit_row(self, node): - # self.body.append(self.starttag(node, 'tr')) - # def depart_row(self, node): - # self.body.append(u'') - # def visit_entry(self, node): - # if isinstance(node.parent.parent, nodes.thead): - # tagname = 'th' - # else: - # tagname = 'td' - # self.body.append(self.starttag(node, tagname)) - # self.context.append(tagname) - # def depart_entry(self, node): - # self.body.append(u''.format(self.context.pop())) - - # # def visit_Text(self, node): - # # self.body.append(self.encode(node.astext())) - # # def depart_Text(self, node): - # # pass - # def visit_literal(self, node): - # self.body.append(self.starttag(node, 'code')) - # def depart_literal(self, node): - # self.body.append(u'') - # visit_literal_emphasis = visit_literal - # depart_literal_emphasis = depart_literal - # def visit_emphasis(self, node): - # self.body.append(self.starttag(node, 'em')) - # def depart_emphasis(self, node): - # self.body.append(u'') - # def visit_strong(self, node): - # self.body.append(self.starttag(node, 'strong')) - # def depart_strong(self, node): - # self.body.append(u'') - # visit_literal_strong = visit_strong - # depart_literal_strong = depart_strong - # def visit_inline(self, node): - # self.body.append(self.starttag(node, 'span')) - # def depart_inline(self, node): - # self.body.append(u'') - - # # def visit_download_reference(self, node): - # # # type: (nodes.Node) -> None - # # if node.hasattr('filename'): - # # self.body.append( - # # '' % - # # posixpath.join(self.builder.dlpath, node['filename'])) - # # self.body.append(node.astext()) - # # self.body.append('') - # # raise nodes.SkipNode - # # else: - # # self.context.append('') - # # def depart_download_reference(self, node): - # # # type: (nodes.Node) -> None - # # self.body.append(self.context.pop()) - # def visit_target(self, node): pass - # def depart_target(self, node): pass - # def visit_footnote(self, node): - # self.body.append(self.starttag(node, 'div', CLASS='footnote')) - # self.footnote_backrefs(node) - # def depart_footnote(self, node): - # self.body.append(u'') - # def visit_footnote_reference(self, node): - # self.body.append(self.starttag( - # node, 'a', href='#' + node['refid'], CLASS="footnote-ref")) - # def depart_footnote_reference(self, node): - # self.body.append(u'') - # def visit_label(self, node): - # self.body.append(self.starttag(node, 'span', CLASS='footnote-label')) - # self.body.append(u'%s[' % self.context.pop()) - # def depart_label(self, node): - # # Context added in footnote_backrefs. - # self.body.append(u']%s %s' % (self.context.pop(), self.context.pop())) - # def footnote_backrefs(self, node): - # # should store following data on context stack (in that order since - # # they'll be popped so LIFO) - # # - # # * outside (after) label - # # * after label text - # # * before label text - # backrefs = node['backrefs'] - # if not backrefs: - # self.context.extend(['', '', '']) - # elif len(backrefs) == 1: - # self.context.extend([ - # '', - # '', - # '' % backrefs[0] - # ]) - # else: - # backlinks = ( - # '%s' % (backref, i) - # for i, backref in enumerate(backrefs, start=1) - # ) - # self.context.extend([ - # '(%s) ' % ', '.join(backlinks), - # '', - # '' - # ]) - - # def visit_desc(self, node): - # self.body.append(self.starttag(node, 'section', CLASS='code-' + node['objtype'])) - # def depart_desc(self, node): - # self.body.append(u'') - # def visit_desc_signature(self, node): - # self.body.append(self.starttag(node, 'h6')) - # self.body.append(u'') - # def depart_desc_signature(self, node): - # self.body.append(u'') - # self.body.append(u'') - # def visit_desc_addname(self, node): pass - # def depart_desc_addname(self, node): pass - # def visit_desc_type(self, node): pass - # def depart_desc_type(self, node): pass - # def visit_desc_returns(self, node): - # self.body.append(u' → ') - # def depart_desc_returns(self, node): - # pass - # def visit_desc_name(self, node): pass - # def depart_desc_name(self, node): pass - # def visit_desc_parameterlist(self, node): - # self.body.append(u'(') - # self.first_param = True - # self.optional_param_level = 0 - # # How many required parameters are left. - # self.required_params_left = sum(isinstance(c, addnodes.desc_parameter) for c in node.children) - # self.param_separator = node.child_text_separator - # def depart_desc_parameterlist(self, node): - # self.body.append(u')') - # # If required parameters are still to come, then put the comma after - # # the parameter. Otherwise, put the comma before. This ensures that - # # signatures like the following render correctly (see issue #1001): - # # - # # foo([a, ]b, c[, d]) - # # - # def visit_desc_parameter(self, node): - # if self.first_param: - # self.first_param = 0 - # elif not self.required_params_left: - # self.body.append(self.param_separator) - # if self.optional_param_level == 0: - # self.required_params_left -= 1 - # if 'noemph' not in node: self.body.append(u'') - # def depart_desc_parameter(self, node): - # if 'noemph' not in node: self.body.append(u'') - # if self.required_params_left: - # self.body.append(self.param_separator) - # def visit_desc_optional(self, node): - # self.optional_param_level += 1 - # self.body.append(u'[') - # def depart_desc_optional(self, node): - # self.optional_param_level -= 1 - # self.body.append(u']') - # def visit_desc_annotation(self, node): - # self.body.append(self.starttag(node, 'em')) - # def depart_desc_annotation(self, node): - # self.body.append(u'') - # def visit_desc_content(self, node): pass - # def depart_desc_content(self, node): pass - # def visit_field_list(self, node): - # self.body.append(self.starttag(node, 'div', CLASS='code-fields')) - # def depart_field_list(self, node): - # self.body.append(u'') - # def visit_field(self, node): - # self.body.append(self.starttag(node, 'div', CLASS='code-field')) - # def depart_field(self, node): - # self.body.append(u'') - # def visit_field_name(self, node): - # self.body.append(self.starttag(node, 'div', CLASS='code-field-name')) - # def depart_field_name(self, node): - # self.body.append(u'') - # def visit_field_body(self, node): - # self.body.append(self.starttag(node, 'div', CLASS='code-field-body')) - # def depart_field_body(self, node): - # self.body.append(u'') - - # def visit_raw(self, node): - # if 'html' in node.get('format', '').split(): - # t = 'span' if isinstance(node.parent, nodes.TextElement) else 'div' - # if node['classes']: - # self.body.append(self.starttag(node, t)) - # self.body.append(node.astext()) - # if node['classes']: - # self.body.append('' % t) - # # Keep non-HTML raw text out of output: - # raise nodes.SkipNode - - # # internal node - # def visit_substitution_definition(self, node): raise nodes.SkipNode - - # # without set_translator, add_node doesn't work correctly, so the - # # serialization of html_domain nodes needs to be embedded here - # def visit_div(self, node): - # self.body.append(self.starttag(node, 'div')) - # def depart_div(self, node): - # self.body.append(u'\n') - # def visit_address(self, node): - # self.body.append(self.starttag(node, 'address')) - # def depart_address(self, node): - # self.body.append(u'') - # # TODO: inline elements From 77a2c9feaff3f1aa452fdf2b7b40d468f02d2946 Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Wed, 28 Apr 2021 11:34:07 +0200 Subject: [PATCH 2/5] remove/fix leftover todo/fixme/... comments --- conf.py | 5 +++-- extensions/github_link/__init__.py | 4 ---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/conf.py b/conf.py index 9b6af150a..7b5123524 100644 --- a/conf.py +++ b/conf.py @@ -164,9 +164,10 @@ html_favicon = os.path.join(html_theme_path[0], html_theme, 'static', 'img', 'fa html_static_path = ['static'] html_add_permalinks = '¶' # Sphinx < 3.5 html_permalinks = True # Sphinx >= 3.5 -# The page-specific js files that can be imported with the 'custom-js' metadata directive. TODO VFE does it act as a filter? Why are there already some imports not listed here? +# Additional css & js files: +# Empty because the js & css files are specified in the extensions/theme +# or specified for a given page only through the custom-js & custom-css metadata directives html_js_files = [] -# The page-specific css files that can be imported with the 'custom-css' metadata directive. TODO VFE does it act as a filter? Why are there already some imports not listed here? html_css_files = [] # PHP lexer option to not require Date: Wed, 28 Apr 2021 12:11:29 +0200 Subject: [PATCH 3/5] layout cleanup/improvements remove outdated comments fix todos/fixmes ... --- extensions/odoo_theme/layout.html | 32 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/extensions/odoo_theme/layout.html b/extensions/odoo_theme/layout.html index 70007992a..20d38f0bf 100644 --- a/extensions/odoo_theme/layout.html +++ b/extensions/odoo_theme/layout.html @@ -3,17 +3,18 @@ {% block css %} {{ super() }} - {# Allow custom css style import for specific pages #} - {% if 'custom-css' in meta %} - {# TODO VFE this should be wrapped in a loop as custom-css is a comma(, not ;)-separated list #} - {% set link = '_static/css/' + meta['custom-css'] %} - + {% if 'custom-css' in meta %}{# Allow custom css style import for specific pages #} + {% set css_files = meta['custom-css'].split(',') %} + {% for css_file in css_files %} + {% set link = '_static/css/' + css_file %} + + {% endfor %} {% endif %} {% endblock %} {% block scripts %} - {% if 'custom-js' in meta %} - {# Before the custom files using React & Immutable #} + {% if 'custom-js' in meta %}{# Allow custom js import for specific pages #} + {# Before the custom files using React & Immutable (accounting mementos) #} @@ -27,13 +28,10 @@ {% endfor %} {% endif %} - {# FIXME ANVFEDI Do we really need prefixfree ? It triggers a reload of css files two more times/page #} - - {{ super() }} - {# TODO EDI boostrap beta cdn ??? Isn't there a stable CDN ? It looks like this cdn won't exist forever :D #} - + {{ super() }} {# Load the scripts specified in the extensions/themes #} + {% endblock %} {% block linktags %} @@ -55,12 +53,12 @@ {% endblock %} {% block header %} - {# shown when js has properly set all the classes on the toc elements #} + {# shown when js has properly set all the classes on the toc elements #} @@ -103,11 +101,9 @@ {% include "layout_templates/homepage.html" %} {% else %}
- -
+
{# Beacon used by the Sphinx search to know where to look for a string #} {% block body %} {% endblock %}
- {# Do not show the edition link for pages without content #} {% if github_link and pagename != 'search' %} Edit on GitHub {% endif %} From 90b92138c7660e3adf3033d1c1f2f9c07571c397 Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Wed, 28 Apr 2021 12:11:41 +0200 Subject: [PATCH 4/5] some js lint --- extensions/odoo_theme/static/js/utils.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/odoo_theme/static/js/utils.js b/extensions/odoo_theme/static/js/utils.js index 38c4365e6..45ade0acc 100644 --- a/extensions/odoo_theme/static/js/utils.js +++ b/extensions/odoo_theme/static/js/utils.js @@ -1,4 +1,4 @@ -let tocEntryListId = 0; // Used to generate IDs of toc entry lists for both the menu and page TOC +let tocEntryListId = 0; // Used to generate IDs of toc entry lists for both the menu and page TOC /** * Update the provided TOC to allow collapsing its entries with Bootstrap's accordion. * @@ -41,7 +41,7 @@ const _prepareAccordion = (tocElement) => { const tocRoot = tocElement.querySelector('ul'); tocRoot.querySelectorAll('ul').forEach(tocEntryList => { // Modify the
    element - tocEntryList.id = `o_target_${tocEntryListId++}` + tocEntryList.id = `o_target_${tocEntryListId++}`; tocEntryList.classList.add('collapse'); // Create and configure an element const arrowButton = document.createElement('I'); @@ -61,4 +61,4 @@ const _prepareAccordion = (tocElement) => { tocEntryWrapper.append(arrowButton, relatedHeadingRef); tocEntryList.parentNode.insertBefore(tocEntryWrapper, tocEntryList); }); -}; \ No newline at end of file +}; From 4ec450d64a6f2552c6578ac9ca6c490b4c5c4184 Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Wed, 28 Apr 2021 13:47:01 +0200 Subject: [PATCH 5/5] [IMP][PERF] Parallelize documentation build --- Makefile | 3 ++- extensions/autodoc_placeholder/__init__.py | 5 +++++ extensions/embedded_video/__init__.py | 9 +++++++-- extensions/exercise_admonition/__init__.py | 4 ++++ extensions/github_link/__init__.py | 4 ++++ extensions/html_domain/__init__.py | 4 ++++ extensions/odoo_theme/__init__.py | 4 ++++ extensions/redirects/__init__.py | 5 +++++ extensions/switcher/__init__.py | 5 +++++ 9 files changed, 40 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 32adf3d0e..6d898ef16 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,8 @@ CONFIG_DIR = . SPHINXOPTS = -D project_root=$(ROOT) -D canonical_version=$(CANONICAL_VERSION) \ -D versions=$(VERSIONS) -D languages=$(LANGUAGES) -D language=$(CURRENT_LANG) \ -D is_remote_build=$(IS_REMOTE_BUILD) \ - -A google_analytics_key=$(GOOGLE_ANALYTICS_KEY) + -A google_analytics_key=$(GOOGLE_ANALYTICS_KEY) \ + -j auto SOURCE_DIR = content BUILD_DIR = _build diff --git a/extensions/autodoc_placeholder/__init__.py b/extensions/autodoc_placeholder/__init__.py index 6508960c4..470f53830 100644 --- a/extensions/autodoc_placeholder/__init__.py +++ b/extensions/autodoc_placeholder/__init__.py @@ -19,3 +19,8 @@ def setup(app): directives.register_directive('autodata', PlaceHolder) directives.register_directive('automethod', PlaceHolder) directives.register_directive('autoattribute', PlaceHolder) + + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True + } diff --git a/extensions/embedded_video/__init__.py b/extensions/embedded_video/__init__.py index 186f1908a..f200deeed 100644 --- a/extensions/embedded_video/__init__.py +++ b/extensions/embedded_video/__init__.py @@ -61,6 +61,11 @@ class Vimeo(IframeVideo): class="align-%(align)s">' -def setup(builder): +def setup(app): directives.register_directive('youtube', Youtube) - directives.register_directive('vimeo', Vimeo) \ No newline at end of file + directives.register_directive('vimeo', Vimeo) + + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True + } diff --git a/extensions/exercise_admonition/__init__.py b/extensions/exercise_admonition/__init__.py index e651c8f30..e16afd94e 100644 --- a/extensions/exercise_admonition/__init__.py +++ b/extensions/exercise_admonition/__init__.py @@ -20,5 +20,9 @@ def setup(app): lambda self, node: self.depart_admonition(node), )) + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True + } admonitionlabels['exercise'] = 'Exercise' diff --git a/extensions/github_link/__init__.py b/extensions/github_link/__init__.py index 487fbd24a..5d1752c5e 100644 --- a/extensions/github_link/__init__.py +++ b/extensions/github_link/__init__.py @@ -74,6 +74,10 @@ def setup(app): odoo_repository=True) app.config.linkcode_resolve = linkcode_resolve + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True + } def make_github_link(app, path, line=None, mode="blob", odoo_repository=False): config = app.config diff --git a/extensions/html_domain/__init__.py b/extensions/html_domain/__init__.py index 53cddc15c..70a38ee79 100644 --- a/extensions/html_domain/__init__.py +++ b/extensions/html_domain/__init__.py @@ -39,6 +39,10 @@ def setup(app): ('kbd', kbd), ('var', var), ('samp', samp)]: addnode(app, node, name) + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True + } class div(nodes.General, nodes.Element): pass diff --git a/extensions/odoo_theme/__init__.py b/extensions/odoo_theme/__init__.py index 20a5926d2..4e61aaefb 100644 --- a/extensions/odoo_theme/__init__.py +++ b/extensions/odoo_theme/__init__.py @@ -15,6 +15,10 @@ def setup(app): app.add_js_file('js/menu.js') app.add_js_file('js/page_toc.js') + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True + } def set_missing_meta(app, pagename, templatename, context, doctree): if context.get('meta') is None: # Pages without title (used with `include::`) have no meta diff --git a/extensions/redirects/__init__.py b/extensions/redirects/__init__.py index a4c670341..054baf733 100644 --- a/extensions/redirects/__init__.py +++ b/extensions/redirects/__init__.py @@ -62,3 +62,8 @@ def generate_redirects(app): def setup(app): app.add_config_value('redirects_file', 'redirects', 'env') app.connect('builder-inited', generate_redirects) + + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True + } diff --git a/extensions/switcher/__init__.py b/extensions/switcher/__init__.py index f21be0829..7ae9b3376 100644 --- a/extensions/switcher/__init__.py +++ b/extensions/switcher/__init__.py @@ -12,6 +12,11 @@ def setup(app): app.connect('env-updated', add_statics) + return { + 'parallel_read_safe': True, + 'parallel_write_safe': True + } + def add_statics(app, env): app.add_js_file('js/switcher.js') env.config.html_static_path.append(statics())