7 """ |
7 """ |
8 __docformat__ = "restructuredtext en" |
8 __docformat__ = "restructuredtext en" |
9 |
9 |
10 from cStringIO import StringIO |
10 from cStringIO import StringIO |
11 |
11 |
|
12 from logilab.common.deprecation import obsolete |
12 from logilab.mtconverter import html_escape |
13 from logilab.mtconverter import html_escape |
13 |
14 |
14 from cubicweb import NotAnEntity, NoSelectableObject |
15 from cubicweb import NotAnEntity, NoSelectableObject |
15 from cubicweb.selectors import (yes, match_user_groups, non_final_entity, |
16 from cubicweb.selectors import (yes, match_user_groups, non_final_entity, |
16 nonempty_rset, none_rset) |
17 nonempty_rset, none_rset) |
89 |
90 |
90 At instantiation time, the standard `req`, `rset`, and `cursor` |
91 At instantiation time, the standard `req`, `rset`, and `cursor` |
91 attributes are added and the `w` attribute will be set at rendering |
92 attributes are added and the `w` attribute will be set at rendering |
92 time to a write function to use. |
93 time to a write function to use. |
93 """ |
94 """ |
|
95 __registry__ = 'views' |
94 __registerer__ = priority_registerer |
96 __registerer__ = priority_registerer |
95 __registry__ = 'views' |
97 registered = require_group_compat(AppRsetObject.registered) |
96 |
98 |
97 templatable = True |
99 templatable = True |
98 need_navigation = True |
100 need_navigation = True |
99 # content_type = 'application/xhtml+xml' # text/xhtml' |
101 # content_type = 'application/xhtml+xml' # text/xhtml' |
100 binary = False |
102 binary = False |
203 def set_request_content_type(self): |
205 def set_request_content_type(self): |
204 """set the content type returned by this view""" |
206 """set the content type returned by this view""" |
205 self.req.set_content_type(self.content_type) |
207 self.req.set_content_type(self.content_type) |
206 |
208 |
207 # view utilities ########################################################## |
209 # view utilities ########################################################## |
208 |
210 |
209 def view(self, __vid, rset, __fallback_vid=None, **kwargs): |
211 def view(self, __vid, rset=None, __fallback_vid=None, **kwargs): |
210 """shortcut to self.vreg.render method avoiding to pass self.req""" |
212 """shortcut to self.vreg.render method avoiding to pass self.req""" |
211 try: |
213 try: |
212 view = self.vreg.select_view(__vid, self.req, rset, **kwargs) |
214 view = self.vreg.select_view(__vid, self.req, rset, **kwargs) |
213 except NoSelectableObject: |
215 except NoSelectableObject: |
214 if __fallback_vid is None: |
216 if __fallback_vid is None: |
215 raise |
217 raise |
216 view = self.vreg.select_view(__fallback_vid, self.req, rset, **kwargs) |
218 view = self.vreg.select_view(__fallback_vid, self.req, rset, **kwargs) |
217 return view.dispatch(**kwargs) |
219 return view.dispatch(**kwargs) |
218 |
220 |
|
221 # XXX Template bw compat |
|
222 template = obsolete('.template is deprecated, use .view')(view) |
|
223 |
219 def wview(self, __vid, rset, __fallback_vid=None, **kwargs): |
224 def wview(self, __vid, rset, __fallback_vid=None, **kwargs): |
220 """shortcut to self.view method automatically passing self.w as argument |
225 """shortcut to self.view method automatically passing self.w as argument |
221 """ |
226 """ |
222 self.view(__vid, rset, __fallback_vid, w=self.w, **kwargs) |
227 self.view(__vid, rset, __fallback_vid, w=self.w, **kwargs) |
223 |
228 |
412 return labels |
417 return labels |
413 |
418 |
414 |
419 |
415 # concrete template base classes ############################################## |
420 # concrete template base classes ############################################## |
416 |
421 |
417 class Template(View): |
422 class MainTemplate(View): |
418 """a template is almost like a view, except that by default a template |
|
419 is only used globally (i.e. no result set adaptation) |
|
420 """ |
|
421 __registry__ = 'templates' |
|
422 __select__ = yes() |
|
423 |
|
424 registered = require_group_compat(View.registered) |
|
425 |
|
426 def template(self, oid, **kwargs): |
|
427 """shortcut to self.registry.render method on the templates registry""" |
|
428 w = kwargs.pop('w', self.w) |
|
429 self.vreg.render('templates', oid, self.req, w=w, **kwargs) |
|
430 |
|
431 |
|
432 class MainTemplate(Template): |
|
433 """main template are primary access point to render a full HTML page. |
423 """main template are primary access point to render a full HTML page. |
434 There is usually at least a regular main template and a simple fallback |
424 There is usually at least a regular main template and a simple fallback |
435 one to display error if the first one failed |
425 one to display error if the first one failed |
436 """ |
426 """ |
437 base_doctype = STRICT_DOCTYPE |
427 base_doctype = STRICT_DOCTYPE |
|
428 registered = require_group_compat(View.registered) |
438 |
429 |
439 @property |
430 @property |
440 def doctype(self): |
431 def doctype(self): |
441 if self.req.xhtml_browser(): |
432 if self.req.xhtml_browser(): |
442 return self.base_doctype % CW_XHTML_EXTENSIONS |
433 return self.base_doctype % CW_XHTML_EXTENSIONS |