"""Bases HTML components:* the rql input form* the logged user link: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"_=unicodefromrqlimportparsefromcubicweb.selectorsimportyes,two_etypes_rset,match_form_paramsfromcubicweb.schemaimportdisplay_namefromcubicweb.common.uilibimporthtml_escape,toggle_actionfromcubicweb.webimportcomponentfromcubicweb.web.htmlwidgetsimport(MenuWidget,PopupBoxMenu,BoxSeparator,BoxLink)VISIBLE_PROP_DEF={_('visible'):dict(type='Boolean',default=True,help=_('display the component or not')),}classRQLInputForm(component.Component):"""build the rql input form, usually displayed in the header"""id='rqlinput'property_defs=VISIBLE_PROP_DEFdefcall(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="" class="rqlsubmit" 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.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(component.Component):"""build the application logo, usually displayed in the header"""id='logo'property_defs=VISIBLE_PROP_DEF# don't want user to hide this component using an cwpropertysite_wide=Truedefcall(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(component.Component):"""build the help button, usually displayed in the header"""id='help'property_defs=VISIBLE_PROP_DEFdefcall(self):self.w(u'<a href="%s" class="help" title="%s"> </a>'%(self.build_url(_restpath='doc/main'),self.req._(u'help'),))classUserLink(component.Component):"""if the user is the anonymous user, build a link to login else a link to the connected user object with a loggout link """property_defs=VISIBLE_PROP_DEF# don't want user to hide this component using an cwpropertysite_wide=Trueid='loggeduserlink'defcall(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')))# FIXME maybe have an other option to explicitely authorise registration# also provide a working register view# if self.config['anonymous-user']:# self.w(u''' [<a class="logout" href="?vid=register">%s</a>]'''# % (self.req._('i18n_register_user')))else:self.w(self.req._('anonymous'))self.w(u' [<a class="logout" href="%s">%s</a>]'%(self.build_url('login'),self.req._('login')))classApplicationMessage(component.Component):"""display application's messages given using the __message parameter into a special div section """__select__=yes()id='applmessages'# don't want user to hide this component using an cwpropertyproperty_defs={}defcall(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>')classApplicationName(component.Component):"""display the application name"""id='appliname'property_defs=VISIBLE_PROP_DEF# don't want user to hide this component using an cwpropertysite_wide=Truedefcall(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(component.RelatedObjectsVComponent):"""display any entity's see also"""id='seealso'context='navcontentbottom'rtype='see_also'role='subject'order=40# register msg not generated since no entity use see_also in cubicweb itselftitle=_('contentnavigation_seealso')help=_('contentnavigation_seealso_description')classEtypeRestrictionComponent(component.Component):"""displays the list of entity types contained in the resultset to be able to filter accordingly. """id='etypenavigation'__select__=two_etypes_rset()|match_form_params('__restrtype','__restrtypes','__restrrql')property_defs=VISIBLE_PROP_DEF# don't want user to hide this component using an cwpropertysite_wide=Truevisible=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>')defregistration_callback(vreg):vreg.register_all(globals().values(),__name__,(SeeAlsoVComponent,))if'see_also'invreg.schema:vreg.register(SeeAlsoVComponent)