equal
deleted
inserted
replaced
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>') |