def save(self): """ Modifies the content of page, creates rev if necessary. """ def txn(factsheet, new_content, patch): r = Revision(parent=factsheet, editor=factsheet.editor, content=patch, number=factsheet.revision_number) factsheet.content = new_content factsheet.revision_number += 1 r.put() factsheet.put() if self._is_revision: raise Exception("Cannot save revision.") if self.content != "" and self.content != self.new_content: differ = dmp.diff_match_patch() patch = differ.patch_toText(differ.patch_make(self.new_content, self.content)) db.run_in_transaction(txn, self, self.new_content, patch) logging.info("Created new revision (%d) for factsheet %s" % (self.revision_number, self.name)) else: self.content = self.new_content self.put()
def revision(self, number): """ Returns a given revision """ if self._is_revision: raise Exception("Cannot get revision of revision.") differ = dmp.diff_match_patch() history = Revision.all().ancestor(self) history.filter("number >=", number).order("-number") revised_content = self.content for r in history: patch = differ.patch_fromText(unicode(r.content)) revised_content = differ.patch_apply(patch, revised_content)[0] earliest = r revised_page = self.__class__( key_name=self.key().name(), content=revised_content, editor=earliest.editor, modified=earliest.created, number=earliest.number, is_revision=True, ) return revised_page