#summary This page contains project roadmap for year 2009
#labels Deprecated,Importance-Useful

= Melange Roadmap 2009 =

_This is the first draft of Melange Roadmap for 2009. This document is still incomplete (work in progress). We will be adding more description for each task listed below shortly._

== release script ==
  * *Lead:* Pawel Solyga
  * *Priority:* High
  * *Scheduled for:* May 2009 
  * *Who:* Pawel Solyga, Sverre Rabbelier, Dan Bentley 
  * *ETA:* 1 week

To simplify the release process, release script will be created. Script will need to support Mercurial (hg) repository cause of our recent switch from SVN to hg. Release script will build, test using test suite, branch, tag new release and create tar.gz package to put into Download section on our code.google.com project page. In addition to that, script will also create app.yaml file from app.yaml.template and support cherrypicking of branches (previous releases) and deployment to testing GAE instances.

== GHOP features support ==
  * *Lead:* Lennard de Rijk
  * *Developers:* Madhudusan C.S. (GSoC) Pawel Solyga
  * *Priority:* High
  * *Scheduled for:* May - September 2009
  * *ETA:* 4 months
  * *More:* http://code.google.com/p/soc/wiki/GSoC2009Ideas

Please see the [GHOP wiki topic] for more information.

Melange GHOP features support GSoC project:
  * http://socghop.appspot.com/student_project/show/google/gsoc2009/melange/t124022698486

== test suite (unit, smoke and functional tests) ==
  * *Priority:* Critical
  * *Scheduled for:* May - June 2009
  * *Who:* Melange Team
  * *ETA:* ~1 month

Right now Melange has a small set of basic unit tests (40). This task aims to extend our test suite with unit, smoke and functional tests. In addition to that we would also like to extend seed_db module which creates fake entities of different Melange models in the datastore for quick testing of Melange functionality locally and on deployed GAE application instance. seed_db module will be extended to seed all the models currently used within Melange.

Summarizing:
  * unit tests
  * functional tests
  * smoke tests
  * extending seed_db module 
  * special view for seed_db module

== 1000 entity limitation fix ==
  * *Priority:* High
  * *Scheduled for:* May 2009
  * *Who:* Dan Bentley, Pawel Solyga, Sverre Rabbelier
  * *ETA:* 2-3 weeks

Due to Google App Engine limitations we currently have problems with listing more than 1000 entities via the web interface. Fix for that has been already committed however it still requires some work including: addition of missing indexes, support for sharded counters to show total number of entries in the table/list, usage of deepFetch function in CSV export of tables in order to export whole table at once, not in batches like it is right now (just visible part of the table is exported).

== statistics module (GSoC & GHOP) ==
  * *Lead:* Pawel Solyga, Sverre Rabbelier
  * *Priority:* High
  * *Scheduled for:* May -  September 2009
  * *Who:* Merio Ferraro (GSoC), Daniel Hans (GSoC), Sverre Rabbelier, Pawel Solyga, Lennard de Rijk  
  * *ETA:* 3 months

Extract interesting statistics from the Melange datastore for the benefit of different Melange Roles including Program Administrator, Developer, Organization Administrator, Mentor.  Use it for: Graphs, Histograms, More Google Maps integration and [http://en.wikipedia.org/wiki/Comma-separated_values CSV] export.
  
   * use Google Chart API 
   * use Google Visualization API
   * display different kind of charts and statistics which can include students by country, number of organizations per program, students for each organization, students by school, mentors and org admins by country
   * generate KML file with location of all mentors, students (connections between mentor and student too)
   * create statistics dashboard page for organization admins, program administrators, developers (superadmins)

Melange Statistics module GSoC projects:
  * http://socghop.appspot.com/student_project/show/google/gsoc2009/melange/t124022698771
  * http://socghop.appspot.com/student_project/show/google/gsoc2009/melange/t124022698336

== bugs, features and enhancements from issue tracker ==
  * *Priority:* High/Depends
  * *Scheduled for:* May - September 2009
  * *Who:* Melange Team
  * *ETA:* hard to determine

To be discussed during Monday (27th of May 2009) conference call what issues we will be working on in the first place.

== surveys support (Quiz) ==
  * *Priority:* High
  * *Scheduled for:* June 2009
  * *Who:* James Levy (GSoC), Sverre Rabbelier, Pawel Solyga
  * *ETA:* 1 month

Survey is a set of questions with a different types of answers. Melange currently doesn't support surveys (quizes). In order to do midterm, final evaluations or any additional surveys within Melange the Surveys(Quiz) module is needed.
Surveys can be created/edited/deleted by Program Administrator or Organization Administrator. Each of them can also list all created Surveys. Program Administrator can request to take a quiz (survey) to any Program user including Mentors, Students, Organization Administrators. Organization Administrator should be able to request to take a quiz from Organization Mentors or Students only. Quiz issuer should be able to list quiz results, list users who did not yet take a quiz and export all that information, results to CSV file. Surveys should have option to set quiz start and end date which will make them available only during this period.

Example survey module for drupal: http://drupal.org/project/quiz

This functionality will be used for midterm, final evaluations and additional surveys.

<LH>
Future feature: Allow other Melange users to create and administer surveys. Need to talk to legal about any implications before considering this feature from the Google perspective.

Raises interesting ethical question: Should all evaluation data from user created surveys be public provided results are anonymized/user has ability to opt-out of having survey results published? Think survey results should only be published at an aggregate level in any case.

If survey results are not public, should the Sponsor (Host) of a particular program using Melange have access to survey data? I think that Sponsors should have access to all this data. If system users prefer not to share this data with Sponsors, there are [http://www.limesurvey.org/content/view/5/83/lang,en/ other FOSS survey tool options].

</LH>

== buildbot enhancements ==
  * *Priority:* Medium
  * *Scheduled for:* June 2009
  * *Who:* Pawel Solyga, Sverre Rabbelier
  * *ETA:* 1 week

Our buildbot needs to be configured to use Hg repository and pull the commits from it every couple minutes or using post-commit-hooks support on code.google.com project hosting (support for post-commit-hooks for Mercurial repositories is not available yet). Our buildbot also needs to test our code using pylint, which can be part of the build script that buildbot is already configured to run. Emails from buildbot should be send to melange-soc-buildbot google group (http://groups.google.com/group/melange-soc-buildbot). Our wiki documentation should also be updated with information about buildbot url and new buildbot google group.

== dealing with failed students ==
  * *Priority:* Medium
  * *Scheduled for:* July 2009
  * *Who:* Lennard de Rijk, Pawel Solyga, Leslie Hawthorn, Madhudusan C.S. (GSoC)
  * *ETA:* 1 week

In previous years students who have failed to complete GSoC project have just disappeared from the web application and no information about them was present on any program page. We are considering changing this. We would a have special link on the Organization Home page listing "failed" projects (e.g. disappearing students, failed via midterm or final evaluation). In addition to that there will be special comment support for those projects and both project mentors and student will be able to comment on the project to explain what happened and what was the reason of failure. 

<lh>
This feature should be implemented regardless of Google's final thoughts on this feature. Post-mortem reports are a beautiful thing and also help people not go down the wrong path when considering a solving a specific problem. It's also useful for people to get a view of the social reasons things didn't work out: being overcommitted to other work, social obligations, etc. Things happen.

For implementation for GSoC, I need to confirm with Legal that this is OK and sync with Chris quickly. I assume he'll be totally fine with it. 

I also think we ought to send Sponsors an email when a post-mortem is posted (good feedback). Also cuts down on trolling reports (think: I failed because my mentors were mean to me. It clearly wasn't that I took a ten week vacation. Hrm, maybe that is useful to publish. This is also a good lesson in the fact that what you say publicly here as with all Open Source participation is something that people will see/look at when considering if they'd like to undertake projects with you in the future.)

</lh>

== ajaxy table view ==
  * *Lead:* Pawel Solyga
  * *Priority:* High
  * *Scheduled for:* July 2009
  * *Who:* Pawel Solyga, Merio Ferraro (GSoC), Sverre Rabbelier
  * *ETA:* 2-3 weeks

Our current list view is very limited, doesn't support ajax data fetching, column sorting and many other features like searching on client side using javascript or on server side using ajax calls. This task aims to improve it or replace it with some ready to use ajax table view.

More information about this task can be found in our issue tracker Issue 201.

== file upload support (avatars, patches, tax forms, etc) ==
  * *Lead:* Pawel Solyga
  * *Priority:* Medium
  * *Scheduled for:* July 2009
  * *Who:* Pawel Solyga, Sverre Rabbelier
  * *ETA:* 2-3 weeks

Main usage will be for tax forms and all sorts of documentation in GSoC, avatars and patches can wait.

See [Ihttp://code.google.com/p/soc/issues/detail?id=44] Issue 44.

<lh>
From Google perspective for source code, LH needs to check implications from legal perspective. Assume it's ok since we satisfy restrictions now with eligibility requirements.

Tax forms from students in USA cannot be stored on GSoC site.

I see this feature as being most useful for patches/source code (GHOP), student presentations, etc. Why not have all your program "work" in one place? Useful instead of searching around. At the very least we already provide students with the opportunity to show off their work via links on their student proposal page (e.g. to slides on Slideshare or videos, etc.)

</lh> 

== feeds support for comments, announcement, important dates, proposal updates ==
  * *Priority:* Medium
  * *Scheduled for:* July - August 2009
  * *Who:* James Levy (GSoC), Sverre Rabbelier
  * *ETA:* 1 month

    * integration with FeedBurner API so we don't have to cache it
    * feeds with important dates based on program timeline (can't we just feed from existing program calendar? - LH)
    * feeds generated using cron jobs ?
    * interface to post announcement by Program Administrators, Organization Administrators
    * each student proposal gets a feed so mentors are aware of any proposal changes/updates

Melange news framework GSoC project:
  * http://socghop.appspot.com/student_project/show/google/gsoc2009/melange/t124022698643

== django patch + gaebar support ==
  * *Lead:* Pawel Solyga
  * *Priority:* Low
  * *Scheduled for:* August 2009
  * *Who:* Pawel Solyga
  * *ETA:* 2 weeks

Melange currently uses Google App Engine and django, however some of the django functionality doesn't work on GAE. With django-patch support in Melange we would be able to leverage all features of django inside Melange. In addition django-patch is required to enable gaebar support in Melange. gaebar is Google App Engine Backup and Restore project which allows to easily import and export data from GAE datastore to local computer or to other instance of application running on GAE. With gaebar support we would be able to do regular backups.

    * Make Melange compatible with django-patch
    * Use gaebar to import, export data from Melange instances (backup)
    * We might not need this if GAE export/import tool is introduced at Google I/O or somewhere in GAE roadmap (what will most likely happen since GAE Team is already working on it)

== PDF generation of CPT letters, certificates, other documents ==
  * *Lead:* Pawel Solyga
  * *Priority:* Medium
  * *Scheduled for:* August 2009
  * *Who:* Pawel Solyga, Leslie Hawthorn
  * *ETA:* 1 week

Every year GSoC students request CPT letters or other documents that will confirm their participation in GSoC. Program Administrators print out GSoC student certificates for all students that successfully finished their projects. This process is very time consuming and we aim to automate it. External python script will be created with support for simple documents templates for different kind of documents including CPT letters and certificates. Script will be able to fetch data from Melange datastore about students and generate documents in pdf format using reportlab library. For certificates script will create one big ready to print pdf file that will include certificates for all students. For other documents where pdf generation will be much faster (few documents at a time) Program Administrator will be able to select students in Web UI, select document type he/she wants to send to the Student and with a click of a button, document pdf will be generated and send to user via email. Students should be also able to request those documents via web user interface and maybe cron jobs can autogenerate and send out those documents every couple hours automatically without any intervention from Program Administrator.

    * external script which will use remote api and reportlab
    * http://www.reportlab.org/rl_toolkit.html

<lh>
This feature will need to be able to embed images, e.g. scanned signature and company logo.

Future feature: make this functionality available to organizations to easily produce letters of recommendation for their students. Allow easy sharing of recommendation templates/good example letters.
</lh>

== clubs support ==
  * *Lead:* Lennard de Rijk
  * *Priority:* Medium
  * *Scheduled for:* August 2009
  * *ETA:* 2 weeks

Clubs within Melange are similar to User Groups. We would like to enable users to create different Clubs within Melange (i.e Apache Club could include all GSoC Apache students, mentors and org admins). Club owner will be able to manage memeberships, add/remove/invite/delete members. Club Members will be able to quickly apply to different projects by reusing their already created Club profile.

== dashboard view for Devs, Host, Org admin (all Roles) ==
  * *Lead:* Pawel Solyga, Sverre Rabbelier
  * *Priority:* Medium
  * *Scheduled for:* August 2009
  * *Who:* Merio Ferraro (GSoC), Daniel Hans (GSoC), Sverre Rabbelier, Pawel Solyga
  * *ETA:* 2-3 weeks

Showing failed students on the organization page with additional comments from both students and mentors. Requires additional discussion with GOSPO Team.

<lh>
I see this as very different from dealing with failed students. People want to see things like:
  * How many of my mentors still need to complete surveys?
  * What time zones are my people in so it's easy to match them up?

etc. There's all kind of data folks will want on a dashboard. This is a great place to solicit community feedback. We can choose how to limit what we implement and others are welcome to create their own views/etc. They have the source code.

</lh>

== KML GSoC generation ==
  * *Lead:* Pawel Solyga
  * *Priority:* Low
  * *Scheduled for:* August 2009
  * *Who:* Pawel Solyga, Merio Ferraro (GSoC), Daniel Hans (GSoC)
  * *ETA:* 1 week

KML should include location of all mentors and students and connections between them just like in previous years. Using libkml python bindings (http://code.google.com/p/libkml/).

KML example from GSoC 2008 can be found here:
  * http://code.google.com/soc/soc_map2008.kml

== integration with Google Documents API and Spreadsheets (exporting, importing data) == 
  * *Priority:* Low
  * *Scheduled for:* September 2009
  * *Who:* Melange Team
  * *ETA:* 2-3 weeks

Currently Melange provides limited export of lists into CSV file. We would like to extend this export to support Google Spreadsheets API. With this functionality we could export all kinds of data into users GSpreadsheet and then edit it inside Google Documents or export it to different formats including CSV, Excel, ODF and any other formats supported by Google Docs.

<lh>
I think this feature is more useful for the organizations than for Google. Exporting directly to a Google spreadsheet is fine, but then I'm just going to download and work with the file locally. Spreadsheets doesn't do a good job with *gigantic* reports (e.g. 1000 GSoC students)
</lh>

== meetings organizer (integration with Calendar API) ==
  * *Priority:* Medium
  * *Scheduled for:* October 2009
  * *Who:* Melange Team
  * *ETA:* 3 weeks

We would like to enable Program Administrators, Students, Mentors and Org admins to organize meetings withing Melange (invite users to attend a meeting, list registered event/meeting users, add meeting webpage, integration with Calendar API for reminders).

<lh>
Also should allow tagging, e.g. Debian, Python, San Francisco and search based on tags. Should also autopublish to program calendar.
</lh>

== advanced search functionality in Melange ==
  * *Priority:* Medium
  * *Scheduled for:* October 2009
  * *Who:* Melange Team
  * *ETA:* 1 month

Currently Melange doesn't support search functionality. We would like to add support for searching different Melange models including Users, Students, Mentors, Org admins, Students Proposals and Projects, Documents. This feature can be also integrated with ajaxy table view.

== diff tool for proposals (documents, tracking changes, rietveld, history) ==
  * *Priority:* Low
  * *Scheduled for:* November 2009
  * *Who:* Melange Team
  * *ETA:* 3 weeks

We want to be able to do diffs and revision histories on our documents, student proposals.
[http://en.wikipedia.org/wiki/Rietveld_(Software) Rietveld] source code might help us to archive this goal.


== fully functional wiki mode in documents ==
  * *Priority:* Medium
  * *Scheduled for:* November 2009
  * *Who:* Melange Team
  * *ETA:* 1 month

This feature aims to introduce additional mode for wiki like syntax in Melange documents, by setting document mode you can choose between WYSIWYG editor and Wiki syntax mode. 

<lh>
:)
</lh>

== geolocation based search functionality ==
  * *Priority:* Low
  * *Scheduled for:* November 2009
  * *Who:* Melange Team
  * *ETA:* 2-3 weeks

Every year GSoC students try to find other GSoCers that live in the same country or nearby their city. We would like to introduce geolocation based search functionality within Melange to allow Students, Mentors and Org admins to search for other Melange users nearby or in particular location. This feature can be integrated with meeting organizer to easily invite all users from within selected area.

== gallery with presentations, photos, videos ==
  * *Priority:* Low
  * *Scheduled for:* November 2009
  * *Who:* Melange Team
  * *ETA:* 3 weeks

With so many GSoC projects every year and internet media era, Melange is looking for a way to share GSoC students project presentations, screenshots, screencasts, GSoC related events photos, videos etc. This task aims to implement some form of gallery with presentations, photos, videos support (embedding presentations from Google Documents or other services, embedding photos from PicasaWeb, Flickr, embedding videos from YouTube, Vimeo).

Additional ideas:
    * Embed YouTube videos on personal profile page
    * Embed feeds, e.g. personal blog feed,  Identi.ca Feed, Twitter Feed, Facebook Feed

<lh>
:)
</lh>

== import data from previous years ==
  * *Lead:* Dan Bentley
  * *Priority:* Medium
  * *Scheduled for:* July - December 2009
  * *Who:* Dan Bentley
  * *ETA:* hard to determine

In previous years GSoC used different web application that was tight to Google infrastructure. The information about Students, Mentors and Org admins from previous years are still available and aim of this task is to import that data into our socghop instance of Melange. This task is non-trivial cause the data models in Melange and previous GSoC webapp are different so conversion script is required. 

== social features (friends, sending messages, gtalk) ==
  * *Priority:* Low
  * *Scheduled for:* December 2009
  * *Who:* Lennard de Rijk, Pawel Solyga
  * *ETA:* 1 month

Melange is looking for a way to extend communication between GSoC/GHOP participants (Mentors, Organization Administrators, Students). In order to do that we would like to implement a set of social features including possibility to send/receive messages to other users, add other users as friends or talk with other users via Google Talk via web interface (this features is in the Google App Engine roadmap).


    * GTalk integration (we are dependent on App Engine support for that)
    * Sending Messages
    * Managing Friends (add, invite, delete, list, search for friends)

<lh>
I think I'm just being a luddite, but I don't care about this at all. If I want to talk to someone, I am going to talk to them on IRC. I can see this being useful for first contact between mentors/students, e.g. "I'd like to talk to you about your proposal, can you please email me at ...."

Is their some useful way to be more inclusive in which instant messaging tools we'd support?
</lh>

== OpenSocial integration ==
  * *Priority:* Low
  * *Scheduled for:* January 2010
  * *Who:* Melange Team
  * *ETA:* hard to determine

This topic requires additional research in order to determine how we can use OpenSocial inside Melange and how long it will take to integrate that kind of functionality.