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