# HG changeset patch # User Madhusudan C.S. # Date 1243211606 -7200 # Node ID e57a6d9eea4b2869dd36e4fe9ab58dfd97b04404 # Parent c05443664e3b33aeb36833e77ff192c704972d21 Added GHOP Task model. Reviewed by: Lennard de Rijk diff -r c05443664e3b -r e57a6d9eea4b app/ghop/models/task.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/ghop/models/task.py Mon May 25 02:33:26 2009 +0200 @@ -0,0 +1,181 @@ +#!/usr/bin/python2.5 +# +# Copyright 2009 the Melange authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module contains the GHOP Task Model. +""" + +__authors__ = [ + '"Madhusudan.C.S" ', + '"Lennard de Rijk" ', +] + + +from google.appengine.ext import db + +from django.utils.translation import ugettext + +import soc.models.linkable +import soc.models.organization +import soc.models.program +import soc.models.role +import soc.models.student +import soc.models.user + + +class Task(soc.models.linkable.Linkable): + """Model for a task used in GHOP workflow. + + The scope property of Linkable will be set to the Organization to which + this task belongs to. A link_id will be generated automatically and will + have no specific meaning other than identification. + """ + + #: Required field indicating the "title" of the task + title = db.StringProperty(required=True, + verbose_name=ugettext('Title')) + title.help_text = ugettext('Title of the task') + + #: Required field containing the description of the task + description = db.TextProperty(required=True, + verbose_name=ugettext('Description')) + description.help_text = ugettext('Complete description of the task') + + #: field indicating the difficulty level of the task. This is not + #: mandatory so the it can be assigned at any later stage. + #: The options are configured by a Program Admin. + difficulty = db.StringProperty(required=False, + verbose_name=ugettext('Difficulty')) + difficulty.help_text = ugettext('Difficulty Level of the task') + + #: Required field which contains the type of the task. These types are + #: configured by a Program Admin. + type = db.StringListProperty(required=True, + verbose_name=ugettext('Task Type')) + type.help_text = ugettext('Type of the task') + + #: A field which contains time allowed for completing the task (in hours) + #: from the moment that this task has been assigned to a Student + time_to_complete = db.IntegerProperty(required=True, + verbose_name=('Time to Complete')) + time_to_complete.help_text = ugettext( + 'Time allowed to complete the task, in hours, once it is claimed') + + #: List of Mentors assigned to this task. A Mentor who creates this + #: task is assigned as the Mentor by default. An Org Admin will have + #: to assign a Mentor upon task creation. + mentors = db.ListProperty(item_type=db.Key, default=[]) + + #: User profile to whom this task has been claimed by. This field + #: is mandatory for claimed tasks + user = db.ReferenceProperty(reference_class=soc.models.user.User, + required=False, + collection_name='assigned_tasks') + + #: Student profile to whom this task is currently assigned to. If the user + #: has registered as a Student than this field will be filled in. This field + #: is mandatory for all Tasks in the closed state. + student = db.ReferenceProperty(reference_class=soc.models.student.Student, + required=False, + collection_name='assigned_tasks') + + #: Program in which this Task has been created + program = db.ReferenceProperty(reference_class=soc.models.program.Program, + required=True, + collection_name='tasks') + + #: Required property which holds the state, the Task is currently in. + #: This is a hidden field not shown on forms. Handled by logic internally. + #: The state can be one of the following: + #: unapproved: If Task is created by a Mentor, this is the automatically + #: assigned state. + #: unpublished: This Task is not published yet. + #: open: This Task is open and ready to be claimed. + #: reopened: This Task has been claimed but never finished and has been + #: reopened. + #: claim_requested: A Student has requested to claim this task. + #: claimed: This Task has been claimed and someone is working on it. + #: action_needed: Work on this Task must be submitted for review within + #: 24 hours. + #: closed: Work on this Task has been completed to the org's content. + #: awaiting_registration: Student has completed work on this task, but + #: needs to complete Student registration before this task is closed. + #: needs_work: This work on this Tasks needs a bit more brushing up. This + #: state is followed by a Mentor review. + #: needs_review: Student has submitted work for this task and it should + #: be reviewed by a Mentor. + status = db.StringProperty( + required=True, verbose_name=ugettext('Status'), + choices=['unapproved', 'unpublished', 'open', 'reopened', + 'claim_requested', 'claimed', 'action_needed', + 'closed', 'awaiting_registration', 'needs_work', + 'needs_review'], + default='unapproved') + + #: A field which indicates if the task was ever in the Reopened state. + #: True indicates that its state was Reopened once, false indicated that it + #: has never been in the Reopened state. + was_reopened = db.BooleanProperty(default=False, + verbose_name=ugettext('Has been reopened')) + + #: This field is set to the next deadline that will have consequences for + #: this Task. For instance this will store a DateTime property which will + #: tell when this Task should be completed. + deadline = db.DateTimeProperty(required=False, + verbose_name=ugettext('Deadline')) + + #: Required field containing the Mentor/Org Admin who created this task + created_by = db.ReferenceProperty(reference_class=soc.models.role.Role, + required=True, + collection_name='created_tasks', + verbose_name=ugettext('Created by')) + + #: Date when the proposal was created + created_on = db.DateTimeProperty(required=True, auto_now_add=True, + verbose_name=ugettext('Created on')) + + #: Required field containing the Mentor/Org Admin who last edited this + #: task. It changes only when Mentor/Org Admin changes title, description, + #: difficulty, type, time_to_complete. + modified_by = db.ReferenceProperty(reference_class=soc.models.role.Role, + required=True, + collection_name='edited_tasks', + verbose_name=ugettext('Modified by')) + + #: Date when the proposal was last modified, should be set manually on edit + modified_on = db.DateTimeProperty(required=True, auto_now_add=True, + verbose_name=ugettext('Modified on')) + + #: A field which holds the entire history of this task in JSON. The + #: structure of this JSON string is as follows: + #: { + #: timestamp1: { + #: "user": User reference + #: "student": Student reference + #: ... + #: "state": "Unapproved" + #: ... + #: "edited_by": Role reference + #: + #: } + #: timestamp2: { + #: "state": "Unpublished" + #: } + #: } + #: First dictionary item holds the values for all the properties in this + #: model. The subsequent items hold the properties that changed at the + #: timestamp given by the key. + #: Reference properties will be stored by calling str() on their Key. + history = db.TextProperty(required=True, default='')