Added updateOrCreateFromFields method to SurveyRecordLogic.
authorLennard de Rijk <ljvderijk@gmail.com>
Thu, 02 Jul 2009 12:43:06 +0200
changeset 2482 0e544df4d925
parent 2481 031e5828f3a4
child 2483 be8a113ee021
Added updateOrCreateFromFields method to SurveyRecordLogic. The reading of the fields from the POST request will not happen in this Logic anymore.
app/soc/logic/models/survey_record.py
--- a/app/soc/logic/models/survey_record.py	Thu Jul 02 12:40:42 2009 +0200
+++ b/app/soc/logic/models/survey_record.py	Thu Jul 02 12:43:06 2009 +0200
@@ -22,15 +22,13 @@
   ]
 
 
-from google.appengine.ext import db
-
-from soc.logic.models import work
+from soc.logic.models import expando_base
 from soc.models.survey_record import SurveyRecord
 from soc.models.grading_project_survey_record import GradingProjectSurveyRecord
 from soc.models.project_survey_record import ProjectSurveyRecord
 
 
-class Logic(work.Logic):
+class Logic(expando_base.Logic):
   """Logic methods for listing results for Surveys.
   """
 
@@ -40,46 +38,27 @@
     """
 
     super(Logic, self).__init__(model=model, base_model=base_model,
-                                scope_logic=scope_logic)
+                                scope_logic=scope_logic, id_based=True)
 
-  def updateSurveyRecord(self, user, survey, survey_record, fields):
-    """ Create a new survey record, or get an existing one.
+  def updateOrCreateFromFields(self, entity, properties, clear_dynamic=False):
+    """ Create a new SurveyRecord, or update an existing one.
 
     params:
-      user = user taking survey
-      survey = survey entity
-      survey_record = existing record, if one exists
-      fields = submitted responses to survey fields
+      entity = existing SurveyRecord, if one exists
+      properties = the properties to be set
+      clear_dynamic = iff True removes all dynamic properties before updating
     """
 
-    if survey_record:
-      create = False
-      for prop in survey_record.dynamic_properties():
-        delattr(survey_record, prop)
+    if entity:
+      if clear_dynamic:
+        # remove all dynamic properties before we update
+        for prop in entity.dynamic_properties():
+          delattr(entity, prop)
+      self.updateEntityProperties(entity, properties)
     else:
-      create = True
-      Record = self.getModel()
-      survey_record = Record(user=user, survey=survey)
-
-    schema = eval(survey.survey_content.schema)
+      entity = super(Logic, self).updateOrCreateFromFields(properties)
 
-    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
+    return entity
 
 
 class ProjectLogic(Logic):
@@ -91,7 +70,7 @@
     """Defines the name, key_name and model for this entity.
     """
 
-    super(Logic, self).__init__(model=model, base_model=base_model,
+    super(ProjectLogic, self).__init__(model=model, base_model=base_model,
                                 scope_logic=scope_logic)
 
 
@@ -104,7 +83,7 @@
     """Defines the name, key_name and model for this entity.
     """
 
-    super(Logic, self).__init__(model=model, base_model=base_model,
+    super(GradingProjectLogic, self).__init__(model=model, base_model=base_model,
                                 scope_logic=scope_logic)