def get_assessment(submission_uuid): """ Retrieve a self-assessment for a submission_uuid. Args: submission_uuid (str): The submission UUID for we want information for regarding self assessment. Returns: assessment (dict) is a serialized Assessment model, or None (if the user has not yet self-assessed) If multiple submissions or self-assessments are found, returns the most recent one. Raises: SelfAssessmentRequestError: submission_uuid was invalid. """ # Retrieve assessments for the submission UUID # We weakly enforce that number of self-assessments per submission is <= 1, # but not at the database level. Someone could take advantage of the race condition # between checking the number of self-assessments and creating a new self-assessment. # To be safe, we retrieve just the most recent submission. serialized_assessments = serialize_assessments( Assessment.objects.filter( score_type=SELF_TYPE, submission_uuid=submission_uuid).order_by('-scored_at')[:1]) if not serialized_assessments: logger.info(u"No self-assessment found for submission {}".format( submission_uuid)) return None serialized_assessment = serialized_assessments[0] logger.info( u"Retrieved self-assessment for submission {}".format(submission_uuid)) return serialized_assessment
def get_assessment(submission_uuid): """ Retrieve a self-assessment for a submission_uuid. Args: submission_uuid (str): The submission UUID for we want information for regarding self assessment. Returns: assessment (dict) is a serialized Assessment model, or None (if the user has not yet self-assessed) If multiple submissions or self-assessments are found, returns the most recent one. Raises: SelfAssessmentRequestError: submission_uuid was invalid. """ # Retrieve assessments for the submission UUID # We weakly enforce that number of self-assessments per submission is <= 1, # but not at the database level. Someone could take advantage of the race condition # between checking the number of self-assessments and creating a new self-assessment. # To be safe, we retrieve just the most recent submission. serialized_assessments = serialize_assessments(Assessment.objects.filter( score_type=SELF_TYPE, submission_uuid=submission_uuid ).order_by('-scored_at')[:1]) if not serialized_assessments: logger.info( u"No self-assessment found for submission {}".format(submission_uuid) ) return None serialized_assessment = serialized_assessments[0] logger.info(u"Retrieved self-assessment for submission {}".format(submission_uuid)) return serialized_assessment
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_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 get_submitted_assessments(submission_uuid, scored_only=True, limit=None): """Retrieve the assessments created by the given submission's author. Retrieves all the assessments created by the given submission's author. 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 of the student whose assessments we are requesting. 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. If no workflow is found associated with the given submission_uuid, returns an empty list. 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_submitted_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"Tim", 'feedback': u'Great submission.' } ] """ try: # If no workflow is found associated with the uuid, this returns None, # and an empty set of assessments will be returned. workflow = PeerWorkflow.get_by_submission_uuid(submission_uuid) items = PeerWorkflowItem.objects.filter( scorer=workflow, assessment__isnull=False ) if scored_only: items = items.exclude(scored=False) assessments = Assessment.objects.filter( pk__in=[item.assessment.pk for item in items])[:limit] return serialize_assessments(assessments) except DatabaseError: error_message = ( u"Couldn't retrieve the assessments completed by the " " student with submission {uuid}" ).format(uuid=submission_uuid) logger.exception(error_message) raise PeerAssessmentInternalError(error_message)
def get_submitted_assessments(submission_uuid, scored_only=True, limit=None): """Retrieve the assessments created by the given submission's author. Retrieves all the assessments created by the given submission's author. 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 of the student whose assessments we are requesting. 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. If no workflow is found associated with the given submission_uuid, returns an empty list. 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_submitted_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"Tim", 'feedback': u'Great submission.' } ] """ try: # If no workflow is found associated with the uuid, this returns None, # and an empty set of assessments will be returned. workflow = PeerWorkflow.get_by_submission_uuid(submission_uuid) items = PeerWorkflowItem.objects.filter( scorer=workflow, assessment__isnull=False ) if scored_only: items = items.exclude(scored=False) assessments = Assessment.objects.filter( pk__in=[item.assessment.pk for item in items])[:limit] return serialize_assessments(assessments) except DatabaseError: error_message = ( u"Couldn't retrieve the assessments completed by the " " student with submission {uuid}" ).format(uuid=submission_uuid) logger.exception(error_message) raise PeerAssessmentInternalError(error_message)