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: |
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') |
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 |
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>') |
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' ' |
486 stitle = u' ' |
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> </td><td><input type="submit" class="loginButton right" value="%s" />\n</td>' % _('log in')) |
518 self.w(u'<td> </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() |