#summary Ideas List for GSoC 2009
#labels Contents-Complete,Importance-Deprecated

= 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._


== [PossibleMentors Possible Mentors] ==
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 [http://en.wikipedia.org/wiki/MoinMoin MoinMoin] or [http://en.wikipedia.org/wiki/Rietveld_(Software) Rietveld].  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 [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)


===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: *[http://code.google.com/p/soc/wiki/TestingGuidelines Automated Testing]*, *World Domination* (ask), *Access Control Module*, *Profiling*, *Log Analysis*, *[http://code.google.com/p/soc/issues/list?can=2&q=&sort=-id Issue Tracker]*, *[http://code.google.com/p/soc/wiki/AccessControl Security]*, *Optimization(s)*, *Mentor Summit*, *GHoP*.