#summary tracks progress for the "integration with external apis" project.
#labels Phase-Requirements

<wiki:toc max_depth="3" />

= 1. Introduction =

This page is tracking of progress for GSoC 2011 Project: Integration with External API's
----

= 2. Requirements =
== 2.1 Melange Lists ==
===Overview===
Basically an export button for each lists on Melange that triggers an export mechanism to Google SpreadSheets. (including OAuth roundtrip, access token storing on datastore)
===Problems & Solutions===
 * *Problem:* exporting a JavaScript list
 * *Solution:* export spreadsheet on client side. Implement JS methods over GData Protocols.

== 2.2 Student Proposals ==
===Overview ===
Students will be able to edit their proposals through tinyMCE editor or link to a Google Document file. There will be a "Sync Now" button to syncronize proposal that Melage holds with actual Google Documents file.
===Problems & Solutions ===
 * *Problem:* Student may not be awere that proposal is syncronised only when he/she clicks "Sync Now" button.
 * *Solution1:* Give responsibility to student.
 * *Solution2:* Sync proposal with stored ACL. Check for single revisions and get the closest revision to deadline.

 * *Problem:* As Google Documents stores HTML files in full-HTML form (including images, css files etc.) a method must be implemented to embed that document to actual proposal entry.
 * *Solution:* 

== 2.3 Surveys (issue 1243) ==
===Overview===
Export a survey as either a pdf, google doc, plain text, something to save the entire webpage view.

== 2.4 Tracking Numbers (issue 1239) ==
=== Overview ===
Program administrators have spreadsheets that will enable students to have tracking numbers for their welcome packages and tshirts. Same for payment status.

== 2.5 Export Melange stuff for developers' use ==
=== Overview ===
Export some statistics and data to Google Documents to work on or to integrate with other services like Fusion Tables.


----

= 4. Project Timeline =
This table is based on deliverables.

|| 25 May - 31 May (Week 1) || Add Google Data packages to Melange. ||
|| 1 June - 7 June (Week 2) || Add related fields create required models. ||
|| 8 June - 21 June (Week 3,4) || Integrate OAuth. ||
|| 22 June - 12 July (Week 5,6,7) || Student proposal syncing. Write tests if possible. ||
|| 13 July - 15 July || Midterm Evaluation. ||
|| 15 July - 19 July (Week 8) || Learn how Melange lists actually works. ||
|| 20 July - 2 August (Week 9,10) || Melange List exporting. ||
|| 3 August - 17 August (Week 11,12) || Work on open issues about APIs. issue 1239, issue 1243 ||
|| 17 August - 26 August (Week 13) || Export Melange stuff for developers' use ||

= 5. Design & Terminology = 
== 5.1 Open Auth Roundtrip ==
https://lh3.googleusercontent.com/-G5GUxfUdXS0/TgC_I0dXVmI/AAAAAAAAADI/hAGOlYZngq0/s640/MelangeOAuth%252520%2525281%252529.png
== 5.2 Resource ==

Resource is a document or file that is exported to GDocs and being kept track of. When Melange exports a document to GDocs it will store returned document ID from Google Documents API. This document should be associated with user for whom resource exported for, and with a unique key that tells where the resource exported from. This shows the basic structure of Resource class:

{{{
class Resource(db.Model):
  """Model of an exported Google Docs resource
  """

  #: Required field storing "ID" of exported resource.
  #: This value is returned from Google Documents at first upload.
  resource_id = db.StringProperty(required=True)

  #: Name of the resource. This value is changed only when
  #: actual name of exported Google document changes.
  resource_name = db.StringProperty(required=True)

  #: Owner of document for whom document exported for, and 
  #: whose Google Documents account is expected to has the resource.
  owner = db.ReferenceProperty(reference_class=soc.models.user.User,
                               required=True,
                               collection_name='exported_documents',
                               verbose_name=ugettext('Owner'))
}}}
----
=6. Meeting Notes & Agendas =
== Monday, May 16 18:30:00 in UTC (Skype Conference)==
=== TODOs ===
 * Create the blogpost summarizing last week today.
 * Have a call with your mentor this week, most of us are in PDT time zone.
 * Put a link to your GAE instance on the wiki page (and blog if possible)
 * Don't forget to make your next blogpost before the next meeting.
 * Get ready to start coding!

== Tuesday, May 20 20:00:00 in UTC (GTalk with Mario) ==

Mario delivered me notes for my project from discussion with Melange team.
===TODOS:===
 * Update project requirements
 * Start working on exporting a html document from Google Documents and integrating with Melange.
 * Come up with a timeline. Designate deliverables.
 * Focus on the main problems instead of thinking whole project or other stuff that is already known how to handle.

== Monday, June 21 20:00:00 in UTC (GTalk with Mario) ==

===TODOS:===
 * Store tokens in datastore.
 * Provide a "remember me" checkbox with login button. 
 * Store "remember me" choice and access token in Profile model.

== Monday, July 21 20:00:00 in UTC (GTalk with Mario) ==
=== Notes ===
It's not convenient to export lists from server side. GAE has 30 second request limit that may prevent uploading big lists. Instead of that, we can upload spreadsheets with JS over GData rest protocol. 