def update_assessment_item()

in microservices/assessment_service/src/routes/submitted_assessment.py [0:0]


def update_assessment_item(
    uuid: str, input_submitted_assessment: UpdateSubmittedAssessmentModel):
  """
    Update a submitted_assessment

    ### Args:
    - input_submitted_assessment (UpdateSubmittedAssessmentModel):
    Required body of submitted_assessment

    ### Raises:
    - ResourceNotFoundException: If the submitted_assessment does not exist
    - Exception: 500 Internal Server Error if something went wrong

    ### Returns:
    - SubmittedAssessmentResponseModel: SubmittedAssessment Object
  """
  try:
    submitted_assessment = SubmittedAssessment.find_by_uuid(uuid)
    submitted_assessment_dict = {**input_submitted_assessment.dict()}
    submitted_assessment_fields = submitted_assessment.get_fields()

    # Update status, pass_status, and result based on submitted_rubrics
    evaluated = False
    if submitted_assessment_fields.get("type") in \
      ["srl", "static_srl", "cognitive_wrapper"] and \
      submitted_assessment_fields.get("is_autogradable", False):
      # Always pass SRL assessments
      pass_status = True
      result = "Pass"
      status = "completed"
      evaluated = True
    else:
      submitted_rubrics = submitted_assessment_dict.get("submitted_rubrics",
                                                        None)
      if submitted_rubrics is not None:
        assessment_id = submitted_assessment.assessment_id
        assessment = Assessment.find_by_uuid(assessment_id)
        if assessment.child_nodes and "rubrics" in assessment.child_nodes:
          # FIXME: Assumption: only one rubric for each assessment
          rubric_id = assessment.child_nodes["rubrics"][0]
          rubric = Rubric.find_by_uuid(rubric_id)
          criteria = rubric.evaluation_criteria
          criteria = {v: k for k, v in criteria.items()}
          if len(submitted_rubrics):
            pass_status = True
            result = "Exemplary"
            for r_criterion in submitted_assessment_dict["submitted_rubrics"]:
              if criteria[r_criterion["result"]] > criteria[result]:
                result = r_criterion["result"]
            if criteria[result] > criteria["Proficient"]:
              pass_status = False
              status = "evaluated"
            else:
              status = "completed"
            evaluated = True
    if evaluated:
      submitted_assessment_dict["status"] = status
      submitted_assessment_dict["result"] = result
      submitted_assessment_dict["pass_status"] = pass_status

    for key, value in submitted_assessment_dict.items():
      if key == "comments" and value is not None:
        if value.get("created_time") is None:
          value["created_time"] = str(datetime.now())
        if submitted_assessment_fields.get("comments"):
          value = [value] + submitted_assessment_fields.get(
              "comments", [])
        else:
          value = [value]
      submitted_assessment_fields[key] = value
    for key, value in submitted_assessment_fields.items():
      setattr(submitted_assessment, key, value)

    submitted_assessment.update()

    submitted_assessment_fields = submitted_assessment.get_fields(
        reformat_datetime=True)
    submitted_assessment_fields["timer_start_time"] = str(
        submitted_assessment_fields["timer_start_time"])

    return {
        "success": True,
        "message": "Successfully updated the submitted assessment.",
        "data": submitted_assessment_fields
    }
  except ResourceNotFoundException as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise ResourceNotFound(str(e)) from e
  except Exception as e:
    Logger.error(e)
    Logger.error(traceback.print_exc())
    raise InternalServerError(str(e)) from e