"""Bases HTML components:* the rql input form* the logged user link* the workflow history section for workflowable objects:organization: Logilab:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr"""__docformat__="restructuredtext en"fromrqlimportparsefromcubicwebimportUnauthorizedfromcubicweb.common.uilibimporthtml_escape,toggle_actionfromcubicweb.common.selectorsimportyes_selectorfromcubicweb.schemaimportdisplay_namefromcubicweb.common.selectorsimport(chainfirst,multitype_selector,req_form_params_selector)fromcubicweb.web.htmlwidgetsimportMenuWidget,PopupBoxMenu,BoxSeparator,BoxLinkfromcubicweb.web.componentimport(SingletonVComponent,EntityVComponent,RelatedObjectsVComponent)_=unicodeclassRQLInputForm(SingletonVComponent):"""build the rql input form, usually displayed in the header"""id='rqlinput'visible=Falsedefcall(self,view=None):ifhasattr(view,'filter_box_context_info'):rset=view.filter_box_context_info()[0]else:rset=self.rset# display multilines query as one linerql=rsetisnotNoneandrset.printable_rql(encoded=False)orself.req.form.get('rql','')rql=rql.replace(u"\n",u" ")req=self.reqself.w(u'''<div id="rqlinput" class="%s"> <form action="%s"><fieldset><input type="text" id="rql" name="rql" value="%s" title="%s" tabindex="%s" accesskey="q" class="searchField" /><input type="submit" value="%s" class="searchButton" tabindex="%s" /></fieldset>'''%(notself.propval('visible')and'hidden'or'',self.build_url('view'),html_escape(rql),req._('full text or RQL query'),req.next_tabindex(),req._('search'),req.next_tabindex()))ifself.req.search_state[0]!='normal':self.w(u'<input type="hidden" name="__mode" value="%s"/>'%':'.join(req.search_state[1]))self.w(u'</form></div>')classApplLogo(SingletonVComponent):"""build the application logo, usually displayed in the header"""id='logo'site_wide=True# don't want user to hide this component using an epropertydefcall(self):self.w(u'<a href="%s"><img class="logo" src="%s" alt="logo"/></a>'%(self.req.base_url(),self.req.external_resource('LOGO')))classApplHelp(SingletonVComponent):"""build the help button, usually displayed in the header"""id='help'defcall(self):self.w(u'<a href="%s" class="help" title="%s"> </a>'%(self.build_url(_restpath='doc/main'),self.req._(u'help'),))classUserLink(SingletonVComponent):"""if the user is the anonymous user, build a link to login else a link to the connected user object with a loggout link """id='loggeduserlink'site_wide=True# don't want user to hide this component using an epropertydefcall(self):ifnotself.req.cnx.anonymous_connection:# display useractions and siteactionsactions=self.vreg.possible_actions(self.req,self.rset)box=MenuWidget('','userActionsBox',_class='',islist=False)menu=PopupBoxMenu(self.req.user.login,isitem=False)box.append(menu)foractioninactions.get('useractions',()):menu.append(BoxLink(action.url(),self.req._(action.title),action.html_class()))ifactions.get('useractions')andactions.get('siteactions'):menu.append(BoxSeparator())foractioninactions.get('siteactions',()):menu.append(BoxLink(action.url(),self.req._(action.title),action.html_class()))box.render(w=self.w)else:self.anon_user_link()defanon_user_link(self):ifself.config['auth-mode']=='cookie':self.w(self.req._('anonymous'))self.w(u''' [<a class="logout" href="javascript: popupLoginBox();">%s</a>]'''%(self.req._('i18n_login_popup')))else:self.w(self.req._('anonymous'))self.w(u' [<a class="logout" href="%s">%s</a>]'%(self.build_url('login'),self.req._('login')))classApplicationMessage(SingletonVComponent):"""display application's messages given using the __message parameter into a special div section """__selectors__=yes_selector,id='applmessages'site_wide=True# don't want user to hide this component using an epropertydefcall(self):msgs=[msgformsgin(self.req.get_shared_data('sources_error',pop=True),self.req.message)ifmsg]self.w(u'<div id="appMsg" onclick="%s" class="%s">\n'%(toggle_action('appMsg'),(msgsand' 'or'hidden')))formsginmsgs:self.w(u'<div class="message" id="%s">%s</div>'%(self.div_id(),msg))self.w(u'</div>')classWFHistoryVComponent(EntityVComponent):"""display the workflow history for entities supporting it"""id='wfhistory'accepts=('Any',)context='navcontentbottom'rtype='wf_info_for'target='subject'title=_('Workflow history')defcall(self,view=None):_=self.req._eid=self.rset[0][0]sel='Any FS,TS,WF,D'rql=' ORDERBY D DESC WHERE WF wf_info_for X,'\'WF from_state FS, WF to_state TS, WF comment C,'\'WF creation_date D'ifself.vreg.schema.eschema('EUser').has_perm(self.req,'read'):sel+=',U,C'rql+=', WF owned_by U?'displaycols=range(5)headers=(_('from_state'),_('to_state'),_('comment'),_('date'),_('EUser'))else:sel+=',C'displaycols=range(4)headers=(_('from_state'),_('to_state'),_('comment'),_('date'))rql='%s%s, X eid %%(x)s'%(sel,rql)try:rset=self.req.execute(rql,{'x':eid},'x')exceptUnauthorized:returnifrset:self.wview('table',rset,title=_(self.title),displayactions=False,displaycols=displaycols,headers=headers)classApplicationName(SingletonVComponent):"""display the application name"""id='appliname'defcall(self):self.w(u'<span id="appliName"><a href="%s">%s</a></span>'%(self.req.base_url(),self.req.property_value('ui.site-title')))classSeeAlsoVComponent(RelatedObjectsVComponent):"""display any entity's see also"""id='seealso'context='navcontentbottom'rtype='see_also'target='object'order=40# register msg not generated since no entity use see_also in cubicweb itselftitle=_('contentnavigation_seealso')help=_('contentnavigation_seealso_description')classEtypeRestrictionComponent(SingletonVComponent):"""displays the list of entity types contained in the resultset to be able to filter accordingly. """id='etypenavigation'__select__=classmethod(chainfirst(multitype_selector,req_form_params_selector))form_params=('__restrtype','__restrtypes','__restrrql')visible=False# disabled by defaultdefcall(self):_=self.req._self.w(u'<div id="etyperestriction">')restrtype=self.req.form.get('__restrtype')restrtypes=self.req.form.get('__restrtypes','').split(',')restrrql=self.req.form.get('__restrrql')ifnotrestrrql:rqlst=self.rset.syntax_tree()restrrql=rqlst.as_string(self.req.encoding,self.rset.args)restrtypes=self.rset.column_types(0)else:rqlst=parse(restrrql)html=[]on_etype=Falseetypes=sorted((display_name(self.req,etype).capitalize(),etype)foretypeinrestrtypes)forelabel,etypeinetypes:ifetype==restrtype:html.append(u'<span class="selected">%s</span>'%elabel)on_etype=Trueelse:rqlst.save_state()forselectinrqlst.children:select.add_type_restriction(select.selection[0],etype)newrql=rqlst.as_string(self.req.encoding,self.rset.args)url=self.build_url(rql=newrql,__restrrql=restrrql,__restrtype=etype,__restrtypes=','.join(restrtypes))html.append(u'<span><a href="%s">%s</a></span>'%(html_escape(url),elabel))rqlst.recover()ifon_etype:url=self.build_url(rql=restrrql)html.insert(0,u'<span><a href="%s">%s</a></span>'%(url,_('Any')))else:html.insert(0,u'<span class="selected">%s</span>'%_('Any'))self.w(u' | '.join(html))self.w(u'</div>')