

**Note**: Please feel free to edit this wiki. This is an open wiki. But once the task is complete, please don't delete or remove them from this page. Please move them to the section named "DONE" at end of this page at least till we start using the features of issue tracker since there is no other way for us to keep track of the progress and things like where we were when we began and where we are now. Thanks for understanding.

# TODO
  * All issues in the issue tracker that have their milestone set to GHOP.  See [this](http://code.google.com/p/soc/issues/list?can=2&q=milestone%3AGHOP&colspec=ID+Type+Priority+DueBy+Status+Owner+Milestone+Effort+Skills+Summary&cells=tiles) page.(Priority - Varies)


  * Write a manual. We really need to get started with the manual right now at this young stage of the module. If we delay it any further, it is possible that we end up with nothing when it is most required. At the moment we only want User Manuals
    1. Write a manual for Program Admins - Explain how to create a program and how to edit the Program profile? How to assign task quota limits to Organizations? How to create/edit/delete Task Type Tags and Task Difficulty Tags? How to assign dates on the Timeline? And of course any other new features added. **Noirin will work on this, but probably not til after the other manuals are done**
    1. Write a manual for Org Admins - How to create Organization profile? How to invite other Org Admins and Mentors? How to Create/Edit/Delete Tasks (Must be really detailed)? How to assign mentors to the tasks? How to approve the tasks suggested by mentors? How to publish the tasks? How to handle actions on the task like assigning the task to claimed student or rejecting the claim, reviewing and requesting for more work or closing the task among other things? **Noirin is working on this**
    1. Write a manual for Mentors - How to suggest tasks and edit the suggested tasks? How to assign mentors to the tasks? How to handle actions on the task like assigning the task to claimed student or rejecting the claim, reviewing and requesting for more work or closing the task among other things? **Noirin is working on this**
    1. Write a manual for Students - How to search and navigate to tasks they want to work on? How to claim the task? How to submit their work? How and when to register as a student in the app? **Noirin will work on this**
    1. Write a manual for General Public - All general things :P. Things any person who is interested in following the programme can do? (Priority - **Extremely High**). **Noirin will work on this**

  * The star icon used for Subscription of Tasks and the check boxes used for Bulk approval of Tasks on Org Admin's View all Tasks page is broken on IE7. Debug and fix the issue. Pointers - app/soc/content/css/ soc-090730.css and soc-090708-ie.css. Note the css file names are susceptible to changes ;-). (Priority - Very High).

  * Fix the problem with InviteAcceptRedirect URLs. It doesn't redirect to correct URL (Priority - Very High).

  * Problem with history - The initial idea was to store history for each change made for every task in the task entity. This history may be important to know how many times a task was reopened, what really made the task to be reopened among other things. This is stored as JSON. See: [GHOPImplementation and Design of Task model](http://code.google.com/p/soc/wiki/GHOPImplementationDesign#Task) for more info as how this is implemented. After a small set of changes to that original idea, during the implementation phase, the plan is as follows:
    1. Initialize the history property of the task to an empty string when the task is created.
    1. When the task is first published, store the entire snapshot of the Task entity, i.e the values of all the entity properties is stored as JSON data as specified in the Implementation and Design page.
    1. For any further changes made to the task entity, we store the value of the property before change in the JSON.
> > This is not working as explained above. It must be debugged and fixed. Pointers - All the code resides in app.soc.modules.ghop.logic.models.task.Logic.updateEntityProperties(). (Priority - Very High).

  * Find two stars for subscribed/unsubscribed status for each Task on Task Public page.

  * We added references to GHOPProgram and GHOPOrganization in the Work Submission model recently. The corresponding changes should be made in the views as well. Pointers - app.soc.modules.ghop.views.models.task.View.publicPost(). There may be other places as well (Priority - High).

  * Remove all unused imports in all Python modules (Priority - High).

  * Fix Issue 450 (on Google Code) (Assigned to Madhusudan.C.S. priority - High).

  * The "Task quota" coloumn should be removed from the page that lists the organizations since this must not be shown on a public page (Priority - High)

  * Use the Appengine's new Blobstore APIs to accept work submissions. The submissions may contain code files itself, or the diffs of the code, translations, wikis etc. They may also contain audio/video files if the task requires them, for instance for tasks to create spoken tutorials. They may also take zip or tarred files. This entire work submission workflow has to be redesigned (Priority - Medium)

  * The ability to automatically select prize winners and runners per organization and overall for the program should be implemented. The requirements this must be discussed both in length and breadth with Leslie before we start implementing this. This also requires a design of how this will be achieved before we start implementing it (Priority - Medium)

  * Implement Task Search Filters - There must be a page to search for the tasks on various parameters like Organization, Type, Difficulty level, Tags etc. Pointers - app.soc.modules.ghop.views.models.task.View.search() (Priority - Medium).

  * If search filters are implemented for searching Tasks they must also include fields for searching based on time estimates for completing tasks. Pointers -  app.soc.modules.ghop.views.models.task.View.search() (Priority - Medium).

  * If search filters are implemented check for 9 public status in the Query. The 9 public status are Open, ClaimRequested, Claimed, ActionNeeded, NeedsWork, NeedsReview, Reopened, Closed, AwaitingRegistration. Make sure one can search only for the tasks in the above said states. Pointers -  app.soc.modules.ghop.views.models.task.View.search() (Priority - Medium).

  * Program Administrator will have access to special view listing all the GHOP students allowing her to filter the ones that didn't send form yet and by selecting them and clicking ‚'Remind' button, Melange would automatically send reminder email to all of the selected students. There is absolutely no code written for this. Probably it is better to start discussing about this with one of the developers on #melange before taking up this issue. Easy to implement but we need some design decisions before we start writing the code. (Priority - Medium).

  * Count of incomplete tasks for a student: Mentors/org admins should get information if student claimed some tasks but didn't complete (task was reopened), with the number of that kind of tasks. As with previous TODO, there is no code for this now. It is good to discuss with devs before progressing. (Priority - Medium).

  * Program Admin will have views to add/edit/delete Task Difficulty tasks and Task Type tags which are mandated to each GHOP Task by the program rules. This view is accessible to the Program Admin through the sidebar entry for the program. Editing tags to the name already exists must say you cannot rename since it already exists. Pointers - app.soc.modules.ghop.views.models.program.View taskDifficultyEdit(), difficultyTagEdit(), taskTypeEdit(), taskTypeTagEdit() and templates at app/soc/templates/modules/ghop/program/tag/ difficuly.html and task`_`type.html (Priority - Medium).

  * Continuing from above - We must either not allow or warn program admin to when she is deleting the tags that still have tasks attached to them. (Priority - Medium).

  * Again continuing from above, the templates app/soc/templates/modules/ghop/program/tag/ difficuly.html and task`_`type.html are really really duplicates of each other. These two must be merged into the same template file. May require minor modifications. Also look at the related view methods mentioned in above 2 TODOs. (Priority - Medium).

  * getExtraMenus() method of app.soc.views.models.organization.View is overridden in app.soc.modules.ghop.views.models.organization.View. The getExtraMenus() of the latter class must be modified to display the entries when the role are different. They are now tied to the roles specified in those methods. (Priority - Medium).

  * Program Admin can assign maximum number of tasks each participating Organization in GHOP can create and subsequently publish. We are currently using Appengine Datastore db.put() API to save this data. This code should be changed to use Appengine's whizkid :P - The Task Queue API. Pointers - app.soc.modules.ghop.views.models.program.View.assignTaskQuotas() (Priority - Low).

  * We must be able to display number of tasks that an organization can set out for contestants on Organization home page or public page or both. Pointers - app.soc.modules.ghop.views.models.View.`_`public() and app/soc/templates/modules/ghop/organization/ home.html and public.html. This is already done for the List of Organizations page, see app/soc/templates/modules/ghop/organization/list/row.html (Priority - Low).

  * Integrate Google Wave for GHOP Task comments and submissions. May seem really ambitious at the moment, but it will _really_ help when people start using Wave (Priority - Very Low) (Wave is dead guys!:-)

  * Remove application template from GHOP organization profile (Priority - Medium).

  * That would be nice if an org admin had a link "Become a mentor". Currently he or she needs to send an invitation, open a notification, read it and accept (Priority - Low).

## DONE

Cleaned out :).