Added Tasks to update/create GradingRecords for a given GradingSurveyGroup.
Also added a stub to update StudentProjects for a given GradingSurveyGroup.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/tasks/grading_survey_group.py Mon Jul 13 00:59:48 2009 +0200
@@ -0,0 +1,143 @@
+#!/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.
+
+"""Tasks related to Grading Survey Groups.
+"""
+
+__authors__ = [
+ '"Lennard de Rijk" <ljvderijk@gmail.com>',
+ ]
+
+
+import datetime
+import logging
+
+from google.appengine.api.labs import taskqueue
+
+from django import http
+
+from soc.tasks.helper import error_handler
+
+
+# batch size to use when going through StudentProjects
+DEF_BATCH_SIZE = 10
+
+
+def getDjangoURLPatterns():
+ """Returns the URL patterns for the tasks in this module.
+ """
+
+ patterns = [(
+ r'tasks/grading_survey_group/update_records$',
+ 'soc.tasks.grading_survey_group.updateOrCreateRecordsForSurveyGroup'),
+ (
+ r'tasks/grading_survey_group/update_projects$',
+ 'soc.tasks.grading_survey_group.updateProjectsForSurveyGroup')]
+
+ return patterns
+
+
+def updateOrCreateRecordsForSurveyGroup(request, *args, **kwargs):
+ """Updates or creates GradingRecords for the given GradingSurveyGroup.
+
+ Expects the following to be present in the POST dict:
+ group_key: Specifies the GradingSurveyGroup key name.
+ project_key: optional to specify which project was the last for which this
+ task was run
+ Args:
+ request: Django Request object
+ """
+
+ from soc.logic.models.grading_record import logic as grading_record_logic
+ from soc.logic.models.grading_survey_group import logic as survey_group_logic
+ from soc.logic.models.student_project import logic as student_project_logic
+
+ post_dict = request.POST
+
+ group_key = post_dict.get('group_key')
+
+ if not group_key:
+ # invalid task data, log and return OK
+ return error_handler.logErrorAndReturnOK(
+ 'Invalid updateRecordForSurveyGroup data: %s' % post_dict)
+
+ # get the GradingSurveyGroup for the given keyname
+ survey_group_entity = survey_group_logic.getFromKeyName(group_key)
+
+ if not survey_group_entity:
+ # invalid GradingSurveyGroup specified, log and return OK
+ return error_handler.logErrorAndReturnOK(
+ 'Invalid GradingSurveyGroup specified: %s' % group_key)
+
+ # check and retrieve the project_key that has been done last
+ if 'project_key' in post_dict:
+ project_start_key = post_dict['project_key']
+ else:
+ project_start_key = None
+
+ # get all valid StudentProjects from starting key
+ fields = {'program': survey_group_entity.scope,
+ 'status': ['accepted', 'failed', 'completed', 'withdrawn']}
+
+ if project_start_key:
+ # retrieve the last project that was done
+ project_start = student_project_logic.getFromKeyName(project_start_key)
+
+ if not project_start:
+ # invalid starting project key specified, log and return OK
+ return error_handler.logErrorAndReturnOK(
+ 'Invalid Student Project Key specified: %s' %(project_start_key))
+
+ fields['__key__ >'] = project_start.key()
+
+ # get the first batch_size number of StudentProjects
+ project_entities = student_project_logic.getForFields(fields,
+ limit=DEF_BATCH_SIZE)
+
+ # update/create and batch put the new GradingRecords
+ grading_record_logic.updateOrCreateRecordsFor(survey_group_entity,
+ project_entities)
+
+ if len(project_entities) == DEF_BATCH_SIZE:
+ # spawn new task starting from the last
+ new_project_start = project_entities[DEF_BATCH_SIZE-1].key().id_or_name()
+
+ # pass along these params as POST to the new task
+ task_params = {'group_key': group_key,
+ 'project_key': new_project_start}
+ task_url = '/tasks/grading_survey_group/update_records'
+
+ new_task = taskqueue.Task(params=task_params, url=task_url)
+ new_task.add()
+ else:
+ # task completed, update timestamp for last update complete
+ fields = {'last_update_complete': datetime.datetime.now()}
+ survey_group_logic.updateEntityProperties(survey_group_entity, fields)
+
+ # task completed, return OK
+ return http.HttpResponse('OK')
+
+def updateProjectsForSurveyGroup(request, *args, **kwargs):
+ """Updates each StudentProject for which a GradingRecord is found.
+
+ Expects the following to be present in the POST dict:
+ group_key: Specifies the GradingSurveyGroup key name.
+
+ Args:
+ request: Django Request object
+ """
+ # TODO(ljvderijk) implement this method
+ return http.HttpResponse('OK')