class Indexable(Persistent): # prepend _v_ to make it volatilive _v_book = None def __init__(self): self._v_book = Book() self._v_book.addData(self) def __setattr__(self, name, value): #only run this if the name is within the current objects attributes if self._v_book and name not in Persistent.__dict__: # if the book exists AND # if the value has changed # and that attribute is an indexable attribute # OR we want it to be indexed, however it is not actually in the index (this condition will be caught # in updateIndexedValue) if self._v_book and self.__dict__.get(name) != value and name in self.indexableAttrs: self._v_book.updateIndexedValue(self, name, value) # save changes self._v_book.commitTransaction() Persistent.__setattr__(self, name, value) #TODO def __delattr__(self, name): pass
class Person(Persistent): name = None age = None indexable = ('name',) if __name__ == '__main__': book = Book() p = Person() p.name = "Mike" age = 20 p1 = Person() p1.name = "Matt" p1.age = 30 p2 = Person() p2.name = "Mitch" p2.age = 25 p3 = Person() p3.name = "Bob" p3.age = 21 book.addData(p) book.addData(p1) book.addData(p2) book.addData(p3) """ #2nd run p2 = book.indexdb['Person']['Mitch'] p2.name = "Mitch1aasdf" p2.age = 25 """ print map(lambda x: x.name, book.indexdb['Person'].values("Mi"))