def __init__(cls, name, bases, cdict): cls.__initialValues__ = iv = [] for name,ob in cdict.items(): if isinstance(ob,schema.Descriptor) and hasattr(ob,'initialValue'): iv.append((name, ob.initialValue)) del ob.initialValue super(StampClass,cls).__init__(name, bases, cdict) cls.__all_ivs__, cls.__setup__ = schema._initializers_for(cls)
def __init__(cls, name, bases, cdict): cls.__initialValues__ = iv = [] for name, ob in cdict.items(): if isinstance(ob, schema.Descriptor) and hasattr( ob, 'initialValue'): iv.append((name, ob.initialValue)) del ob.initialValue super(StampClass, cls).__init__(name, bases, cdict) cls.__all_ivs__, cls.__setup__ = schema._initializers_for(cls)
def deferredItem(self, uuid, itype=schema.Item, **attrs): """Return deferred for a stamp or item by UUID+type w/optional attrs""" if isinstance(uuid, Deferred): d = Deferred() @uuid.addCallback def uuid_to_item(uuid): if uuid in (None, NoChange): d.callback(uuid) else: self.deferredItem(uuid, itype, **attrs).addCallback(d.callback) return uuid uuid.addErrback(self.recordFailure) return d def setattrs(ob): # Set specified attributes, skipping NoChange attrs, and deleting # Inherit attrs for attr, val in attrs.items(): self.smart_setattr(val, ob, attr) return ob # return value for deferreds if issubclass(itype, pim.Stamp): d = self.deferredItem(uuid, itype.targetType()) @d.addCallback def add_stamp(item): stamp = itype(item) if not stamp.stamp_types or itype not in stamp.stamp_types: stamp.add() return setattrs(stamp) # return value for deferreds return d.addErrback(self.recordFailure) item = self.rv.findUUID(uuid) d = Deferred().addCallback(setattrs).addErrback(self.recordFailure) if item is None: # Create the item if isinstance(uuid, basestring): uuid = UUID(uuid) item = itype(itsView=self.rv, _uuid=uuid) if isinstance(item, itype): d.callback(item) return d if not issubclass(itype, type(item)): # Can't load the item yet; put callbacks on the queue self.loadQueue.setdefault(item, []).append((itype, d)) return d # Upgrade the item type, set attributes, and run setups old_type = item.__class__ item.__class__ = itype item.itsKind = itype.getKind(self.rv) ivs, setups = schema._initializers_for(itype, old_type.__mro__) for k,f in ivs: setattr(item, k, f(item)) setattrs(item) for c,s in setups: s(item) # run callbacks for any pending types that are now resolved if item in self.loadQueue: q = self.loadQueue[item] for t, cbd in q[:]: if isinstance(item, t): cbd.callback(item) q.remove((t,cbd)) if not q: del self.loadQueue[item] d.callback(item) return d
def deferredItem(self, uuid, itype=schema.Item, **attrs): """Return deferred for a stamp or item by UUID+type w/optional attrs""" if isinstance(uuid, Deferred): d = Deferred() @uuid.addCallback def uuid_to_item(uuid): if uuid in (None, NoChange): d.callback(uuid) else: self.deferredItem(uuid, itype, **attrs).addCallback(d.callback) return uuid uuid.addErrback(self.recordFailure) return d def setattrs(ob): # Set specified attributes, skipping NoChange attrs, and deleting # Inherit attrs for attr, val in attrs.items(): self.smart_setattr(val, ob, attr) return ob # return value for deferreds if issubclass(itype, pim.Stamp): d = self.deferredItem(uuid, itype.targetType()) @d.addCallback def add_stamp(item): stamp = itype(item) if not stamp.stamp_types or itype not in stamp.stamp_types: stamp.add() return setattrs(stamp) # return value for deferreds return d.addErrback(self.recordFailure) item = self.rv.findUUID(uuid) d = Deferred().addCallback(setattrs).addErrback(self.recordFailure) if item is None: # Create the item if isinstance(uuid, basestring): uuid = UUID(uuid) item = itype(itsView=self.rv, _uuid=uuid) if isinstance(item, itype): d.callback(item) return d if not issubclass(itype, type(item)): # Can't load the item yet; put callbacks on the queue self.loadQueue.setdefault(item, []).append((itype, d)) return d # Upgrade the item type, set attributes, and run setups old_type = item.__class__ item.__class__ = itype item.itsKind = itype.getKind(self.rv) ivs, setups = schema._initializers_for(itype, old_type.__mro__) for k, f in ivs: setattr(item, k, f(item)) setattrs(item) for c, s in setups: s(item) # run callbacks for any pending types that are now resolved if item in self.loadQueue: q = self.loadQueue[item] for t, cbd in q[:]: if isinstance(item, t): cbd.callback(item) q.remove((t, cbd)) if not q: del self.loadQueue[item] d.callback(item) return d