#summary Starter Manual for using GHOP module.
#labels Importance-Useful,Phase-Support,Contents-Draft

<wiki:toc max_depth="3" />

= Introduction =

  This document covers detailed explanation of how to use the Task-based work flow, GHOP module of Melange. These features are available for you to try out at the demo instance running at [http://melange-madhusudancs.appspot.com http://melange-madhusudancs.appspot.com]. It will soon be made available through [http://melange-demo.appspot.com http://melange-demo.appspot.com]


= Details =

  This document is exclusively written for users of the GHOP module of Melange, and is in no way a developer manual. If any of you are willing to contribute to GHOP module in particular, please ping any one of the developers on our IRC channel: #melange @ irc.freenode.net or on our developer mailing list.

  The following document is divided into 5 separate sections, one for each role of Melange.

== Program Admin(PA) ==

  A Program Admin(PA henceforth) is one who creates and manages a GHOP Program. He/She has all the rights of an Org Admin and a Mentor.

  * Create/Edit Program Admin profile: TBD
  * Create the GHOP program: TBD
  * Edit the GHOP Program: The PA will have a link on the sidebar under the <Program Name> menu to edit the Program profile. The following are the list of things that PA can set from the Program profile page:
    * Org Admin, Mentor, Student Agreement document link ids.
    * Home page link id
    * Minimum age of the participating student to be enforced and the date as of which this requirement must be met.
    * She can also set the maximum number of tasks that a student can claim simultaneously (1 for GHOP).
    * She can also set Winners and Runners-up per organization.

=== Timeline ===

A PA must set:

  * All the program specific timeline in the edit program timeline link available from the sidebar
  * Org App and all other survey timeline in the *Survey Create/Edit page*. Note Org Admins will not be able to apply as organizations just by setting the Org signup start and end dates in timeline but also be made sure that it is set in the Org App survey.


== Organization Admin (OA) ==

  An Organization Admin (OA henceforth) is one who creates and manages an Organization under the GHOP Program that PA has created. An OA does not have all the rights of a Mentor.  To perform any of the operations mentioned below i.e. to become an OA or to apply as an organization, the basic minimum requirement is to login to http://socghop.appsot.com with your Google account and create a profile by clicking on the "Create profile" link on the sidebar.

  The workflow to apply as a an organization and hence to become an OA
  * Once the Organization application period opens as per the program timeline a link titled "Apply to become an Organization" appears on the sidebar under the Programs menu's specific program for which Organization applications are open.
  * Login to http://socghop.appspot.com with the Google account you previously used to create your profile.
  * Click on the "Apply to become an Organization" link which is mentioned above.
  * Fill up the application and submit. *Note:* This form asks to specify a backup admin for the Organization and this is mandatory. You must specify the Link ID of another person who would like to be the backup admin for your Organization. And to specify the Link ID here in the backup admin field he/she should have already created a profile on http://socghop.appspot.com and that Link ID must be used.
  * Similarly you can submit applications to as many organizations as you would like to be OA of.
  * You can view the list of all the applications you have submitted by clicking on "List My Organization Applications" link under the same program.
  * The PA reviews your application and accepts or rejects it.
  * If your organization is accepted you will get a notification regarding the same.
    * To read the notification click on the "Notifications" link on the sidebar under the Users menu.
    * In the notification message click on the link that leads to a form where you can fill in your Organization profile.
    * Upon that you and the backup admin you had specified when you submitted the application will get a notification which contains the invitation to become an OA for the organization you registered the Organization profile with.
    * Clicking on that link will lead you(same for backup admin as well) to a page where you can accept/reject the invitation to become an OA for that Organization. Upon acceptance you are redirected to a form where you can fill in your OA profile.
    * On the sidebar you will now see a new submenu with your Organization name under the GCI Organizations menu which you can use to manage your Organization's work.
    * You may invite other users to become OAs or Mentors as you
  * However if your application was rejected no notification will be sent to you. But you can anyways find this out by clicking on the "List of participating organizations" link that appears on the sidebar under the same program once the accepted organizations are announced.


== Mentor ==

  A Mentor is one who mentors one or more student for accomplishing GHOP Tasks.

  * Suggest a new task/Edit the task: The deadline for the task cannot exceed 30 days i.e in terms of hours it cannot exceed 720 hours.

== Student ==

  A student is one who can claim a task, work on it, submit his work and win prizes.

  * If student submits no work and the initial deadline passes, the deadline is automatically extended for another 24 hours. This shoots a mail to all the subscribers to the task notifying about the deadline extension. The task of the status is set to ActionNeeded. If the student fails to submit any work in that extended deadline of 24 hours also, the task is automatically re-opened. To learn how to subscribe to the task read the Rules of subscription below.

== Public ==

  Any user. Every such user is differentiated as a logged-in or non-logged-in user.

= General =
== Subscription ==

  * A user is subscribed to a GHOP Task if the star button on the top of the Task public page preceding the task title is a glowing icon and is not subscribed otherwise.
  * He/She can subscribe to the task by clicking on the non-glowing star icon
  * And unsubscribe by clicking on the glowing icon.

Rules of the subscription game:
  * A mentor is automatically subscribed to the task the moment he suggests the task. Assigned mentors are *not* automatically subscribed to the task.
  * An Org Admin is automatically subscribed to the task the moment he creates the task.
  * A student is automatically subscribed to the task the moment he *Requests* to claim the task.
  * All other users must manually subscribe to the task by clicking on the star button.
  * No user is automatically unsubscribed from the task. All the users irrespective of a student who has claimed the task, Org Admin who created the task and mentor who suggested the task should unsubscribe from the task manually.