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"><< %s</a>' % ( |
213 return u'<a href="%s" title="%s"><< %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 >></a>' % ( |
219 return u'<a href="%s" title="%s">%s >></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))) |