def create_assessment( team_submission_uuid, scorer_id, options_selected, criterion_feedback, overall_feedback, rubric_dict, scored_at=None ): """ Creates an assessment for each member of the submitting team. Closely mirrors openassessment.assessment.api.staff.py::create_assessment Can use _complete_assessment from Staff API as is, but has the side-effect of only associating the last graded assessment with the workflow Returns: dict: the Assessment model, serialized as a dict. """ try: try: scorer_workflow = TeamStaffWorkflow.objects.get(team_submission_uuid=team_submission_uuid) except TeamStaffWorkflow.DoesNotExist: scorer_workflow = None # Get the submissions for a team team_submission = team_submissions_api.get_team_submission(team_submission_uuid) assessment_dicts = [] for submission_uuid in team_submission['submission_uuids']: assessment = _complete_assessment( submission_uuid, scorer_id, options_selected, criterion_feedback, overall_feedback, rubric_dict, scored_at, scorer_workflow ) assessment_dicts.append(full_assessment_dict(assessment)) return assessment_dicts except InvalidRubric as ex: error_message = "The rubric definition is not valid." logger.exception(error_message) raise StaffAssessmentRequestError(error_message) from ex except InvalidRubricSelection as ex: error_message = "Invalid options were selected in the rubric." logger.warning(error_message, exc_info=True) raise StaffAssessmentRequestError(error_message) from ex except DatabaseError as ex: error_message = ( "An error occurred while creating an assessment by the scorer with this ID: {}" ).format(scorer_id) logger.exception(error_message) raise StaffAssessmentInternalError(error_message) from ex
def create_assessment( submission_uuid, scorer_id, options_selected, criterion_feedback, overall_feedback, rubric_dict, scored_at=None ): """Creates an assessment on the given submission. Assessments are created based on feedback associated with a particular rubric. Assumes that the user creating the assessment has the permissions to do so. Args: submission_uuid (str): The submission uuid for the submission being assessed. scorer_id (str): The user ID for the user giving this assessment. This is required to create an assessment on a submission. options_selected (dict): Dictionary mapping criterion names to the option names the user selected for that criterion. criterion_feedback (dict): Dictionary mapping criterion names to the free-form text feedback the user gave for the criterion. Since criterion feedback is optional, some criteria may not appear in the dictionary. overall_feedback (unicode): Free-form text feedback on the submission overall. rubric_dict (dict): The rubric model associated with this assessment scored_at (datetime): Optional argument to override the time in which the assessment took place. If not specified, scored_at is set to now. Keyword Args: scored_at (datetime): Optional argument to override the time in which the assessment took place. If not specified, scored_at is set to now. Returns: dict: the Assessment model, serialized as a dict. Raises: StaffAssessmentRequestError: Raised when the submission_id is invalid, or the assessment_dict does not contain the required values to create an assessment. StaffAssessmentInternalError: Raised when there is an internal error while creating a new assessment. Examples: >>> options_selected = {"clarity": "Very clear", "precision": "Somewhat precise"} >>> criterion_feedback = {"clarity": "I thought this essay was very clear."} >>> feedback = "Your submission was thrilling." >>> create_assessment("Tim", options_selected, criterion_feedback, feedback, rubric_dict) """ try: try: scorer_workflow = StaffWorkflow.objects.get(submission_uuid=submission_uuid) except StaffWorkflow.DoesNotExist: scorer_workflow = None assessment = _complete_assessment( submission_uuid, scorer_id, options_selected, criterion_feedback, overall_feedback, rubric_dict, scored_at, scorer_workflow ) return full_assessment_dict(assessment) except InvalidRubric: error_message = u"The rubric definition is not valid." logger.exception(error_message) raise StaffAssessmentRequestError(error_message) except InvalidRubricSelection: error_message = u"Invalid options were selected in the rubric." logger.warning(error_message, exc_info=True) raise StaffAssessmentRequestError(error_message) except DatabaseError: error_message = ( u"An error occurred while creating an assessment by the scorer with this ID: {}" ).format(scorer_id) logger.exception(error_message) raise StaffAssessmentInternalError(error_message)