# Introduction

> _We have been accepted as an organization for GSoC 2011.  You're invited to drop by at #melange on FreeNode to discuss._


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

---


# Better Google Code-in module

### Description

Google launched a new program in 2010 to encourage high school students to contribute to open source. The program is called as Google Code-in(GCI). Melange has a GCI module. But from the experience of running GCI for the first time in 2010, we have learned that GCI module can improved in a lot of areas. Some of the areas (including ideas) where GCI can be improved are:

  * Queuing system for student claim requests
    * Student task claims should be placed in a queue. If the first student withdraws or if the claim is rejected, next student should be advanced in the queue for claim request.
    * Mechanism to lock down the student to the task once the claim request is accepted rather than the current mechanism of locking the student as soon as she requests a task.
  * Allow one touch subscriptions (see issue 560 (on Google Code) in our issue tracker.)
  * Use channel APIs for notifications to give unobtrusive on-site live notifications.
  * Store task history. There is already a support for storing history. It needs to be reworked a lot and get it to working. We should be able to query on this data.
  * Publicly visible statistics for Google Code-in
  * Multiple file upload support for tasks
  * Upload files asynchronously (there is jQuery plugin for it. It needs to integrated with Melange.)

### Skills

  * Python
  * Django
  * Appengine
  * Basics of jQuery and CSS

### Difficulty

Moderate

### Mentors

  * Madhusudan C.S. (madrazr on #Melange)


---

# Google Code-in with new architecture

### Description

Melange is undergoing a major rewrite. The views layer is being rewritten. The UI is getting changed. We would like to follow the suite for the GCI module too.

  * Port GCI to the new Views architecture.
  * Add the dashboard functionality to users.

Just these two things may not be worth a full GSoC project. So students could look at the following things too while writing the proposal.

  * Data Seeder for GCI. There is already a data seeder for GSoC which is being integrated with Melange now. This needs to be extended to GCI too.
  * Tests for GCI.

### Skills

  * Python
  * Django
  * Appengine
  * Basics of jQuery and CSS
  * Basic knowledge of Principles of UX Design

### Difficulty

Moderate

### Mentors

  * Madhusudan C.S. (madrazr on #Melange)
  * Leo (Chong Liu)


---

# Melange/GSoC Administration Interface

### Description
Now that Melange is undergoing a big makeover we are in need of a proper administration backend to make the life of the Open Source Programs Office easier.

During your project you would need to gather requirements from the people who work with Melange at a day-to-day basis and if need be show them your work on a regular basis so that details can be refined. At the end of GSoC we would like to see an interface that allows them to run day-to-day operations such as finding/editing data on participants, editing settings of a program and being able to export a wide range of data.

If you are planning on sending us an application for this project we would like to see a suggestion of how the interface might be integrated in Melange but most importantly how you will approach the requirements elicitation and feedback process.

### Skills

  * Python
  * Django
  * Appengine
  * Basic knowledge of Principles of UX Design
  * Requirements gathering

### Difficulty

Moderate

### Mentors

  * None known yet.

---

# Integration with external API's

### Description

We would like to be able to export lists as well as Melange documents to Google Docs using the Docs APIs. This would involve using OAuth to get an auth token from the user, and then using the Google Data APIs to create a new document of the appropriate type.

Could also include integration with other services, such as the Email and XMMP api.

### Skills

  * Python
  * Google APIs

### Difficulty

Easy

### Mentors

  * Sverre
  * Mario Ferraro
  * Daniel Hans


---


# 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

  * Leo (Chong Liu)
  * Sverre Rabbelier (SRabbelier on #Melange)


---


# Other ideas

  * 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)
  * 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: **[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**, **Wiki**.