# Introduction

> _We have been selected as a participating organization for GSoC 2012.  You're invited to drop by at #melange on FreeNode to discuss._

We would like our prospective students to propose new project ideas and discuss with Melange developers either here(in comments), #melange or our mailing list melange-soc-dev@googlegroups.com.

Every student is encouraged to clone our <a href='http://code.google.com/p/soc/source/checkout'>git repository</a>, solve <a href='http://code.google.com/p/soc/issues/list'>issues</a> and submit patches as part of the application process. <a href='http://code.google.com/p/soc/wiki/GettingStarted'>Here</a> is our getting started guide.

**ANY ORIGINAL IDEA WOULD BE VERY MUCH APPRECIATED :)**

# Project Ideas

## Testing, Code Guru, Code Quality Assurance

### Description

Melange has some decent tests, but we can do better. 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
**Still need to be confirmed, left this idea here as an example**

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

## New invitation/request module

### Description
Currently there is a feature to invite new mentors/admins by organization admins. People, who want to become mentors, may also request that role from organizations. The code is not perfect, so we are looking for a student to implement a new module that is better and does not have any limitations the current one have.

The project requires both server and client side work. From the backend perspective, new datastore design is needed. The current code has to be rewritten so that it is much clearer and completely thread-safe. For some current drawbacks you can search for the related issues in our issue tracker.

There are also some new features to be implemented. For example, it should be possible to invite people who do not have user accounts in Melange. They should receive an email which encourages them to create a profile and become a mentor.

Another point is to detect "spammers" who send requests to many organizations which they are not associated with.

Other interesting ideas how to improve the module are of course welcome.

On the client side we need UI that makes it obvious to users how to request a mentor role in the program. It should be also easy for organization admins to invite other users. Two modules, GSoC and GCI, need to be taken into consideration.

The other part of this project is to implement a function which would allow users to switch their roles between mentors and students. Currently, if someone, who wants to be a student, accidentally registers as a mentor, we have to change some fields in the datastore manually. It would be much more convenient for both us and the users, if they could change it on their own.

The first task of an accepted student will be to determine under what circumstances role changes should be allowed. Then new functionality should be implemented.

### Difficulty
Easy or Moderate
In order to successfully complete the project, the new modules have to be integrated before end of the program.
There is probably not enough work for a returning Melange student, so we would prefer to accept a rookie.

### Mentors
  * Daniel Hans


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