#!/usr/bin/python2.5## Copyright 2009 the Melange authors.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License."""GradingRecord (Model) query functions."""__authors__ = [ '"Lennard de Rijk" <ljvderijk@gmail.com>', ]from google.appengine.ext import dbfrom soc.logic.models import basefrom soc.logic.models.survey_record import grading_logicfrom soc.logic.models.survey_record import project_logicimport soc.models.grading_recordclass Logic(base.Logic): """Logic methods for the GradingRecord model. """ def __init__(self, model=soc.models.grading_record.GradingRecord, base_model=None, scope_logic=None): """Defines the name, key_name and model for this entity. """ super(Logic, self).__init__(model=model, base_model=base_model, scope_logic=scope_logic, id_based=True) def updateOrCreateRecordsFor(self, survey_group, project_entities): """Updates or creates a GradingRecord in a batch. Args: survey_group: GradingSurveyGroup entity project_entities: list of project_entities which to process """ records_to_store = [] query_fields = {'grading_survey_group': survey_group} for project_entity in project_entities: # set a new project to query for query_fields['project'] = project_entity # try to retrieve an existing record record_entity = self.getForFields(query_fields, unique=True) # retrieve the fields that should be set record_fields = self.getFieldsForGradingRecord(project_entity, survey_group, record_entity) if not record_entity and project_entity.status in ['failed', 'invalid'] \ and not record_fields['mentor_record'] \ and not record_fields['student_record']: # Don't create a new GradingRecord for an already failed project which # has no records attached. Because it does not matter. continue if record_entity: # update existing GradingRecord for key,value in record_fields.iteritems(): setattr(record_entity, key, value) else: # create a new GradingRecord record_entity = self.getModel()(**record_fields) # prepare the new/updated record for storage records_to_store.append(record_entity) # batch put and return the entities return db.put(records_to_store) def getFieldsForGradingRecord(self, project, survey_group, record_entity=None): """Returns the fields for a GradingRecord. See GradingRecord model for description of the grade_decision value. Args: project: Project entity survey_group: a GradingSurveyGroup entity record_entity: an optional GradingRecord entity Returns: Dict containing the fields that should be set on a GradingRecord for this GradingSurveyGroup and StudentProject """ # retrieve the two Surveys, student_survey might be None grading_survey = survey_group.grading_survey student_survey = survey_group.student_survey # retrieve a GradingSurveyRecord survey_record_fields = {'project': project, 'survey': grading_survey} grading_survey_record = grading_logic.getForFields(survey_record_fields, unique=True) if student_survey: # retrieve ProjectSurveyRecord survey_record_fields['survey'] = student_survey project_survey_record = project_logic.getForFields(survey_record_fields, unique=True) else: project_survey_record = None # set the necessary fields fields = {'grading_survey_group': survey_group, 'project': project, 'mentor_record': grading_survey_record, 'student_record': project_survey_record} if not record_entity or not record_entity.locked: # find grading decision for new or unlocked records if not grading_survey_record: # no record found, return undecided grade_decision = 'undecided' elif not student_survey or project_survey_record: # if the grade is True then pass else fail grade_decision = 'pass' if grading_survey_record.grade else 'fail' else: # no ProjectSurveyRecord on file while there is a survey to be taken grade_decision = 'fail' fields['grade_decision'] = grade_decision # return the fields that should be set for a GradingRecord return fieldslogic = Logic()