

# GSoC Project Info

| Madhusudan C.S | [Implementation of Task-based GHOP-like work flow](http://socghop.appspot.com/student_project/show/google/gsoc2009/melange/t124022698486) |
|:---------------|:------------------------------------------------------------------------------------------------------------------------------------------|

# Introduction

Required **background reading** for GHOP, especially Google documents linked from the archives, is the [GHOP Contest Administrative List](http://groups.google.com/group/sockhoppers).

A few big gotchas:
  * **Students cannot set tasks to claimed status**. This must be done by mentors. Perhaps this means we need to add a student accessible tag called "claim requested".
  * Students can only claim **_n_ task at a time**, where n is an option configurable by Program Admin in Program Configuration Page.
  * We are **not allowed to collect student personal details** like address, etc., until they have completed at least one task.
  * Once a task is out there and **claimed, it cannot be deleted** unless the contestant does not submit work for it. It is OK to delete created tasks if no one has claimed them.

These things are what make it legally OK to run GHOP as a contest. GHOP has to be a contest since we are dealing with those under the age of majority. I do not understand why the world has decided it is ok to give money to kids through a contest but not in other fashions. I <3 our lawyers since they understand this so I do not have to do so.

Worth noting: tasks have assigned mentors, but **GHOP is more about pooled mentoring** resources. Any mentor should be able to review any task if they'd like to, but an assigned mentor is the person committing to be the go to person for student questions. No reason not to have more than one mentor per task.

It was a big old pain in the past that we did not track **time estimates** for tasks systematically. Organizations need to set a **time limit** for each task, though it is at their option to extend the amount of time a student can work on a given task if good work is in progress.

For example, if an organization says a task should take two days, then a **clock counting down** from 48 hours should begin counting down as soon as a mentor sets the task to claimed status. It would be awesome if we could email mentors about when a task is due, this is detailed in email notifications below.

**Tasks are not scored, they are either done or not done**. The task states below define different states along the not done to done spectrum.

  * There is now a wiki page **[LifeOfaGhopTask](LifeOfaGhopTask.md)**.
  * List of **[GHOP issues](http://code.google.com/p/soc/issues/list?can=1&q=GHOP&sort=-id&colspec=ID+Summary)**, including stories and closed issues.
  * List of **[open GHOP issues](http://code.google.com/p/soc/issues/list?can=2&q=GHOP&sort=-id&colspec=ID+Summary)**.

  * Madhu: Can we call a few of the org admins/mentors who participated in previous GHOP for a meeting (IRC?), so we can **get their opinions on how to implement the new GHOP framework**, what was wrong last time and stuff (or e-mail)


# Details

## New general capabilities

_Edit hint: New page "New General Capabilities for GHOP" ?_

  * Submitting Your Claim for Prizes Online and Submitting Your Parental Consent Form - instead of faxing or sending this forms via email to Program Administrator, student will have ability to upload **scanned document** to their GHOP profile account
    * This design decision is much bigger than just accepting prize forms, etc. online. We need to be able to take actual work submissions via Melange, meaning we need folks to be able to upload a document file, or a jpeg file for a logo created, etc.
    * Action Item: **LH needs to talk to legal** to make sure that it is OK from Google's perspective to upload patches to this system. It was fine when we were using the issue tracker; would it still be OK using the socghop infrastructure.
    * Related issue: http://code.google.com/p/soc/issues/detail?id=44
    * Related [roadmap](http://code.google.com/p/soc/wiki/MelangeRoadmap2009) item: file upload support (avatars, patches, tax forms, etc)

  * We can accept files that are **up to 1Mb in Google App Engine**, patches usually are small, documentation too, the only probably we will have is screencast but we will figure it out. Due to GAE limitation we won't be accepting big files.

  * More about claiming prizes: http://groups.google.com/group/ghop-announce/web/how-to-claim-your-ghop-prizes

  * (Nice to Have) Using GHOP calendar and **Calendar API** mentors, admins, students would get **reminders about important dates** in the program, emails can be send to the program group or/and to users emails (same for GSoC, that way LH has less work and life is good)
    * Related [roadmap](http://code.google.com/p/soc/wiki/MelangeRoadmap2009) item: meetings organizer (integration with Calendar API)
    * We will prioritize work during our meeting.  Madhu is keen to do calendar support.

  * Mentors and org admins should be able to setup **task update notifications**.  Mentors/OAs should be able to add tags to tasks like needs rework or task closed because work was successfully completed.  If the task is updated (status changed or comment posted) students, mentors get an email. We already have notification system in place for GSoC but this might need some additional work.
    * If we are going to implement sending emails with these notifications, and it would be great if we could, we should figure out how to let folks set email notification rules, e.g. only email me when a task is updated closed/open. It may not be possible to do this in time for GHOP 2009, e.g. perhaps the best we can do would be either you choose to get emails or not get emails. (If you choose to get emails, you accept that you will get a lot of them.)
    * Related discussion [UserPreferencesPage](UserPreferencesPage.md) (and also issue 495 (on Google Code))

  * **Task activity info:** It should be possible to determine how many times a task has been reopened, how many students worked on it by anyone. This should also be easily available when generating reports.

  * If a student has requested to claim a task then, the task must be **locked down** so no one else requests it.

  * (NTH) Org Admins/Mentors should be able to **bulk upload** tasks from a CSV file.

  * (NTH) Org Admins/Mentors should be able to **bulk download** tasks into a CSV file.

  * (NTH) **RSS/Atom feeds** for keeping up with the progress of an Organization.

  * Org Admins should be able to **bulk accept** tasks - It can be a check box associated with each task in the list, and there should be a button to accept all checked tasks.
Also they must have ability to accept all tasks created by a particular mentor by typing in his name.

  * Check boxes for list of filtered tags. User must be able to check all the required tags and subscribe to them.

  * (NTH) [Repeatable Tasks](http://code.google.com/p/google-highly-open-participation-asf/issues/list?can=1&q=present&colspec=ID+Status+Owner+ClaimedBy+Summary&x=status&y=claimedby&cells=tiles)


## Task Fields

  * New Tags now in **[TagsInMelange](TagsInMelange.md)**

  * (Nice to Have) **Progress variable** for each task so that GHOP student can update the value of it during the time he works on the particular task (0%-100%), that will also allow mentor to track progress of students tasks, when task is 100% complete mentor can get email notification to take action on particular student task (Close it)
    * For now: This is a nice to have but really not essential and will create more work. If a mentor wants an update, they can set task state tag to ActionNeeded and request a status update. Given how fast these students work, I don't think they'll have time to update statuses before they are finished.
    * Madhu: Maybe we can have this field, but not mandatory? But % progress _is_ subjective and varies from student to student....

  * Each GHOP tasks should have _public_ **difficulty level**, which can be later helpful in selecting grand prize winners and runner ups (not only amount of tasks counts but also quality of student work, task difficulty and other factors), organization has quick access to overview of what kind of tasks each student did and what's it's total point sum etc., this might be also available only for admins and mentors just in order to make a Grand Prize winners choosing process easier.  Closely related to the need for **time estimates** and **time limits** in number of hours after the task is assigned for all tasks. This might tie into the overall concept of **tagging**, but more likely it is a numerical measure of how many hours it is expected to take.

  * **Task preparation (privately):** Tasks should have a way to be hidden from the students until an org admin decides they are ready to be published.

## New task related views

  * There should be a view to see all the tasks on a public page. This is also helpful for publicity. Should be publicly viewable, so public page sounds like better option than dashboard. These tasks can be filtered in following ways:
    1. Organization.
    1. Difficulty level.
    1. Type of Task.
    1. State of Task.
    1. Time required for completing it.
    1. Latest Added.
    1. Students (LH should get permission from legal team).
> > Sorting of tasks based on tags should be allowed.

  * Program Administrator should have a special view to assign or tune the tasks list **quota per project** at any instant of time when the program is active. Note: An organization administrator should not be able to arbitrarily change their own task quota, as a sponsor is only committing to provide a certain amount of prize money.

  * There is no reason not to **display the overall number of tasks** that an organization can set out for contestants publicly.  Let's do so.


## Public Tracking of Students

_All work on these tasks should be public, meaning claiming is public, it is public when review is needed, review comments are public, etc._

  * Selecting grand prize winner should be done via public views in the GHOP Melange project showing **student tasks, tasks amount and difficulty level**

  * (Required) Anyone should be able to track students progress, **completed tasks, open/reopened tasks, claimed tasks**, there will be special views for that with **filter options** (status of the tasks should be open to public)


## Dashboards
### Program Admin dashboard features

  * GHOP Melange should have a special configuration page where you can setup dates like : **dates:** when contest begins , when contest ends, what is the age (range) of the students that can participate for example: thirteen (13) years of age or older on November 27, 2007 (this date would be setup in configuration page and once student fill in profile data you can automagically check whether he can participate in contest
  * (Drop if time shortage) 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.
  * Program Administrator should be able to setup **tasks limits** for each participating project (similar to slots for GSoC)

**Timeline _logic_** already created for Summer of Code will be used for GHOP too.  However the important dates for a GHOP based program need to be added to the respective TimeLine model. The extra dates are: Contest start, Contest End and "No more Claims" Deadline.

**Q:** Will we register dates with 'timeline', or will we derive a subclass?

**A:**



### Mentor/Org-Admin dashboard features

  * None for this GHOP?  It's all in public trackers.

  * [For\_GHOP\_20](For_GHOP_20.md) Selecting grand prize (this process should be similar to how proposals are rated in GSoC but public)
  * [For\_GHOP\_20](For_GHOP_20.md) Additionally using special view org admin can **setup number of runner ups** and select them from participating students (this can be later on used to automatically generate list of both grand prize winners and runner ups)
  * More explanation of **Automatic Prizes**, which could be part of the dashboard, has been moved to **[For\_GHOP\_20](For_GHOP_20.md)**.

Organization will just pick the grand prize winner student and runners ups in the web ui where they already have access to all the students and their tasks. That way we can easily generate a page which shows selected students.


### Student dashboard features (?)

  * If task progress variables are used, student needs a way to view and **set task progress**.
  * Students must be able to **request to claim a particular task**, **withdraw** and **submit their work** (either as links to their actual work and/or file upload if we get legal consent) and request for review by setting **"NeedsReview"** for the task.
  * Provide students an option to mark the tasks they like, so organizations can get back to them when they have similar tasks or also helps for generating reports and feedbacks for organizations.

## Custom logic

**Essential**
  * **Push for registration.   "No-reg no-shirt" :** Claiming first task doesn't require to have full profile (just Google account), however after first completed tasks, students should also not be able to register for a second GHOP task until they have completed registration (we should send an email reminder). Without registration, there can be no shirt, that should be checked when Melange setups prizes for each student
  * **N tasks in progress:** Student cannot work on more than n tasks at a time, which is specified via program configuration page (this was a problem with first edition of GHOP, since we had to find duplicates using python script) - Melange will not allow GHOP student to claim n+1th task while he is still working on previous ones. There will be no need for any additional duplicates check scripts.
  * Enforce **task limit** for orgs.
  * Informing mentor about completed task.  This means that **mentors get a notification (email likely) that a student has submitted work** for a particular task that requires mentor review. Without the task being reviewed and closed (as in, the work for this task meets requirements and you get the prize for completing it), the student cannot go on to the next task. Hence, we want to make sure their work is reviewed quickly to keep them motivated.  Perhaps we make this the only student editable tag. Like a tick box for setting a tag that org admins and mentors can see that adds a tag automatically that says "NeedsReview" See tags section above.


**Human not computer logic**
  * GHOP Grand Prize winners are selected based on completed number of tasks, tasks quality, difficulty, student community activity and things like that, so it is not just number of completed tasks.  **This is mostly a manual process from examining the sorted list of student results**

**Nice to have**
  * **Count of incomplete tasks for a student:** Mentors/org admins should also get information if student claimed some tasks but didn't complete (task was reopened), with the number of that kind of tasks

## Dependencies on GSoC student work
  * (Nice to have) Any GHOP **[surveys](SurveysModule.md)** should be done via Melange Survey module that would enable to create/edit/delete questions and build surveys from questions.
  * (Nice to have) Any additional **[statistics](StatisticsModule.md)** in Melange project should use Google Chart API and Google Visualization API
  * (Nice to have) Program Administrator should be able to view all participating projects/organization in special view with simple **statistics on the same page**


[Surveys](SurveysModule.md) are not required to run GHOP, nor are [statistics](StatisticsModule.md), however, both features are highly desirable.  Each contributes to making GHOP easier to run by giving more information about how GHOP is progressing.  GHOP's requirements may influence some decisions about what order features of these GSoC projects should be tackled in and will help to shape the detailed requirements for these features.

Really, these are all nice to haves for now. **Really nice to have, but NTHs nonetheless**. We need to get core functionality working before we worry about running better reports and asking for feedback, etc. systematically.  We need to focus on getting the core functionality running first. However our GSoC students are going to work Surveys and Statistics modules so we will make sure that they are generic enough to be reused for both GSoC and GHOP program types.