diff -r a24b2b4af87d -r dd1f94c3594c app/soc/logic/models/survey_record.py --- 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)