# HG changeset patch # User Lennard de Rijk # Date 1247582802 -7200 # Node ID 222be0eb4aab63679d56d6df5705e488d70d5a51 # Parent 1bb33f56a3f405792a49e4f6ab0fbf0129d6454b Added updateProjectsForGradingRecords to StudentProject Logic. This method takes a list of record_entities, processes them and batch puts the update StudentProjects. diff -r 1bb33f56a3f4 -r 222be0eb4aab app/soc/logic/models/student_project.py --- a/app/soc/logic/models/student_project.py Tue Jul 14 15:17:10 2009 +0200 +++ b/app/soc/logic/models/student_project.py Tue Jul 14 16:46:42 2009 +0200 @@ -22,6 +22,8 @@ ] +from google.appengine.ext import db + from soc.logic.models import base from soc.logic.models import organization as org_logic @@ -42,5 +44,66 @@ super(Logic, self).__init__(model=model, base_model=base_model, scope_logic=scope_logic) + def updateProjectsForGradingRecords(self, record_entities): + """Updates StudentProjects using a list of GradingRecord entities. + + Args: + record_entities: List of GradingRecord entities to process. + """ + + projects_to_update = [] + + for record_entity in record_entities: + + project_entity = record_entity.project + + if project_entity.status in ['withdrawn', 'invalid']: + # skip this project + continue + + # get the key from the GradingRecord entity since that gets stored + record_key = record_entity.key() + + passed_evals = project_entity.passed_evaluations + failed_evals = project_entity.failed_evaluations + + # try to remove this GradingRecord from the existing list of evals + if record_key in passed_evals: + passed_evals.remove(record_key) + + if record_key in failed_evals: + failed_evals.remove(record_key) + + # get the grade_decision from the GradingRecord + grade_decision = record_entity.grade_decision + + # update GradingRecord lists with respect to the grading_decision + if grade_decision == 'pass': + passed_evals.append(record_key) + elif grade_decision == 'fail': + failed_evals.append(record_key) + + if project_entity.status != 'completed': + # Only when the project has not been completed should the status be + # updated to reflect the new setting of the evaluations. + + if len(failed_evals) == 0: + # no failed evaluations present + new_status = 'accepted' + else: + new_status = 'failed' + else: + new_status = project_entity.status + + # update the necessary fields and store it before updating + project_entity.passed_evaluations = passed_evals + project_entity.failed_evaluations = failed_evals + project_entity.status = new_status + + projects_to_update.append(project_entity) + + # batch put the StudentProjects that need to be updated + db.put(projects_to_update) + logic = Logic()