# Introduction

> _While Melange will apply as an organization, there is no guarantee that we will be accepted as an organization for GSoC 2009.  You're invited to drop by at #melange IRC to discuss.  Help us make it happen._


## [Possible Mentors](PossibleMentors.md)
These are, in order, the most likely or best mentors for this project idea.

## Skills

  * All developers will need to have experience in, or be willing to learn Python.
  * Prior experience with Django or an equivalent framework would be a distinct plus.
  * Knowledge of JavaScript (AJAX), and a feeling for web design is big plus as well.

## Difficulty
'Easy', 'Moderate' or 'Hard'.  Hard is not necessarily better!  We are risk averse!

## Early Spinoffs

We want code that we can actually use, not code that shows great promise.  At the half way stage, you MUST have something complete that we can actually use as a 'spin off' of the work.  In discussing projects we will try to help you find ways to have spinoffs along the way.



---


---

# Idea Details

---


---


# Full Function Wiki

### Description
Either integrating [MoinMoin](http://en.wikipedia.org/wiki/MoinMoin) or [Rietveld](http://en.wikipedia.org/wiki/Rietveld_(Software)).  We're looking for a bit more than just having these in the same web server!  We want to be able to do diffs and revision histories on our documents.  We'd like to be able to have Melange tables show up in wiki pages.  We'd like to be able to create wiki pages based on a template specified as a quiz.


---


# Quiz Adapter

### Description
Melange currently has two different systems for forms.  There is the quiz system which is very flexible and dynamically changeable.  There is the custom page system, which is very well, customizable.  We'd like to marry the two systems which currently don't speak very much to each other by having a student who writes an adapter.  Ultimately we'd like to either have a super quiz system where we can use some of the customizations used on custom pages, or a super custom page system which is as flexible and dynamic as the quiz system.


---


# Statistics Module

### Description
Extract interesting statistics from the Melange data for the benefit of the program admin.  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)


### Skills
  * AJAX skills a plus.

### Difficulty
  * Moderate to hard.

### Early Spin Off
  * (For example) At half way stage ability to show a pie chart of students by location.  Also ability to show some stats of any kind broken down by the number of active projects in the organization, or by new or repeat organization.  Your mid term goals need to be clearly stated in your application.


---


# Other ideas

  * integrate OpenSocial into Melange
  * add features required for running Google Highly Open Participation Contest
  * write tests
  * add functional tests using twill
  * extend functionality of our buildbot (post commit hooks, pylint integration, application deployment to testing App Engine instance)
  * add feeds support for comments, announcements etc.
  * add features that will enable to organize GSoC/GHOP Meetings (creating new events, managing participants, integration with Google Calendar API)
  * support for Surveys inside Melange (creating surveys/editing surveys/ collecting surveys answers, surveys stats) similar form that we had in previous GSoC app, notifications about surveys,
  * Melange API allowing any external page to list current status of tasks and tasks list, participating projects etc.
  * generating pdfs, docs of student applications
  * generating csv, pdfs of tables content
  * integrating export functionality of tables, proposals with Google Docs (use Google Docs API)
  * upload of student presentations (storage, viewer)
  * work on selected issues from Melange Issue Tracker
  * Non US students should be able to upload their Tax forms via their Student dashboard page (no more faxing or sending via email)
  * Melange should enable admins/host to easily autogenerate CPT letter or letter of acceptance if one is needed/requested by student. This would generate pdf file ready to print based on the data from student profile (including program logo).
  * User (Roles) profiles (mentor/admin/student/organization admin/) with profile photo, functionality to share profile information with other GSoCers ) - privacy settings for your profile
  * dates that are setup in GHOP and GSoC Melange configuration page can be later automatically put into faq and terms of program in specific places
  * Melange survey module should have autosave forms functionality (just like in gmail)\
  * Table view with nice JS filtering option (ajax ?) - used for tasks, proposals, schools, countries, organization names, listing students, mentors etc, just any kind of table data view (this should be universal and reusable)
  * Dashboard for mentor, org admin, host, student, developer with nice information/status box, updates, stats depending on the Role
  * Melange will have access to blog urls and feeds from user profiles using Google FeedBurner (RSS/Feed) API we can create a nice Melange GSoC and GHOP blog planet and also add it to the Melange main page as it already done on many Google products pages
  * Advanced search functionality (student, mentor, school, organization etc)
  * Google Calendar API support for events planning
  * RSS feeds notifications about comments, events, important dates etc
  * Adding other GSoCers as friends to your profile,
  * Sharing profile data with other social network users
  * Messaging module allowing to send messages to other users (emails) (Way to improve communication between GSoCers, GHOPers)
  * Requesting profile data access
  * Better geo location features
  * Nice upload of profile photo with crop functionality via JS library.

### GHOP Melange features

  * Submitting Your Claim for Prizes Online and Submitting Your Parental Consent Form - instead of faxing or sending this forms via email to LH, student will have ability to upload scanned document to their GHOP profile account, Program Administrator will have access to special view listing all the GHOP students allowing her to filter the ones that didn't send form yet and by selecting them and clicking ‚'Remind' button, Melange would automatically send reminder email to all of the selected students (simple and efficient).
More:
http://groups.google.com/group/ghop-announce/web/how-to-claim-your-ghop-prizes
  * Special button to generate addresses from profiles in DHL,FedEx friendly format.
  * Parsing phone numbers in user profiles, acceptable formats: +1.650.214.8031, 16502148031, 1-650-214-8031, 1 (650) 214-8031, 1 (650) 214 8031, 1 650 214 8031
  * Mentors and org admins should be able to track students progress, completed tasks, open/reopened tasks, claimed tasks, there will be special views for that with filter options (status of the tasks should be open to public or not , Melange API ?)
  * Each task should have one of the following status:
    * Open: This task has not yet been claimed,
    * Reopened: This task has been claimed but never finished and has been reopened,
    * Claimed: This task has been claimed and someone is working on it,
    * ActionNeeded: Work on this task must be submitted for review within 24 hours,
    * Closed: Work on this task has been successfully completed.
  * Mentors and org admins should be able to setup task updates notifications
  * Any GHOP surveys should be done via Melange Survey module that would enable to create/edit/delete questions and build surveys from questions.
  * Using GHOP calendar and Calendar API mentors, admins, students would get reminders about important dates in the program, emails can be send to the program group or/and to users emails (same for GSoC, that way LH has less work and life is good)
  * Admin/host (LH) should be able to setup tasks limits for each participating project
  * Admin/host (LH) should be able to view all participating projects/organization in special view with simple statistics on the same page
  * Any additional statistics in Melange project should use Google Chart API and Google Visualization API
  * Maybe it would be wise to add progress variable to each task so that GHOP student can update the value of it during the time he works on the particular task (0%-100%), that will also allow mentor to track progress of students tasks, when task is 100% complete mentor can get email notification to take action on particular student task (Close it)
  * Informing mentor about completed task
  * Each GHOP task should be tagged (Documentation, User Interface, Code, etc), GHOP admin/host can setup available tags in GHOP Melange configuration page, that way later on there are no typos and Melange can easily generate statistics for particular types of tasks. Tasks will typically fall into the following categories:
    * Code: Tasks related to writing or refactoring code,
    * Documentation: Tasks related to creating/editing documents,
    * Outreach: Tasks related to community management and outreach/marketing,
    * Quality Assurance: Tasks related to testing and ensuring code is of high quality,
    * Research: Tasks related to studying a problem and recommending solutions,
    * Training: Tasks related to helping others learn more,
    * Translation: Tasks related to localization,
    * User Interface: Tasks related to user experience research or user interface design and interaction
  * Each GHOP tasks should have internal (mentors/org admins/hosts) or maybe public difficulty level, which can be later helpful in selecting grand prize winners and runner ups (not only amount of tasks counts but also quality of student work, task difficulty and other factors), organization has quick access to overview of what kind of tasks each student did and what's it's total point sum etc., this might be also available only for admins and mentors just in order to make a Grand Prize winners choosing process easier.
  * GHOP Melange should have a special configuration page
  * where you can setup dates like : when contest begins , when contest ends, what is the age (range) of the students that can participate for example: thirteen (13) years of age or older on November 27, 2007 (this date would be setup in configuration page and once student fill in profile data you can automagically check whether he can participate in contest)
  * where you can setup countries that the contest is not open to and automatically check for students from this countries and inform them about the problem
  * Selecting grand prize winner should be done via special view in the GHOP Melange project allowing admins and mentors quickly see particular student tasks, tasks amount and difficulty level (this process should be similar to how proposals are rated in GSoC)
  * Additionally using special view org admin can setup number of runner ups and select them from participating students (this can be later on used to automatically generate list of both grand prize winners and runner ups)
  * Prizes for completed entries - depending on the tasks amount , Melange should automatically setup prizes for each student (t-shirt, $ price), prices options and setup should be available via GHOP Melange configuration page
  * Claiming first task doesn ºt require to have full profile (just Google account), however after first completed tasks, students should also not be able to register for a second GHOP task until they have completed registration (we should send an email reminder). Without registration, there can be no shirt, that should be checked when Melange setups prizes for each student
  * Mentors/org admins should also get information if student claimed some tasks but didn't complete (task was reopened), with the number of that kind of tasks
  * Student cannot work on more than one task at a time (this was a problem with first edition of GHOP, since we had to find duplicates using python script) - Melange will not allow GHOP student to claim second task while he is still working on previous one. There will be no need for any additional duplicates check scripts.
  * There should be a view to see latest added tasks (maybe in dashboard ? or on main page ?)
  * There should be a way to easily see students completed tasks (by anyone)?
  * Tasks list per different criteria (also from different projects in one view)
  * Tasks list quota per project (admin should be able to change that)
  * GHOP Grand Prize winners are selected based on completed number of tasks, tasks quality, difficulty, student community activity and things like that, so it is not just number of completed tasks



---


# Some Rough Notes

  * Did we mention that we have an active IRC channel, #melange?
  * Melange is planning to participate in GSoC and planning to provide support for the GSoC infrastructure for GSoC in 2009.  Confused?  So are we at times.  If you see GSoC/M then the person who wrote it is making it clearer that it's about Melange participating in GSoC as a mentoring organization.  "We're getting ready for GSoC/M", means we're preparing pages like this one, getting mentors to commit to being mentors etc.  "We're getting ready for GSoC" could mean we're fine tuning the code ready for running the entire GSoC program.
  * Some words for you, to inspire more ideas: **[Automated Testing](http://code.google.com/p/soc/wiki/TestingGuidelines)**, **World Domination** (ask), **Access Control Module**, **Profiling**, **Log Analysis**, **[Issue Tracker](http://code.google.com/p/soc/issues/list?can=2&q=&sort=-id)**, **[Security](http://code.google.com/p/soc/wiki/AccessControl)**, **Optimization(s)**, **Mentor Summit**, **GHoP**.