# Main Improvements, Features and Fixes for Q3-Q4 '10

**Under Construction, just a copy of Q1-Q2**

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.

To be added to the list, needs to be made more tangible:
  * Testing, Sverre suggesting getting more time for it. Chong Liu's work should help.

| **Short Name** | **Description** | **Schelduled** | **Priority** | **Primary Contributors** |
|:---------------|:----------------|:---------------|:-------------|:-------------------------|
| Design UI Prototypes | Design and prototype new UI designs for Melange | 31 August      | High         | Mario Ferraro            |
| User Interface Discussion | Discussion and choosing of the new interface | 6 September    | High         | All                      |
| User Interface Implementation| Implementation of the new user interface. | TBD            | High         |                          |
|Internal User ID as a reference|Currently, we use email address as user ID, but then if that changes we don't have a correct reference to the user anymore and we have to fix things manually. This means to update current user models in the datastore and changing the current calls to getUserForCurrentAccount to work with the ID|                |Medium        |                          |
| JavaScript Refactoring | Refactor Melange JavaScripts to their separate module. | TBD            | Medium       | Mario Ferraro            |
|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           |                          |
|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.| 19 July (Depends on design) |Low           | Daniel Hans              |
|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      |                          |

## GHOP
| **Short Name** | **Description** | **Status** | **Duration** | **Schelduled** | **Priority** | **Primary Contributors** |
|:---------------|:----------------|:-----------|:-------------|:---------------|:-------------|:-------------------------|
|~~GHOP Organization Registration~~| Check/Fix/Implement the Organization registration for GHOP Organizations, including Org Admin and Mentor invitations. | Complete   | 1 week       | 14 June        | High         | Madhusudan               |
|~~GHOP Task Quota assignment~~| Create the page where Program Administrators can see/update the quota for each organization. Does not need to be Task API anymore because the current list can send along the keys, however it does need to scale. | Complete   | 2 weeks      | 21 June        | High         | Mario and Madhusudan     |
|~~GHOP Task creation by org admins~~| Allow GHOP Org Admins to create tasks for their own org which can be directly published or stored for later publishing. | Complete   | 2 weeks      | 5 July         | High         | Madhusudan               |
|~~GHOP Task suggestion by mentors, all can edit~~| Allow GHOP Mentors to suggest tasks for their organization and let the Org Admin accept/publish the task, both in bulk and on a per-task basis | Complete   | 1 week       | 12 July        | High         | Madhusudan               |
|~~GHOP Task workflow~~| Run the current workflow from the point that a task is published till the completion of a Task. Includes, checking access to make sure that a mentor/org admin can't claim a task and someone who has claimed a task or is a Student can't become a Org Admin/Mentor. | Complete   | 2 weeks      | 13 September   | High         | Madhusudan               |
|~~GHOP Task pages~~| Besides the per-task page there are a few more important pages to be checked/fixed/implemented. Namely the org home page with a lists of their tasks, a page with all tasks for a single program and a page for listing "My tasks" showing either the ones you have claimed or are mentoring. | Started    | 1 week       | 20 September   | High         | Madhusudan               |
| GHOP statistics | Page to gather GHOP Statistics, might make use of the work from Mario and Daniel. Most importantly we need to know who completed what amount of tasks on a overall and per-org basis.| Not started | 2 weeks      | 27 September   | High         | Daniel and Madhusudan    |
| ~~GHOP Notifications~~ | http://code.google.com/p/soc/issues/detail?id=921 | Complete   | 1 week       | 27 September   | High         | Madhusudan               |
| GHOP Task work upload | Allowing uploads to be made as part of a WorkSubmission | Won't fix for GHOP 2010 | 3 weeks      | 21 November    | Medium       | Madhusudan               |
| GHOP User Manual | There is a skeleton [GHOP User Manual in the wiki](http://code.google.com/p/soc/wiki/GHOPUserManual). This needs to include all the details and nuances about how to use GHOP module. | Started - Contributions needed | 2 weeks      | 4 October      | High         | Madhusudan and others    |
| GHOP Testing period | Similar to the GSoC testing period we will run GHOP through its paces publicly during this time. | Not started | 2 weeks      | 11 October     | High         | All                      |