# Main Improvements, Features and Fixes for Q1-Q2 '10

This page lists the different tasks that Melange will focus on during the upcoming months. Note that this list is far from complete in terms of other improvements we might make and that not everything on this list (prio medium or lower) might make it into Melange before the next months are over.


| **Short Name** | **Description** | **Schelduled** | **Priority** | **Primary Contributors** |
|:---------------|:----------------|:---------------|:-------------|:-------------------------|
| ~~Complete the Module Overhaul~~ |The new module system requires significant changes to our datamodels. These changes need to be rolled out using the GAE Task API on the live socghop server.|December 15, 2009|Very High     |Sverre Rabbelier and Lennard de Rijk|
|~~Putting Old Programs in Freeze mode~~|Although currently the inactive state is available for a program it does not yet put everything that has to do with the program into a state where the data can no longer be changed. Thought needs to go out to making sure the data is still available but not editable.|December 28, 2009|Very High     |Daniel Hans and Lennard de Rijk|
|~~New Organization Application Format~~|Extending the current Survey implementation with a new type of Survey to handle Organization Applications.|January 18, 2010|Very High     |Lennard de Rijk           |
|~~~Issue 201 (on Google Code)~~~|Implementing a searchable list that allows the user to fetch more then 1000 entities and sort on any column. Also this list should allow post operations on certain rows of the table.|January 18, 2010|High          |Sverre Rabbelier and Mario Ferraro|
|~~Taggable Organizations~~|Add tags to Organizations. At least two different tags are needed, programming language tags and arbitrary tags. The programming language tags might have to be preset or have some form of autocompletion to ensure that organizations fall under the same tag wether they use C++ or c++ as spelling. This also includes adding a page on which the organizations are grouped under their tags.|February 15, 2010|Medium        |Daniel Hans               |
|~~Finding duplicate accepted proposals using the Task API~~|Currently duplicate finding happens using async HTTP requests, this can now be done using the GAE Task API. This also makes it possible to automatically schedule the duplicate finding task to happen and semi-live update the lists for organizations. So that they can have more direct feedback on their students. (Note that this latter needs to be checked with LH).|February 15, 2009|High          |Madhusudan C.S.           |
|~~Org Application Processing using Task API~~|The current OrgApplication processing happens using async HTTP requests. Thanks to the introduction of the GAE Task API this can now be done more user friendly :).|February 22, 2010|High          |Lennard de Rijk           |
|~~Slot Assignment using Task API~~| The current slot assignment algorithm does not use the GAE Task API, this needs to be rewritten. The slot assignment algorithm helps to determine the amount of slots each organization will get. |February 22, 2010|High          |Sverre Rabbelier          |
| ~~Project Acceptance using Task API~~ | Accepting proposals and turning them into projects required use of the remote API. The Task API will allow us to get rid of using the remote API and allow this to happen with a press of a single button. |February 22, 2010|High          |Sverre Rabbelier          |
| ~~GSoC Testing Period~~ |As requested by the Organizations we will run the complete GSoC in 2 weeks to gather feedback and see if the system is ready.|February 22, 2010|Very High     |Sverre Rabbelier and Lennard de Rijk|
|~~StudentProposal Scoring Improvements~~|Allow the Org admins to lock out mentors from scoring proposals and add a way to directly influence the rank of a StudentProposal on the page that lists all these applications instead of only on the per-proposal page. This last might be achieved by using up/down arrows.|February 22, 2010|Medium        |Daniel Hans               |
|~~Make GradingSurveyGroup available to Hosts~~|Add the GradingSurveyGroup pages to the menu structure and ensure that Hosts are able to view them correctly.|July 1, 2010    |Medium        |Lennard de Rijk           |
|Improve the navigational structure|The current sidebar has grown over the last year to become a huge list. New (realistic) ideas are welcome on how to improve the navigational structure to accommodate for the large functionality we offer.|Discussion Topic|Medium        |                          |
|Per Org URL for Applying|The current StudentApplication uses the student as scope. This gives non-shareable URL’s for organizations to apply on. Unless changing the datamodel to become based around Orgs becomes viable for GSoC10 (a lot of dependencies with access and accepting/rejecting applications), a good solution would also be to introduce a URL that is not user-dependent but Organization dependent.|                |Low           |                          |
|~~Statistics Module Integration~~|Integrate the statistics module backend to work with the new module system. Also includes integrating the frontends for the hosts and users.|                |Low           |Daniel Hans               |
|Use HTTPS protocol for certain pages|This means enabling HTTPS for a certain set of pages such as edit pages for roles. See also Issue 445 (on Google Code).|                |Low           |                          |
|Enhance Notifications|This includes posting the complete notification in the email sent to the user and perhaps add the possibility to read them using an RSS feed (NewsFeed framework from James Levy)|                |Low           |                          |
|Add Surveys to the Statistics module|The Statistics modules seems like the perfect place to also handle the statistics that can be gathered from the Surveys collected within Melange.|                |Low           |                          |
|Internationalization|The text in Melange has now become quite stable and we do have a large user base within the Asian community. We should look into the possibility of adding and enabling translations. Research might be required into languages that read from right to left.|                |Low           |                          |
|Display changes in StudentProposals|A StudentProposal usually has multiple iterations. A request from the organizations was to make these changes more visible by somehow displaying the history of a proposal (diffs or complete histories are an idea)|GSoC 2010       |Very Low      |                          |