

# 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.