web/views/navigation.py
changeset 4252 6c4f109c2b03
parent 4072 ead446e70c28
parent 4244 2c3de1953d00
child 4265 0912f111b028
equal deleted inserted replaced
4251:3c6569be1f86 4252:6c4f109c2b03
     1 """navigation components definition for CubicWeb web client
     1 """navigation components definition for CubicWeb web client
     2 
     2 
     3 :organization: Logilab
     3 :organization: Logilab
     4 :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
     4 :copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses
     7 """
     7 """
     8 __docformat__ = "restructuredtext en"
     8 __docformat__ = "restructuredtext en"
     9 _ = unicode
     9 _ = unicode
   146         self.w(u'[ %s ]' % u' | '.join(blocklist))
   146         self.w(u'[ %s ]' % u' | '.join(blocklist))
   147         self.w(u' %s' % self.next_link(basepath, params))
   147         self.w(u' %s' % self.next_link(basepath, params))
   148         self.w(u'</div>')
   148         self.w(u'</div>')
   149 
   149 
   150 
   150 
   151 def limit_rset_using_paged_nav(self, req, rset, w, forcedisplay=False,
       
   152                                show_all_option=True, page_size=None):
       
   153     if not (forcedisplay or req.form.get('__force_display') is not None):
       
   154         nav = self._cw.vreg['components'].select_or_none('navigation', req,
       
   155                                                      rset=rset, page_size=page_size)
       
   156         if nav:
       
   157             # get boundaries before component rendering
       
   158             start, stop = nav.page_boundaries()
       
   159             nav.render(w=w)
       
   160             params = dict(req.form)
       
   161             nav.clean_params(params)
       
   162             # make a link to see them all
       
   163             if show_all_option:
       
   164                 url = xml_escape(self._cw.build_url(__force_display=1, **params))
       
   165                 w(u'<span><a href="%s">%s</a></span>\n'
       
   166                   % (url, req._('show %s results') % len(rset)))
       
   167             rset.limit(offset=start, limit=stop-start, inplace=True)
       
   168 
       
   169 
       
   170 # monkey patch base View class to add a .pagination(req, rset, w, forcedisplay)
       
   171 # method to be called on view's result set and printing pages index in the view
       
   172 from cubicweb.view import View
       
   173 View.pagination = deprecated('.pagination is deprecated, use paginate')(limit_rset_using_paged_nav)
       
   174 
       
   175 def paginate(view, show_all_option=True, w=None, page_size=None, rset=None):
       
   176     if rset is None:
       
   177         rset = view.cw_rset
       
   178     limit_rset_using_paged_nav(view, view._cw, rset, w or view.w,
       
   179                                not view.need_navigation, show_all_option,
       
   180                                page_size=page_size)
       
   181 View.paginate = paginate
       
   182 
       
   183 class NextPrevNavigationComponent(EntityVComponent):
   151 class NextPrevNavigationComponent(EntityVComponent):
   184     __regid__ = 'prevnext'
   152     __regid__ = 'prevnext'
   185     # register msg not generated since no entity implements IPrevNext in cubicweb
   153     # register msg not generated since no entity implements IPrevNext in cubicweb
   186     # itself
   154     # itself
   187     title = _('contentnavigation_prevnext')
   155     title = _('contentnavigation_prevnext')
   221     def next_link(self, next, textsize):
   189     def next_link(self, next, textsize):
   222         return u'<a href="%s" title="%s">%s &gt;&gt;</a>' % (
   190         return u'<a href="%s" title="%s">%s &gt;&gt;</a>' % (
   223             xml_escape(next.absolute_url()),
   191             xml_escape(next.absolute_url()),
   224             self._cw._('i18nprevnext_next'),
   192             self._cw._('i18nprevnext_next'),
   225             xml_escape(cut(next.dc_title(), textsize)))
   193             xml_escape(cut(next.dc_title(), textsize)))
       
   194 
       
   195 
       
   196 def do_paginate(view, rset=None, w=None, show_all_option=True, page_size=None):
       
   197     """write pages index in w stream (default to view.w) and then limit the result
       
   198     set (default to view.rset) to the currently displayed page
       
   199     """
       
   200     req = view.req
       
   201     if rset is None:
       
   202         rset = view.rset
       
   203     nav = req.vreg['components'].select_or_none(
       
   204         'navigation', req, rset=rset, page_size=page_size)
       
   205     if nav:
       
   206         if w is None:
       
   207             w = view.w
       
   208         # get boundaries before component rendering
       
   209         start, stop = nav.page_boundaries()
       
   210         nav.render(w=w)
       
   211         params = dict(req.form)
       
   212         nav.clean_params(params)
       
   213         # make a link to see them all
       
   214         if show_all_option:
       
   215             url = xml_escape(view.build_url(__force_display=1, **params))
       
   216             w(u'<span><a href="%s">%s</a></span>\n'
       
   217               % (url, req._('show %s results') % len(rset)))
       
   218         rset.limit(offset=start, limit=stop-start, inplace=True)
       
   219 
       
   220 
       
   221 def paginate(view, show_all_option=True, w=None, page_size=None, rset=None):
       
   222     """paginate results if the view is paginable and we're not explictly told to
       
   223     display everything (by setting __force_display in req.form)
       
   224     """
       
   225     if not (view.paginable or view.req.form.get('__force_display')):
       
   226         do_paginate(view, rset, w or view.w, show_all_option, page_size)
       
   227 
       
   228 # monkey patch base View class to add a .paginate([...])
       
   229 # method to be called to write pages index in the view and then limit the result
       
   230 # set to the current page
       
   231 from cubicweb.view import View
       
   232 View.do_paginate = do_paginate
       
   233 View.paginate = paginate
       
   234 
       
   235 
       
   236 #@deprecated (see below)
       
   237 def limit_rset_using_paged_nav(self, req, rset, w, forcedisplay=False,
       
   238                                show_all_option=True, page_size=None):
       
   239     if not (forcedisplay or req.form.get('__force_display') is not None):
       
   240         do_paginate(self, rset, w, show_all_option, page_size)
       
   241 
       
   242 View.pagination = deprecated('[3.2] .pagination is deprecated, use paginate')(
       
   243     limit_rset_using_paged_nav)
       
   244 limit_rset_using_paged_nav = deprecated('[3.6] limit_rset_using_paged_nav is deprecated, use do_paginate')(
       
   245     limit_rset_using_paged_nav)