app/soc/modules/ghop/tasks/task_update.py
changeset 2817 c31428f08daa
child 2826 211783aa20d5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/modules/ghop/tasks/task_update.py	Thu Aug 27 11:13:52 2009 +0200
@@ -0,0 +1,158 @@
+#!/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.
+
+"""Appengine Tasks related to GHOP Task handling.
+"""
+
+__authors__ = [
+    '"Madhusudan.C.S" <madhusudancs@gmail.com>'
+  ]
+
+
+import logging
+import os
+
+from google.appengine.api.labs import taskqueue
+from google.appengine.ext import db
+
+from django import http
+from django.utils.translation import ugettext
+
+from soc.tasks.helper import error_handler
+from soc.views.helper import redirects
+
+from soc.modules.ghop.logic.models import task as ghop_task_logic
+
+
+DEF_TASK_UPDATE_SUBJECT_FMT = ugettext('[GHOP Task Update] %(title)s')
+
+
+def getDjangoURLPatterns():
+  """Returns the URL patterns for the tasks in this module.
+  """
+
+  patterns = [
+      (r'^tasks/ghop/task/update$',
+       'soc.modules.ghop.tasks.task_update.updateGHOPTask'),
+      (r'^tasks/ghop/task/update/student_status$',
+       'soc.modules.ghop.tasks.task_update.updateTasksPostStudentSignUp')]
+
+  return patterns
+
+
+def spawnUpdateTask(entity):
+  """Spawns a task to update the state of the task. 
+  """
+
+  update_params = {
+      'ghop_task_key': entity.key().name(),
+      }
+  update_url = '/tasks/ghop/task/update'
+
+  new_task = taskqueue.Task(eta=entity.deadline, 
+                            params=update_params,
+                            url=update_url)
+  new_task.add('ghop-update')
+
+
+def updateGHOPTask(request, *args, **kwargs):
+  """Method executed by Task Queue API to update a GHOP Task to
+  relevant state.
+
+  Expects the ghop_task_key entry to be present in the POST dict.
+
+  Args:
+    request: the standard Django HTTP request object 
+  """
+
+  post_dict = request.POST
+
+  key_name = post_dict.get('ghop_task_key')
+
+  if not key_name:
+    # invalid task data, log and return OK
+    return error_handler.logErrorAndReturnOK(
+        'Invalid updateGHOPTask data: %s' % post_dict)
+
+  entity = ghop_task_logic.logic.getFromKeyNameOr404(key_name)
+
+  entity, comment_entity, ws_entity = ghop_task_logic.logic.updateTaskStatus(
+      entity)
+
+  if entity:
+    # TODO(madhusudan): does this really mean an unsuccessful update?
+    # return OK
+    return http.HttpResponse()
+
+
+def updateTasksPostStudentSignUp(request, *args, **kwargs):
+  """Appengine task that updates the GHOP Tasks after the student signs up.
+
+  Expects the following to be present in the POST dict:
+    student_key: Specifies the student key name who registered
+
+  Args:
+    request: Django Request object
+  """
+  from soc.modules.ghop.logic.models import student as ghop_student_logic
+
+  post_dict = request.POST
+
+  student_key = post_dict.get('student_key')
+
+  if not student_key:
+    # invalid student data, log and return OK
+    return error_handler.logErrorAndReturnOK(
+        'Invalid Student data: %s' % post_dict)
+
+  student_entity = ghop_student_logic.logic.getFromKeyNameOr404(student_key)
+
+  # retrieve all tasks currently assigned to the user
+  task_fields = {
+      'user': student_entity.user,
+      }
+  task_entities = ghop_task_logic.logic.getForFields(task_fields)
+
+  # TODO(madhusudan) move this to the Task Logic
+  # Make sure the tasks store references to the student as well as
+  # closing all tasks that are AwaitingRegistration.
+  for task_entity in task_entities:
+    task_entity.student = student_entity
+    if task_entity.status == 'AwaitingRegistration':
+      task_entities.remove(task_entity)
+
+      properties = {'status': 'Closed'}
+      changes = [ugettext('User-MelangeAutomatic'),
+                 ugettext('Action-Student registered'),
+                 ugettext('Status-%s' % (properties['status']))]
+
+      comment_properties = {
+          'parent': task_entity,
+          'scope_path': task_entity.key().name(),
+          'created_by': None,
+          'changes': changes,
+          'content': ugettext(
+              '(The Melange Automated System has detected that the student '
+              'has signed up for the program and hence has closed this task.'),
+          }
+
+      ghop_task_logic.logic.updateEntityPropertiesWithCWS(
+          task_entity, properties, comment_properties)
+
+  db.put(task_entities)
+
+  # return OK
+  return http.HttpResponse()