Added tag cubicweb-debian-version-3.5.6-1 for changeset e6225e8e36c6
"""navigation components definition for CubicWeb web client:organization: Logilab:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""__docformat__="restructuredtext en"_=unicodefromrql.nodesimportVariableRef,Constantfromlogilab.mtconverterimportxml_escapefromlogilab.common.deprecationimportdeprecatedfromcubicweb.interfacesimportIPrevNextfromcubicweb.selectorsimport(paginated_rset,sorted_rset,primary_view,match_context_prop,one_line_rset,implements)fromcubicweb.common.uilibimportcutfromcubicweb.web.componentimportEntityVComponent,NavigationComponentclassPageNavigation(NavigationComponent):defcall(self):"""displays a resultset by page"""w=self.wreq=self.reqrset=self.rsetpage_size=self.page_sizestart=0blocklist=[]params=dict(req.form)self.clean_params(params)basepath=req.relative_path(includeparams=False)whilestart<rset.rowcount:stop=min(start+page_size-1,rset.rowcount-1)blocklist.append(self.page_link(basepath,params,start,stop,self.index_display(start,stop)))start=stop+1w(u'<div class="pagination">')w(u'%s '%self.previous_link(basepath,params))w(u'[ %s ]'%u' | '.join(blocklist))w(u' %s'%self.next_link(basepath,params))w(u'</div>')defindex_display(self,start,stop):returnu'%s - %s'%(start+1,stop+1)classSortedNavigation(NavigationComponent):"""sorted navigation apply if navigation is needed (according to page size) and if the result set is sorted """__select__=paginated_rset()&sorted_rset()# number of considered chars to build page linksnb_chars=5defdisplay_func(self,rset,col,attrname):req=self.reqifattrnameisnotNone:defindex_display(row):ifnotrset[row][col]:# outer joinreturnu''entity=rset.get_entity(row,col)returnentity.printable_value(attrname,format='text/plain')elifself.schema.eschema(rset.description[0][col]).final:defindex_display(row):returnunicode(rset[row][col])else:defindex_display(row):returnrset.get_entity(row,col).view('text')returnindex_displaydefcall(self):"""displays links to navigate accross pages of a result set Displayed result is done according to a variable on which the sort is done, and looks like: [ana - cro] | [cro - ghe] | ... | [tim - zou] """w=self.wrset=self.rsetpage_size=self.page_sizerschema=self.schema.rschema# attrname = the name of attribute according to which the sort# is done if anyforsorterminrset.syntax_tree().children[0].orderby:ifisinstance(sorterm.term,Constant):col=sorterm.term.value-1index_display=self.display_func(rset,col,None)breakvar=sorterm.term.get_nodes(VariableRef)[0].variablecol=Noneforrefinvar.references():rel=ref.relation()ifrelisNone:continueattrname=rel.r_typeifattrname=='is':continueifnotrschema(attrname).final:col=var.selected_index()attrname=NoneifcolisNone:# final relation or not selected non final relationifvarisrel.children[0]:relvar=rel.children[1].children[0].get_nodes(VariableRef)[0]else:relvar=rel.children[0].variablecol=relvar.selected_index()ifcolisnotNone:breakelse:# no relation but maybe usable anyway if selectedcol=var.selected_index()attrname=NoneifcolisnotNone:index_display=self.display_func(rset,col,attrname)breakelse:# nothing usable found, use the first columnindex_display=self.display_func(rset,0,None)blocklist=[]params=dict(self.req.form)self.clean_params(params)start=0basepath=self.req.relative_path(includeparams=False)whilestart<rset.rowcount:stop=min(start+page_size-1,rset.rowcount-1)cell=self.format_link_content(index_display(start),index_display(stop))blocklist.append(self.page_link(basepath,params,start,stop,cell))start=stop+1self.write_links(basepath,params,blocklist)defformat_link_content(self,startstr,stopstr):text=u'%s - %s'%(startstr.lower()[:self.nb_chars],stopstr.lower()[:self.nb_chars])returnxml_escape(text)defwrite_links(self,basepath,params,blocklist):self.w(u'<div class="pagination">')self.w(u'%s '%self.previous_link(basepath,params))self.w(u'[ %s ]'%u' | '.join(blocklist))self.w(u' %s'%self.next_link(basepath,params))self.w(u'</div>')deflimit_rset_using_paged_nav(self,req,rset,w,forcedisplay=False,show_all_option=True,page_size=None):ifnot(forcedisplayorreq.form.get('__force_display')isnotNone):nav=self.vreg['components'].select_object('navigation',req,rset=rset,page_size=page_size)ifnav:# get boundaries before component renderingstart,stop=nav.page_boundaries()nav.render(w=w)params=dict(req.form)nav.clean_params(params)# make a link to see them allifshow_all_option:url=xml_escape(self.build_url(__force_display=1,**params))w(u'<span><a href="%s">%s</a></span>\n'%(url,req._('show %s results')%len(rset)))rset.limit(offset=start,limit=stop-start,inplace=True)# monkey patch base View class to add a .pagination(req, rset, w, forcedisplay)# method to be called on view's result set and printing pages index in the viewfromcubicweb.viewimportViewView.pagination=deprecated('.pagination is deprecated, use paginate')(limit_rset_using_paged_nav)defpaginate(view,show_all_option=True,w=None,page_size=None):limit_rset_using_paged_nav(view,view.req,view.rset,worview.w,notview.need_navigation,show_all_option,page_size=page_size)View.paginate=paginateclassNextPrevNavigationComponent(EntityVComponent):id='prevnext'# register msg not generated since no entity implements IPrevNext in cubicweb# itselftitle=_('contentnavigation_prevnext')help=_('contentnavigation_prevnext_description')__select__=(one_line_rset()&primary_view()&match_context_prop()&implements(IPrevNext))context='navbottom'order=10defcall(self,view=None):entity=self.entity(0)previous=entity.previous_entity()next=entity.next_entity()ifpreviousornext:textsize=self.req.property_value('navigation.short-line-size')self.w(u'<div class="prevnext">')ifprevious:self.w(u'<div class="previousEntity left">')self.w(self.previous_link(previous,textsize))self.w(u'</div>')self.req.html_headers.add_raw('<link rel="prev" href="%s" />'%xml_escape(previous.absolute_url()))ifnext:self.w(u'<div class="nextEntity right">')self.w(self.next_link(next,textsize))self.w(u'</div>')self.req.html_headers.add_raw('<link rel="next" href="%s" />'%xml_escape(next.absolute_url()))self.w(u'</div>')self.w(u'<div class="clear"></div>')defprevious_link(self,previous,textsize):returnu'<a href="%s" title="%s"><< %s</a>'%(xml_escape(previous.absolute_url()),self.req._('i18nprevnext_previous'),xml_escape(cut(previous.dc_title(),textsize)))defnext_link(self,next,textsize):returnu'<a href="%s" title="%s">%s >></a>'%(xml_escape(next.absolute_url()),self.req._('i18nprevnext_next'),xml_escape(cut(next.dc_title(),textsize)))