diff -r 0ff3d29e91c9 -r 7074698c6522 entity.py --- a/entity.py Fri Mar 27 12:23:34 2009 +0100 +++ b/entity.py Fri Mar 27 12:24:47 2009 +0100 @@ -54,8 +54,8 @@ EditBox.rmode.set_rtag(tag, rtype, role, stype, otype) elif tag in CATEGORY_TAGS: AutomaticEntityForm.rcategories.set_rtag(tag, rtype, role, stype, otype) - elif tag == 'inlined': - AutomaticEntityForm.rinline.set_rtag(True, rtype, role, stype, otype) + elif tag == 'inlineview': + AutomaticEntityForm.rinlined.set_rtag(True, rtype, role, stype, otype) else: raise ValueError(tag) @@ -64,46 +64,67 @@ def dispatch_rtags(*args): pass - + +def _get_etype(bases, classdict): + try: + return classdict['id'] + except KeyError: + for base in bases: + etype = getattr(base, 'id', None) + if etype and etype != 'Any': + return etype + +def _get_defs(attr, name, bases, classdict): + try: + yield name, classdict.pop(attr) + except KeyError: + for base in bases: + try: + value = getattr(base, attr) + delattr(base, attr) + yield base.__name__, value + except AttributeError: + continue + class metaentity(type): """this metaclass sets the relation tags on the entity class and deals with the `widgets` attribute """ def __new__(mcs, name, bases, classdict): # collect baseclass' rtags - if '__rtags__' in classdict: - etype = classdict['id'] - warn('%s: __rtags__ is deprecated' % name, DeprecationWarning) - for relation, tags in classdict.pop('__rtags__').iteritems(): - # tags must become an iterable - if isinstance(tags, basestring): - tags = (tags,) - # relation must become a 3-uple (rtype, targettype, role) - if isinstance(relation, basestring): - dispatch_rtags(tags, relation, 'subject', etype, '*') - dispatch_rtags(tags, relation, 'object', '*', etype) - elif len(relation) == 1: # useful ? - dispatch_rtags(tags, relation[0], 'subject', etype, '*') - dispatch_rtags(tags, relation[0], 'object', '*', etype) - elif len(relation) == 2: - rtype, ttype = relation - ttype = bw_normalize_etype(ttype) # XXX bw compat - dispatch_rtags(tags, rtype, 'subject', etype, ttype) - dispatch_rtags(tags, rtype, 'object', ttype, etype) - elif len(relation) == 3: - rtype, ttype, role = relation - ttype = bw_normalize_etype(ttype) - if role == 'subject': + etype = _get_etype(bases, classdict) + if etype and AutomaticEntityForm is not None: + for name, rtags in _get_defs('__rtags__', name, bases, classdict): + warn('%s: __rtags__ is deprecated' % name, DeprecationWarning) + for relation, tags in rtags.iteritems(): + # tags must become an iterable + if isinstance(tags, basestring): + tags = (tags,) + # relation must become a 3-uple (rtype, targettype, role) + if isinstance(relation, basestring): + dispatch_rtags(tags, relation, 'subject', etype, '*') + dispatch_rtags(tags, relation, 'object', '*', etype) + elif len(relation) == 1: # useful ? + dispatch_rtags(tags, relation[0], 'subject', etype, '*') + dispatch_rtags(tags, relation[0], 'object', '*', etype) + elif len(relation) == 2: + rtype, ttype = relation + ttype = bw_normalize_etype(ttype) # XXX bw compat dispatch_rtags(tags, rtype, 'subject', etype, ttype) + dispatch_rtags(tags, rtype, 'object', ttype, etype) + elif len(relation) == 3: + rtype, ttype, role = relation + ttype = bw_normalize_etype(ttype) + if role == 'subject': + dispatch_rtags(tags, rtype, 'subject', etype, ttype) + else: + dispatch_rtags(tags, rtype, 'object', ttype, etype) else: - dispatch_rtags(tags, rtype, 'object', ttype, etype) - else: - raise ValueError('bad rtag definition (%r)' % (relation,)) - if 'widgets' in classdict and AutomaticEntityForm is not None: - etype = classdict['id'] - warn('%s: widgets is deprecated' % name, DeprecationWarning) - for relation, wdgname in classdict.pop('widgets').iteritems(): - AutomaticEntityForm.rwidgets.set_rtag(wdgname, rtype, 'subject', etype) + raise ValueError('bad rtag definition (%r)' % (relation,)) + for name, widgets in _get_defs('widgets', name, bases, classdict): + warn('%s: widgets is deprecated' % name, DeprecationWarning) + for rtype, wdgname in widgets.iteritems(): + AutomaticEntityForm.rwidgets.set_rtag(wdgname, rtype, 'subject', etype) return super(metaentity, mcs).__new__(mcs, name, bases, classdict)