# 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 [wiki topic](GHOP.md) 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 [CSV](http://en.wikipedia.org/wiki/Comma-separated_values) 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.



&lt;LH&gt;


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 [other FOSS survey tool options](http://www.limesurvey.org/content/view/5/83/lang,en/).



&lt;/LH&gt;



## 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.



&lt;lh&gt;


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.)



&lt;/lh&gt;



## 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 (on Google Code).

## 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 (on Google Code).



&lt;lh&gt;


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.)



&lt;/lh&gt;



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



&lt;lh&gt;


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.


&lt;/lh&gt;



## 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.



&lt;lh&gt;


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.



&lt;/lh&gt;



## 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.



&lt;lh&gt;


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)


&lt;/lh&gt;



## 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).



&lt;lh&gt;


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


&lt;/lh&gt;



## 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.
[Rietveld](http://en.wikipedia.org/wiki/Rietveld_(Software)) 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.



&lt;lh&gt;


:)


&lt;/lh&gt;



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



&lt;lh&gt;


:)


&lt;/lh&gt;



## 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)



&lt;lh&gt;


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?


&lt;/lh&gt;



## 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.