#summary This page lists all the TODOs for running GHOP program.
#labels Importance-Overview,Phase-Requirements,Contents-Update

<wiki:toc max_depth="3" />

*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 [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 this] 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
    # 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*
    # 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*
    # 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*
    # 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*
    # 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: [http://code.google.com/p/soc/wiki/GHOPImplementationDesign#Task GHOPImplementation and Design of Task model] 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:
    # Initialize the history property of the task to an empty string when the task is created.
    # 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.
    # 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 (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 :).