web/views/basetemplates.py
changeset 2381 caad2367d940
parent 2144 51c84d585456
parent 2312 af4d8f75c5db
child 2555 ca7b122f34fa
equal deleted inserted replaced
2374:ea1a44e4ad62 2381:caad2367d940
     6 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     6 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     7 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     7 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     8 """
     8 """
     9 __docformat__ = "restructuredtext en"
     9 __docformat__ = "restructuredtext en"
    10 
    10 
    11 from logilab.mtconverter import html_escape
    11 from logilab.mtconverter import xml_escape
    12 
    12 
    13 from cubicweb.vregistry import objectify_selector
    13 from cubicweb.vregistry import objectify_selector
    14 from cubicweb.selectors import match_kwargs
    14 from cubicweb.selectors import match_kwargs
    15 from cubicweb.view import View, MainTemplate, NOINDEX, NOFOLLOW
    15 from cubicweb.view import View, MainTemplate, NOINDEX, NOFOLLOW
    16 from cubicweb.utils import make_uid, UStringIO
    16 from cubicweb.utils import make_uid, UStringIO
    29         w(u'</body>')
    29         w(u'</body>')
    30 
    30 
    31     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
    31     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
    32         w = self.whead
    32         w = self.whead
    33         # explictly close the <base> tag to avoid IE 6 bugs while browsing DOM
    33         # explictly close the <base> tag to avoid IE 6 bugs while browsing DOM
    34         w(u'<base href="%s"></base>' % html_escape(self.req.base_url()))
    34         w(u'<base href="%s"></base>' % xml_escape(self.req.base_url()))
    35         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
    35         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
    36           % (content_type, self.req.encoding))
    36           % (content_type, self.req.encoding))
    37         w(NOINDEX)
    37         w(NOINDEX)
    38         w(NOFOLLOW)
    38         w(NOFOLLOW)
    39         w(u'\n'.join(additional_headers) + u'\n')
    39         w(u'\n'.join(additional_headers) + u'\n')
    40         self.wview('htmlheader', rset=self.rset)
    40         self.wview('htmlheader', rset=self.rset)
    41         w(u'<title>%s</title>\n' % html_escape(page_title))
    41         w(u'<title>%s</title>\n' % xml_escape(page_title))
    42 
    42 
    43 
    43 
    44 class LogInTemplate(LogInOutTemplate):
    44 class LogInTemplate(LogInOutTemplate):
    45     id = 'login'
    45     id = 'login'
    46     title = 'log in'
    46     title = 'log in'
    58         msg = self.req._('you have been logged out')
    58         msg = self.req._('you have been logged out')
    59         w(u'<h2>%s</h2>\n' % msg)
    59         w(u'<h2>%s</h2>\n' % msg)
    60         if self.config['anonymous-user']:
    60         if self.config['anonymous-user']:
    61             indexurl = self.build_url('view', vid='index', __message=msg)
    61             indexurl = self.build_url('view', vid='index', __message=msg)
    62             w(u'<p><a href="%s">%s</a><p>' % (
    62             w(u'<p><a href="%s">%s</a><p>' % (
    63                 html_escape(indexurl),
    63                 xml_escape(indexurl),
    64                 self.req._('go back to the index page')))
    64                 self.req._('go back to the index page')))
    65 
    65 
    66 @objectify_selector
    66 @objectify_selector
    67 def templatable_view(cls, req, rset, *args, **kwargs):
    67 def templatable_view(cls, req, rset, *args, **kwargs):
    68     view = kwargs.pop('view', None)
    68     view = kwargs.pop('view', None)
   108         self.template_header(self.content_type, view)
   108         self.template_header(self.content_type, view)
   109         w = self.w
   109         w = self.w
   110         w(u'<div id="pageContent">\n')
   110         w(u'<div id="pageContent">\n')
   111         vtitle = self.req.form.get('vtitle')
   111         vtitle = self.req.form.get('vtitle')
   112         if vtitle:
   112         if vtitle:
   113             w(u'<h1 class="vtitle">%s</h1>\n' % html_escape(vtitle))
   113             w(u'<h1 class="vtitle">%s</h1>\n' % xml_escape(vtitle))
   114         # display entity type restriction component
   114         # display entity type restriction component
   115         etypefilter = self.vreg.select_vobject('components', 'etypenavigation',
   115         etypefilter = self.vreg.select_vobject('components', 'etypenavigation',
   116                                               self.req, rset=self.rset)
   116                                               self.req, rset=self.rset)
   117         if etypefilter:
   117         if etypefilter:
   118             etypefilter.render(w=w)
   118             etypefilter.render(w=w)
   135 
   135 
   136     def template_html_header(self, content_type, page_title, additional_headers=()):
   136     def template_html_header(self, content_type, page_title, additional_headers=()):
   137         w = self.whead
   137         w = self.whead
   138         lang = self.req.lang
   138         lang = self.req.lang
   139         self.write_doctype()
   139         self.write_doctype()
   140         w(u'<base href="%s" />' % html_escape(self.req.base_url()))
   140         w(u'<base href="%s" />' % xml_escape(self.req.base_url()))
   141         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   141         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   142           % (content_type, self.req.encoding))
   142           % (content_type, self.req.encoding))
   143         w(u'\n'.join(additional_headers) + u'\n')
   143         w(u'\n'.join(additional_headers) + u'\n')
   144         self.wview('htmlheader', rset=self.rset)
   144         self.wview('htmlheader', rset=self.rset)
   145         if page_title:
   145         if page_title:
   146             w(u'<title>%s</title>\n' % html_escape(page_title))
   146             w(u'<title>%s</title>\n' % xml_escape(page_title))
   147 
   147 
   148     def template_body_header(self, view):
   148     def template_body_header(self, view):
   149         w = self.w
   149         w = self.w
   150         w(u'<body>\n')
   150         w(u'<body>\n')
   151         self.wview('header', rset=self.rset, view=view)
   151         self.wview('header', rset=self.rset, view=view)
   210         self.write_doctype()
   210         self.write_doctype()
   211         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   211         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   212           % (content_type, self.req.encoding))
   212           % (content_type, self.req.encoding))
   213         w(u'\n'.join(additional_headers))
   213         w(u'\n'.join(additional_headers))
   214         self.wview('htmlheader', rset=self.rset)
   214         self.wview('htmlheader', rset=self.rset)
   215         w(u'<title>%s</title>\n' % html_escape(page_title))
   215         w(u'<title>%s</title>\n' % xml_escape(page_title))
   216         self.w(u'<body>\n')
   216         self.w(u'<body>\n')
   217 
   217 
   218     def template_footer(self, view=None):
   218     def template_footer(self, view=None):
   219         self.w(u'</body>')
   219         self.w(u'</body>')
   220 
   220 
   232         whead(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   232         whead(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   233               % (content_type, self.req.encoding))
   233               % (content_type, self.req.encoding))
   234         whead(u'\n'.join(additional_headers) + u'\n')
   234         whead(u'\n'.join(additional_headers) + u'\n')
   235         self.wview('htmlheader', rset=self.rset)
   235         self.wview('htmlheader', rset=self.rset)
   236         w = self.w
   236         w = self.w
   237         w(u'<title>%s</title>\n' % html_escape(page_title))
   237         w(u'<title>%s</title>\n' % xml_escape(page_title))
   238         w(u'<body>\n')
   238         w(u'<body>\n')
   239         w(u'<div id="page">')
   239         w(u'<div id="page">')
   240         w(u'<table width="100%" height="100%" border="0"><tr>\n')
   240         w(u'<table width="100%" height="100%" border="0"><tr>\n')
   241         w(u'<td class="navcol">\n')
   241         w(u'<td class="navcol">\n')
   242         self.topleft_header()
   242         self.topleft_header()
   250         w(u'</td>')
   250         w(u'</td>')
   251         w(u'<td id="contentcol" rowspan="2">')
   251         w(u'<td id="contentcol" rowspan="2">')
   252         w(u'<div id="pageContent">\n')
   252         w(u'<div id="pageContent">\n')
   253         vtitle = self.req.form.get('vtitle')
   253         vtitle = self.req.form.get('vtitle')
   254         if vtitle:
   254         if vtitle:
   255             w(u'<h1 class="vtitle">%s</h1>' % html_escape(vtitle))
   255             w(u'<h1 class="vtitle">%s</h1>' % xml_escape(vtitle))
   256 
   256 
   257     def topleft_header(self):
   257     def topleft_header(self):
   258         logo = self.vreg.select_vobject('components', 'logo', self.req,
   258         logo = self.vreg.select_vobject('components', 'logo', self.req,
   259                                         rset=self.rset)
   259                                         rset=self.rset)
   260         if logo:
   260         if logo:
   299     def alternates(self):
   299     def alternates(self):
   300         urlgetter = self.vreg.select_object('components', 'rss_feed_url',
   300         urlgetter = self.vreg.select_object('components', 'rss_feed_url',
   301                                             self.req, rset=self.rset)
   301                                             self.req, rset=self.rset)
   302         if urlgetter is not None:
   302         if urlgetter is not None:
   303             self.whead(u'<link rel="alternate" type="application/rss+xml" title="RSS feed" href="%s"/>\n'
   303             self.whead(u'<link rel="alternate" type="application/rss+xml" title="RSS feed" href="%s"/>\n'
   304                        %  html_escape(urlgetter.feed_url()))
   304                        %  xml_escape(urlgetter.feed_url()))
   305 
   305 
   306     def pageid(self):
   306     def pageid(self):
   307         req = self.req
   307         req = self.req
   308         pid = make_uid(id(req))
   308         pid = make_uid(id(req))
   309         req.pageid = pid
   309         req.pageid = pid
   460             self.w(u'<div class="simpleMessage">%s</div>\n' % message)
   460             self.w(u'<div class="simpleMessage">%s</div>\n' % message)
   461 
   461 
   462     def login_form(self, id):
   462     def login_form(self, id):
   463         _ = self.req._
   463         _ = self.req._
   464         self.w(u'<form method="post" action="%s" id="login_form">\n'
   464         self.w(u'<form method="post" action="%s" id="login_form">\n'
   465                % html_escape(login_form_url(self.config, self.req)))
   465                % xml_escape(login_form_url(self.config, self.req)))
   466         self.w(u'<table>\n')
   466         self.w(u'<table>\n')
   467         self.w(u'<tr>\n')
   467         self.w(u'<tr>\n')
   468         msg = (self.config['allow-email-login'] and _('login or email')) or _('login')
   468         msg = (self.config['allow-email-login'] and _('login or email')) or _('login')
   469         self.w(u'<td><label for="__login">%s</label></td>' % msg)
   469         self.w(u'<td><label for="__login">%s</label></td>' % msg)
   470         self.w(u'<td><input name="__login" id="__login" class="data" type="text" /></td>')
   470         self.w(u'<td><input name="__login" id="__login" class="data" type="text" /></td>')