#summary Ideas List for GSoC 2010
#labels Importance-Featured,Contents-Draft,Featured

= Introduction =

 _While Melange will apply as an organization, there is no guarantee that we will be accepted as an organization for GSoC 2010.  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 =
----

= New Document Editor =

=== Description ===
We're looking for a better way to handle documents, document revisions and document editing in Melange. To do that we need to switch the text editor from TinyMCE to something better usable and safer when it comes to HTML. Documents are used throughout Melange to show and edit, for example, the very Home Page, organizations home pages and, most important, project proposals.

==== Characteristics we're looking for =====
  * Safe handling of HTML tags, or switch completely to Markdown syntax
  * Be able to add custom tags
  * Code highlighting (should be able to recognize automatically the language to highlight)
  * Support for anchors
  * Show images linked from the Net and/or uploaded to the system using BLOB API.
  * Be able to accept attachments (perhaps with checking over MIME part to accept only certain types of files)
  * Be able to add links
  * Control over appareance (left, right, center, bold, italic, color, etc)
  * Autosaving during editing
  * Be able to show diffs between editing (but it should be possible to turn it off for certain pages)
  * Document access control

We did an internal study about the switching and we're thinking the safer way to go is not to use HTML for editing at all (but we welcome new exciting proposals!), so probably a solution could be to use an already made Markdown editor. To do that we need a markdown parser and a markdown WYSIWYG (or at least a WYSIWYM) editor. On the backend side, we need to store different revisions of each document. The simplest way to do that is to store a new document each time it's edited and to show the differences on the frontend side using libraries like Google-Diff-Match-Patch. The hardest way is to have a proper revision control system completely written in Python. One challenge of this part of the project may be the showing of proper differences of the very Markdown tags.

==== Useful Links ====

  * [http://markitup.jaysalvat.com/home/ markItUp!]
  * [http://attacklab.net/showdown/ Showdown]
  * [http://www.ivan.fomichev.name/2008/04/javascript-creole-10-wiki-markup-parser.html Creole Parser]
  * [http://code.google.com/p/google-diff-match-patch/ Google-diff-match-patch]
  * [http://alexgorbatchev.com/wiki/SyntaxHighlighter SyntaxHighlighter]
  * [http://softwaremaniacs.org/soft/highlight/en/ Highlight.js]

=== Skills ===
  * JavaScript (and jQuery)
  * HTML
  * DHTML
  * Ajax
  * CSS
  * Python

=== Difficulty ===
Moderate

=== Mentors ===
  * Mario Ferraro (Merio on #melange)

----
=Testing, Code Guru, Code Quality Assurance=

===Description===

Melange is sorely lacking tests, and it's hurting our development speed significantly. What we need is a extensive set of unit tests for our logic and views, as well as functional tests to make sure that all views work as expected. This will require learning the codebase first, so as to know what something should do. Test-based exploring would be most suitable (learning how the codebase by writing tests that confirm that things work a certain way). We want test coverage such that it is possible to refactor a core function without doing any manual testing, and still be fairly certain that everything works as expected. On top of that, we want to be able to start doing TDD, which is a lot easier if there are a lot of tests already. All developers will be asked to include tests with their changes as soon as we start doing TDD, so once the momentum picks up things should get easier.

A lower priority, that can be pursued once we have decent test coverage, is to make sure that all pylint errors are fixed, and that all warnings are fixed or suppressed as appropriate. This way we can require that each commit introduces no new pylint errors, which will ensure some level of code quality.

===Skills===

  * Python
  * Django
  * Testing

===Difficulty===

Moderate, but requires a lot of effort

===Mentors ===

* Sverre Rabbelier (SRabbelier on #Melange)

----

=Social Features=

===Description===

Google Summer of Code is not only about coding, but it is also an annual event which gathers together thousands of people who belong to hundreds of communities or just start their adventure with open source.

We have received a number of requests for adding social features to Melange. Some users would like to update their work progress for public view, while others want to share their interests and activities. Maybe someone is giving a speech at a conference nearby and you are invited to drop in. There is also a large number of more or less official meetings which are often organized on students own initiative.

Currently we use our dedicated mailing lists for these purposes, but we definitely want something better.

The project ideas consist of a few parts which are rather independent, but in some parts they may interfere with each other.

==== Google Calendar API integration ====

As mentioned above, there is a lot of events and important dates. This part is mostly about integrating Google Calendar API into Melange, so that we are able to manage them.

I recon there should be a few different calendars:

 * one global calendar to emphasize program official dates and events (i.e. current timeline entries)
  * editable by: program host
  * visible to: everyone

 * one global calendar to show social events like unofficial student meetings, interesting open source conferences, etc.
  * editable by: program host, but all users may request putting a new event there
  * visible to: everyone

 * one private calendar for each accepted organization
  * editable by: organization admin
  * visible to: mentors and students who work for the organization

==== User personal page ====

Each user should be able to create her own personal page and customize its content within given permissions. The main requirements are that users can:
 * edit description using also HTML tags
 * add a personal photo (it should be quite easy to store it now thanks to the new Blobstore API)
 * maybe embed some custom gadgets; anyway we need to ensure that any code that is pasted by users is safe to prevent for example XSS vulnerabilities.
 * display all roles for all previous programs; the user should be able to either show or hide this information; this way it is more official so that users cannot take pride in fictional achievements
Besides the fact that the user has influence on how the page looks like, its general layout should be pleasing to the eye and readable.

==== Finding nearby students by geomodel ====

Is not it frustrating when you live in Europe and receive invitation to a conference which takes place in Australia? There is no doubt it is a marvelous country, but the chances that you will go are slim, aren't they? Thanks to geomodel project it is possible to filter the results the based on a given location. The project itself is still in its infancy, so working with it may require adding some changes. There may be not enough time to implement all interesting queries during the Google Summer of Code coding period, but adopting the source code to be useable for Melange would be a nice feature.

Of course this is only an initial draft. Other ideas on adding different social features are appreciated, thus the final range of the project may vary.

==== Friends list (LinkedIn, Facebook) ====
TBD

==== Useful Links ====

 * [http://www.google.com/calendar/ Google Calendar]
 * [http://code.google.com/apis/calendar/ Google Calendar API]
 * [http://code.google.com/appengine/docs/python/blobstore/ Blobstore API]
 * [http://code.google.com/p/geomodel/ Geomodel]

===Skills===
  * Python
  * JavaScript
  * HTML
  * CSS

===Difficulty===

Moderate/Hard (depending on the final goals)

===Mentors ===
 * Daniel Hans (dhans on #melange)

----
= Usability improvements =

=== Description ===
Melange has done its good work for Summer of Code 2009, but we're looking for usability enhancements to improve user experience throughout the workflow. It's no secret that the current architecture and, consequently, the current user interface has its rough edges. We've made some steps to improve user experience, for example, shrinking the sidebar (which, for developers and administrators, is very long) and, recently, beginning to integrate [http://www.trirand.com/blog/ jQGrid] to address [http://code.google.com/p/soc/issues/detail?id=201 Issue 201]. But much work still has to be done.
In an ideal world we should be able, for example, to use Ajax and DHTML more extensively for many tasks: to do this, however, something in the Python/Django architecture has to be changed.
Here some ideas to improve the user experience, but they're not "what we want", but "what we think we want": we very welcome fresh ideas from wannabe students. The most important thing to have in mind is that every improvement should follow the current minimalistic (Googley) style.
Prototypes and/or mockups are most welcome in proposals about this project.

  * *Sidebar*: The current sidebar shows, for example, the same links for each Organization in the system, which is unnecessary. To improve this, for example, we should either have a single page with the list of all organizations and the links that lead to the proper pages to deal with them or a superduper DHTML/Ajaxy sidebar that appear from a side of the page with a control panel (for example with a tab "Organizations", an autocomplete combobox to select an organization and the tasks that can be done over that organization). Another option is a sliding sidebar (iPod style), something that, clicking on a higher level link, slides to show only the second level and so on.

  * *Developer/owner control panel*: The control panel mentioned in the sidebar topic could be also a totally different page, which should address specific needs of each role. An iGoogle style control panel could be very welcome. Much code for iGoogle style interfaces has already been written during last year SoC project (from Mario Ferraro and Daniel Hans), [http://bitbucket.org/dhans/statistic-module-for-melange/ Statistics Module for Melange], which is not yet integrated in the main branch.

  * *Workflow/notifications*: in this moment the workflow is not very clear, for example, for a student. We would want to show current/next steps in the user's homepage and a more beautiful way to show notifications (e.g. when a mentor publish a new comment on project proposals), maybe integrated with the control panel mentioned before. Think about yourself: what you would like to know during the lifecycle of your project proposal? What has not been immediately clear when you first dealt with Melange?

  * *Client side/ajaxy form validation*: Even with tooltips shown for every field in Melange (they also need some refinement though), sometimes users put wrong stuff in form fields, and is common habit to alert the user in a friendly way without any page reloading (which takes time). So we would like to integrate some client side validation (e.g. over regular expressions), but there could be also the need to have some ajaxy roundtrip for particular checkings (e.g. link_id already existent). Some clever way to avoid most of the duplication that will come between JavaScript and Python cleaners/checkers is a plus.

  * *Autosaving of forms/documents*: This is something that could be catched by another project (see "New Document Editor"), but if no proposal is accepted we still would like to have it for better user experience. Sometimes it happened that users take much time to fill in forms and/or documents (either because they were thinking or left the computer because of any reason): obviously sessions have their timeouts, so when they were going to save their editings... a message complaining about not having logged in appeared to the user and an issue complaining about lost modifications appeared in our bug tracker :). So we need a way to autosave temporary informations in our models to avoid this kind of problem.

  * *Form design*: if you try to use Melange's survey module, you will find it working and functional but still with some rough edges on usability. We would like to find (and code!) a way to improve owner's user experience when it comes to create survey forms.

==== Useful Links ====

  * Sidebar
    * [http://www.barandis.com/dev/jquery/ddmenu/index.html BDC Drilldown Menu]
    * [http://www.filamentgroup.com/lab/jquery_ipod_style_and_flyout_menus/ iPod Drilldown]
    * [http://www.lanrentuku.com/down/js/daohang-541/ jGlide Menu]
    * [http://www.flash-free.org/wp-content/files/e24tabmenu/index2.html TabMenu]

  * Validation
    * [http://docs.jquery.com/Plugins/Validation jQuery Validation Plugin]
    * [http://plugins.jquery.com/project/validate jQuery Validate Plugin]

  * User interface
    * [http://www.gmail.com GMail]

=== Skills ===
  * JavaScript (and jQuery)
  * HTML
  * DHTML
  * Ajax
  * CSS
  * Python

=== Difficulty ===

Moderate/Hard

=== Mentors ===
  * Mario Ferraro (Merio on #melange)

----

=New Data Seeder=

=== Description ===
Everytime it comes to developer tools, most of developers are lazy or just overwhelemed by bug fixing and/or new exciting improvements that those tools are postponed forever. We make no exception! :) Although these tasks are normally not so exciting like bringing new end-user features, they are necessary for the whole application ecosystem, and to help developing ... new end-user features! Melange has two little cool modules (seed_db and seed_many) to seed the datastore, but they're quite outdated and doesn't respond to all our needs. Developing a fresh new and flexible module to seed the datastore to easen our work is going to be exciting as developing new end-user features. We would like an Ajaxy frontend and a strong bulletproof backend which communicates asynchronously with the frontend to make test cases easier to setup, which is easy to extend and mantain.

<DanielPleaseConfirmYourAvailability>
Be aware that some code about a new data seeder has already been written by the awesome Daniel Hans, so you might want to talk also with him to have some hints on writing your application.
</DanielPleaseConfirmYourAvailability>

==== Characteristics of the module ====

  * *Data seeder*: The data seeder should be a Python module which takes input from the frontend, does its duties and respond back to the frontend asynchronously (just to confirm that the Task has been activated). All seeded data should be distinguishable from user entered data. It should use Task Queue API for data seeding. Because it will be necessary to test and setup test cases also for statistics module, it could be quite complicated:

    * * Statistical distributions of data *: Having all students coming from USA and 1 year old is not the best thing when it comes to testing. Then we should need, for any model, a way to define a statistical distribution that the seeded data has to follow. Students ages, e.g., need to probably follow a normal distribution, not to forget that that distribution should be parametric: Summer of Code has no students under 18, but other events might accept different students age ranges. An exciting feature (although not required) would be to analyze past data of the same event in the datastore to gather probability densities. Same thing for students degree, country, other models details, etc.

    * * Easy to mantain *: Although standard melange models are not likely to change heavily in the future, no one knows... so we need to have a way to make the data seeder easy to mantain and extend. Maybe a clever use of Python reflection/introspection and (maybe?) some use of GAE metadata would make the module highly flexible.

    * * Dependency *: There's no way to create mentors if there are no organization seeded before. So, the seeder should be smart enough to tell the user that it should seed organizations first, or should give an option to automatically seed those organizations before seeding mentors. Also for this task, clever use of Python reflection and GAE metadata could give enough flexibility.

    * * Easy setup for test cases *: So, we would like to test the organization home page. But then a document for this organization must be created and associated with the organization home page. This is some kind of dependency, but it's not closely related to datastore, but to an abstract concept. Here it comes the flexibility for the seeder to accept some kind of configuration (probably guided by a JSON object that comes from the frontend) associated to test cases.

    * * Timeline *: Same thing for the timeline. If we want to test midterm surveys, we need to have the datastore seeded with everything that is necessary to go back and forth in the timeline.

    * * Options *: It should be possible to define some options for the seeder (e.g. number of entities to seed, number of org admins who are also mentors (fixed number or random)).

    * * GHOP/GSOC *: data should be seeded for multiple GSoC style programs instances, and also for GHOP style program instances (which are not seeded at all currently).

  * *Ajaxy frontend*: Because of Task Queue API lack of a "reverse" communication, there is no possibility to respond back to the client when a task has finished: standard GET and POST requests are to be done. Still, there is no need to have a page reloading when doing this, as also standard GET and POST requests can be sent asynchronously. About the frontend we would like some ideas from students, depending on the backend architecture they propose. Furthermore, the Ajaxy frontend can be very simple: Ajaxy in this project doesn't mean extreme DOM manipulation, just asynchronous communication. We strongly prefer an awesome data seeder than a fancy frontend, as the frontend can be improved lately if the backend is well developed.

=== Skills ===

  * Python
  * Some Django, Javascript, Ajax, HTML/CSS skills, although not strictly required, are a plus
  * Strong background in Statistic is a plus too

=== Useful Links ===

  * [http://code.google.com/appengine/docs/python/taskqueue/overview.html Task Queue API]

=== Difficulty ===

Moderate/Hard

=== Mentors ===

  * Mario Ferraro (Merio on #melange)

----

=Extending GHOP=

===Description===

*Notification system for GHOP: (This may make use of feeds module)*
  # At the moment GHOP Tasks have a single subscribe button, subscribing to it sends the notifications as mails. Every change to the task will trigger a notification. However user must be able to customize through some kind of dashboard or something, what kind of updates he wants. 
  # Also he must be able to configure it as Feeds(RSS, Atom or whatever) or mails or on-site(socghop.appspot.com) notifications
  # Also the notification system now works only when some event is triggered, like the state of task is changed. But we need a notification system in place for reminders too. For example if a task is claimed by a student, it should reminders to both mentors and students about the remaining time so that they spring into action.

*Statistics and visualization for GHOP: (May make use of the work Merio and Daniel have done during last GSoC)*
  # Each student should have access to data of his own work: 
    # Number of tasks requested
    # Number of tasks claimed
    # Number of tasks that I did not complete and subsequently reopened
    # Number of tasks that I completed
    # (Many more)
  # Similarly stats can be prepared per organization
  # And for the entire programme
  # Also per task
    # For instance, number of times a task was reopened

Visualizations like Pie chart etc can be plugged with these stats

There are many other possibilities. We will update them as and when we can think of them. Also if the potential student can do the work of going through our app and come up with ideas of what else can be extended, he will have an upper hand on others ;-) 

*Submitting/Uploading the work*
  * At the moment one can say on a GHOP Task that he has completed the task and put a link to it in the URL to your work field and give more info about the work as a text in the info field. But it is required for students to be able to submit their work which may contain diffs of the code, translations, wikis among other things or the full files of the work they have done. Few tasks may also require audio/video files, like the tasks which require making spoken tutorials, for instance. The way we accept the work submissions, store it and retrieve it must be redesigned. We may want to use the Blobstore property, which was added to Google Appengine recently, to achieve this.

*Automated Winner selection*
  * Melange should be able to automatically select winners and runners up from the data we have. The winners and runners up should be selectable organization wise and overall for a programme. The number of winners and runners up are already configurable through the programme configuration page. Melange should pick the winners based on this. 

*Extending GHOP Test suite*
  * GHOP almost doesn't have any tests except a couple of unit tests written for GHOPTask view. It is required to have an extensive and exhaustive test suite for GHOP module like it is required for GSoC module. The tests must include Unit and Functional tests. 

===Skills===

Skills are more or less same as mentioned at the top.

=== Useful Links ===

  * [http://code.google.com/p/soc/wiki/GHOPTODO GHOP TODO page]
  * [http://code.google.com/p/soc/wiki/GHOP GHOP Requirements Document]
  * [http://code.google.com/p/soc/wiki/GHOPImplementationDesign Implementation and Design document]
  * [http://code.google.com/p/soc/wiki/LifeOfaGhopTask]

===Difficulty===

Moderate

===Mentors ===

Madhusudan (madrazr on #melange)

----

= Other ideas =

  * Write a Wiki module, that adds Wiki functionality to Melange
  * integrate OpenSocial into Melange
  * add functional tests using twill
  * Profiling and Caching developer tools
  * extend functionality of our buildbot (post commit hooks, pylint integration, application deployment to testing App Engine instance)
  * add features that will enable to organize GSoC/GHOP Meetings (creating new events, managing participants, integration with Google Calendar API),
  * Melange API allowing any external page to list current status of tasks and tasks list, participating projects etc.
  * generating pdfs, docs of student applications
  * 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)\
  * Dashboard for mentor, org admin, host, student, developer with nice information/status box, updates, stats depending on the Role
  * Google Calendar API support for events planning
  * 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.

= Some Rough Notes =

   * Did we mention that we have an active IRC channel, #melange?
   * 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*, *Wiki*.