from Attr import Attr def objRefJoin(klassId, serialNum): """Given a klass id and object serial number, return a 64-bit obj ref value (e.g., a long).""" return (long(klassId) << 32) | long(serialNum) def objRefSplit(objRef): """Return a tuple with (klassId, serialNum) given the 64-bit (e.g., long type) objRef.""" return ((objRef & 0xFFFFFFFF00000000L) >> 32, objRef & 0xFFFFFFFFL) class ObjRefAttr(Attr): """This is an attribute that refers to another user-defined object. For a list of objects, use ListAttr. """ def __init__(self, dict): Attr.__init__(self, dict) self._className = dict['Type'] def targetClassName(self): """Return the name of the base class that this obj ref attribute points to.""" return self._className def targetKlass(self): assert self._targetKlass, 'not yet fully initialized' return self._targetKlass def awakeFromRead(self): """Check that the target class actually exists.""" self._targetKlass = self.model().klass(self.targetClassName(), None) if not self._targetKlass: from Model import ModelError raise ModelError, 'class %s: attr %s: cannot locate target class %s for this obj ref.' % ( self.klass().name(), self.name(), self.targetClassName()) def className(self): print 'DEPRECATED: ObjRefAttr.className() on 2004-02-27. Use targetClassName() instead.' return self.targetClassName()