Added task to send out email for each processed GradingRecord.
authorLennard de Rijk <ljvderijk@gmail.com>
Tue, 14 Jul 2009 18:35:20 +0200
changeset 2647 69ac7307bb50
parent 2646 f1e7cf929d02
child 2648 c6d1c9ccef4a
Added task to send out email for each processed GradingRecord. If send_mail evaluates to True in the POST data for updateProjectsForSurveyGroup task then the results of every GradingRecord will be mailed to the Student. The Mentor and Org Admins will be cc'ed.
app/soc/tasks/grading_survey_group.py
--- 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()