# HG changeset patch # User Sylvain Thénault # Date 1280913398 -7200 # Node ID efca814587e2957e16363b2be01c2c32de3ddb7c # Parent 9535787093244ccc0574caa3845306aaed5dbea8 [primary] refactor primary view handling of relation's label to properly handle label optionaly specified in dispctrl (no more default set) and use contextual translation by default. Also, consistent handling in attributes, relations and sideboxes section. Introduce new support_args function to use when possible instead of try/except TypeError. diff -r 953578709324 -r efca814587e2 utils.py --- a/utils.py Wed Aug 04 11:13:11 2010 +0200 +++ b/utils.py Wed Aug 04 11:16:38 2010 +0200 @@ -24,6 +24,7 @@ import decimal import datetime import random +from inspect import getargspec from itertools import repeat from uuid import uuid4 from warnings import warn @@ -64,6 +65,15 @@ '__doc__': cls.__doc__, '__module__': cls.__module__}) +def support_args(callable, *argnames): + """return true if the callable support given argument names""" + argspec = getargspec(callable) + if argspec[2]: + return True + for argname in argnames: + if argname not in argspec[0]: + return False + return True # use networkX instead ? # http://networkx.lanl.gov/reference/algorithms.traversal.html#module-networkx.algorithms.traversal.astar diff -r 953578709324 -r efca814587e2 web/uicfg.py --- a/web/uicfg.py Wed Aug 04 11:13:11 2010 +0200 +++ b/web/uicfg.py Wed Aug 04 11:16:38 2010 +0200 @@ -107,11 +107,8 @@ def init_primaryview_display_ctrl(rtag, sschema, rschema, oschema, role): if role == 'subject': oschema = '*' - label = rschema.type else: sschema = '*' - label = '%s_%s' % (rschema, role) - rtag.setdefault((sschema, rschema, oschema, role), 'label', label) rtag.counter += 1 rtag.setdefault((sschema, rschema, oschema, role), 'order', rtag.counter) diff -r 953578709324 -r efca814587e2 web/views/primary.py --- a/web/views/primary.py Wed Aug 04 11:13:11 2010 +0200 +++ b/web/views/primary.py Wed Aug 04 11:16:38 2010 +0200 @@ -25,6 +25,7 @@ from logilab.mtconverter import xml_escape from cubicweb import Unauthorized +from cubicweb.utils import support_args from cubicweb.selectors import match_kwargs from cubicweb.view import EntityView from cubicweb.schema import VIRTUAL_RTYPES, display_name @@ -142,10 +143,15 @@ if display_attributes: self.w(u'') for rschema, role, dispctrl, value in display_attributes: - try: - self._render_attribute(dispctrl, rschema, value, - role=role, table=True) - except TypeError: + if support_args(self._render_attribute, 'label'): + label = self._rel_label(entity, rschema, role, dispctrl) + self._render_attribute(label, value, table=True) + elif support_args(self._render_attribute, 'dispctrl'): + warn('[3.10] _render_attribute prototype has changed, please' + ' update %s' % self.__class___, DeprecationWarning) + self._render_attribute(dispctrl, rschema, value, role=role, + table=True) + else: warn('[3.6] _render_attribute prototype has changed, please' ' update %s' % self.__class___, DeprecationWarning) self._render_attribute(rschema, value, role=role, table=True) @@ -155,9 +161,14 @@ for rschema, tschemas, role, dispctrl in self._section_def(entity, 'relations'): rset = self._relation_rset(entity, rschema, role, dispctrl) if rset: - try: + if support_args(self._render_relation, 'label'): + label = self._rel_label(entity, rschema, role, dispctrl) + self._render_relation(label, dispctrl, rset, 'autolimited') + elif not support_args(self._render_relation, 'showlabel'): + warn('[3.10] _render_relation prototype has changed, ' + 'please update %s' % self.__class__, DeprecationWarning) self._render_relation(dispctrl, rset, 'autolimited') - except TypeError: + else: warn('[3.6] _render_relation prototype has changed, ' 'please update %s' % self.__class__, DeprecationWarning) self._render_relation(rset, dispctrl, 'autolimited', @@ -194,7 +205,7 @@ rset = self._relation_rset(entity, rschema, role, dispctrl) if not rset: continue - label = display_name(self._cw, rschema.type, role) + label = self._rel_label(entity, rschema, role, dispctrl) vid = dispctrl.get('vid', 'sidebox') sideboxes.append( (label, rset, vid, dispctrl) ) sideboxes += self._cw.vreg['boxes'].poss_visible_objects( @@ -240,26 +251,30 @@ rset = dispctrl['filter'](rset) return rset - def _render_relation(self, dispctrl, rset, defaultvid): + def _render_relation(self, label, dispctrl, rset, defaultvid): self.w(u'
') - if dispctrl.get('showlabel', self.show_rel_label): - self.w(u'

%s

' % self._cw._(dispctrl['label'])) + if label: + self.w(u'

%s

' % label) self.wview(dispctrl.get('vid', defaultvid), rset, initargs={'dispctrl': dispctrl}) self.w(u'
') - def _render_attribute(self, dispctrl, rschema, value, - role='subject', table=False): + def _render_attribute(self, label, value, table=False): + self.field(label, value, tr=False, table=table) + + def _rel_label(self, entity, rschema, role, dispctrl): if rschema.final: showlabel = dispctrl.get('showlabel', self.show_attr_label) else: showlabel = dispctrl.get('showlabel', self.show_rel_label) - if dispctrl.get('label'): - label = self._cw._(dispctrl.get('label')) - else: - label = display_name(self._cw, rschema.type, role) - self.field(label, value, show_label=showlabel, tr=False, table=table) - + if showlabel: + if dispctrl.get('label'): + label = self._cw._(dispctrl['label']) + else: + label = display_name(self._cw, rschema.type, role, + context=entity.__regid__) + return label + return u'' class RelatedView(EntityView): __regid__ = 'autolimited'