web/views/navigation.py
changeset 3451 6b46d73823f5
parent 3377 dd9d292b6a6d
child 3457 0924d0d08d60
equal deleted inserted replaced
3448:495862266785 3451:6b46d73823f5
    24 class PageNavigation(NavigationComponent):
    24 class PageNavigation(NavigationComponent):
    25 
    25 
    26     def call(self):
    26     def call(self):
    27         """displays a resultset by page"""
    27         """displays a resultset by page"""
    28         w = self.w
    28         w = self.w
    29         req = self.req
    29         req = self._cw
    30         rset = self.rset
    30         rset = self.cw_rset
    31         page_size = self.page_size
    31         page_size = self.page_size
    32         start = 0
    32         start = 0
    33         blocklist = []
    33         blocklist = []
    34         params = dict(req.form)
    34         params = dict(req.form)
    35         self.clean_params(params)
    35         self.clean_params(params)
    57 
    57 
    58     # number of considered chars to build page links
    58     # number of considered chars to build page links
    59     nb_chars = 5
    59     nb_chars = 5
    60 
    60 
    61     def display_func(self, rset, col, attrname):
    61     def display_func(self, rset, col, attrname):
    62         req = self.req
    62         req = self._cw
    63         if attrname is not None:
    63         if attrname is not None:
    64             def index_display(row):
    64             def index_display(row):
    65                 entity = rset.get_entity(row, col)
    65                 entity = rset.get_entity(row, col)
    66                 return entity.printable_value(attrname, format='text/plain')
    66                 return entity.printable_value(attrname, format='text/plain')
    67         elif self.schema.eschema(rset.description[0][col]).is_final():
    67         elif self._cw.schema.eschema(rset.description[0][col]).is_final():
    68             def index_display(row):
    68             def index_display(row):
    69                 return unicode(rset[row][col])
    69                 return unicode(rset[row][col])
    70         else:
    70         else:
    71             def index_display(row):
    71             def index_display(row):
    72                 return rset.get_entity(row, col).view('text')
    72                 return rset.get_entity(row, col).view('text')
    78         Displayed result is done according to a variable on which the sort
    78         Displayed result is done according to a variable on which the sort
    79         is done, and looks like:
    79         is done, and looks like:
    80         [ana - cro] | [cro - ghe] | ... | [tim - zou]
    80         [ana - cro] | [cro - ghe] | ... | [tim - zou]
    81         """
    81         """
    82         w = self.w
    82         w = self.w
    83         rset = self.rset
    83         rset = self.cw_rset
    84         page_size = self.page_size
    84         page_size = self.page_size
    85         rschema = self.schema.rschema
    85         rschema = self._cw.schema.rschema
    86         # attrname = the name of attribute according to which the sort
    86         # attrname = the name of attribute according to which the sort
    87         # is done if any
    87         # is done if any
    88         for sorterm in rset.syntax_tree().children[0].orderby:
    88         for sorterm in rset.syntax_tree().children[0].orderby:
    89             if isinstance(sorterm.term, Constant):
    89             if isinstance(sorterm.term, Constant):
    90                 col = sorterm.term.value - 1
    90                 col = sorterm.term.value - 1
   120                 break
   120                 break
   121         else:
   121         else:
   122             # nothing usable found, use the first column
   122             # nothing usable found, use the first column
   123             index_display = self.display_func(rset, 0, None)
   123             index_display = self.display_func(rset, 0, None)
   124         blocklist = []
   124         blocklist = []
   125         params = dict(self.req.form)
   125         params = dict(self._cw.form)
   126         self.clean_params(params)
   126         self.clean_params(params)
   127         start = 0
   127         start = 0
   128         basepath = self.req.relative_path(includeparams=False)
   128         basepath = self._cw.relative_path(includeparams=False)
   129         while start < rset.rowcount:
   129         while start < rset.rowcount:
   130             stop = min(start + page_size - 1, rset.rowcount - 1)
   130             stop = min(start + page_size - 1, rset.rowcount - 1)
   131             cell = self.format_link_content(index_display(start), index_display(stop))
   131             cell = self.format_link_content(index_display(start), index_display(stop))
   132             blocklist.append(self.page_link(basepath, params, start, stop, cell))
   132             blocklist.append(self.page_link(basepath, params, start, stop, cell))
   133             start = stop + 1
   133             start = stop + 1
   147 
   147 
   148 
   148 
   149 def limit_rset_using_paged_nav(self, req, rset, w, forcedisplay=False,
   149 def limit_rset_using_paged_nav(self, req, rset, w, forcedisplay=False,
   150                                show_all_option=True, page_size=None):
   150                                show_all_option=True, page_size=None):
   151     if not (forcedisplay or req.form.get('__force_display') is not None):
   151     if not (forcedisplay or req.form.get('__force_display') is not None):
   152         nav = self.vreg['components'].select_or_none('navigation', req,
   152         nav = self._cw.vreg['components'].select_or_none('navigation', req,
   153                                                      rset=rset, page_size=page_size)
   153                                                      rset=rset, page_size=page_size)
   154         if nav:
   154         if nav:
   155             # get boundaries before component rendering
   155             # get boundaries before component rendering
   156             start, stop = nav.page_boundaries()
   156             start, stop = nav.page_boundaries()
   157             nav.render(w=w)
   157             nav.render(w=w)
   168 # monkey patch base View class to add a .pagination(req, rset, w, forcedisplay)
   168 # monkey patch base View class to add a .pagination(req, rset, w, forcedisplay)
   169 # method to be called on view's result set and printing pages index in the view
   169 # method to be called on view's result set and printing pages index in the view
   170 from cubicweb.view import View
   170 from cubicweb.view import View
   171 View.pagination = deprecated('.pagination is deprecated, use paginate')(limit_rset_using_paged_nav)
   171 View.pagination = deprecated('.pagination is deprecated, use paginate')(limit_rset_using_paged_nav)
   172 
   172 
   173 def paginate(view, show_all_option=True, w=None, page_size=None):
   173 def paginate(view, show_all_option=True, w=None, page_size=None, rset=None):
   174     limit_rset_using_paged_nav(view, view.req, view.rset, w or view.w,
   174     rset = rset or view.cw_rset
       
   175     limit_rset_using_paged_nav(view, view._cw, view.cw_rset, w or view.w,
   175                                not view.need_navigation, show_all_option,
   176                                not view.need_navigation, show_all_option,
   176                                page_size=page_size)
   177                                page_size=page_size)
   177 View.paginate = paginate
   178 View.paginate = paginate
   178 
   179 
   179 class NextPrevNavigationComponent(EntityVComponent):
   180 class NextPrevNavigationComponent(EntityVComponent):
   185     __select__ = (one_line_rset() & primary_view()
   186     __select__ = (one_line_rset() & primary_view()
   186                   & match_context_prop() & implements(IPrevNext))
   187                   & match_context_prop() & implements(IPrevNext))
   187     context = 'navbottom'
   188     context = 'navbottom'
   188     order = 10
   189     order = 10
   189     def call(self, view=None):
   190     def call(self, view=None):
   190         entity = self.rset.get_entity(0,0)
   191         entity = self.cw_rset.get_entity(0,0)
   191         previous = entity.previous_entity()
   192         previous = entity.previous_entity()
   192         next = entity.next_entity()
   193         next = entity.next_entity()
   193         if previous or next:
   194         if previous or next:
   194             textsize = self.req.property_value('navigation.short-line-size')
   195             textsize = self._cw.property_value('navigation.short-line-size')
   195             self.w(u'<div class="prevnext">')
   196             self.w(u'<div class="prevnext">')
   196             if previous:
   197             if previous:
   197                 self.w(u'<div class="previousEntity left">')
   198                 self.w(u'<div class="previousEntity left">')
   198                 self.w(self.previous_link(previous, textsize))
   199                 self.w(self.previous_link(previous, textsize))
   199                 self.w(u'</div>')
   200                 self.w(u'</div>')
   200                 self.req.html_headers.add_raw('<link rel="prev" href="%s" />'
   201                 self._cw.html_headers.add_raw('<link rel="prev" href="%s" />'
   201                                               % xml_escape(previous.absolute_url()))
   202                                               % xml_escape(previous.absolute_url()))
   202             if next:
   203             if next:
   203                 self.w(u'<div class="nextEntity right">')
   204                 self.w(u'<div class="nextEntity right">')
   204                 self.w(self.next_link(next, textsize))
   205                 self.w(self.next_link(next, textsize))
   205                 self.w(u'</div>')
   206                 self.w(u'</div>')
   206                 self.req.html_headers.add_raw('<link rel="next" href="%s" />'
   207                 self._cw.html_headers.add_raw('<link rel="next" href="%s" />'
   207                                               % xml_escape(next.absolute_url()))
   208                                               % xml_escape(next.absolute_url()))
   208             self.w(u'</div>')
   209             self.w(u'</div>')
   209             self.w(u'<div class="clear"></div>')
   210             self.w(u'<div class="clear"></div>')
   210 
   211 
   211     def previous_link(self, previous, textsize):
   212     def previous_link(self, previous, textsize):
   212         return u'<a href="%s" title="%s">&lt;&lt; %s</a>' % (
   213         return u'<a href="%s" title="%s">&lt;&lt; %s</a>' % (
   213             xml_escape(previous.absolute_url()),
   214             xml_escape(previous.absolute_url()),
   214             self.req._('i18nprevnext_previous'),
   215             self._cw._('i18nprevnext_previous'),
   215             xml_escape(cut(previous.dc_title(), textsize)))
   216             xml_escape(cut(previous.dc_title(), textsize)))
   216 
   217 
   217     def next_link(self, next, textsize):
   218     def next_link(self, next, textsize):
   218         return u'<a href="%s" title="%s">%s &gt;&gt;</a>' % (
   219         return u'<a href="%s" title="%s">%s &gt;&gt;</a>' % (
   219             xml_escape(next.absolute_url()),
   220             xml_escape(next.absolute_url()),
   220             self.req._('i18nprevnext_next'),
   221             self._cw._('i18nprevnext_next'),
   221             xml_escape(cut(next.dc_title(), textsize)))
   222             xml_escape(cut(next.dc_title(), textsize)))