# HG changeset patch # User Sylvain Thénault # Date 1250151657 -7200 # Node ID b703639614e7eaa2bef2a1c8ddc2227b59fc57c8 # Parent 9c650701cb177f97cff953e3a63247ad8832c972 refactor property handling to avoid name conflicts diff -r 9c650701cb17 -r b703639614e7 appobject.py --- a/appobject.py Thu Aug 13 09:59:35 2009 +0200 +++ b/appobject.py Thu Aug 13 10:20:57 2009 +0200 @@ -277,38 +277,18 @@ """ cls.build___select__() cls.vreg = registry.vreg - cls.register_properties() + pdefs = getattr(cls, 'cw_property_defs', {}) + for propid, pdef in pdefs: + pdef = pdef.copy() # may be shared + pdef['default'] = getattr(cls, propid, pdef['default']) + pdef['sitewide'] = getattr(cls, 'site_wide', pdef.get('sitewide')) + registry.vreg.register_property(cls._cwpropkey(propid), **pdef) return cls @classmethod def vreg_initialization_completed(cls): pass - # properties definition: - # key: id of the property (the actual CWProperty key is build using - # .. - # value: tuple (property type, vocabfunc, default value, property description) - # possible types are those used by `logilab.common.configuration` - # - # notice that when it exists multiple objects with the same id (adaptation, - # overriding) only the first encountered definition is considered, so those - # objects can't try to have different default values for instance. - - property_defs = {} - - @classmethod - def register_properties(cls): - for propid, pdef in cls.property_defs.items(): - pdef = pdef.copy() # may be shared - pdef['default'] = getattr(cls, propid, pdef['default']) - pdef['sitewide'] = getattr(cls, 'site_wide', pdef.get('sitewide')) - cls.vreg.register_property(cls.propkey(propid), **pdef) - - @classmethod - def propkey(cls, propid): - return '%s.%s.%s' % (cls.__registry__, cls.id, propid) - - def __init__(self, req=None, rset=None, row=None, col=None, **extra): super(AppObject, self).__init__() self.req = req @@ -317,16 +297,43 @@ self.col = col self.extra_kwargs = extra - def propval(self, propid): - assert self.req - return self.req.property_value(self.propkey(propid)) - def view(self, __vid, rset=None, __fallback_oid=None, __registry='views', **kwargs): """shortcut to self.vreg.view method avoiding to pass self.req""" return self.vreg[__registry].render(__vid, self.req, __fallback_oid, rset=rset, **kwargs) + # persistent class properties ############################################## + # + # optional `cw_property_defs` dict on a class defines available persistent + # properties for this class: + # + # * key: id of the property (the actual CWProperty key is build using + # .. + # * value: tuple (property type, vocabfunc, default value, property description) + # possible types are those used by `logilab.common.configuration` + # + # notice that when it exists multiple objects with the same id (adaptation, + # overriding) only the first encountered definition is considered, so those + # objects can't try to have different default values for instance. + # + # you can then access to a property value using self.propval, where self is + # an instance of class + + @classmethod + def _cwpropkey(cls, propid): + """return cw property key for the property of the given id for this + class + """ + return '%s.%s.%s' % (cls.__registry__, cls.id, propid) + + def cw_propval(self, propid): + """return cw property value associated to key + + .. + """ + return self.req.property_value(self._cwpropkey(propid)) + # deprecated ############################################################### @classproperty @@ -397,4 +404,8 @@ def parse_datetime(self, value, etype='Datetime'): return self.req.parse_datetime(value, etype) + @deprecated('[3.5] use self.cw_propval') + def propval(self, propid): + return self.req.property_value(self._cwpropkey(propid)) + set_log_methods(AppObject, getLogger('cubicweb.appobject')) diff -r 9c650701cb17 -r b703639614e7 devtools/devctl.py --- a/devtools/devctl.py Thu Aug 13 09:59:35 2009 +0200 +++ b/devtools/devctl.py Thu Aug 13 10:20:57 2009 +0200 @@ -205,7 +205,7 @@ objid = '%s_%s' % (reg, obj.id) if objid in done: break - if obj.property_defs: + if obj.cw_property_defs: yield objid done.add(objid) break diff -r 9c650701cb17 -r b703639614e7 view.py --- a/view.py Thu Aug 13 09:59:35 2009 +0200 +++ b/view.py Thu Aug 13 10:20:57 2009 +0200 @@ -479,7 +479,6 @@ """base class for components""" __registry__ = 'components' __select__ = yes() - property_defs = {} def div_class(self): return '%s %s' % (self.propval('htmlclass'), self.id) diff -r 9c650701cb17 -r b703639614e7 web/action.py --- a/web/action.py Thu Aug 13 09:59:35 2009 +0200 +++ b/web/action.py Thu Aug 13 10:20:57 2009 +0200 @@ -22,7 +22,7 @@ __registry__ = 'actions' __select__ = match_search_state('normal') - property_defs = { + cw_property_defs = { 'visible': dict(type='Boolean', default=True, help=_('display the action or not')), 'order': dict(type='Int', default=99, diff -r 9c650701cb17 -r b703639614e7 web/box.py --- a/web/box.py Thu Aug 13 09:59:35 2009 +0200 +++ b/web/box.py Thu Aug 13 10:20:57 2009 +0200 @@ -42,7 +42,7 @@ registered = classmethod(require_group_compat(View.registered)) categories_in_order = () - property_defs = { + cw_property_defs = { _('visible'): dict(type='Boolean', default=True, help=_('display the box or not')), _('order'): dict(type='Int', default=99, diff -r 9c650701cb17 -r b703639614e7 web/component.py --- a/web/component.py Thu Aug 13 09:59:35 2009 +0200 +++ b/web/component.py Thu Aug 13 10:20:57 2009 +0200 @@ -35,7 +35,7 @@ __select__ = one_line_rset() & primary_view() & match_context_prop() registered = accepts_compat(has_relation_compat(condition_compat(View.registered))) - property_defs = { + cw_property_defs = { _('visible'): dict(type='Boolean', default=True, help=_('display the component or not')), _('order'): dict(type='Int', default=99, @@ -63,7 +63,7 @@ id = 'navigation' __select__ = paginated_rset() - property_defs = { + cw_property_defs = { _('visible'): dict(type='Boolean', default=True, help=_('display the component or not')), } diff -r 9c650701cb17 -r b703639614e7 web/facet.py --- a/web/facet.py Thu Aug 13 09:59:35 2009 +0200 +++ b/web/facet.py Thu Aug 13 10:20:57 2009 +0200 @@ -244,7 +244,7 @@ class AbstractFacet(AppObject): __abstract__ = True __registry__ = 'facets' - property_defs = { + cw_property_defs = { _('visible'): dict(type='Boolean', default=True, help=_('display the box or not')), _('order'): dict(type='Int', default=99, diff -r 9c650701cb17 -r b703639614e7 web/views/ajaxedit.py --- a/web/views/ajaxedit.py Thu Aug 13 09:59:35 2009 +0200 +++ b/web/views/ajaxedit.py Thu Aug 13 10:20:57 2009 +0200 @@ -21,7 +21,7 @@ __registry__ = 'views' __select__ = (match_form_params('rtype', 'target') | match_kwargs('rtype', 'target')) - property_defs = {} # don't want to inherit this from Box + cw_property_defs = {} # don't want to inherit this from Box id = 'xaddrelation' expected_kwargs = form_params = ('rtype', 'target') diff -r 9c650701cb17 -r b703639614e7 web/views/basecomponents.py --- a/web/views/basecomponents.py Thu Aug 13 09:59:35 2009 +0200 +++ b/web/views/basecomponents.py Thu Aug 13 10:20:57 2009 +0200 @@ -29,7 +29,7 @@ class RQLInputForm(component.Component): """build the rql input form, usually displayed in the header""" id = 'rqlinput' - property_defs = VISIBLE_PROP_DEF + cw_property_defs = VISIBLE_PROP_DEF visible = False def call(self, view=None): @@ -59,7 +59,7 @@ class ApplLogo(component.Component): """build the instance logo, usually displayed in the header""" id = 'logo' - property_defs = VISIBLE_PROP_DEF + cw_property_defs = VISIBLE_PROP_DEF # don't want user to hide this component using an cwproperty site_wide = True @@ -71,7 +71,7 @@ class ApplHelp(component.Component): """build the help button, usually displayed in the header""" id = 'help' - property_defs = VISIBLE_PROP_DEF + cw_property_defs = VISIBLE_PROP_DEF def call(self): self.w(u' ' % (self.build_url(_restpath='doc/main'), @@ -82,7 +82,7 @@ """if the user is the anonymous user, build a link to login else a link to the connected user object with a loggout link """ - property_defs = VISIBLE_PROP_DEF + cw_property_defs = VISIBLE_PROP_DEF # don't want user to hide this component using an cwproperty site_wide = True id = 'loggeduserlink' @@ -124,7 +124,7 @@ __select__ = yes() id = 'applmessages' # don't want user to hide this component using an cwproperty - property_defs = {} + cw_property_defs = {} def call(self): msgs = [msg for msg in (self.req.get_shared_data('sources_error', pop=True), @@ -140,7 +140,7 @@ class ApplicationName(component.Component): """display the instance name""" id = 'appliname' - property_defs = VISIBLE_PROP_DEF + cw_property_defs = VISIBLE_PROP_DEF # don't want user to hide this component using an cwproperty site_wide = True @@ -170,7 +170,7 @@ id = 'etypenavigation' __select__ = two_etypes_rset() | match_form_params('__restrtype', '__restrtypes', '__restrrql') - property_defs = VISIBLE_PROP_DEF + cw_property_defs = VISIBLE_PROP_DEF # don't want user to hide this component using an cwproperty site_wide = True visible = False # disabled by default