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