app/soc/tasks/grading_survey_group.py
changeset 2647 69ac7307bb50
parent 2644 0eb27bb0122d
--- a/app/soc/tasks/grading_survey_group.py	Tue Jul 14 18:28:33 2009 +0200
+++ b/app/soc/tasks/grading_survey_group.py	Tue Jul 14 18:35:20 2009 +0200
@@ -45,7 +45,10 @@
       'soc.tasks.grading_survey_group.updateOrCreateRecordsForSurveyGroup'),
               (
       r'tasks/grading_survey_group/update_projects$',
-      'soc.tasks.grading_survey_group.updateProjectsForSurveyGroup')]
+      'soc.tasks.grading_survey_group.updateProjectsForSurveyGroup'),
+              (
+      r'tasks/grading_survey_group/mail_result$',
+      'soc.tasks.grading_survey_group.sendMailAboutGradingRecordResult')]
 
   return patterns
 
@@ -138,6 +141,8 @@
     group_key: Specifies the GradingSurveyGroup key name.
     record_key: Optional, specifies the key of the last processed
                 GradingRecord.
+    send_mail: Optional, if this string evaluates to True mail will be send
+               for each GradingRecord that's processed.
 
   Args:
     request: Django Request object
@@ -190,13 +195,27 @@
 
   student_project_logic.updateProjectsForGradingRecords(record_entities)
 
+  # check if we need to send an email for each GradingRecord
+  send_mail = post_dict.get('send_mail', '')
+
+  if send_mail:
+    # enqueue a task to send mail for each GradingRecord
+    for record_entity in record_entities:
+      # pass along these params as POST to the new task
+      task_params = {'record_key': record_entity.key().id_or_name()}
+      task_url = '/tasks/grading_survey_group/mail_result'
+
+      mail_task = taskqueue.Task(params=task_params, url=task_url)
+      mail_task.add('mail')
+
   if len(record_entities) == DEF_BATCH_SIZE:
     # spawn new task starting from the last
     new_record_start = record_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,
-                   'record_key': new_record_start}
+                   'record_key': new_record_start,
+                   'send_mail': send_mail}
     task_url = '/tasks/grading_survey_group/update_projects'
 
     new_task = taskqueue.Task(params=task_params, url=task_url)
@@ -204,3 +223,86 @@
 
   # task completed, return OK
   return http.HttpResponse('OK')
+
+
+def sendMailAboutGradingRecordResult(request, *args, **kwargs):
+  """Sends out a mail about the result of one GradingRecord.
+
+  Expects the following to be present in the POST dict:
+    record_key: Specifies the key for the record to process.
+
+  Args:
+    request: Django Request object
+  """
+
+  from soc.logic import mail_dispatcher
+  from soc.logic.models.grading_record import logic as grading_record_logic
+  from soc.logic.models.org_admin import logic as org_admin_logic
+  from soc.logic.models.site import logic as site_logic
+
+  post_dict = request.POST
+
+  # check and retrieve the record_key that has been done last
+  if 'record_key' in post_dict and post_dict['record_key'].isdigit():
+    record_key = int(post_dict['record_key'])
+  else:
+    record_key = None
+
+  if not record_key:
+    # no GradingRecord key specified, log and return OK
+    error_handler.logErrorAndReturnOK(
+        'No valid record_key specified in POST data: %s' % request.POST)
+
+  record_entity = grading_record_logic.getFromID(record_key)
+
+  if not record_entity:
+    # no valid GradingRecord key specified, log and return OK
+    error_handler.logErrorAndReturnOK(
+        'No valid GradingRecord key specified: %s' % record_key)
+
+  survey_group_entity = record_entity.grading_survey_group
+  project_entity = record_entity.project
+  student_entity = project_entity.student
+  mentor_entity = project_entity.mentor
+  org_entity = project_entity.scope
+  site_entity = site_logic.getSingleton()
+
+  mail_context = {
+    'survey_group': survey_group_entity,
+    'grading_record': record_entity,
+    'project': project_entity,
+    'organization': org_entity,
+    'site_name': site_entity.site_name,
+    'to_name': student_entity.name()
+  }
+
+  # set the sender
+  (sender, sender_address) = mail_dispatcher.getDefaultMailSender()
+  mail_context['sender'] = sender_address
+
+  # set the receiver and subject
+  mail_context['to'] = student_entity.email
+  mail_context['cc'] = [mentor_entity.email]
+  mail_context['subject'] = '%s results processed for %s' %(
+      survey_group_entity.name, project_entity.title)
+
+  # find all org admins for the project's organization
+  fields = {'scope': org_entity,
+            'status': 'active'}
+  org_admin_entities = org_admin_logic.getForFields(fields)
+
+  # collect email addresses for all found org admins
+  org_admin_addresses = []
+
+  for org_admin_entity in org_admin_entities:
+    org_admin_addresses.append(org_admin_entity.email)
+
+  if org_admin_addresses:
+    mail_context['cc'].extend(org_admin_addresses)
+
+  # send out the email using a template
+  mail_template = 'soc/grading_record/mail/result.html'
+  mail_dispatcher.sendMailFromTemplate(mail_template, mail_context)
+
+  # return OK
+  return http.HttpResponse()