cubicweb/web/views/wdoc.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Fri, 05 Apr 2019 17:58:19 +0200
changeset 12567 26744ad37953
parent 12336 90ff36da4c8e
permissions -rw-r--r--
Drop python2 support This mostly consists in removing the dependency on "six" and updating the code to use only Python3 idioms. Notice that we previously used TemporaryDirectory from cubicweb.devtools.testlib for compatibility with Python2. We now directly import it from tempfile.
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
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6996
diff changeset
    29
from logilab.common.registry import yes
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
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 cubicweb.predicates import match_form_params
984
536e421b082b import updates
sylvain.thenault@logilab.fr
parents: 731
diff changeset
    32
from cubicweb.view import StartupView
4023
eae23c40627a drop common subpackage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4004
diff changeset
    33
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
    34
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
    35
from cubicweb import _
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
# table of content management #################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    39
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    40
def build_toc_index(node, parent, index):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
    try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
        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
    43
        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
    44
        index[nodeidx] = node, parent
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
    except KeyError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
        pass
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
    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
    48
        build_toc_index(child, node, index)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    50
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
def get_insertion_point(section, index):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
    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
    53
        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
    54
        idx = list(node).index(snode) + 1
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    55
    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
    56
        snode, node = index[section.attrib['insertbefore']]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    57
        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
    58
    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
    59
        node, _ = index[section.attrib['appendto']]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
        idx = None
6420
4c14be06e557 [views/wdoc] do not crash on malconstructed stuff
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5424
diff changeset
    61
    else:
4c14be06e557 [views/wdoc] do not crash on malconstructed stuff
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5424
diff changeset
    62
        node, idx = None, None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    63
    return node, idx
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
    64
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    65
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    66
def build_toc(config):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
    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
    68
    maintoc = parse(next(alltocfiles)).getroot()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
    index = {}
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
    70
    build_toc_index(maintoc, None, index)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
    # 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
    72
    # file
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
    for fpath in alltocfiles:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
        toc = parse(fpath).getroot()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
        for section in toc:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    76
            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
    77
            if node is None:
4c14be06e557 [views/wdoc] do not crash on malconstructed stuff
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5424
diff changeset
    78
                continue
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    79
            if idx is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    80
                node.append(section)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    81
            else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    82
                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
    83
            build_toc_index(section, node, index)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
    return index
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
    85
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    86
1149
1e19b6ef53a1 pylint cleanup
sylvain.thenault@logilab.fr
parents: 1132
diff changeset
    87
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
    88
    fallback_title = None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    89
    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
    90
        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
    91
        if title_lang == lang:
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12336
diff changeset
    92
            return title.text
6996
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 == 'en':
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12336
diff changeset
    94
            fallback_title = 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
    return fallback_title
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    96
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
    97
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    98
def subsections(node):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    99
    return [child for child in node if child.tag == 'section']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   100
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   101
# help views ##################################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   102
12330
6e620df7d4c3 [style] Make cubicweb/web/views/wdoc.py flake8-clean
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12329
diff changeset
   103
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   104
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
   105
    __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
   106
    __regid__ = 'wdoc'
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   107
    title = _('site documentation')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   108
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   109
    def call(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   110
        fid = self._cw.form['fid']
3733
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   111
        vreg = self._cw.vreg
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   112
        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
   113
                          vreg.config.available_languages()):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   114
            rid = '%s_%s.rst' % (fid, lang)
3733
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   115
            resourcedir = vreg.config.locate_doc_file(rid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   116
            if resourcedir:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   117
                break
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   119
            raise NotFound
3733
c3feb6a33f58 remove some warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3655
diff changeset
   120
        self.tocindex = build_toc(vreg.config)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   121
        try:
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
   122
            node, parent = self.tocindex[fid]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   123
        except KeyError:
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 = None, None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   125
        else:
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
   126
            self.navigation_links(node, parent)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
            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
   128
            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
   129
        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
   130
            self.w(rest_publish(self, f.read()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   131
        if node is not None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   132
            self.subsections_links(node)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   133
            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
   134
            self.navigation_links(node, parent)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   135
12336
90ff36da4c8e [py3] Avoid setting attribute on Element instance in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12334
diff changeset
   136
    def navigation_links(self, node, parent):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   137
        if parent is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   138
            return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
        brothers = subsections(parent)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   140
        self.w(u'<div class="docnav">\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   141
        previousidx = brothers.index(node) - 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
        if previousidx >= 0:
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   143
            self.navsection(brothers[previousidx], 'prev')
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   144
        self.navsection(parent, 'up')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   145
        nextidx = brothers.index(node) + 1
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   146
        if nextidx < len(brothers):
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   147
            self.navsection(brothers[nextidx], 'next')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
        self.w(u'</div>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   149
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   150
    navinfo = {'prev': ('', 'data/previous.png', _('i18nprevnext_previous')),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   151
               'next': ('', 'data/next.png', _('i18nprevnext_next')),
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   152
               '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
   153
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   154
    def navsection(self, node, navtype):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   155
        htmlclass, imgpath, msgid = self.navinfo[navtype]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
        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
   157
        self.w(u'%s : ' % self._cw._(msgid))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   158
        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
   159
            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
   160
            title_for_lang(node, self._cw.lang)))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   161
        self.w(u'</span>\n')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   162
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   163
    def subsections_links(self, node, first=True):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   164
        sub = subsections(node)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   165
        if not sub:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   166
            return
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   167
        if first:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   168
            self.w(u'<div class="hr"></div>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   169
        self.w(u'<ul class="docsum">')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   170
        for child in sub:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   171
            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
   172
                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
   173
                title_for_lang(child, self._cw.lang)))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   174
            self.subsections_links(child, False)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   175
            self.w(u'</li>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   176
        self.w(u'</ul>\n')
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   177
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   178
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   179
class InlineHelpImageView(StartupView):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   180
    __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
   181
    __select__ = match_form_params('fid')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   182
    binary = True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   183
    templatable = False
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   184
    content_type = 'image/png'
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1364
diff changeset
   185
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   186
    def call(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   187
        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
   188
        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
   189
                          self._cw.vreg.config.available_languages()):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   190
            rid = join('images', '%s_%s.png' % (fid, lang))
4087
2b8bc4cfd6ee api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4045
diff changeset
   191
            resourcedir = self._cw.vreg.config.locate_doc_file(rid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   192
            if resourcedir:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   193
                break
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   194
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
            raise NotFound
12334
4c0f7ef3145c [py3] Open rst file in text mode in wdoc view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12332
diff changeset
   196
        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
   197
            self.w(f.read())
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   198
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   199
3818
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   200
class HelpAction(action.Action):
4004
c52619c738a5 api renaming update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 3890
diff changeset
   201
    __regid__ = 'help'
3818
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   202
    __select__ = yes()
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   203
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   204
    category = 'footer'
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   205
    order = 0
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   206
    title = _('Help')
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   207
9522e51d8644 [web ui] move help from header to footer
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 3495
diff changeset
   208
    def url(self):
4045
f4a52abb6f4f cw 3.6 api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4023
diff changeset
   209
        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
   210
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   211
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   212
class AboutAction(action.Action):
3655
af86ab65a282 3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3503
diff changeset
   213
    __regid__ = 'about'
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   214
    __select__ = yes()
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   215
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   216
    category = 'footer'
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   217
    order = 2
6459
7f46ec158c48 [i18n] uniformize footer capitalization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6420
diff changeset
   218
    title = _('About this site')
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   219
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1977
diff changeset
   220
    def url(self):
3655
af86ab65a282 3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3503
diff changeset
   221
        return self._cw.build_url('doc/about')