web/views/basetemplates.py
changeset 3451 6b46d73823f5
parent 3377 dd9d292b6a6d
child 3460 e4843535db25
equal deleted inserted replaced
3448:495862266785 3451:6b46d73823f5
    22 
    22 
    23     def call(self):
    23     def call(self):
    24         self.set_request_content_type()
    24         self.set_request_content_type()
    25         w = self.w
    25         w = self.w
    26         self.write_doctype()
    26         self.write_doctype()
    27         self.template_header('text/html', self.req._('login_action'))
    27         self.template_header('text/html', self._cw._('login_action'))
    28         w(u'<body>\n')
    28         w(u'<body>\n')
    29         self.content(w)
    29         self.content(w)
    30         w(u'</body>')
    30         w(u'</body>')
    31 
    31 
    32     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
    32     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
    33         w = self.whead
    33         w = self.whead
    34         # explictly close the <base> tag to avoid IE 6 bugs while browsing DOM
    34         # explictly close the <base> tag to avoid IE 6 bugs while browsing DOM
    35         w(u'<base href="%s"></base>' % xml_escape(self.req.base_url()))
    35         w(u'<base href="%s"></base>' % xml_escape(self._cw.base_url()))
    36         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
    36         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
    37           % (content_type, self.req.encoding))
    37           % (content_type, self._cw.encoding))
    38         w(NOINDEX)
    38         w(NOINDEX)
    39         w(NOFOLLOW)
    39         w(NOFOLLOW)
    40         w(u'\n'.join(additional_headers) + u'\n')
    40         w(u'\n'.join(additional_headers) + u'\n')
    41         self.wview('htmlheader', rset=self.rset)
    41         self.wview('htmlheader', rset=self.cw_rset)
    42         w(u'<title>%s</title>\n' % xml_escape(page_title))
    42         w(u'<title>%s</title>\n' % xml_escape(page_title))
    43 
    43 
    44 
    44 
    45 class LogInTemplate(LogInOutTemplate):
    45 class LogInTemplate(LogInOutTemplate):
    46     __regid__ = 'login'
    46     __regid__ = 'login'
    47     title = 'log in'
    47     title = 'log in'
    48 
    48 
    49     def content(self, w):
    49     def content(self, w):
    50         self.wview('logform', rset=self.rset, id='loginBox', klass='')
    50         self.wview('logform', rset=self.cw_rset, id='loginBox', klass='')
    51 
    51 
    52 
    52 
    53 class LoggedOutTemplate(LogInOutTemplate):
    53 class LoggedOutTemplate(LogInOutTemplate):
    54     __regid__ = 'loggedout'
    54     __regid__ = 'loggedout'
    55     title = 'logged out'
    55     title = 'logged out'
    56 
    56 
    57     def content(self, w):
    57     def content(self, w):
    58         # FIXME Deprecated code ?
    58         # FIXME Deprecated code ?
    59         msg = self.req._('you have been logged out')
    59         msg = self._cw._('you have been logged out')
    60         w(u'<h2>%s</h2>\n' % msg)
    60         w(u'<h2>%s</h2>\n' % msg)
    61         if self.config['anonymous-user']:
    61         if self._cw.config['anonymous-user']:
    62             indexurl = self.build_url('view', vid='index', __message=msg)
    62             indexurl = self.build_url('view', vid='index', __message=msg)
    63             w(u'<p><a href="%s">%s</a><p>' % (
    63             w(u'<p><a href="%s">%s</a><p>' % (
    64                 xml_escape(indexurl),
    64                 xml_escape(indexurl),
    65                 self.req._('go back to the index page')))
    65                 self._cw._('go back to the index page')))
    66 
    66 
    67 @objectify_selector
    67 @objectify_selector
    68 def templatable_view(cls, req, rset, *args, **kwargs):
    68 def templatable_view(cls, req, rset, *args, **kwargs):
    69     view = kwargs.pop('view', None)
    69     view = kwargs.pop('view', None)
    70     if view is None:
    70     if view is None:
    82     __select__ = ~templatable_view()
    82     __select__ = ~templatable_view()
    83 
    83 
    84     def call(self, view):
    84     def call(self, view):
    85         view.set_request_content_type()
    85         view.set_request_content_type()
    86         view.set_stream()
    86         view.set_stream()
    87         if (self.req.form.has_key('__notemplate') and view.templatable
    87         if (self._cw.form.has_key('__notemplate') and view.templatable
    88             and view.content_type == self.req.html_content_type()):
    88             and view.content_type == self._cw.html_content_type()):
    89             view.w(self.req.document_surrounding_div())
    89             view.w(self._cw.document_surrounding_div())
    90             view.render()
    90             view.render()
    91             view.w(u'</div>')
    91             view.w(u'</div>')
    92         else:
    92         else:
    93             view.render()
    93             view.render()
    94         # have to replace our stream by view's stream (which may be a binary
    94         # have to replace our stream by view's stream (which may be a binary
   107     def call(self, view):
   107     def call(self, view):
   108         self.set_request_content_type()
   108         self.set_request_content_type()
   109         self.template_header(self.content_type, view)
   109         self.template_header(self.content_type, view)
   110         w = self.w
   110         w = self.w
   111         w(u'<div id="pageContent">\n')
   111         w(u'<div id="pageContent">\n')
   112         vtitle = self.req.form.get('vtitle')
   112         vtitle = self._cw.form.get('vtitle')
   113         if vtitle:
   113         if vtitle:
   114             w(u'<h1 class="vtitle">%s</h1>\n' % xml_escape(vtitle))
   114             w(u'<h1 class="vtitle">%s</h1>\n' % xml_escape(vtitle))
   115         # display entity type restriction component
   115         # display entity type restriction component
   116         etypefilter = self.vreg['components'].select_or_none(
   116         etypefilter = self._cw.vreg['components'].select_or_none(
   117             'etypenavigation', self.req, rset=self.rset)
   117             'etypenavigation', self._cw, rset=self.cw_rset)
   118         if etypefilter and etypefilter.cw_propval('visible'):
   118         if etypefilter and etypefilter.cw_propval('visible'):
   119             etypefilter.render(w=w)
   119             etypefilter.render(w=w)
   120         self.nav_html = UStringIO()
   120         self.nav_html = UStringIO()
   121         if view and view.need_navigation:
   121         if view and view.need_navigation:
   122             view.paginate(w=self.nav_html.write)
   122             view.paginate(w=self.nav_html.write)
   134         self.template_html_header(content_type, page_title, additional_headers)
   134         self.template_html_header(content_type, page_title, additional_headers)
   135         self.template_body_header(view)
   135         self.template_body_header(view)
   136 
   136 
   137     def template_html_header(self, content_type, page_title, additional_headers=()):
   137     def template_html_header(self, content_type, page_title, additional_headers=()):
   138         w = self.whead
   138         w = self.whead
   139         lang = self.req.lang
   139         lang = self._cw.lang
   140         self.write_doctype()
   140         self.write_doctype()
   141         # explictly close the <base> tag to avoid IE 6 bugs while browsing DOM
   141         # explictly close the <base> tag to avoid IE 6 bugs while browsing DOM
   142         w(u'<base href="%s"></base>' % xml_escape(self.req.base_url()))
   142         w(u'<base href="%s"></base>' % xml_escape(self._cw.base_url()))
   143         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   143         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   144           % (content_type, self.req.encoding))
   144           % (content_type, self._cw.encoding))
   145         w(u'\n'.join(additional_headers) + u'\n')
   145         w(u'\n'.join(additional_headers) + u'\n')
   146         self.wview('htmlheader', rset=self.rset)
   146         self.wview('htmlheader', rset=self.cw_rset)
   147         if page_title:
   147         if page_title:
   148             w(u'<title>%s</title>\n' % xml_escape(page_title))
   148             w(u'<title>%s</title>\n' % xml_escape(page_title))
   149 
   149 
   150     def template_body_header(self, view):
   150     def template_body_header(self, view):
   151         w = self.w
   151         w = self.w
   152         w(u'<body>\n')
   152         w(u'<body>\n')
   153         self.wview('header', rset=self.rset, view=view)
   153         self.wview('header', rset=self.cw_rset, view=view)
   154         w(u'<div id="page"><table width="100%" border="0" id="mainLayout"><tr>\n')
   154         w(u'<div id="page"><table width="100%" border="0" id="mainLayout"><tr>\n')
   155         self.nav_column(view, 'left')
   155         self.nav_column(view, 'left')
   156         w(u'<td id="contentcol">\n')
   156         w(u'<td id="contentcol">\n')
   157         components = self.vreg['components']
   157         components = self._cw.vreg['components']
   158         rqlcomp = components.select_or_none('rqlinput', self.req, rset=self.rset)
   158         rqlcomp = components.select_or_none('rqlinput', self._cw, rset=self.cw_rset)
   159         if rqlcomp:
   159         if rqlcomp:
   160             rqlcomp.render(w=self.w, view=view)
   160             rqlcomp.render(w=self.w, view=view)
   161         msgcomp = components.select_or_none('applmessages', self.req, rset=self.rset)
   161         msgcomp = components.select_or_none('applmessages', self._cw, rset=self.cw_rset)
   162         if msgcomp:
   162         if msgcomp:
   163             msgcomp.render(w=self.w)
   163             msgcomp.render(w=self.w)
   164         self.content_header(view)
   164         self.content_header(view)
   165 
   165 
   166     def template_footer(self, view=None):
   166     def template_footer(self, view=None):
   167         self.content_footer(view)
   167         self.content_footer(view)
   168         self.w(u'</td>\n')
   168         self.w(u'</td>\n')
   169         self.nav_column(view, 'right')
   169         self.nav_column(view, 'right')
   170         self.w(u'</tr></table></div>\n')
   170         self.w(u'</tr></table></div>\n')
   171         self.wview('footer', rset=self.rset)
   171         self.wview('footer', rset=self.cw_rset)
   172         self.w(u'</body>')
   172         self.w(u'</body>')
   173 
   173 
   174     def nav_column(self, view, context):
   174     def nav_column(self, view, context):
   175         boxes = list(self.vreg['boxes'].poss_visible_objects(
   175         boxes = list(self._cw.vreg['boxes'].poss_visible_objects(
   176             self.req, rset=self.rset, view=view, context=context))
   176             self._cw, rset=self.cw_rset, view=view, context=context))
   177         if boxes:
   177         if boxes:
   178             self.w(u'<td class="navcol"><div class="navboxes">\n')
   178             self.w(u'<td class="navcol"><div class="navboxes">\n')
   179             for box in boxes:
   179             for box in boxes:
   180                 box.render(w=self.w, view=view)
   180                 box.render(w=self.w, view=view)
   181             self.w(u'</div></td>\n')
   181             self.w(u'</div></td>\n')
   182 
   182 
   183     def content_header(self, view=None):
   183     def content_header(self, view=None):
   184         """by default, display informal messages in content header"""
   184         """by default, display informal messages in content header"""
   185         self.wview('contentheader', rset=self.rset, view=view)
   185         self.wview('contentheader', rset=self.cw_rset, view=view)
   186 
   186 
   187     def content_footer(self, view=None):
   187     def content_footer(self, view=None):
   188         self.wview('contentfooter', rset=self.rset, view=view)
   188         self.wview('contentfooter', rset=self.cw_rset, view=view)
   189 
   189 
   190 
   190 
   191 class ErrorTemplate(TheMainTemplate):
   191 class ErrorTemplate(TheMainTemplate):
   192     """fallback template if an internal error occured during displaying the
   192     """fallback template if an internal error occured during displaying the
   193     main template. This template may be called for authentication error,
   193     main template. This template may be called for authentication error,
   196     __regid__ = 'error-template'
   196     __regid__ = 'error-template'
   197 
   197 
   198     def call(self):
   198     def call(self):
   199         """display an unexpected error"""
   199         """display an unexpected error"""
   200         self.set_request_content_type()
   200         self.set_request_content_type()
   201         self.req.reset_headers()
   201         self._cw.reset_headers()
   202         view = self.vreg['views'].select('error', self.req, rset=self.rset)
   202         view = self._cw.vreg['views'].select('error', self._cw, rset=self.cw_rset)
   203         self.template_header(self.content_type, view, self.req._('an error occured'),
   203         self.template_header(self.content_type, view, self._cw._('an error occured'),
   204                              [NOINDEX, NOFOLLOW])
   204                              [NOINDEX, NOFOLLOW])
   205         view.render(w=self.w)
   205         view.render(w=self.w)
   206         self.template_footer(view)
   206         self.template_footer(view)
   207 
   207 
   208     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
   208     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
   209         w = self.whead
   209         w = self.whead
   210         lang = self.req.lang
   210         lang = self._cw.lang
   211         self.write_doctype()
   211         self.write_doctype()
   212         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   212         w(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   213           % (content_type, self.req.encoding))
   213           % (content_type, self._cw.encoding))
   214         w(u'\n'.join(additional_headers))
   214         w(u'\n'.join(additional_headers))
   215         self.wview('htmlheader', rset=self.rset)
   215         self.wview('htmlheader', rset=self.cw_rset)
   216         w(u'<title>%s</title>\n' % xml_escape(page_title))
   216         w(u'<title>%s</title>\n' % xml_escape(page_title))
   217         self.w(u'<body>\n')
   217         self.w(u'<body>\n')
   218 
   218 
   219     def template_footer(self, view=None):
   219     def template_footer(self, view=None):
   220         self.w(u'</body>')
   220         self.w(u'</body>')
   226 
   226 
   227     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
   227     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
   228         page_title = page_title or view.page_title()
   228         page_title = page_title or view.page_title()
   229         additional_headers = additional_headers or view.html_headers()
   229         additional_headers = additional_headers or view.html_headers()
   230         whead = self.whead
   230         whead = self.whead
   231         lang = self.req.lang
   231         lang = self._cw.lang
   232         self.write_doctype()
   232         self.write_doctype()
   233         whead(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   233         whead(u'<meta http-equiv="content-type" content="%s; charset=%s"/>\n'
   234               % (content_type, self.req.encoding))
   234               % (content_type, self._cw.encoding))
   235         whead(u'\n'.join(additional_headers) + u'\n')
   235         whead(u'\n'.join(additional_headers) + u'\n')
   236         self.wview('htmlheader', rset=self.rset)
   236         self.wview('htmlheader', rset=self.cw_rset)
   237         w = self.w
   237         w = self.w
   238         w(u'<title>%s</title>\n' % xml_escape(page_title))
   238         w(u'<title>%s</title>\n' % xml_escape(page_title))
   239         w(u'<body>\n')
   239         w(u'<body>\n')
   240         w(u'<div id="page">')
   240         w(u'<div id="page">')
   241         w(u'<table width="100%" height="100%" border="0"><tr>\n')
   241         w(u'<table width="100%" height="100%" border="0"><tr>\n')
   242         w(u'<td class="navcol">\n')
   242         w(u'<td class="navcol">\n')
   243         self.topleft_header()
   243         self.topleft_header()
   244         boxes = list(self.vreg['boxes'].poss_visible_objects(
   244         boxes = list(self._cw.vreg['boxes'].poss_visible_objects(
   245             self.req, rset=self.rset, view=view, context='left'))
   245             self._cw, rset=self.cw_rset, view=view, context='left'))
   246         if boxes:
   246         if boxes:
   247             w(u'<div class="navboxes">\n')
   247             w(u'<div class="navboxes">\n')
   248             for box in boxes:
   248             for box in boxes:
   249                 box.render(w=w)
   249                 box.render(w=w)
   250             self.w(u'</div>\n')
   250             self.w(u'</div>\n')
   251         w(u'</td>')
   251         w(u'</td>')
   252         w(u'<td id="contentcol" rowspan="2">')
   252         w(u'<td id="contentcol" rowspan="2">')
   253         w(u'<div id="pageContent">\n')
   253         w(u'<div id="pageContent">\n')
   254         vtitle = self.req.form.get('vtitle')
   254         vtitle = self._cw.form.get('vtitle')
   255         if vtitle:
   255         if vtitle:
   256             w(u'<h1 class="vtitle">%s</h1>' % xml_escape(vtitle))
   256             w(u'<h1 class="vtitle">%s</h1>' % xml_escape(vtitle))
   257 
   257 
   258     def topleft_header(self):
   258     def topleft_header(self):
   259         logo = self.vreg['components'].select_or_none('logo', self.req,
   259         logo = self._cw.vreg['components'].select_or_none('logo', self._cw,
   260                                                       rset=self.rset)
   260                                                       rset=self.cw_rset)
   261         if logo and logo.cw_propval('visible'):
   261         if logo and logo.cw_propval('visible'):
   262             self.w(u'<table id="header"><tr>\n')
   262             self.w(u'<table id="header"><tr>\n')
   263             self.w(u'<td>')
   263             self.w(u'<td>')
   264             logo.render(w=self.w)
   264             logo.render(w=self.w)
   265             self.w(u'</td>\n')
   265             self.w(u'</td>\n')
   277 
   277 
   278         def call(self, view):
   278         def call(self, view):
   279             """build the standard view, then when it's all done, convert xhtml to pdf
   279             """build the standard view, then when it's all done, convert xhtml to pdf
   280             """
   280             """
   281             super(PdfMainTemplate, self).call(view)
   281             super(PdfMainTemplate, self).call(view)
   282             section = self.req.form.pop('section', 'contentmain')
   282             section = self._cw.form.pop('section', 'contentmain')
   283             pdf = self.to_pdf(self._stream, section)
   283             pdf = self.to_pdf(self._stream, section)
   284             self.req.set_content_type('application/pdf', filename='report.pdf')
   284             self._cw.set_content_type('application/pdf', filename='report.pdf')
   285             self.binary = True
   285             self.binary = True
   286             self.w = None
   286             self.w = None
   287             self.set_stream()
   287             self.set_stream()
   288             # pylint needs help
   288             # pylint needs help
   289             self.w(pdf)
   289             self.w(pdf)
   316         self.javascripts()
   316         self.javascripts()
   317         self.alternates()
   317         self.alternates()
   318         self.pageid()
   318         self.pageid()
   319 
   319 
   320     def favicon(self):
   320     def favicon(self):
   321         favicon = self.req.external_resource('FAVICON', None)
   321         favicon = self._cw.external_resource('FAVICON', None)
   322         if favicon:
   322         if favicon:
   323             self.whead(u'<link rel="shortcut icon" href="%s"/>\n' % favicon)
   323             self.whead(u'<link rel="shortcut icon" href="%s"/>\n' % favicon)
   324 
   324 
   325     def stylesheets(self):
   325     def stylesheets(self):
   326         req = self.req
   326         req = self._cw
   327         add_css = req.add_css
   327         add_css = req.add_css
   328         for css in req.external_resource('STYLESHEETS'):
   328         for css in req.external_resource('STYLESHEETS'):
   329             add_css(css, localfile=False)
   329             add_css(css, localfile=False)
   330         for css in req.external_resource('STYLESHEETS_PRINT'):
   330         for css in req.external_resource('STYLESHEETS_PRINT'):
   331             add_css(css, u'print', localfile=False)
   331             add_css(css, u'print', localfile=False)
   332         for css in req.external_resource('IE_STYLESHEETS'):
   332         for css in req.external_resource('IE_STYLESHEETS'):
   333             add_css(css, localfile=False, ieonly=True)
   333             add_css(css, localfile=False, ieonly=True)
   334 
   334 
   335     def javascripts(self):
   335     def javascripts(self):
   336         for jscript in self.req.external_resource('JAVASCRIPTS'):
   336         for jscript in self._cw.external_resource('JAVASCRIPTS'):
   337             self.req.add_js(jscript, localfile=False)
   337             self._cw.add_js(jscript, localfile=False)
   338 
   338 
   339     def alternates(self):
   339     def alternates(self):
   340         urlgetter = self.vreg['components'].select_or_none('rss_feed_url',
   340         urlgetter = self._cw.vreg['components'].select_or_none('rss_feed_url',
   341                                                            self.req, rset=self.rset)
   341                                                            self._cw, rset=self.cw_rset)
   342         if urlgetter is not None:
   342         if urlgetter is not None:
   343             self.whead(u'<link rel="alternate" type="application/rss+xml" title="RSS feed" href="%s"/>\n'
   343             self.whead(u'<link rel="alternate" type="application/rss+xml" title="RSS feed" href="%s"/>\n'
   344                        %  xml_escape(urlgetter.feed_url()))
   344                        %  xml_escape(urlgetter.feed_url()))
   345 
   345 
   346     def pageid(self):
   346     def pageid(self):
   347         req = self.req
   347         req = self._cw
   348         pid = make_uid(id(req))
   348         pid = make_uid(id(req))
   349         req.pageid = pid
   349         req.pageid = pid
   350         req.html_headers.define_var('pageid', pid)
   350         req.html_headers.define_var('pageid', pid)
   351 
   351 
   352 
   352 
   366 
   366 
   367     def main_header(self, view):
   367     def main_header(self, view):
   368         """build the top menu with authentification info and the rql box"""
   368         """build the top menu with authentification info and the rql box"""
   369         self.w(u'<table id="header"><tr>\n')
   369         self.w(u'<table id="header"><tr>\n')
   370         self.w(u'<td id="firstcolumn">')
   370         self.w(u'<td id="firstcolumn">')
   371         logo = self.vreg['components'].select_or_none(
   371         logo = self._cw.vreg['components'].select_or_none(
   372             'logo', self.req, rset=self.rset)
   372             'logo', self._cw, rset=self.cw_rset)
   373         if logo and logo.cw_propval('visible'):
   373         if logo and logo.cw_propval('visible'):
   374             logo.render(w=self.w)
   374             logo.render(w=self.w)
   375         self.w(u'</td>\n')
   375         self.w(u'</td>\n')
   376         # appliname and breadcrumbs
   376         # appliname and breadcrumbs
   377         self.w(u'<td id="headtext">')
   377         self.w(u'<td id="headtext">')
   378         for cid in self.main_cell_components:
   378         for cid in self.main_cell_components:
   379             comp = self.vreg['components'].select_or_none(
   379             comp = self._cw.vreg['components'].select_or_none(
   380                 cid, self.req, rset=self.rset)
   380                 cid, self._cw, rset=self.cw_rset)
   381             if comp and comp.cw_propval('visible'):
   381             if comp and comp.cw_propval('visible'):
   382                 comp.render(w=self.w)
   382                 comp.render(w=self.w)
   383         self.w(u'</td>')
   383         self.w(u'</td>')
   384         # logged user and help
   384         # logged user and help
   385         self.w(u'<td>\n')
   385         self.w(u'<td>\n')
   386         comp = self.vreg['components'].select_or_none(
   386         comp = self._cw.vreg['components'].select_or_none(
   387             'loggeduserlink', self.req, rset=self.rset)
   387             'loggeduserlink', self._cw, rset=self.cw_rset)
   388         if comp and comp.cw_propval('visible'):
   388         if comp and comp.cw_propval('visible'):
   389             comp.render(w=self.w)
   389             comp.render(w=self.w)
   390         self.w(u'</td><td>')
   390         self.w(u'</td><td>')
   391         helpcomp = self.vreg['components'].select_or_none(
   391         helpcomp = self._cw.vreg['components'].select_or_none(
   392             'help', self.req, rset=self.rset)
   392             'help', self._cw, rset=self.cw_rset)
   393         if helpcomp and helpcomp.cw_propval('visible'):
   393         if helpcomp and helpcomp.cw_propval('visible'):
   394             helpcomp.render(w=self.w)
   394             helpcomp.render(w=self.w)
   395         self.w(u'</td>')
   395         self.w(u'</td>')
   396         # lastcolumn
   396         # lastcolumn
   397         self.w(u'<td id="lastcolumn">')
   397         self.w(u'<td id="lastcolumn">')
   398         self.w(u'</td>\n')
   398         self.w(u'</td>\n')
   399         self.w(u'</tr></table>\n')
   399         self.w(u'</tr></table>\n')
   400         self.wview('logform', rset=self.rset, id='popupLoginBox', klass='hidden',
   400         self.wview('logform', rset=self.cw_rset, id='popupLoginBox', klass='hidden',
   401                    title=False, message=False)
   401                    title=False, message=False)
   402 
   402 
   403     def state_header(self):
   403     def state_header(self):
   404         state = self.req.search_state
   404         state = self._cw.search_state
   405         if state[0] == 'normal':
   405         if state[0] == 'normal':
   406             return
   406             return
   407         _ = self.req._
   407         _ = self._cw._
   408         value = self.view('oneline', self.req.eid_rset(state[1][1]))
   408         value = self.view('oneline', self._cw.eid_rset(state[1][1]))
   409         msg = ' '.join((_("searching for"),
   409         msg = ' '.join((_("searching for"),
   410                         display_name(self.req, state[1][3]),
   410                         display_name(self._cw, state[1][3]),
   411                         _("to associate with"), value,
   411                         _("to associate with"), value,
   412                         _("by relation"), '"',
   412                         _("by relation"), '"',
   413                         display_name(self.req, state[1][2], state[1][0]),
   413                         display_name(self._cw, state[1][2], state[1][0]),
   414                         '"'))
   414                         '"'))
   415         return self.w(u'<div class="stateMessage">%s</div>' % msg)
   415         return self.w(u'<div class="stateMessage">%s</div>' % msg)
   416 
   416 
   417 
   417 
   418 
   418 
   420     """default html page footer: include logo if any, and close the HTML body
   420     """default html page footer: include logo if any, and close the HTML body
   421     """
   421     """
   422     __regid__ = 'footer'
   422     __regid__ = 'footer'
   423 
   423 
   424     def call(self, **kwargs):
   424     def call(self, **kwargs):
   425         req = self.req
   425         req = self._cw
   426         self.w(u'<div class="footer">')
   426         self.w(u'<div class="footer">')
   427         # XXX Take object from the registry if in there? would be
   427         # XXX Take object from the registry if in there? would be
   428         #     better anyway
   428         #     better anyway
   429         from cubicweb.web.views.wdoc import ChangeLogView
   429         from cubicweb.web.views.wdoc import ChangeLogView
   430         self.w(u'<a href="%s">%s</a> | ' % (req.build_url('changelog'),
   430         self.w(u'<a href="%s">%s</a> | ' % (req.build_url('changelog'),
   442     """
   442     """
   443     __regid__ = 'contentheader'
   443     __regid__ = 'contentheader'
   444 
   444 
   445     def call(self, view, **kwargs):
   445     def call(self, view, **kwargs):
   446         """by default, display informal messages in content header"""
   446         """by default, display informal messages in content header"""
   447         components = self.vreg['contentnavigation'].poss_visible_objects(
   447         components = self._cw.vreg['contentnavigation'].poss_visible_objects(
   448             self.req, rset=self.rset, view=view, context='navtop')
   448             self._cw, rset=self.cw_rset, view=view, context='navtop')
   449         if components:
   449         if components:
   450             self.w(u'<div id="contentheader">')
   450             self.w(u'<div id="contentheader">')
   451             for comp in components:
   451             for comp in components:
   452                 comp.render(w=self.w, view=view)
   452                 comp.render(w=self.w, view=view)
   453             self.w(u'</div><div class="clear"></div>')
   453             self.w(u'</div><div class="clear"></div>')
   458     components
   458     components
   459     """
   459     """
   460     __regid__ = 'contentfooter'
   460     __regid__ = 'contentfooter'
   461 
   461 
   462     def call(self, view, **kwargs):
   462     def call(self, view, **kwargs):
   463         components = self.vreg['contentnavigation'].poss_visible_objects(
   463         components = self._cw.vreg['contentnavigation'].poss_visible_objects(
   464             self.req, rset=self.rset, view=view, context='navbottom')
   464             self._cw, rset=self.cw_rset, view=view, context='navbottom')
   465         if components:
   465         if components:
   466             self.w(u'<div id="contentfooter">')
   466             self.w(u'<div id="contentfooter">')
   467             for comp in components:
   467             for comp in components:
   468                 comp.render(w=self.w, view=view)
   468                 comp.render(w=self.w, view=view)
   469             self.w(u'</div>')
   469             self.w(u'</div>')
   474     __select__ = match_kwargs('id', 'klass')
   474     __select__ = match_kwargs('id', 'klass')
   475 
   475 
   476     title = 'log in'
   476     title = 'log in'
   477 
   477 
   478     def call(self, id, klass, title=True, message=True):
   478     def call(self, id, klass, title=True, message=True):
   479         self.req.add_css('cubicweb.login.css')
   479         self._cw.add_css('cubicweb.login.css')
   480         self.w(u'<div id="%s" class="%s">' % (id, klass))
   480         self.w(u'<div id="%s" class="%s">' % (id, klass))
   481         if title:
   481         if title:
   482             stitle = self.req.property_value('ui.site-title')
   482             stitle = self._cw.property_value('ui.site-title')
   483             if stitle:
   483             if stitle:
   484                 stitle = xml_escape(stitle)
   484                 stitle = xml_escape(stitle)
   485             else:
   485             else:
   486                 stitle = u'&#160;'
   486                 stitle = u'&#160;'
   487             self.w(u'<div id="loginTitle">%s</div>' % stitle)
   487             self.w(u'<div id="loginTitle">%s</div>' % stitle)
   488         self.w(u'<div id="loginContent">\n')
   488         self.w(u'<div id="loginContent">\n')
   489 
   489 
   490         if message:
   490         if message:
   491             self.display_message()
   491             self.display_message()
   492         if self.config['auth-mode'] == 'http':
   492         if self._cw.config['auth-mode'] == 'http':
   493             # HTTP authentication
   493             # HTTP authentication
   494             pass
   494             pass
   495         else:
   495         else:
   496             # Cookie authentication
   496             # Cookie authentication
   497             self.login_form(id)
   497             self.login_form(id)
   498         self.w(u'</div></div>\n')
   498         self.w(u'</div></div>\n')
   499 
   499 
   500     def display_message(self):
   500     def display_message(self):
   501         message = self.req.message
   501         message = self._cw.message
   502         if message:
   502         if message:
   503             self.w(u'<div class="simpleMessage">%s</div>\n' % message)
   503             self.w(u'<div class="simpleMessage">%s</div>\n' % message)
   504 
   504 
   505     def login_form(self, id):
   505     def login_form(self, id):
   506         _ = self.req._
   506         _ = self._cw._
   507         self.w(u'<form method="post" action="%s" id="login_form">\n'
   507         self.w(u'<form method="post" action="%s" id="login_form">\n'
   508                % xml_escape(login_form_url(self.config, self.req)))
   508                % xml_escape(login_form_url(self._cw.config, self._cw)))
   509         self.w(u'<table>\n')
   509         self.w(u'<table>\n')
   510         self.w(u'<tr>\n')
   510         self.w(u'<tr>\n')
   511         msg = (self.config['allow-email-login'] and _('login or email')) or _('login')
   511         msg = (self._cw.config['allow-email-login'] and _('login or email')) or _('login')
   512         self.w(u'<td><label for="__login">%s</label></td>' % msg)
   512         self.w(u'<td><label for="__login">%s</label></td>' % msg)
   513         self.w(u'<td><input name="__login" id="__login" class="data" type="text" /></td>')
   513         self.w(u'<td><input name="__login" id="__login" class="data" type="text" /></td>')
   514         self.w(u'</tr><tr>\n')
   514         self.w(u'</tr><tr>\n')
   515         self.w(u'<td><label for="__password" >%s</label></td>' % _('password'))
   515         self.w(u'<td><label for="__password" >%s</label></td>' % _('password'))
   516         self.w(u'<td><input name="__password" id="__password" class="data" type="password" /></td>\n')
   516         self.w(u'<td><input name="__password" id="__password" class="data" type="password" /></td>\n')
   517         self.w(u'</tr><tr>\n')
   517         self.w(u'</tr><tr>\n')
   518         self.w(u'<td>&#160;</td><td><input type="submit" class="loginButton right" value="%s" />\n</td>' % _('log in'))
   518         self.w(u'<td>&#160;</td><td><input type="submit" class="loginButton right" value="%s" />\n</td>' % _('log in'))
   519         self.w(u'</tr>\n')
   519         self.w(u'</tr>\n')
   520         self.w(u'</table>\n')
   520         self.w(u'</table>\n')
   521         self.w(u'</form>\n')
   521         self.w(u'</form>\n')
   522         self.req.html_headers.add_onload('jQuery("#__login:visible").focus()')
   522         self._cw.html_headers.add_onload('jQuery("#__login:visible").focus()')
   523 
   523 
   524 
   524 
   525 def login_form_url(config, req):
   525 def login_form_url(config, req):
   526     if req.https:
   526     if req.https:
   527         return req.url()
   527         return req.url()