Ejemplo n.º 1
0
class VersionedDocument(Document):
    my_metaclass = TopLevelDocumentMetaclass

    _rev    = ObjectIdField(required=True)
    _parent = ObjectIdField()
    _ts     = DateTimeField(default=datetime.now)
    _meta   = {'abstract': True}

    def save(self, *args, **kwargs):
        Document.save.__doc__

        #generate a new revision
        if not self.id:
            self.id = ObjectId()
            # self._created is an internal attribute used by MongoEngine to determine
            # what to do when saving the document. When we assign a value to self.id
            # this attribute gets set to False. We want to reset it to True so ME will
            # do its usual business when saving this new document.
            self._created = True
            self._parent = None
        else:
            self._parent = self._rev

        self._ts = datetime.now()
        self._rev = ObjectId()

        #save it in the versioning collection
        nv = self.to_mongo()
        if issubclass(type(self.id), EmbeddedDocument):
            nv['_id'] = {'id': self.id.to_mongo(), 'rev': self._rev}
        else:
            nv['_id'] = {'id': self.id, 'rev': self._rev}

        db = self._get_db()
        db['versioned_'+self._meta['collection']].insert(nv, safe=True)

        return super(VersionedDocument, self).save(*args, **kwargs)