diff -r c4a70a5dd144 -r 42079f752a9c web/views/primary.py --- a/web/views/primary.py Tue Sep 14 08:48:44 2010 +0200 +++ b/web/views/primary.py Thu Sep 16 18:56:35 2010 +0200 @@ -24,7 +24,7 @@ from logilab.mtconverter import xml_escape -from cubicweb import Unauthorized +from cubicweb import Unauthorized, NoSelectableObject from cubicweb.utils import support_args from cubicweb.selectors import match_kwargs from cubicweb.view import EntityView @@ -161,13 +161,19 @@ def render_entity_relations(self, entity): for rschema, tschemas, role, dispctrl in self._section_def(entity, 'relations'): if rschema.final or dispctrl.get('rtypevid'): + vid = dispctrl.get('vid', 'reledit') + try: + rview = self._cw.vreg['views'].select( + vid, self._cw, rset=entity.cw_rset, row=entity.cw_row, + col=entity.cw_col, dispctrl=dispctrl, rtype=rschema, role=role) + except NoSelectableObject: + continue self.w(u'
') label = self._rel_label(entity, rschema, role, dispctrl) if label: self.w(u'

%s

' % label) - vid = dispctrl.get('vid', 'reledit') - entity.view(vid, rtype=rschema.type, role=role, w=self.w, - initargs={'dispctrl': dispctrl}) + rview.render(row=entity.cw_row, col=entity.cw_col, w=self.w, + rtype=rschema.type, role=role) self.w(u'
') continue rset = self._relation_rset(entity, rschema, role, dispctrl) @@ -248,10 +254,7 @@ if section == where: matchtschemas.append(tschema) if matchtschemas: - # XXX pick the latest dispctrl - dispctrl = self.display_ctrl.etype_get(eschema, rschema, role, - matchtschemas[-1]) - + dispctrl = self.display_ctrl.etype_get(eschema, rschema, role, '*') rdefs.append( (rschema, matchtschemas, role, dispctrl) ) return sorted(rdefs, key=lambda x: x[-1]['order']) @@ -338,6 +341,28 @@ if url: self.w(u'%s' % (url, url)) +class AttributeView(EntityView): + """use this view on an entity as an alternative to more sophisticated + views such as reledit. + + Ex. usage: + + uicfg.primaryview_display_ctrl.tag_attribute(('Foo', 'bar'), {'vid': 'attribute'}) + """ + __regid__ = 'attribute' + __select__ = EntityView.__select__ & match_kwargs('rtype') + + def cell_call(self, row, col, rtype, **kwargs): + entity = self.cw_rset.get_entity(row, col) + if self._cw.vreg.schema.rschema(rtype).final: + self.w(entity.printable_value(rtype)) + else: + dispctrl = uicfg.primaryview_display_ctrl.etype_get( + entity.e_schema, rtype, kwargs['role'], '*') + rset = entity.related(rtype, role) + if rset: + self.wview('autolimited', rset, initargs={'dispctrl': dispctrl}) + ## default primary ui configuration ###########################################