"""Set of HTML startup views. A startup view is global, e.g. doesn'tapply to a result set.: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"fromlogilab.mtconverterimporthtml_escapefromcubicweb.common.uilibimportureport_as_html,unormalize,ajax_replace_urlfromcubicweb.common.viewimportStartupViewfromcubicweb.web.httpcacheimportEtagHTTPCacheManager_=unicodeclassManageView(StartupView):id='manage'title=_('manage')http_cache_manager=EtagHTTPCacheManagerdefdisplay_folders(self):returnFalsedefcall(self,**kwargs):"""The default view representing the application's management"""self.w(u'<div>\n')ifnotself.display_folders():self._main_index()else:self.w(u'<table><tr>\n')self.w(u'<td style="width:40%">')self._main_index()self.w(u'</td><td style="width:60%">')self.folders()self.w(u'</td>')self.w(u'</tr></table>\n')self.w(u'</div>\n')def_main_index(self):req=self.reqmanager=req.user.matching_groups('managers')ifnotmanagerand'Card'inself.schema:rset=self.req.execute('Card X WHERE X wikiid "index"')else:rset=Noneifrset:self.wview('inlined',rset,row=0)else:self.entities()self.w(u'<div class="hr"> </div>')self.startup_views()ifmanagerand'Card'inself.schema:self.w(u'<div class="hr"> </div>')ifrset:href=rset.get_entity(0,0).absolute_url(vid='edition')label=self.req._('edit the index page')else:href=req.build_url('view',vid='creation',etype='Card',wikiid='index')label=self.req._('create an index page')self.w(u'<br/><a href="%s">%s</a>\n'%(html_escape(href),label))deffolders(self):self.w(u'<h4>%s</h4>\n'%self.req._('Browse by category'))self.vreg.select_view('tree',self.req,None).dispatch(w=self.w)defstartup_views(self):self.w(u'<h4>%s</h4>\n'%self.req._('Startup views'))self.startupviews_table()defstartupviews_table(self):forvinself.vreg.possible_views(self.req,None):ifv.category!='startupview'orv.idin('index','tree','manage'):continueself.w('<p><a href="%s">%s</a></p>'%(html_escape(v.url()),html_escape(self.req._(v.title).capitalize())))defentities(self):schema=self.schemaself.w(u'<h4>%s</h4>\n'%self.req._('The repository holds the following entities'))manager=self.req.user.matching_groups('managers')self.w(u'<table class="startup">')ifmanager:self.w(u'<tr><th colspan="4">%s</th></tr>\n'%self.req._('application entities'))self.entity_types_table(eschemaforeschemainschema.entities()ifnoteschema.metaandnoteschema.is_subobject())ifmanager:self.w(u'<tr><th colspan="4">%s</th></tr>\n'%self.req._('system entities'))self.entity_types_table(eschemaforeschemainschema.entities()ifeschema.metaandnoteschema.schema_entity())if'EFRDef'inschema:# check schema supportself.w(u'<tr><th colspan="4">%s</th></tr>\n'%self.req._('schema entities'))self.entity_types_table(schema.eschema(etype)foretypeinschema.schema_entity_types())self.w(u'</table>')defentity_types_table(self,eschemas):newline=0infos=sorted(self.entity_types(eschemas),key=lambda(l,a,e):unormalize(l))q,r=divmod(len(infos),2)ifr:infos.append((None,' ',' '))infos=zip(infos[:q+r],infos[q+r:])for(_,etypelink,addlink),(_,etypelink2,addlink2)ininfos:self.w(u'<tr>\n')self.w(u'<td class="addcol">%s</td><td>%s</td>\n'%(addlink,etypelink))self.w(u'<td class="addcol">%s</td><td>%s</td>\n'%(addlink2,etypelink2))self.w(u'</tr>\n')defentity_types(self,eschemas):"""return a list of formatted links to get a list of entities of a each entity's types """req=self.reqforeschemaineschemas:ifeschema.is_final()or(noteschema.has_perm(req,'read')andnoteschema.has_local_role('read')):continueetype=eschema.typelabel=display_name(req,etype,'plural')nb=req.execute('Any COUNT(X) WHERE X is %s'%etype)[0][0]ifnb>1:view=self.vreg.select_view('list',req,req.etype_rset(etype))url=view.url()else:url=self.build_url('view',rql='%s X'%etype)etypelink=u' <a href="%s">%s</a> (%d)'%(html_escape(url),label,nb)yield(label,etypelink,self.add_entity_link(eschema,req))defadd_entity_link(self,eschema,req):"""creates a [+] link for adding an entity if user has permission to do so"""ifnoteschema.has_perm(req,'add'):returnu''returnu'[<a href="%s" title="%s">+</a>]'%(html_escape(self.create_url(eschema.type)),self.req.__('add a %s'%eschema))classIndexView(ManageView):id='index'title=_('index')defdisplay_folders(self):return'Folder'inself.schemaclassSchemaView(StartupView):id='schema'title=_('application schema')defcall(self):"""display schema information"""self.req.add_js('cubicweb.ajax.js')self.req.add_css('cubicweb.schema.css')withmeta=int(self.req.form.get('withmeta',0))self.w(u'<img src="%s" alt="%s"/>\n'%(html_escape(self.req.build_url('view',vid='schemagraph',withmeta=withmeta)),self.req._("graphical representation of the application'schema")))ifwithmeta:self.w(u'<div><a href="%s">%s</a></div>'%(self.build_url('schema',withmeta=0),self.req._('hide meta-data')))else:self.w(u'<div><a href="%s">%s</a></div>'%(self.build_url('schema',withmeta=1),self.req._('show meta-data')))self.w(u'<div id="detailed_schema"><a href="%s">%s</a></div>'%(html_escape(ajax_replace_url('detailed_schema','','schematext',skipmeta=int(notwithmeta))),self.req._('detailed schema view')))classSchemaUreportsView(StartupView):id='schematext'defcall(self):fromcubicweb.schemaviewerimportSchemaViewerskipmeta=int(self.req.form.get('skipmeta',True))schema=self.schemaviewer=SchemaViewer(self.req)layout=viewer.visit_schema(schema,display_relations=True,skiprels=('is','is_instance_of','identity','owned_by','created_by'),skipmeta=skipmeta)self.w(ureport_as_html(layout))