Add function for CSV export of survey records for a given survey.
authorPawel Solyga <Pawel.Solyga@gmail.com>
Mon, 05 Oct 2009 20:35:06 +0200
changeset 3016 63625e7e0cac
parent 3015 ad05c8063e37
child 3017 6689a4c8f02e
Add function for CSV export of survey records for a given survey.
scripts/stats.py
--- a/scripts/stats.py	Mon Oct 05 19:09:58 2009 +0200
+++ b/scripts/stats.py	Mon Oct 05 20:35:06 2009 +0200
@@ -733,6 +733,119 @@
   print "Exported Roles for Google Code to %s file." % csv_filename
 
 
+def entityToDict(entity, field_names=None):
+  """Returns a dict with all specified values of this entity.
+
+  Args:
+    entity: entity that will be converted to dictionary
+    field_names: the fields that should be included, defaults to
+      all fields that are of a type that is in DICT_TYPES.
+  """
+  from google.appengine.ext import db
+
+  DICT_TYPES = (db.StringProperty, db.IntegerProperty)
+  result = {}
+
+  if not field_names:
+    props = entity.properties().iteritems()
+    field_names = [k for k, v in props if isinstance(v, DICT_TYPES)]
+
+  for key in field_names:
+    # Skip everything that is not valid
+    if not hasattr(entity, key):
+      continue
+
+    result[key] = getattr(entity, key)
+
+  if hasattr(entity, 'name'):
+    name_prop = getattr(entity, 'name')
+    if callable(name_prop):
+      result['name'] = name_prop()
+
+  return result
+
+
+def surveyRecordCSVExport(csv_filename, survey_record_model, 
+                          survey_model, survey_key):
+  """CSV export for Survey Records for selected survey type and given survey key.
+  
+  Args:
+    csv_filename: the name of the csv file to save
+    survey_record_model: model of surver record that will be exported
+    survey_model: model of the survey that wil be exported
+    survey_key: key of the survey that records will be exported
+  """
+  from soc.models.project_survey import ProjectSurvey
+  from soc.models.grading_project_survey import GradingProjectSurvey
+
+  # fetch survey
+  survey = survey_model.get(survey_key)
+
+  if not survey:
+    print "Survey of given model and key doesn't exist."
+    return
+
+  schema = eval(survey.survey_content.schema)
+  ordered_properties = survey.survey_content.orderedProperties()
+
+  getSurveyRecords = getEntities(survey_record_model)
+  survey_records = getSurveyRecords()
+  survey_records_amount = len(survey_records)
+  print "Fetched %d Survey Records." % survey_records_amount
+
+  count = 0
+
+  print "Preparing SurveyRecord data for export."
+
+  sr_key = {}
+  comments_properties = []
+  for property_name in ordered_properties:
+    sr_key[property_name] = schema[property_name]['question']
+    if schema[property_name]['has_comment']:
+      sr_key['comment_for_' + property_name] = 'None'
+      comments_properties.append('comment_for_' + property_name)
+
+  for comment in comments_properties:
+    ordered_properties.append(comment)
+
+  survey_record_data = []
+  for i in survey_records.keys():
+    if str(survey_records[i].survey.key()) != survey_key:
+        continue
+    data = entityToDict(survey_records[i], ordered_properties)
+
+    if (survey_model == GradingProjectSurvey) or \
+        (survey_model == ProjectSurvey):
+      data['organization'] = survey_records[i].org.name
+      data['project_title'] = survey_records[i].project.title
+      data['user_link_id'] = survey_records[i].user.link_id
+
+      if survey_model == GradingProjectSurvey:
+        data['project_grade'] = survey_records[i].grade
+
+    survey_record_data.append(data)
+
+    count += 1
+    print str(count) + '/' + str(survey_records_amount) + ' ' + str(i)
+
+  if (survey_model == GradingProjectSurvey) or (survey_model == ProjectSurvey):
+    ordered_properties.append('organization')
+    ordered_properties.append('project_title')
+    ordered_properties.append('user_link_id')
+    sr_key['organization'] = 'None'
+    sr_key['project_title'] = 'None'
+    sr_key['user_link_id'] = 'None'
+
+    if survey_model == GradingProjectSurvey:
+      ordered_properties.append('project_grade')
+      sr_key['project_grade'] = 'None'
+
+  survey_record_data.insert(0, sr_key)
+
+  saveDataToCSV(csv_filename, survey_record_data, ordered_properties)
+  print "Survey Records exported to %s file." % csv_filename
+
+
 def main(args):
   """Main routine.
   """
@@ -793,6 +906,7 @@
       'exportOrgsForGoogleCode': exportOrgsForGoogleCode,
       'exportRolesForGoogleCode': exportRolesForGoogleCode,
       'startUniqueUserIdConversion': startUniqueUserIdConversion,
+      'surveyRecordCSVExport': surveyRecordCSVExport,
   }
 
   interactive.remote(args, context)