

# Introduction

> This document covers detailed explanation of how to use the Task-based work flow, GCI 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 GCI module of Melange, and is in no way a developer manual. If any of you are willing to contribute to GCI 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 GCI Program. He/She has all the rights of an Org Admin and a Mentor.

  * Create/Edit Program Admin profile: TBD
  * Create the GCI program: TBD
  * Edit the GCI 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 GCI).
    * 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 GCI 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://google-melange.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://google-melange.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://google-melange.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 GCI 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 GCI 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.


## Task

### Prologue

> A task can be claimed by students and hence completed during the program. At any point in time, every task will be in one of the following states:
  1. **Unapproved**
  1. **Unpublished**
  1. **Open**
  1. **Reopened**
  1. **ClaimRequested**
  1. **Claimed**
  1. **ActionNeeded**
  1. **NeedsWork**
  1. **NeedsReview**
  1. **Closed**
  1. **AwaitingRegistration**
  1. **Invalid**
In addition every task will have mentor(s) assigned and time to complete value, in hours, associated with it.


### A typical work flow

#### Setting up the scene

  1. Either an Org Admin(OA) creates or the Mentor suggests a new tasks under the organiazation.
  1. If the task was created by an OA it is automatically approved and hence in the **Unpublished** state
  1. If the task was suggested by a Mentor it is in the **Unapproved** state
    1. The OA can review the task and can either:
      1. Approve the task which changes the task status to **Unpublished**
      1. Or Publish the task directly which implicitly means the task is approved. This changes the status of the task **Open**. **Note to OAs**: It is not necessary to check the Approve box on the task edit form. If Publish box is checked it is implicitly assumed that the task is approved as well.
  1. If the OA thinks that the task is irrelevant or is a spam, he can delete the task which sets the task status to **Invalid**.
  1. The OA can unpublish the task as long as the task is not claimed by any student i.e as long as it remains in the **Open** state. It is not possible to unpublish the task once the task status changes from **Open** to any of the claimed states. This is because the task never returns back to **Open** state.
  1. An OA or the Mentor can edit the task as long as the task is not claimed by any student i.e. as long as it remains in one of the **Unapproved**, **Unpublished** or **Open** states. It is not possible to edit the task once the task status changes from **Open** state to any of the claimed states because of the same reason mentioned in the previous point.

#### Student enters

All the action on the task henceforth happens on the task public page. The following happens only after the Task is published, i.e. in the **Open** state.

  1. A student submits the action "Request to claim" the task along with an optional comment and waits for approval. The task moves to **ClaimRequested** state.
  1. This locks down both the task and the student to the task, meaning:
    1. No other student can request to the claim the same task.
    1. The student cannot request to claim another task. This also implies that if a student is already working on a task, he cannot request to claim any other task.
  1. OA or any Mentor of the organization(irrespective of being a mentor of that task) can do one of the following with an optional comment:
    1. Approve the request if it is valid and the student deserves it. The task moves to **Claimed** state.
    1. Reject the request if the request is invalid, irrelevant or a spam. The task moves to **Reopened** state.

#### Student gets involved

  1. If the claim request is accepted the deadline is set as specified by the time to complete field and the clock starts to tick. The student begins his/her work on the task.
  1. If the student completes the work set out by the task before the deadline, he/she can submit the work by posting an comment along with the URL to the work. Note that one of the comment or the URL field is mandatory. The task changes the state to **NeedsReview**.
  1. If the deadline passes with the student submitting no work, the deadline is automatically extended for another 24 hours. The task changes the state to **ActionNeeded** and the notification is sent to all the subscribers including the student if he has subscribed. For more about subscriptions read the section on subscriptions above.
  1. If the student fails to submit the work even after the extended deadline, the task will be automatically re-opened and the task status will be set to **Reopened**.
  1. If the student submits the work before this deadline passes, the same rule as the previous work submission rule applies.
  1. One of the Mentors of the task reviews the submitted work. The mentor can take one of the following actions:
    1. If the mentor is satisfied by the student's work he choses the action to "Close the task" along with an optional comment thereby marking the task as closed. The task moves to one of **AwaitingRegistration** or **Closed**. More about it below.
    1. If the mentor is not satisfied with the work but thinks that it requires rework and student can do it, he/she will choose the action "Needs More Work" with an optional comment. At this juncture the mentor has the option to extend the deadline for the student. The task status moves to **NeedsWork**. The cycle goes back to the point where student has to submit his/her work again.
    1. If the Mentor is completely unsatisfied with the student's work he/she will re-open the task. The task changes the state to **Reopened**. The new cycle with the same/another student requesting to claim the task begins.
  1. The student can withdraw from the task at any point in this entire workflow after he requests to claim the task. In such a case the task returns to **Reopened** state.

#### Student exits

  1. If the student's request to claim the task is rejected, the student can continue to request to claim the same task again or proceed to request to claim any other published task.
  1. If the student successfully completes a task, the task is closed by the Mentor. If the student is not registered yet the task status is set to **AwaitingRegistration**.
  1. In this situation the student should register with a student profile by clicking on the link "Register as a Student".
  1. **Note** that we don't want the students to register until they successfully complete at least one task.
  1. Also it is mandatory for the student to register once he completes the task, otherwise he cannot request to claim any more tasks and this task is not counted towards winner calculations.
  1. Once the student registers, the task which he completed and was in **AwaitingRegistration** state is automatically set to **Closed** state and the student can continue requesting to claim other tasks towards his conquest to win Google Code In.

### Epilogue
**Note:** Any registered user can post a comment on the task once the task is published.