#summary Design/discussion for GHOP
#labels Importance-Useful,Contents-Review,Phase-Requirements

<wiki:toc max_depth="3" />

= GSoC Project Info =

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

= Introduction =

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

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]*.
  * List of *[http://code.google.com/p/soc/issues/list?can=1&q=GHOP&sort=-id&colspec=ID+Summary GHOP issues]*, including stories and closed issues.  
  * List of *[http://code.google.com/p/soc/issues/list?can=2&q=GHOP&sort=-id&colspec=ID+Summary open GHOP issues]*.

  * 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 [http://code.google.com/p/soc/wiki/MelangeRoadmap2009 roadmap] 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 [http://code.google.com/p/soc/wiki/MelangeRoadmap2009 roadmap] 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] (and also issue 495)

  * *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) [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 Repeatable Tasks]


== Task Fields ==

  * New Tags now in *[TagsInMelange]*

  * (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:
     # Organization.
     # Difficulty level.
     # Type of Task.
     # State of Task.
     # Time required for completing it.
     # Latest Added.
     # 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] Selecting grand prize (this process should be similar to how proposals are rated in GSoC but public)
  * [For_GHOP_20] 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]*.

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 *[SurveysModule surveys]* 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 *[StatisticsModule statistics]* 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*


[SurveysModule Surveys] are not required to run GHOP, nor are [StatisticsModule statistics], 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.