[server] eschema_eid needs a connection, not a session
# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""Bases HTML components:* the rql input form* the logged user link"""__docformat__="restructuredtext en"_=unicodefromlogilab.mtconverterimportxml_escapefromlogilab.common.registryimportyesfromlogilab.common.deprecationimportclass_renamedfromrqlimportparsefromcubicweb.predicatesimport(match_form_params,match_context,multi_etypes_rset,configuration_values,anonymous_user,authenticated_user)fromcubicweb.schemaimportdisplay_namefromcubicweb.utilsimportwrap_on_writefromcubicweb.uilibimporttoggle_actionfromcubicweb.webimportcomponentfromcubicweb.web.htmlwidgetsimportMenuWidget,PopupBoxMenuVISIBLE_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"""__regid__='rqlinput'cw_property_defs=VISIBLE_PROP_DEFvisible=Falsedefcall(self,view=None):req=self._cwifhasattr(view,'filter_box_context_info'):rset=view.filter_box_context_info()[0]else:rset=self.cw_rset# display multilines query as one linerql=rsetisnotNoneandrset.printable_rql(encoded=False)orreq.form.get('rql','')rql=rql.replace(u"\n",u" ")rql_suggestion_comp=self._cw.vreg['components'].select_or_none('rql.suggestions',self._cw)ifrql_suggestion_compisnotNone:# enable autocomplete feature only if the rql# suggestions builder is availableself._cw.add_css('jquery.ui.css')self._cw.add_js(('cubicweb.ajax.js','jquery.ui.js'))self._cw.add_onload('$("#rql").autocomplete({source: "%s"});'%(req.build_url('json',fname='rql_suggest')))self.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" />'''%(notself.cw_propval('visible')and'hidden'or'',req.build_url('view'),xml_escape(rql),req._('full text or RQL query'),req.next_tabindex()))ifreq.search_state[0]!='normal':self.w(u'<input type="hidden" name="__mode" value="%s"/>'%':'.join(req.search_state[1]))self.w(u'</fieldset></form></div>')classHeaderComponent(component.CtxComponent):# XXX rename properly along with related context"""if the user is the anonymous user, build a link to login else display a menu with user'action (preference, logout, etc...) """__abstract__=Truecw_property_defs=component.override_ctx(component.CtxComponent,vocabulary=['header-center','header-left','header-right',])# don't want user to hide this component using an cwpropertysite_wide=Truecontext=_('header-center')classApplLogo(HeaderComponent):"""build the instance logo, usually displayed in the header"""__regid__='logo'__select__=yes()# no need for a cnxorder=-1context=_('header-left')defrender(self,w):w(u'<a href="%s"><img id="logo" src="%s" alt="logo"/></a>'%(self._cw.base_url(),self._cw.uiprops['LOGO']))classApplicationName(HeaderComponent):"""display the instance name"""__regid__='appliname'# XXX support kwargs for compat with other components which gets the view as# argumentdefrender(self,w,**kwargs):title=self._cw.property_value('ui.site-title')iftitle:w(u'<span id="appliName"><a href="%s">%s</a></span>'%(self._cw.base_url(),xml_escape(title)))classCookieLoginComponent(HeaderComponent):__regid__='anonuserlink'__select__=(HeaderComponent.__select__&anonymous_user()&configuration_values('auth-mode','cookie'))context='header-right'loginboxid='popupLoginBox'_html=u"""[<a class="logout" title="%s" href="javascript:cw.htmlhelpers.popupLoginBox('%s', '__login');">%s</a>]"""defrender(self,w):# XXX bw compat, though should warn about subclasses redefining callself.w=wself.call()defcall(self):self.w(self._html%(self._cw._('login / password'),self.loginboxid,self._cw._('i18n_login_popup')))self._cw.view('logform',rset=self.cw_rset,id=self.loginboxid,klass='%s hidden'%self.loginboxid,title=False,showmessage=False,w=self.w)classHTTPLoginComponent(CookieLoginComponent):__select__=(HeaderComponent.__select__&anonymous_user()&configuration_values('auth-mode','http'))defrender(self,w):# this redirects to the 'login' controller which in turn# will raise a 401/Unauthorizedreq=self._cww(u'[<a class="logout" title="%s" href="%s">%s</a>]'%(req._('login / password'),req.build_url('login'),req._('login')))_UserLink=class_renamed('_UserLink',HeaderComponent)AnonUserLink=class_renamed('AnonUserLink',CookieLoginComponent)AnonUserLink.__abstract__=TrueAnonUserLink.__select__&=yes(1)classAnonUserStatusLink(HeaderComponent):__regid__='userstatus'__select__=anonymous_user()context=_('header-right')order=HeaderComponent.order-10defrender(self,w):w(u'<span class="caption">%s</span>'%self._cw._('anonymous'))classAuthenticatedUserStatus(AnonUserStatusLink):__select__=authenticated_user()defrender(self,w):# display useractions and siteactionsactions=self._cw.vreg['actions'].possible_actions(self._cw,rset=self.cw_rset)box=MenuWidget('','userActionsBox',_class='',islist=False)menu=PopupBoxMenu(self._cw.user.login,isitem=False)box.append(menu)foractioninactions.get('useractions',()):menu.append(self.action_link(action))ifactions.get('useractions')andactions.get('siteactions'):menu.append(self.separator())foractioninactions.get('siteactions',()):menu.append(self.action_link(action))box.render(w=w)classApplicationMessage(component.Component):"""display messages given using the __message parameter into a special div section """__select__=yes()__regid__='applmessages'# don't want user to hide this component using a cwpropertycw_property_defs={}defcall(self,msg=None):ifmsgisNone:msg=self._cw.message# XXX don't call self._cw.message twiceself.w(u'<div id="appMsg" onclick="%s" class="%s">\n'%(toggle_action('appMsg'),(msgand' 'or'hidden')))self.w(u'<div class="message" id="%s">%s</div>'%(self.domid,msg))self.w(u'</div>')# contextual components ########################################################classMetaDataComponent(component.EntityCtxComponent):__regid__='metadata'context='navbottom'order=1defrender_body(self,w):self.entity.view('metadata',w=w)classSectionLayout(component.Layout):__select__=match_context('navtop','navbottom','navcontenttop','navcontentbottom')cssclass='section'defrender(self,w):ifself.init_rendering():view=self.cw_extra_kwargs['view']w(u'<div class="%s%s" id="%s">'%(self.cssclass,view.cssclass,view.domid))withwrap_on_write(w,'<h4>')aswow:view.render_title(wow)view.render_body(w)w(u'</div>\n')