cubicweb/web/views/wdoc.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Thu, 28 Jun 2018 11:19:14 +0200
branch3.26
changeset 12336 90ff36da4c8e
parent 12334 4c0f7ef3145c
child 12567 26744ad37953
permissions -rw-r--r--
[py3] Avoid setting attribute on Element instance in wdoc view This change is needed to make "wdoc" view work on Python 3. Indeed, before this patch, we used to set a "parent" attribute on Element instances, which is not permitted since Python 3.3 as xml.etree.ElementTree uses the C implementation by default. To get rid of this "parent" attribute, we rework the XML nodes processing logic to return and retrieve a node along with its parent in several place of the code. Namely, build_toc_index() now accepts the "parent" value for "node" and inserts it in the "index" dict (thus avoid `node.parent = <value>`). Respectively, every query to the "index" dict is updated to also retrieve the "parent" (thus avoiding `<value> = node.parent`). Later in InlineHelpView class, the "index" dict is bound to "tocindex" attribute so we adjust how it is queried in respective methods. Tests cubicweb/web/test/unittest_views_wdoc.py now pass on Python 3.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6996
diff changeset
     1
# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4466
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
8969
b37ce419ce26 [views] attempt to clarify the inline help system documentation
Dimitri Papadopoulos <dimitri.papadopoulos@cea.fr>
parents: 8632
diff changeset
    18
"""inline help system, rendering ReST files in the `wdoc` subdirectory of
b37ce419ce26 [views] attempt to clarify the inline help system documentation
Dimitri Papadopoulos <dimitri.papadopoulos@cea.fr>
parents: 8632
diff changeset
    19
CubicWeb and cubes
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
"""
11767
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
    22
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
12334
4c0f7ef3145c [py3] Open rst file in text mode in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12332
diff changeset
    24
import io
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
from itertools import chain
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    26
from os.path import join
12332
45f9d93bba71 [wdoc] Remove fallback about xml.etree module
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12331
diff changeset
    27
from xml.etree.ElementTree import parse
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    28
12329
d0bf06146782 [py3] Use six.text_type instead of unicode in wdoc views
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11767
diff changeset
    29
from six import text_type
d0bf06146782 [py3] Use six.text_type instead of unicode in wdoc views
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11767
diff changeset
    30
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6996
diff changeset
    31
from logilab.common.registry import yes
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    32
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6996
diff changeset
    33
from cubicweb.predicates import match_form_params
984
536e421b082b import updates
sylvain.thenault@logilab.fr
parents: 731
diff changeset
    34
from cubicweb.view import StartupView
4023
eae23c40627a drop common subpackage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4004
diff changeset
    35
from cubicweb.uilib import rest_publish
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
    36
from cubicweb.web import NotFound, action
10666
7f6b5f023884 [py3k] replace '_ = unicode' in global scope (closes #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 8969
diff changeset
    37
from cubicweb import _
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
# table of content management #################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    41
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    42
def build_toc_index(node, parent, index):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
    try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
        nodeidx = node.attrib['resource']
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    45
        assert nodeidx not in index, nodeidx
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    46
        index[nodeidx] = node, parent
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
    except KeyError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    48
        pass
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
    for child in node:
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    50
        build_toc_index(child, node, index)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    52
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
def get_insertion_point(section, index):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
    if section.attrib.get('insertafter'):
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    55
        snode, node = index[section.attrib['insertafter']]
12331
3cddf6a5473a [wdoc] Avoid usage of deprecated xlm elementree getchildren() method
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12330
diff changeset
    56
        idx = list(node).index(snode) + 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    57
    elif section.attrib.get('insertbefore'):
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    58
        snode, node = index[section.attrib['insertbefore']]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    59
        idx = node.getchildren().index(snode)
6420
4c14be06e557 [views/wdoc] do not crash on malconstructed stuff
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5424
diff changeset
    60
    elif 'appendto' in section.attrib:
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    61
        node, _ = index[section.attrib['appendto']]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
        idx = None
6420
4c14be06e557 [views/wdoc] do not crash on malconstructed stuff
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5424
diff changeset
    63
    else:
4c14be06e557 [views/wdoc] do not crash on malconstructed stuff
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5424
diff changeset
    64
        node, idx = None, None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
    return node, idx
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
    66
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    67
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
def build_toc(config):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
    alltocfiles = reversed(tuple(config.locate_all_files('toc.xml')))
10669
155c29e0ed1c [py3k] use next builtin instead of next method
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10666
diff changeset
    70
    maintoc = parse(next(alltocfiles)).getroot()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
    index = {}
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    72
    build_toc_index(maintoc, None, index)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
    # insert component documentation into the tree according to their toc.xml
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
    74
    # file
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
    for fpath in alltocfiles:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    76
        toc = parse(fpath).getroot()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
        for section in toc:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
            node, idx = get_insertion_point(section, index)
6420
4c14be06e557 [views/wdoc] do not crash on malconstructed stuff
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5424
diff changeset
    79
            if node is None:
4c14be06e557 [views/wdoc] do not crash on malconstructed stuff
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5424
diff changeset
    80
                continue
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    81
            if idx is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    82
                node.append(section)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    83
            else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
                node.insert(idx, section)
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    85
            build_toc_index(section, node, index)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    86
    return index
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
    87
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    88
1149
1e19b6ef53a1 pylint cleanup
sylvain.thenault@logilab.fr
parents: 1132
diff changeset
    89
def title_for_lang(node, lang):
6996
86214f0da14f [wdoc] fallback to english title when no translation found
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6459
diff changeset
    90
    fallback_title = None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    91
    for title in node.findall('title'):
6996
86214f0da14f [wdoc] fallback to english title when no translation found
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6459
diff changeset
    92
        title_lang = title.attrib['{http://www.w3.org/XML/1998/namespace}lang']
86214f0da14f [wdoc] fallback to english title when no translation found
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6459
diff changeset
    93
        if title_lang == lang:
12329
d0bf06146782 [py3] Use six.text_type instead of unicode in wdoc views
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11767
diff changeset
    94
            return text_type(title.text)
6996
86214f0da14f [wdoc] fallback to english title when no translation found
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6459
diff changeset
    95
        if title_lang == 'en':
12329
d0bf06146782 [py3] Use six.text_type instead of unicode in wdoc views
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11767
diff changeset
    96
            fallback_title = text_type(title.text)
6996
86214f0da14f [wdoc] fallback to english title when no translation found
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6459
diff changeset
    97
    return fallback_title
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    99
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   100
def subsections(node):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   101
    return [child for child in node if child.tag == 'section']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   102
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   103
# help views ##################################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   104
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
   105
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   106
class InlineHelpView(StartupView):
731
ac4a94e50b60 some more s/__selectors__/__select__ but still more to come
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 692
diff changeset
   107
    __select__ = match_form_params('fid')
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   108
    __regid__ = 'wdoc'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   109
    title = _('site documentation')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   110
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   111
    def call(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   112
        fid = self._cw.form['fid']
3733
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   113
        vreg = self._cw.vreg
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   114
        for lang in chain((self._cw.lang, vreg.property_value('ui.language')),
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   115
                          vreg.config.available_languages()):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
            rid = '%s_%s.rst' % (fid, lang)
3733
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   117
            resourcedir = vreg.config.locate_doc_file(rid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
            if resourcedir:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   119
                break
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   120
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   121
            raise NotFound
3733
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   122
        self.tocindex = build_toc(vreg.config)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   123
        try:
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
   124
            node, parent = self.tocindex[fid]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   125
        except KeyError:
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
   126
            node, parent = None, None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
        else:
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
   128
            self.navigation_links(node, parent)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   129
            self.w(u'<div class="hr"></div>')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   130
            self.w(u'<h1>%s</h1>' % (title_for_lang(node, self._cw.lang)))
12334
4c0f7ef3145c [py3] Open rst file in text mode in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12332
diff changeset
   131
        with io.open(join(resourcedir, rid)) as f:
4c0f7ef3145c [py3] Open rst file in text mode in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12332
diff changeset
   132
            self.w(rest_publish(self, f.read()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   133
        if node is not None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   134
            self.subsections_links(node)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   135
            self.w(u'<div class="hr"></div>')
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
   136
            self.navigation_links(node, parent)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   137
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
   138
    def navigation_links(self, node, parent):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
        if parent is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   140
            return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   141
        brothers = subsections(parent)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
        self.w(u'<div class="docnav">\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   143
        previousidx = brothers.index(node) - 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   144
        if previousidx >= 0:
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   145
            self.navsection(brothers[previousidx], 'prev')
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   146
        self.navsection(parent, 'up')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   147
        nextidx = brothers.index(node) + 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
        if nextidx < len(brothers):
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   149
            self.navsection(brothers[nextidx], 'next')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   150
        self.w(u'</div>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   151
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   152
    navinfo = {'prev': ('', 'data/previous.png', _('i18nprevnext_previous')),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
               'next': ('', 'data/next.png', _('i18nprevnext_next')),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   154
               'up': ('', 'data/up.png', _('i18nprevnext_up'))}
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   155
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
    def navsection(self, node, navtype):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   157
        htmlclass, imgpath, msgid = self.navinfo[navtype]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   158
        self.w(u'<span class="%s">' % htmlclass)
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   159
        self.w(u'%s : ' % self._cw._(msgid))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   160
        self.w(u'<a href="%s">%s</a>' % (
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
   161
            self._cw.build_url('doc/' + node.attrib['resource']),
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   162
            title_for_lang(node, self._cw.lang)))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   163
        self.w(u'</span>\n')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   164
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   165
    def subsections_links(self, node, first=True):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   166
        sub = subsections(node)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   167
        if not sub:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   168
            return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   169
        if first:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   170
            self.w(u'<div class="hr"></div>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   171
        self.w(u'<ul class="docsum">')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   172
        for child in sub:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   173
            self.w(u'<li><a href="%s">%s</a>' % (
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
   174
                self._cw.build_url('doc/' + child.attrib['resource']),
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   175
                title_for_lang(child, self._cw.lang)))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   176
            self.subsections_links(child, False)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   177
            self.w(u'</li>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   178
        self.w(u'</ul>\n')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   179
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   180
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   181
class InlineHelpImageView(StartupView):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   182
    __regid__ = 'wdocimages'
731
ac4a94e50b60 some more s/__selectors__/__select__ but still more to come
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 692
diff changeset
   183
    __select__ = match_form_params('fid')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   184
    binary = True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   185
    templatable = False
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   186
    content_type = 'image/png'
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   187
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   188
    def call(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   189
        fid = self._cw.form['fid']
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   190
        for lang in chain((self._cw.lang, self._cw.vreg.property_value('ui.language')),
4087
2b8bc4cfd6ee api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4045
diff changeset
   191
                          self._cw.vreg.config.available_languages()):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   192
            rid = join('images', '%s_%s.png' % (fid, lang))
4087
2b8bc4cfd6ee api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4045
diff changeset
   193
            resourcedir = self._cw.vreg.config.locate_doc_file(rid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   194
            if resourcedir:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
                break
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   196
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   197
            raise NotFound
12334
4c0f7ef3145c [py3] Open rst file in text mode in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12332
diff changeset
   198
        with io.open(join(resourcedir, rid)) as f:
4c0f7ef3145c [py3] Open rst file in text mode in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12332
diff changeset
   199
            self.w(f.read())
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   200
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   201
3818
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   202
class HelpAction(action.Action):
4004
c52619c738a5 api renaming update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 3890
diff changeset
   203
    __regid__ = 'help'
3818
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   204
    __select__ = yes()
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   205
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   206
    category = 'footer'
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   207
    order = 0
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   208
    title = _('Help')
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   209
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   210
    def url(self):
4045
f4a52abb6f4f cw 3.6 api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4023
diff changeset
   211
        return self._cw.build_url('doc/main')
3818
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   212
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   213
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   214
class AboutAction(action.Action):
3655
af86ab65a282 3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3503
diff changeset
   215
    __regid__ = 'about'
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   216
    __select__ = yes()
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   217
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   218
    category = 'footer'
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   219
    order = 2
6459
7f46ec158c48 [i18n] uniformize footer capitalization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6420
diff changeset
   220
    title = _('About this site')
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   221
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   222
    def url(self):
3655
af86ab65a282 3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3503
diff changeset
   223
        return self._cw.build_url('doc/about')