#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:* 

== 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 Agust - 17 August (Week 11,12) || Work on open issues about APIs. issue 1239, issue 1243 ||
|| 17 Agust - 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.