def get_assessments(submission_uuid, scored_only=True, limit=None): """Retrieve the assessments for a submission. Retrieves all the assessments for a submissions. This API returns related feedback without making any assumptions about grading. Any outstanding assessments associated with this submission will not be returned. Args: submission_uuid (str): The submission all the requested assessments are associated with. Required. Kwargs: scored (boolean): Only retrieve the assessments used to generate a score for this submission. limit (int): Limit the returned assessments. If None, returns all. Returns: list(dict): A list of dictionaries, where each dictionary represents a separate assessment. Each assessment contains points earned, points possible, time scored, scorer id, score type, and feedback. Raises: PeerAssessmentRequestError: Raised when the submission_id is invalid. PeerAssessmentInternalError: Raised when there is an internal error while retrieving the assessments associated with this submission. Examples: >>> get_assessments("1", scored_only=True, limit=2) [ { 'points_earned': 6, 'points_possible': 12, 'scored_at': datetime.datetime(2014, 1, 29, 17, 14, 52, 649284 tzinfo=<UTC>), 'scorer': u"Tim", 'feedback': u'Your submission was thrilling.' }, { 'points_earned': 11, 'points_possible': 12, 'scored_at': datetime.datetime(2014, 1, 31, 14, 10, 17, 544214 tzinfo=<UTC>), 'scorer': u"Bob", 'feedback': u'Great submission.' } ] """ try: if scored_only: assessments = PeerWorkflowItem.get_scored_assessments( submission_uuid)[:limit] else: assessments = Assessment.objects.filter( submission_uuid=submission_uuid, score_type=PEER_TYPE)[:limit] return serialize_assessments(assessments) except DatabaseError: error_message = _( u"Error getting assessments for submission {}".format( submission_uuid)) logger.exception(error_message) raise PeerAssessmentInternalError(error_message)
def get_bulk_scored_assessments(submission_uuids): """ Given a list of submission uuids, return a set of assessments that are "scored", which is to say, included in the calculation of the final score, as opposed to "extra" peer reviews. """ return set(PeerWorkflowItem.get_bulk_scored_assessments(submission_uuids))
def get_assessments(submission_uuid, scored_only=True, limit=None): """Retrieve the assessments for a submission. Retrieves all the assessments for a submissions. This API returns related feedback without making any assumptions about grading. Any outstanding assessments associated with this submission will not be returned. Args: submission_uuid (str): The submission all the requested assessments are associated with. Required. Keyword Arguments: scored (boolean): Only retrieve the assessments used to generate a score for this submission. limit (int): Limit the returned assessments. If None, returns all. Returns: list: A list of dictionaries, where each dictionary represents a separate assessment. Each assessment contains points earned, points possible, time scored, scorer id, score type, and feedback. Raises: PeerAssessmentRequestError: Raised when the submission_id is invalid. PeerAssessmentInternalError: Raised when there is an internal error while retrieving the assessments associated with this submission. Examples: >>> get_assessments("1", scored_only=True, limit=2) [ { 'points_earned': 6, 'points_possible': 12, 'scored_at': datetime.datetime(2014, 1, 29, 17, 14, 52, 649284 tzinfo=<UTC>), 'scorer': u"Tim", 'feedback': u'Your submission was thrilling.' }, { 'points_earned': 11, 'points_possible': 12, 'scored_at': datetime.datetime(2014, 1, 31, 14, 10, 17, 544214 tzinfo=<UTC>), 'scorer': u"Bob", 'feedback': u'Great submission.' } ] """ try: if scored_only: assessments = PeerWorkflowItem.get_scored_assessments(submission_uuid)[:limit] else: assessments = Assessment.objects.filter(submission_uuid=submission_uuid, score_type=PEER_TYPE)[:limit] return serialize_assessments(assessments) except DatabaseError: error_message = (u"Error getting assessments for submission {uuid}").format(uuid=submission_uuid) logger.exception(error_message) raise PeerAssessmentInternalError(error_message)
def set_assessment_feedback(feedback_dict): """ Set a feedback object for an assessment to have some new values. Sets or updates the assessment feedback with the given values in the dict. Args: feedback_dict (dict): A dictionary of all the values to update or create a new assessment feedback. Returns: None Raises: PeerAssessmentRequestError PeerAssessmentInternalError """ submission_uuid = feedback_dict.get('submission_uuid') feedback_text = feedback_dict.get('feedback_text') selected_options = feedback_dict.get('options', list()) if feedback_text and len(feedback_text) > AssessmentFeedback.MAXSIZE: error_message = u"Assessment feedback too large." raise PeerAssessmentRequestError(error_message) try: # Get or create the assessment model for this submission # If we receive an integrity error, assume that someone else is trying to create # another feedback model for this submission, and raise an exception. if submission_uuid: feedback, created = AssessmentFeedback.objects.get_or_create( submission_uuid=submission_uuid) else: error_message = u"An error occurred creating assessment feedback: bad or missing submission_uuid." logger.error(error_message) raise PeerAssessmentRequestError(error_message) # Update the feedback text if feedback_text is not None: feedback.feedback_text = feedback_text # Save the feedback model. We need to do this before setting m2m relations. if created or feedback_text is not None: feedback.save() # Associate the feedback with selected options feedback.add_options(selected_options) # Associate the feedback with scored assessments assessments = PeerWorkflowItem.get_scored_assessments(submission_uuid) feedback.assessments.add(*assessments) except DatabaseError: msg = u"Error occurred while creating or updating feedback on assessment: {}".format( feedback_dict) logger.exception(msg) raise PeerAssessmentInternalError(msg)
def set_assessment_feedback(feedback_dict): """ Set a feedback object for an assessment to have some new values. Sets or updates the assessment feedback with the given values in the dict. Args: feedback_dict (dict): A dictionary of all the values to update or create a new assessment feedback. Returns: None Raises: PeerAssessmentRequestError PeerAssessmentInternalError """ submission_uuid = feedback_dict.get('submission_uuid') feedback_text = feedback_dict.get('feedback_text') selected_options = feedback_dict.get('options', list()) if feedback_text and len(feedback_text) > AssessmentFeedback.MAXSIZE: error_message = u"Assessment feedback too large." raise PeerAssessmentRequestError(error_message) try: # Get or create the assessment model for this submission # If we receive an integrity error, assume that someone else is trying to create # another feedback model for this submission, and raise an exception. if submission_uuid: feedback, created = AssessmentFeedback.objects.get_or_create(submission_uuid=submission_uuid) else: error_message = u"An error occurred creating assessment feedback: bad or missing submission_uuid." logger.error(error_message) raise PeerAssessmentRequestError(error_message) # Update the feedback text if feedback_text is not None: feedback.feedback_text = feedback_text # Save the feedback model. We need to do this before setting m2m relations. if created or feedback_text is not None: feedback.save() # Associate the feedback with selected options feedback.add_options(selected_options) # Associate the feedback with scored assessments assessments = PeerWorkflowItem.get_scored_assessments(submission_uuid) feedback.assessments.add(*assessments) except DatabaseError: msg = u"Error occurred while creating or updating feedback on assessment: {}".format(feedback_dict) logger.exception(msg) raise PeerAssessmentInternalError(msg)