#summary Tracks progress of the new document editor project.

<wiki:toc max_depth="2"/>

= Introduction =
The goal of the project is to develop and/or deploy new infrastructure for document editing in Melange. This infrastructure should provide revision control of the documents, displaying diffs between revisions, storing documents in HTML and markdown. MarkItUp! can be deployed as an optional editor.

= Revision control architecture =
There are several issues that should be taken into account:
  # Loose coupling. Information about revisions must be represented as a separate model to minimize dependencies between document entities and revisions.
  # Minimize the size of the data retrieved.
  # Minimize datastore queries and simplify them.

== First approach: independent revisions ==
{{{
class Revision(db.Model):
  revision_id = db.IntegerProperty()
  timestamp = db.DateTimeProperty() # It's not required, cause Document entity has it
  user = db.UserProperty() # It's not required, cause Document entity has it
  comment = db.TextProperty() # Comment about the revision
  current = db.BooleanProperty() # Current revision
  deleted = db.BooleanProperty() # Revision is marked as deleted
  public = db.BooleanProperty() # Public or private revision
  document = db.ReferenceProperty() # Reference to content
}}}

It's obvious that revisions are not linked to each other. Each operation on revision is just a query to a datastore.

== Second approach: Linked revisions ==
{{{
class DocRevision(db.Model):
  revision_id = db.IntegerProperty() # It's necessary for list rearrangement
  timestamp = db.DateTimeProperty() # It's not required, cause Document entity has it
  user = db.UserProperty() # It's not required, cause Document entity has it
  comment = db.TextProperty() # Comment about the revision
  document = db.ReferenceProperty() # Reference to content

class Revision(db.Model):
  revisions = db.ListProperty(db.Key) # List of revisions
  public = db.ListProperty(db.Key)
  private = db.ListProperty(db.Key)
}}}

This approach helps to manage revisions easily, but list rearrangement operations consumes expensive CPU time.
 
This approach allows us to simplify revision management. {{{revs}}}, {{{public}}} and {{{private}}} are manged at entity creation.
= Project timeline =
== Week 1 (24 May - 30 May) ==
 # Dig into GAE datastore (read [http://oreilly.com/catalog/9780596522735 "Programming Google App Engine"], review google.appengine.ext.db, play with the datastore)
 # Deploy test Melange instance to appspot.com
 # Design revision control architecture

== Week 2 (31 May - 6 June) ==
 # Implement revision control
  * Implement revision control models
  * Hack out views to support revisions

== Week 3 (7 June - 13 June) ==
 # Finish revision control
  * Implement support for public and private revisions
  * Implement revision rollback
  * Fix problems

== Week 4 (14 June - 20 June) ==
 # Work on diff engine
  * Review existing solutions
  * Try [http://www.aaronsw.com/2002/diff/ HTML diff] on existing infrastructure

== Week 5 (21 June - 27 June) ==
 # Hack HTML diff for intelligent diff computation

== Week 6 (28 June - 4 July) ==
 # Refactor views to support HTML diffs

== Week 7 (5 July - 11 July) ==
 # Test diffs with revision control
 # Fix issues
 # Release full-featured revision control before mid-term evaluations