#summary Starter Manual for using GHOP module.
#labels Importance-Deprecated,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.