cubicweb/web/views/basetemplates.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 30 Sep 2016 18:25:08 +0200
changeset 11767 432f87a63057
parent 11374 0e50215016f3
child 11870 3a84a79c4ed5
permissions -rw-r--r--
flake8 and all * update some copyright * drop most __docformat__ declaration * fix some flake8 warnings / errors
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11280
eb1d74ce6b61 Only access once to _cw.message in the login form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
     1
# copyright 2003-2016 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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
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: 4952
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5584
c1823448f81d [web] disallow authenticated users to access to the login form (closes #914873)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    18
"""default templates for CubicWeb web client"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
11767
432f87a63057 flake8 and all
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11374
diff changeset
    20
10666
7f6b5f023884 [py3k] replace '_ = unicode' in global scope (closes #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10510
diff changeset
    21
from cubicweb import _
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2119
diff changeset
    23
from logilab.mtconverter import xml_escape
4599
dafa39be525d bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4596
diff changeset
    24
from logilab.common.deprecation import class_renamed
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8009
diff changeset
    25
from logilab.common.registry import objectify_predicate
8310
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
    26
from logilab.common.decorators import classproperty
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    27
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8009
diff changeset
    28
from cubicweb.predicates import match_kwargs, no_cnx, anonymous_user
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    29
from cubicweb.view import View, MainTemplate, NOINDEX, NOFOLLOW, StartupView
5195
e8235b2789fc le patch move-pdf-export-to-cubes a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4952
diff changeset
    30
from cubicweb.utils import UStringIO
3242
390acf7594ed missing import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3184
diff changeset
    31
from cubicweb.schema import display_name
4935
f710770e6e90 move pdf icon component with it's template so we don't see it when the template isn't available due to missing dependancies
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4781
diff changeset
    32
from cubicweb.web import component, formfields as ff, formwidgets as fw
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
    33
from cubicweb.web.views import forms
2555
ca7b122f34fa fix html headers for forced html content type : main template and json controller
Fabrice <fabrice@secondweb.fr>
parents: 2381
diff changeset
    34
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
# main templates ##############################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
    37
class LogInOutTemplate(MainTemplate):
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
    def call(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
        self.set_request_content_type()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
        w = self.w
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
        self.write_doctype()
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    43
        self.template_header('text/html', self._cw._('login_action'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
        w(u'<body>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
        self.content(w)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
        w(u'</body>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    48
    def template_header(self, content_type, view=None, page_title='', additional_headers=()):
11296
5153f6fd478e Define BASE_URL and DATA_URL js variables in the login template. Closes #13385185
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10666
diff changeset
    49
        self._cw.html_headers.define_var('BASE_URL', self._cw.base_url())
5153f6fd478e Define BASE_URL and DATA_URL js variables in the login template. Closes #13385185
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 10666
diff changeset
    50
        self._cw.html_headers.define_var('DATA_URL', self._cw.datadir_url)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
        w = self.whead
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
        # explictly close the <base> tag to avoid IE 6 bugs while browsing DOM
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    53
        w(u'<base href="%s"></base>' % xml_escape(self._cw.base_url()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
        w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    55
          % (content_type, self._cw.encoding))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    56
        w(NOINDEX)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    57
        w(NOFOLLOW)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    58
        w(u'\n'.join(additional_headers) + u'\n')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    59
        self.wview('htmlheader', rset=self.cw_rset)
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2119
diff changeset
    60
        w(u'<title>%s</title>\n' % xml_escape(page_title))
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
    61
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7432
diff changeset
    62
    def content(self):
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7432
diff changeset
    63
        raise NotImplementedError()
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7432
diff changeset
    64
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    66
class LogInTemplate(LogInOutTemplate):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
    67
    __regid__ = 'login'
5584
c1823448f81d [web] disallow authenticated users to access to the login form (closes #914873)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    68
    __select__ = anonymous_user()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
    title = 'log in'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
    def content(self, w):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    72
        self.wview('logform', rset=self.cw_rset, id='loginBox', klass='')
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
    73
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    75
class LoggedOutTemplate(StartupView):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
    76
    __regid__ = 'loggedout'
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    77
    __select__ = anonymous_user()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
    title = 'logged out'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    79
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    80
    def call(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    81
        msg = self._cw._('you have been logged out')
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    82
        if self._cw.cnx:
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    83
            comp = self._cw.vreg['components'].select('applmessages', self._cw)
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    84
            comp.render(w=self.w, msg=msg)
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    85
            self.wview('index')
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    86
        else:
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7428
diff changeset
    87
            self.w(u'<h2>%s</h2>' % msg)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    88
5584
c1823448f81d [web] disallow authenticated users to access to the login form (closes #914873)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    89
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8009
diff changeset
    90
@objectify_predicate
9378
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
    91
def modal_view(cls, req, rset, *args, **kwargs):
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
    92
    if req.form.get('__modal', None):
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
    93
        return 1
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
    94
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
    95
@objectify_predicate
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
    96
def templatable_view(cls, req, rset, *args, **kwargs):
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
    97
    view = kwargs.pop('view', None)
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
    98
    if view is None:
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
    99
        return 1
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   100
    if view.binary:
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   101
        return 0
8697
574bb05e40a4 [toward py3k] rewrite has_key() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8485
diff changeset
   102
    if '__notemplate' in req.form:
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   103
        return 0
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   104
    return view.templatable
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   105
6005
0300fae1f7cb [views] link to public url when trying https without an account
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5988
diff changeset
   106
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   107
class NonTemplatableViewTemplate(MainTemplate):
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   108
    """main template for any non templatable views (xml, binaries, etc.)"""
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   109
    __regid__ = 'main-template'
1421
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
   110
    __select__ = ~templatable_view()
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
   111
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   112
    def call(self, view):
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   113
        view.set_request_content_type()
1421
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
   114
        view.set_stream()
8697
574bb05e40a4 [toward py3k] rewrite has_key() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8485
diff changeset
   115
        if (('__notemplate' in self._cw.form)
574bb05e40a4 [toward py3k] rewrite has_key() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8485
diff changeset
   116
            and view.templatable
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   117
            and view.content_type == self._cw.html_content_type()):
8974
c8520188eb4b [web request] drop no more necessary request.document_surrounding_div method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8706
diff changeset
   118
            view.w(u'<div>')
2555
ca7b122f34fa fix html headers for forced html content type : main template and json controller
Fabrice <fabrice@secondweb.fr>
parents: 2381
diff changeset
   119
            view.render()
2559
46859078c866 [R xhtml] remove xhtml_wrap* function, use instead a single req.document_surrounding_div method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2555
diff changeset
   120
            view.w(u'</div>')
2555
ca7b122f34fa fix html headers for forced html content type : main template and json controller
Fabrice <fabrice@secondweb.fr>
parents: 2381
diff changeset
   121
        else:
ca7b122f34fa fix html headers for forced html content type : main template and json controller
Fabrice <fabrice@secondweb.fr>
parents: 2381
diff changeset
   122
            view.render()
2559
46859078c866 [R xhtml] remove xhtml_wrap* function, use instead a single req.document_surrounding_div method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2555
diff changeset
   123
        # have to replace our stream by view's stream (which may be a binary
46859078c866 [R xhtml] remove xhtml_wrap* function, use instead a single req.document_surrounding_div method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2555
diff changeset
   124
        # stream)
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   125
        self._stream = view._stream
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   126
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   127
9378
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   128
class ModalMainTemplate(MainTemplate):
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   129
    """ a no-decoration main template for standard views
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   130
    that typically live in a modal context """
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   131
    __regid__ = 'main-template'
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   132
    __select__ = templatable_view() & modal_view()
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   133
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   134
    def call(self, view):
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   135
        view.set_request_content_type()
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   136
        view.render(w=self.w)
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   137
4a668dcfa0a0 [views/templates] provide a modal main template (closes #3274672)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9176
diff changeset
   138
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
class TheMainTemplate(MainTemplate):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   140
    """default main template :
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   141
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   142
    - call header / footer templates
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   143
    """
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   144
    __regid__ = 'main-template'
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   145
    __select__ = templatable_view()
1421
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
   146
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   147
    def call(self, view):
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   148
        self.set_request_content_type()
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   149
        self.template_header(self.content_type, view)
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   150
        w = self.w
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   151
        w(u'<div id="pageContent">\n')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   152
        vtitle = self._cw.form.get('vtitle')
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   153
        if vtitle:
6140
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
   154
            w(u'<div class="vtitle">%s</div>\n' % xml_escape(vtitle))
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   155
        # display entity type restriction component
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   156
        etypefilter = self._cw.vreg['components'].select_or_none(
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   157
            'etypenavigation', self._cw, rset=self.cw_rset)
2818
326375561412 propagate some api changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2813
diff changeset
   158
        if etypefilter and etypefilter.cw_propval('visible'):
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   159
            etypefilter.render(w=w)
5988
d8ac8acd27f9 [basetemplate nav] no need for an attribute here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5854
diff changeset
   160
        nav_html = UStringIO()
8009
75638a6ff159 [tableview,basetemplates,pagination] some views internally handle the pagination, in which case the base template should not try to paginate
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7879
diff changeset
   161
        if view and not view.handle_pagination:
5988
d8ac8acd27f9 [basetemplate nav] no need for an attribute here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5854
diff changeset
   162
            view.paginate(w=nav_html.write)
6178
9b596b11e375 remove buggy call to builtins._ on navigation content
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
   163
        w(nav_html.getvalue())
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   164
        w(u'<div id="contentmain">\n')
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   165
        view.render(w=w)
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   166
        w(u'</div>\n') # close id=contentmain
6178
9b596b11e375 remove buggy call to builtins._ on navigation content
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
   167
        w(nav_html.getvalue())
823
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   168
        w(u'</div>\n') # closes id=pageContent
cb8ccbef8fa5 main template refactoring
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 822
diff changeset
   169
        self.template_footer(view)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   170
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   171
    def template_header(self, content_type, view=None, page_title='', additional_headers=()):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   172
        page_title = page_title or view.page_title()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   173
        additional_headers = additional_headers or view.html_headers()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   174
        self.template_html_header(content_type, page_title, additional_headers)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   175
        self.template_body_header(view)
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   176
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   177
    def template_html_header(self, content_type, page_title, additional_headers=()):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   178
        w = self.whead
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   179
        lang = self._cw.lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   180
        self.write_doctype()
7069
8bf2337a6f3b [views] #1499661 get rid of base tag
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6786
diff changeset
   181
        self._cw.html_headers.define_var('BASE_URL', self._cw.base_url())
9176
8139f82c8bbe [facets,js] fix bogus checkbox icon appearing after the first interaction (closes #2790332)
David Douard <david.douard@logilab.fr>
parents: 8974
diff changeset
   182
        self._cw.html_headers.define_var('DATA_URL', self._cw.datadir_url)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   183
        w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   184
          % (content_type, self._cw.encoding))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   185
        w(u'\n'.join(additional_headers) + u'\n')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   186
        self.wview('htmlheader', rset=self.cw_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   187
        if page_title:
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2119
diff changeset
   188
            w(u'<title>%s</title>\n' % xml_escape(page_title))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   189
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   190
    def template_body_header(self, view):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   191
        w = self.w
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   192
        w(u'<body>\n')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   193
        self.wview('header', rset=self.cw_rset, view=view)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   194
        w(u'<div id="page"><table width="100%" border="0" id="mainLayout"><tr>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
        self.nav_column(view, 'left')
5478
c52124b7a00e [css] progressively fixing rhythm
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5477
diff changeset
   196
        w(u'<td id="contentColumn">\n')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   197
        components = self._cw.vreg['components']
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   198
        rqlcomp = components.select_or_none('rqlinput', self._cw, rset=self.cw_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   199
        if rqlcomp:
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   200
            rqlcomp.render(w=self.w, view=view)
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   201
        msgcomp = components.select_or_none('applmessages', self._cw, rset=self.cw_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   202
        if msgcomp:
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   203
            msgcomp.render(w=self.w)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   204
        self.content_header(view)
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   205
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   206
    def template_footer(self, view=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   207
        self.content_footer(view)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   208
        self.w(u'</td>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   209
        self.nav_column(view, 'right')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   210
        self.w(u'</tr></table></div>\n')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   211
        self.wview('footer', rset=self.cw_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   212
        self.w(u'</body>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   213
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   214
    def nav_column(self, view, context):
6141
b8287e54b528 [web api] unify 'contentnav' (VComponent) and 'boxes' registries as 'ctxcomponents' (CtxComponent)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6140
diff changeset
   215
        boxes = list(self._cw.vreg['ctxcomponents'].poss_visible_objects(
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   216
            self._cw, rset=self.cw_rset, view=view, context=context))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   217
        if boxes:
6140
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
   218
            getlayout = self._cw.vreg['components'].select
5478
c52124b7a00e [css] progressively fixing rhythm
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5477
diff changeset
   219
            self.w(u'<td id="navColumn%s"><div class="navboxes">\n' % context.capitalize())
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   220
            for box in boxes:
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   221
                box.render(w=self.w, view=view)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   222
            self.w(u'</div></td>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   223
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   224
    def content_header(self, view=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   225
        """by default, display informal messages in content header"""
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   226
        self.wview('contentheader', rset=self.cw_rset, view=view)
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   227
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   228
    def content_footer(self, view=None):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   229
        self.wview('contentfooter', rset=self.cw_rset, view=view)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   230
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   231
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   232
class ErrorTemplate(TheMainTemplate):
6109
47d9c0e0f7b7 integrate Celso's work on translation file: proper/complete spanish translation, fixed some typos in french translation, occured -> occurred fix in various places
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6091
diff changeset
   233
    """fallback template if an internal error occurred during displaying the main
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5195
diff changeset
   234
    template. This template may be called for authentication error, which means
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5195
diff changeset
   235
    that req.cnx and req.user may not be set.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   236
    """
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   237
    __regid__ = 'error-template'
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   238
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   239
    def call(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   240
        """display an unexpected error"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   241
        self.set_request_content_type()
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   242
        self._cw.reset_headers()
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   243
        view = self._cw.vreg['views'].select('error', self._cw, rset=self.cw_rset)
6109
47d9c0e0f7b7 integrate Celso's work on translation file: proper/complete spanish translation, fixed some typos in french translation, occured -> occurred fix in various places
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6091
diff changeset
   244
        self.template_header(self.content_type, view, self._cw._('an error occurred'),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   245
                             [NOINDEX, NOFOLLOW])
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   246
        view.render(w=self.w)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   247
        self.template_footer(view)
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   248
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   249
    def template_header(self, content_type, view=None, page_title='', additional_headers=()):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   250
        w = self.whead
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   251
        lang = self._cw.lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   252
        self.write_doctype()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   253
        w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   254
          % (content_type, self._cw.encoding))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   255
        w(u'\n'.join(additional_headers))
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   256
        self.wview('htmlheader', rset=self.cw_rset)
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2119
diff changeset
   257
        w(u'<title>%s</title>\n' % xml_escape(page_title))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   258
        self.w(u'<body>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   259
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   260
    def template_footer(self, view=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   261
        self.w(u'</body>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   262
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   263
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   264
class SimpleMainTemplate(TheMainTemplate):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   265
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   266
    __regid__ = 'main-no-top'
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   267
163
451a3e35dbcb repairing error from preceding commit
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 158
diff changeset
   268
    def template_header(self, content_type, view=None, page_title='', additional_headers=()):
451a3e35dbcb repairing error from preceding commit
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 158
diff changeset
   269
        page_title = page_title or view.page_title()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   270
        additional_headers = additional_headers or view.html_headers()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   271
        whead = self.whead
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   272
        lang = self._cw.lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   273
        self.write_doctype()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   274
        whead(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   275
              % (content_type, self._cw.encoding))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   276
        whead(u'\n'.join(additional_headers) + u'\n')
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   277
        self.wview('htmlheader', rset=self.cw_rset)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   278
        w = self.w
8269
80d37fb56312 [web templates] fix invalid html in main-no-top template; closes #2174806
Florent Cayré <florent.cayre@logilab.fr>
parents: 8009
diff changeset
   279
        whead(u'<title>%s</title>\n' % xml_escape(page_title))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   280
        w(u'<body>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   281
        w(u'<div id="page">')
8269
80d37fb56312 [web templates] fix invalid html in main-no-top template; closes #2174806
Florent Cayré <florent.cayre@logilab.fr>
parents: 8009
diff changeset
   282
        w(u'<table width="100%" border="0" id="mainLayout"><tr>\n')
5478
c52124b7a00e [css] progressively fixing rhythm
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5477
diff changeset
   283
        w(u'<td id="navColumnLeft">\n')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   284
        self.topleft_header()
6141
b8287e54b528 [web api] unify 'contentnav' (VComponent) and 'boxes' registries as 'ctxcomponents' (CtxComponent)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6140
diff changeset
   285
        boxes = list(self._cw.vreg['ctxcomponents'].poss_visible_objects(
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   286
            self._cw, rset=self.cw_rset, view=view, context='left'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   287
        if boxes:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   288
            w(u'<div class="navboxes">\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   289
            for box in boxes:
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   290
                box.render(w=w)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   291
            self.w(u'</div>\n')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   292
        w(u'</td>')
8269
80d37fb56312 [web templates] fix invalid html in main-no-top template; closes #2174806
Florent Cayré <florent.cayre@logilab.fr>
parents: 8009
diff changeset
   293
        w(u'<td id="contentColumn" rowspan="2">')
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   294
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   295
    def topleft_header(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   296
        logo = self._cw.vreg['components'].select_or_none('logo', self._cw,
5854
b49f58a320e6 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5849
diff changeset
   297
                                                          rset=self.cw_rset)
2818
326375561412 propagate some api changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2813
diff changeset
   298
        if logo and logo.cw_propval('visible'):
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   299
            w = self.w
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   300
            w(u'<table id="header"><tr>\n')
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   301
            w(u'<td>')
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   302
            logo.render(w=w)
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   303
            w(u'</td>\n')
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   304
            w(u'</tr></table>\n')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   305
2935
e06b3eadef31 [views,pdf] minimal support for xhtml->pdf conversion
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2657
diff changeset
   306
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   307
# page parts templates ########################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   308
816
9cd49a910fce kill Template class and 'templates' registry
sylvain.thenault@logilab.fr
parents: 811
diff changeset
   309
class HTMLHeader(View):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   310
    """default html headers"""
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   311
    __regid__ = 'htmlheader'
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   312
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   313
    def call(self, **kwargs):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   314
        self.favicon()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   315
        self.stylesheets()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   316
        self.javascripts()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   317
        self.alternates()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   318
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   319
    def favicon(self):
5467
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   320
        favicon = self._cw.uiprops.get('FAVICON', None)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   321
        if favicon:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   322
            self.whead(u'<link rel="shortcut icon" href="%s"/>\n' % favicon)
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   323
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   324
    def stylesheets(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   325
        req = self._cw
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   326
        add_css = req.add_css
5467
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   327
        for css in req.uiprops['STYLESHEETS']:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   328
            add_css(css, localfile=False)
5467
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   329
        for css in req.uiprops['STYLESHEETS_PRINT']:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   330
            add_css(css, u'print', localfile=False)
5467
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   331
        for css in req.uiprops['STYLESHEETS_IE']:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   332
            add_css(css, localfile=False, ieonly=True)
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   333
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   334
    def javascripts(self):
5467
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   335
        for jscript in self._cw.uiprops['JAVASCRIPTS']:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   336
            self._cw.add_js(jscript, localfile=False)
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   337
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   338
    def alternates(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   339
        urlgetter = self._cw.vreg['components'].select_or_none('rss_feed_url',
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   340
                                                           self._cw, rset=self.cw_rset)
142
0425ee84cfa6 add selector to test if result set is an object (for rss feed component)
Laure Bourgois <Laure.Bourgois@logilab.fr>
parents: 29
diff changeset
   341
        if urlgetter is not None:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   342
            self.whead(u'<link rel="alternate" type="application/rss+xml" title="RSS feed" href="%s"/>\n'
2381
caad2367d940 backport stable branch
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2144 2312
diff changeset
   343
                       %  xml_escape(urlgetter.feed_url()))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   344
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   345
816
9cd49a910fce kill Template class and 'templates' registry
sylvain.thenault@logilab.fr
parents: 811
diff changeset
   346
class HTMLPageHeader(View):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   347
    """default html page header"""
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   348
    __regid__ = 'header'
3053
51f196c212d9 provide facility to override main header components without having to override the whole methode
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3020
diff changeset
   349
    main_cell_components = ('appliname', 'breadcrumbs')
6697
ffc644fafcb4 [basetemplates] define header ctx components categories as attribute to ease overriding
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6678
diff changeset
   350
    headers = (('headtext', 'header-left'),
8326
2e793b2cdb57 [view] breadcrumbs layout broken with long elements (closes #1347486)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 8324
diff changeset
   351
               ('header-center', 'header-center'),
2e793b2cdb57 [view] breadcrumbs layout broken with long elements (closes #1347486)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 8324
diff changeset
   352
               ('header-right', 'header-right')
2e793b2cdb57 [view] breadcrumbs layout broken with long elements (closes #1347486)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 8324
diff changeset
   353
               )
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   354
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   355
    def call(self, view, **kwargs):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   356
        self.main_header(view)
6091
560df423149a [login template] missing xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6005
diff changeset
   357
        self.w(u'<div id="stateheader">')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   358
        self.state_header()
6091
560df423149a [login template] missing xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6005
diff changeset
   359
        self.w(u'</div>')
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   360
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   361
    def main_header(self, view):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   362
        """build the top menu with authentification info and the rql box"""
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   363
        w = self.w
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   364
        w(u'<table id="header"><tr>\n')
6697
ffc644fafcb4 [basetemplates] define header ctx components categories as attribute to ease overriding
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6678
diff changeset
   365
        for colid, context in self.headers:
6428
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6389
diff changeset
   366
            w(u'<td id="%s">' % colid)
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6389
diff changeset
   367
            components = self._cw.vreg['ctxcomponents'].poss_visible_objects(
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6389
diff changeset
   368
                self._cw, rset=self.cw_rset, view=view, context=context)
de95bbed8781 [components] refactor main template header: make it much more flexible by using CtxComponent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6389
diff changeset
   369
            for comp in components:
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   370
                comp.render(w=w)
6764
b2c1b481f310 [web/views/basetemplates] nbsp breaks tests, use #160 instead
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6697
diff changeset
   371
                w(u'&#160;')
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   372
            w(u'</td>')
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   373
        w(u'</tr></table>\n')
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   374
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   375
    def state_header(self):
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   376
        state = self._cw.search_state
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   377
        if state[0] == 'normal':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   378
            return
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   379
        _ = self._cw._
4604
96cc3d296d75 remove 3.6 deprecation warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4603
diff changeset
   380
        value = self._cw.view('oneline', self._cw.eid_rset(state[1][1]))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   381
        msg = ' '.join((_("searching for"),
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   382
                        display_name(self._cw, state[1][3]),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   383
                        _("to associate with"), value,
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   384
                        _("by relation"), '"',
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   385
                        display_name(self._cw, state[1][2], state[1][0]),
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   386
                        '"'))
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   387
        return self.w(u'<div class="stateMessage">%s</div>' % msg)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   388
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   389
816
9cd49a910fce kill Template class and 'templates' registry
sylvain.thenault@logilab.fr
parents: 811
diff changeset
   390
class HTMLPageFooter(View):
6786
ce35c6f2f219 [footer template] refactor to ease addition of some content into the footer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6764
diff changeset
   391
    """default html page footer: include footer actions"""
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   392
    __regid__ = 'footer'
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   393
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   394
    def call(self, **kwargs):
5478
c52124b7a00e [css] progressively fixing rhythm
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5477
diff changeset
   395
        self.w(u'<div id="footer">')
6786
ce35c6f2f219 [footer template] refactor to ease addition of some content into the footer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6764
diff changeset
   396
        self.footer_content()
ce35c6f2f219 [footer template] refactor to ease addition of some content into the footer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6764
diff changeset
   397
        self.w(u'</div>')
ce35c6f2f219 [footer template] refactor to ease addition of some content into the footer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6764
diff changeset
   398
ce35c6f2f219 [footer template] refactor to ease addition of some content into the footer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6764
diff changeset
   399
    def footer_content(self):
3655
af86ab65a282 3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3503
diff changeset
   400
        actions = self._cw.vreg['actions'].possible_actions(self._cw,
af86ab65a282 3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3503
diff changeset
   401
                                                            rset=self.cw_rset)
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3242
diff changeset
   402
        footeractions = actions.get('footer', ())
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3242
diff changeset
   403
        for i, action in enumerate(footeractions):
6140
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
   404
            self.w(u'<a href="%s">%s</a>' % (action.url(),
65a619eb31c4 [boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6109
diff changeset
   405
                                             self._cw._(action.title)))
3495
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3242
diff changeset
   406
            if i < (len(footeractions) - 1):
438576c5b1d1 [ui] turn footer items into actions
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3242
diff changeset
   407
                self.w(u' | ')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   408
816
9cd49a910fce kill Template class and 'templates' registry
sylvain.thenault@logilab.fr
parents: 811
diff changeset
   409
class HTMLContentHeader(View):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   410
    """default html page content header:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   411
    * include message component if selectable for this request
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   412
    * include selectable content navigation components
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   413
    """
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   414
    __regid__ = 'contentheader'
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   415
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   416
    def call(self, view, **kwargs):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   417
        """by default, display informal messages in content header"""
6141
b8287e54b528 [web api] unify 'contentnav' (VComponent) and 'boxes' registries as 'ctxcomponents' (CtxComponent)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6140
diff changeset
   418
        components = self._cw.vreg['ctxcomponents'].poss_visible_objects(
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   419
            self._cw, rset=self.cw_rset, view=view, context='navtop')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   420
        if components:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   421
            self.w(u'<div id="contentheader">')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   422
            for comp in components:
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   423
                comp.render(w=self.w, view=view)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   424
            self.w(u'</div><div class="clear"></div>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   425
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   426
816
9cd49a910fce kill Template class and 'templates' registry
sylvain.thenault@logilab.fr
parents: 811
diff changeset
   427
class HTMLContentFooter(View):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   428
    """default html page content footer: include selectable content navigation
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   429
    components
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   430
    """
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   431
    __regid__ = 'contentfooter'
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   432
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   433
    def call(self, view, **kwargs):
6141
b8287e54b528 [web api] unify 'contentnav' (VComponent) and 'boxes' registries as 'ctxcomponents' (CtxComponent)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6140
diff changeset
   434
        components = self._cw.vreg['ctxcomponents'].poss_visible_objects(
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   435
            self._cw, rset=self.cw_rset, view=view, context='navbottom')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   436
        if components:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   437
            self.w(u'<div id="contentfooter">')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   438
            for comp in components:
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   439
                comp.render(w=self.w, view=view)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   440
            self.w(u'</div>')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   441
8310
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   442
class BaseLogForm(forms.FieldsForm):
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   443
    """Abstract Base login form to be used by any login form
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   444
    """
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   445
    __abstract__ = True
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   446
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   447
    __regid__ = 'logform'
4596
13fd398916c2 specify login form dom id, don't render progress div
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4594
diff changeset
   448
    domid = 'loginForm'
4600
ae95c3241226 use needs_css so you can change login form css without redefining LogFormView
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4599
diff changeset
   449
    needs_css = ('cubicweb.login.css',)
8310
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   450
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   451
    onclick_base = "javascript: cw.htmlhelpers.popupLoginBox('%s', '%s');"
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   452
    onclick_args = (None, None)
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   453
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   454
    @classproperty
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   455
    def form_buttons(cls):
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   456
        # we use a property because sub class will need to define their own onclick_args.
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   457
        # Therefor we can't juste make the string formating when instanciating this class
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   458
        onclick = cls.onclick_base % cls.onclick_args
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   459
        form_buttons = [fw.SubmitButton(label=_('log in'),
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   460
                                    attrs={'class': 'loginButton'}),
8310
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   461
                        fw.ResetButton(label=_('cancel'),
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   462
                                       attrs={'class': 'loginButton',
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   463
                                              'onclick': onclick}),]
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   464
        ## Can't shortcut next access because __dict__ is a "dictproxy" which 
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   465
        ## does not support items assignement.
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   466
        # cls.__dict__['form_buttons'] = form_buttons
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   467
        return form_buttons
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   468
5588
377c9adfe81e [forms] refactor action handling to ease overriding while keeping action overrideable by instance (closes #969167)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   469
    def form_action(self):
377c9adfe81e [forms] refactor action handling to ease overriding while keeping action overrideable by instance (closes #969167)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5584
diff changeset
   470
        if self.action is None:
8485
8de41063d629 [web login] fix after login redirection: redirect expect an url not a relative path. Breaks on cases like '?vid=aview'. Closes #2423575
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8326
diff changeset
   471
            # reuse existing redirection if it exists
8311
76a44a0d7f4b [login] split authentication logic from post authentication logic (closes #2200755)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8310
diff changeset
   472
            target = self._cw.form.get('postlogin_path',
76a44a0d7f4b [login] split authentication logic from post authentication logic (closes #2200755)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8310
diff changeset
   473
                                       self._cw.relative_path())
8324
75694a61f089 [login redirect] only add postlogin_path argument when meaningful
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   474
            url_args = {}
75694a61f089 [login redirect] only add postlogin_path argument when meaningful
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   475
            if target and target != '/':
75694a61f089 [login redirect] only add postlogin_path argument when meaningful
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   476
                url_args['postlogin_path'] = target
75694a61f089 [login redirect] only add postlogin_path argument when meaningful
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8311
diff changeset
   477
            return self._cw.build_url('login', __secure__=True, **url_args)
9709
d60dc7e03a45 [login form] Fix BaseLogForm.form_action()
Christophe de Vienne <cdevienne@gmail.com>
parents: 9378
diff changeset
   478
        return super(BaseLogForm, self).form_action()
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   479
8310
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   480
class LogForm(BaseLogForm):
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   481
    """Simple login form that send username and password
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   482
    """
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   483
    __regid__ = 'logform'
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   484
    domid = 'loginForm'
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   485
    needs_css = ('cubicweb.login.css',)
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   486
    # XXX have to recall fields name since python is mangling __login/__password
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   487
    __login = ff.StringField('__login', widget=fw.TextInput({'class': 'data'}))
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   488
    __password = ff.StringField('__password', label=_('password'),
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   489
                                widget=fw.PasswordSingleInput({'class': 'data'}))
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   490
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   491
    onclick_args =  ('popupLoginBox', '__login')
87f2f18a77ef [LoginForm] refactor to ease other implementation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8307
diff changeset
   492
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   493
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   494
class LogFormView(View):
10510
51321946da37 Spelling fixes in comments and docstrings
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10322
diff changeset
   495
    # XXX an awful lot of hardcoded assumptions there
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   496
    #     makes it unobvious to reuse/specialize
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3293
diff changeset
   497
    __regid__ = 'logform'
826
51cb3d85c059 fix LogFormTemplate selector
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 823
diff changeset
   498
    __select__ = match_kwargs('id', 'klass')
1421
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
   499
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   500
    title = 'log in'
1421
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1149
diff changeset
   501
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   502
    def call(self, id, klass, title=True, showmessage=True):
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   503
        w = self.w
6429
72669e7950c1 [login] fix some previously introduced login box css breakage
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6428
diff changeset
   504
        w(u'<div id="%s" class="%s">' % (id, klass))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   505
        if title:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   506
            stitle = self._cw.property_value('ui.site-title')
3166
2413e5291e8d properly escape site-title
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3053
diff changeset
   507
            if stitle:
2413e5291e8d properly escape site-title
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3053
diff changeset
   508
                stitle = xml_escape(stitle)
2413e5291e8d properly escape site-title
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3053
diff changeset
   509
            else:
2413e5291e8d properly escape site-title
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3053
diff changeset
   510
                stitle = u'&#160;'
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   511
            w(u'<div class="loginTitle">%s</div>' % stitle)
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   512
        w(u'<div class="loginContent">\n')
11234
558e5a6d1ec3 [views] do not eat the self._cw.message in LogFormView (closes #12421177)
David Douard <david.douard@logilab.fr>
parents: 9778
diff changeset
   513
        # don't call self._cw.message twice since it pops the id
11374
0e50215016f3 Merge with 3.22
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11373 11301
diff changeset
   514
        message = self._cw.message
11280
eb1d74ce6b61 Only access once to _cw.message in the login form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   515
        if showmessage and message:
eb1d74ce6b61 Only access once to _cw.message in the login form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11057
diff changeset
   516
            w(u'<div class="loginMessage">%s</div>\n' % message)
6005
0300fae1f7cb [views] link to public url when trying https without an account
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5988
diff changeset
   517
        config = self._cw.vreg.config
0300fae1f7cb [views] link to public url when trying https without an account
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5988
diff changeset
   518
        if config['auth-mode'] != 'http':
0300fae1f7cb [views] link to public url when trying https without an account
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 5988
diff changeset
   519
            self.login_form(id) # Cookie authentication
6389
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   520
        w(u'</div>')
72ba82a26e05 refactor login box & form to enable easy pluggability
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6225
diff changeset
   521
        w(u'</div>\n')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   522
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   523
    def login_form(self, id):
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   524
        cw = self._cw
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   525
        form = cw.vreg['forms'].select('logform', cw)
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   526
        if cw.vreg.config['allow-email-login']:
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   527
            label = cw._('login or email')
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   528
        else:
5838
68187d50968e [login form] fix bad login field label by using pgettext
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5588
diff changeset
   529
            label = cw.pgettext('CWUser', 'login')
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   530
        form.field_by_name('__login').label = label
6453
7fdd780d87e4 [form] unify form.render prototype to take a 'w' argument as other view/components render method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6429
diff changeset
   531
        form.render(w=self.w, table_class='', display_progress_div=False)
4594
7b9824d1b734 use an actual form for the login form ease customization from external cubes (eg rememberme)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4279
diff changeset
   532
        cw.html_headers.add_onload('jQuery("#__login:visible").focus()')
641
ed668804af37 split main template into main template + page-content template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 609
diff changeset
   533
4599
dafa39be525d bw compat
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4596
diff changeset
   534
LogFormTemplate = class_renamed('LogFormTemplate', LogFormView)