--- 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)