display title in the component to avoid relying on view supporting title argument
"""The default primary view: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"_=unicodefromwarningsimportwarnfromlogilab.mtconverterimportxml_escapefromcubicwebimportUnauthorizedfromcubicweb.viewimportEntityViewfromcubicweb.schemaimportdisplay_namefromcubicweb.webimportuicfgclassPrimaryView(EntityView):"""the full view of an non final entity"""id='primary'title=_('primary')show_attr_label=Trueshow_rel_label=Trueskip_none=Truersection=uicfg.primaryview_sectiondisplay_ctrl=uicfg.primaryview_display_ctrlmain_related_section=Truedefhtml_headers(self):"""return a list of html headers (eg something to be inserted between <head> and </head> of the returned page by default primary views are indexed """return[]defcell_call(self,row,col):self.row=rowself.maxrelated=self.req.property_value('navigation.related-limit')entity=self.complete_entity(row,col)self.render_entity(entity)defrender_entity(self,entity):self.render_entity_title(entity)self.render_entity_metadata(entity)# entity's attributes and relations, excluding meta data# if the entity isn't meta itselfboxes=self._prepare_side_boxes(entity)ifboxesorhasattr(self,'render_side_related'):self.w(u'<table width="100%"><tr><td style="width: 75%">')self.render_entity_summary(entity)self.w(u'<div class="mainInfo">')self.content_navigation_components('navcontenttop')self.render_entity_attributes(entity)ifself.main_related_section:self.render_entity_relations(entity)self.w(u'</div>')# side boxesifboxesorhasattr(self,'render_side_related'):self.w(u'</td><td>')self.w(u'<div class="primaryRight">')ifhasattr(self,'render_side_related'):warn('render_side_related is deprecated')self.render_side_related(entity,[])self.render_side_boxes(boxes)self.w(u'</div>')self.w(u'</td></tr></table>')self.content_navigation_components('navcontentbottom')defcontent_navigation_components(self,context):self.w(u'<div class="%s">'%context)forcompinself.vreg['contentnavigation'].possible_vobjects(self.req,rset=self.rset,row=self.row,view=self,context=context):try:comp.render(w=self.w,row=self.row,view=self)exceptNotImplementedError:warn('component %s doesnt implement cell_call, please update'%comp.__class__,DeprecationWarning)comp.render(w=self.w,view=self)self.w(u'</div>')defrender_entity_title(self,entity):"""default implementation return dc_title"""title=xml_escape(entity.dc_title())iftitle:self.w(u'<h1><span class="etype">%s</span> %s</h1>'%(entity.dc_type().capitalize(),title))defrender_entity_metadata(self,entity):entity.view('metadata',w=self.w)defrender_entity_summary(self,entity):summary=self.summary(entity)# deprecate summary?ifsummary:self.w(u'<div class="summary">%s</div>'%summary)defsummary(self,entity):"""default implementation return an empty string"""returnu''defrender_entity_attributes(self,entity,siderelations=None):forrschema,tschemas,role,dispctrlinself._section_def(entity,'attributes'):vid=dispctrl.get('vid','reledit')ifrschema.finalorvid=='reledit':value=entity.view(vid,rtype=rschema.type,role=role)else:rset=self._relation_rset(entity,rschema,role,dispctrl)ifrset:value=self.view(vid,rset)else:value=Noneifself.skip_noneand(valueisNoneorvalue==''):continueself._render_attribute(rschema,value)defrender_entity_relations(self,entity,siderelations=None):forrschema,tschemas,role,dispctrlinself._section_def(entity,'relations'):rset=self._relation_rset(entity,rschema,role,dispctrl)ifrset:self._render_relation(rset,dispctrl,'autolimited',self.show_rel_label)defrender_side_boxes(self,boxes):"""display side related relations: non-meta in a first step, meta in a second step """forboxinboxes:ifisinstance(box,tuple):label,rset,vid=boxself.w(u'<div class="sideBox">')self.wview(vid,rset,title=label)self.w(u'</div>')else:try:box.render(w=self.w,row=self.row)exceptNotImplementedError:# much probably a context insensitive box, which only implements# .call() and not cell_call()box.render(w=self.w)def_prepare_side_boxes(self,entity):sideboxes=[]forrschema,tschemas,role,dispctrlinself._section_def(entity,'sideboxes'):rset=self._relation_rset(entity,rschema,role,dispctrl)ifnotrset:continuelabel=display_name(self.req,rschema.type,role)vid=dispctrl.get('vid','sidebox')sideboxes.append((label,rset,vid))sideboxes+=self.vreg['boxes'].possible_vobjects(self.req,rset=self.rset,row=self.row,view=self,context='incontext')returnsideboxesdef_section_def(self,entity,where):rdefs=[]eschema=entity.e_schemaforrschema,tschemas,roleineschema.relation_definitions(True):matchtschemas=[]fortschemaintschemas:section=self.rsection.etype_get(eschema,rschema,role,tschema)ifsection==where:matchtschemas.append(tschema)ifmatchtschemas:# XXX pick the latest dispctrldispctrl=self.display_ctrl.etype_get(eschema,rschema,role,matchtschemas[-1])rdefs.append((rschema,matchtschemas,role,dispctrl))returnsorted(rdefs,key=lambdax:x[-1]['order'])def_relation_rset(self,entity,rschema,role,dispctrl):try:dispctrl.setdefault('limit',self.maxrelated)rset=entity.related(rschema.type,role,limit=dispctrl['limit']+1)exceptUnauthorized:returnif'filter'indispctrl:rset=dispctrl['filter'](rset)returnrsetdef_render_relation(self,rset,dispctrl,defaultvid,showlabel):self.w(u'<div class="section">')ifshowlabel:self.w(u'<h4>%s</h4>'%self.req._(dispctrl['label']))self.wview(dispctrl.get('vid',defaultvid),rset,initargs={'dispctrl':dispctrl})self.w(u'</div>')def_render_attribute(self,rschema,value,role='subject'):ifrschema.final:show_label=self.show_attr_labelelse:show_label=self.show_rel_labellabel=display_name(self.req,rschema.type,role)self.field(label,value,show_label=show_label,tr=False)classRelatedView(EntityView):id='autolimited'defcall(self,**kwargs):# nb: rset retreived using entity.related with limit + 1 if any# because of that, we known that rset.printable_rql() will return# rql with no limit set anyway (since it's handled manually)if'dispctrl'inself.extra_kwargs:limit=self.extra_kwargs['dispctrl'].get('limit')else:limit=None# if not too many entities, show them all in a listiflimitisNoneorself.rset.rowcount<=limit:ifself.rset.rowcount==1:self.wview('incontext',self.rset,row=0)elif1<self.rset.rowcount<=5:self.wview('csv',self.rset)else:self.w(u'<div>')self.wview('simplelist',self.rset)self.w(u'</div>')# else show links to display related entitieselse:rql=rset.printable_rql()self.rset.limit(limit)# remove extra entityself.w(u'<div>')self.wview('simplelist',self.rset)self.w(u'[<a href="%s">%s</a>]'%(self.build_url(rql=rql),self.req._('see them all')))self.w(u'</div>')## default primary ui configuration ###########################################forrtypein('eid','creation_date','modification_date','cwuri','is','is_instance_of','identity','owned_by','created_by','in_state','wf_info_for','by_transition','from_state','to_state','require_permission','from_entity','to_entity','see_also'):uicfg.primaryview_section.tag_subject_of(('*',rtype,'*'),'hidden')uicfg.primaryview_section.tag_object_of(('*',rtype,'*'),'hidden')uicfg.primaryview_section.tag_subject_of(('*','use_email','*'),'attributes')uicfg.primaryview_section.tag_subject_of(('*','primary_email','*'),'hidden')forattrin('name','final'):uicfg.primaryview_section.tag_attribute(('CWEType',attr),'hidden')forattrin('name','final','symetric','inlined'):uicfg.primaryview_section.tag_attribute(('CWRType',attr),'hidden')