app/soc/logic/models/survey_record.py
changeset 2482 0e544df4d925
parent 2478 985fd974e095
child 2500 ecc16ffe174b
equal deleted inserted replaced
2481:031e5828f3a4 2482:0e544df4d925
    20 __authors__ = [
    20 __authors__ = [
    21   '"Lennard de Rijk" <ljvderijk@gmail.com>',
    21   '"Lennard de Rijk" <ljvderijk@gmail.com>',
    22   ]
    22   ]
    23 
    23 
    24 
    24 
    25 from google.appengine.ext import db
    25 from soc.logic.models import expando_base
    26 
       
    27 from soc.logic.models import work
       
    28 from soc.models.survey_record import SurveyRecord
    26 from soc.models.survey_record import SurveyRecord
    29 from soc.models.grading_project_survey_record import GradingProjectSurveyRecord
    27 from soc.models.grading_project_survey_record import GradingProjectSurveyRecord
    30 from soc.models.project_survey_record import ProjectSurveyRecord
    28 from soc.models.project_survey_record import ProjectSurveyRecord
    31 
    29 
    32 
    30 
    33 class Logic(work.Logic):
    31 class Logic(expando_base.Logic):
    34   """Logic methods for listing results for Surveys.
    32   """Logic methods for listing results for Surveys.
    35   """
    33   """
    36 
    34 
    37   def __init__(self, model=SurveyRecord,
    35   def __init__(self, model=SurveyRecord,
    38                base_model=None, scope_logic=None):
    36                base_model=None, scope_logic=None):
    39     """Defines the name, key_name and model for this entity.
    37     """Defines the name, key_name and model for this entity.
    40     """
    38     """
    41 
    39 
    42     super(Logic, self).__init__(model=model, base_model=base_model,
    40     super(Logic, self).__init__(model=model, base_model=base_model,
    43                                 scope_logic=scope_logic)
    41                                 scope_logic=scope_logic, id_based=True)
    44 
    42 
    45   def updateSurveyRecord(self, user, survey, survey_record, fields):
    43   def updateOrCreateFromFields(self, entity, properties, clear_dynamic=False):
    46     """ Create a new survey record, or get an existing one.
    44     """ Create a new SurveyRecord, or update an existing one.
    47 
    45 
    48     params:
    46     params:
    49       user = user taking survey
    47       entity = existing SurveyRecord, if one exists
    50       survey = survey entity
    48       properties = the properties to be set
    51       survey_record = existing record, if one exists
    49       clear_dynamic = iff True removes all dynamic properties before updating
    52       fields = submitted responses to survey fields
       
    53     """
    50     """
    54 
    51 
    55     if survey_record:
    52     if entity:
    56       create = False
    53       if clear_dynamic:
    57       for prop in survey_record.dynamic_properties():
    54         # remove all dynamic properties before we update
    58         delattr(survey_record, prop)
    55         for prop in entity.dynamic_properties():
       
    56           delattr(entity, prop)
       
    57       self.updateEntityProperties(entity, properties)
    59     else:
    58     else:
    60       create = True
    59       entity = super(Logic, self).updateOrCreateFromFields(properties)
    61       Record = self.getModel()
       
    62       survey_record = Record(user=user, survey=survey)
       
    63 
    60 
    64     schema = eval(survey.survey_content.schema)
    61     return entity
    65 
       
    66     for name, value in fields.items():
       
    67       # TODO(ajaksu) logic below can be improved now we have different models
       
    68       if name == 'project':
       
    69         project = student_project.StudentProject.get(value)
       
    70         survey_record.project = project
       
    71       elif name == 'grade':
       
    72         survey_record.grade = GRADES[value]
       
    73       else:
       
    74         pick_multi = name in schema and schema[name]['type'] == 'pick_multi'
       
    75         if pick_multi and hasattr(fields, 'getlist'): # it's a multidict
       
    76           setattr(survey_record, name, ','.join(fields.getlist(name)))
       
    77         else:
       
    78           setattr(survey_record, name, value)
       
    79 
       
    80     # if creating evaluation record, set SurveyRecordGroup
       
    81     db.put(survey_record)
       
    82     return survey_record
       
    83 
    62 
    84 
    63 
    85 class ProjectLogic(Logic):
    64 class ProjectLogic(Logic):
    86   """Logic class for ProjectSurveyRecord.
    65   """Logic class for ProjectSurveyRecord.
    87   """
    66   """
    89   def __init__(self, model=ProjectSurveyRecord,
    68   def __init__(self, model=ProjectSurveyRecord,
    90                base_model=SurveyRecord, scope_logic=None):
    69                base_model=SurveyRecord, scope_logic=None):
    91     """Defines the name, key_name and model for this entity.
    70     """Defines the name, key_name and model for this entity.
    92     """
    71     """
    93 
    72 
    94     super(Logic, self).__init__(model=model, base_model=base_model,
    73     super(ProjectLogic, self).__init__(model=model, base_model=base_model,
    95                                 scope_logic=scope_logic)
    74                                 scope_logic=scope_logic)
    96 
    75 
    97 
    76 
    98 class GradingProjectLogic(ProjectLogic):
    77 class GradingProjectLogic(ProjectLogic):
    99   """Logic class for GradingProjectSurveyRecord
    78   """Logic class for GradingProjectSurveyRecord
   102   def __init__(self, model=GradingProjectSurveyRecord,
    81   def __init__(self, model=GradingProjectSurveyRecord,
   103                base_model=ProjectSurveyRecord, scope_logic=None):
    82                base_model=ProjectSurveyRecord, scope_logic=None):
   104     """Defines the name, key_name and model for this entity.
    83     """Defines the name, key_name and model for this entity.
   105     """
    84     """
   106 
    85 
   107     super(Logic, self).__init__(model=model, base_model=base_model,
    86     super(GradingProjectLogic, self).__init__(model=model, base_model=base_model,
   108                                 scope_logic=scope_logic)
    87                                 scope_logic=scope_logic)
   109 
    88 
   110 
    89 
   111 logic = Logic()
    90 logic = Logic()
   112 project_logic = ProjectLogic()
    91 project_logic = ProjectLogic()