view.py
branchtls-sprint
changeset 816 9cd49a910fce
parent 781 323656dd85a9
child 819 7fd66f389ef7
equal deleted inserted replaced
813:69c623aa39ed 816:9cd49a910fce
     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