Added GAE tasks that are related to updating GHOP Tasks.
authorMadhusudan.C.S <madhusudancs@gmail.com>
Thu, 27 Aug 2009 11:13:52 +0200
changeset 2817 c31428f08daa
parent 2816 bd2918172bfd
child 2818 4107ff19203a
Added GAE tasks that are related to updating GHOP Tasks. Several TODO's have been added. Also note that some functionality that is being used here is under construction and is being integrated asap. That's the price to pay for cleaner integration commits I guess :). Reviewed by: Lennard de Rijk
app/soc/modules/ghop/tasks/task_update.py
--- /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()