app/soc/logic/models/survey_record.py
changeset 2442 dd1f94c3594c
parent 2439 7fac0da44bbf
child 2443 2e86dbd47907
--- a/app/soc/logic/models/survey_record.py	Sun Jun 28 22:12:33 2009 +0200
+++ b/app/soc/logic/models/survey_record.py	Sun Jun 28 23:58:03 2009 +0200
@@ -22,8 +22,12 @@
   ]
 
 
+from google.appengine.ext import db
+
 from soc.logic.models import work
 from soc.models.survey_record import SurveyRecord
+from soc.models.survey_record import ProjectSurveyRecord
+from soc.models.survey_record import GradingProjectSurveyRecord
 
 
 class Logic(work.Logic):
@@ -38,5 +42,69 @@
     super(Logic, self).__init__(model=model, base_model=base_model,
                                 scope_logic=scope_logic)
 
+  def updateSurveyRecord(self, user, survey, survey_record, fields):
+    """ Create a new survey record, or get an existing one.
+
+    params:
+      user = user taking survey
+      survey = survey entity
+      survey_record = existing record, if one exists
+      fields = submitted responses to survey fields
+    """
+
+    if survey_record:
+      create = False
+      for prop in survey_record.dynamic_properties():
+        delattr(survey_record, prop)
+    else:
+      create = True
+      Record = self.getModel()
+      survey_record = Record(user=user, survey=survey)
+
+    schema = eval(survey.survey_content.schema)
+
+    for name, value in fields.items():
+      # TODO(ajaksu) logic below can be improved now we have different models
+      if name == 'project':
+        project = student_project.StudentProject.get(value)
+        survey_record.project = project
+      elif name == 'grade':
+        survey_record.grade = GRADES[value]
+      else:
+        pick_multi = name in schema and schema[name]['type'] == 'pick_multi'
+        if pick_multi and hasattr(fields, 'getlist'): # it's a multidict
+          setattr(survey_record, name, ','.join(fields.getlist(name)))
+        else:
+          setattr(survey_record, name, value)
+
+    # if creating evaluation record, set SurveyRecordGroup
+    db.put(survey_record)
+    return survey_record
+
 
 logic = Logic()
+# TODO separate project and grading logic into own class to overwrite methods
+project_logic = Logic(model=ProjectSurveyRecord)
+grading_logic = Logic(model=GradingProjectSurveyRecord)
+
+
+def updateSurveyRecord(user, survey, survey_record, fields):
+  """Create a new survey record, or get an existing one.
+
+  params:
+    user = user taking survey
+    survey = survey entity
+    survey_record = existing record, if one exists
+    fields = submitted responses to survey fields
+  """
+
+  # TODO(ajaksu) We should use class information here, but being careful about
+  # compatibility with existent records should the class change.
+  if hasattr(survey_record, 'grade'):
+    record_logic = grading_logic
+  elif hasattr(survey_record, 'project'):
+    record_logic = grading_logic
+  else:
+    record_logic = logic
+
+  return record_logic.updateSurveyRecord(user, survey, survey_record, fields)