in microservices/assessment_service/src/services/submitted_assessment.py [0:0]
def submit_assessment(submitted_assessment_dict, header):
"""Helper function to handle the submit assessment flow"""
assessor_id = None
pass_status = None
result = None
session_data = None
items = {}
assessment_id = submitted_assessment_dict["assessment_id"]
assessment = Assessment.find_by_uuid(assessment_id)
is_autogradable = assessment.is_autogradable
max_attempts = assessment.max_attempts
attempt_no = submitted_assessment_dict["attempt_no"]
submission_gcs_paths = submitted_assessment_dict.get(
"submission_gcs_paths", [])
valid_gcs_path = bool(submission_gcs_paths)
#pylint: disable=chained-comparison
if max_attempts is not None and max_attempts > 0 and \
attempt_no > max_attempts:
raise PreconditionFailedError(
f"Allowed number of attempts exceeded ({attempt_no}/{max_attempts})")
learner_id = submitted_assessment_dict["learner_id"]
Learner.find_by_uuid(learner_id)
user = User.find_by_user_type_ref(learner_id)
if is_autogradable:
activity_id = assessment.assessment_reference
if activity_id is not None and activity_id != {}:
activity_id = activity_id.get("activity_template_id", None)
learnosity_req_body = {
"user_id": user.id,
"session_id": submitted_assessment_dict["learner_session_id"],
"activity_id": activity_id
}
if USE_LEARNOSITY_SECRET:
session_data = fetch_response(**learnosity_req_body)
if assessment.metadata is not None:
items = assessment.metadata.get("items", {})
items = update_item_responses(items, session_data)
# Autogradable assessments are always passed
# Load Sample data to run e2e for pretests
if not USE_LEARNOSITY_SECRET and assessment.type == "pretest":
with open(LEARNOSITY_DATA, encoding="utf-8") as data:
session_data = json.load(data)
with open(ITEM_REFERENCES, encoding="utf-8") as data:
items = json.load(data)
pass_status = True
status = "completed"
result = "Pass"
else:
status = "evaluation_pending"
if submission_gcs_paths:
for path in submission_gcs_paths:
path = f"gs://{CONTENT_SERVING_BUCKET}/{path}"
valid_current_gcs_path = is_valid_path(path)
valid_gcs_path = valid_gcs_path and valid_current_gcs_path
if not valid_current_gcs_path:
raise ValidationError(
"The following GCS Path for the assessment submission does" +\
f" not exist: {path}")
# assign assessor only if assessment is human graded and is not an srl
# or pretest
if assessment.type not in ["srl", "static_srl", "cognitive_wrapper",
"pretest"]:
discipline = traverse_up(assessment, "assessments", "discipline")
pathway_id = discipline.get_fields()[
"uuid"] if discipline is not None else ""
assessor_id = assessor_handler(header, pathway_id)
# create document for submitted_assessment
submitted_assessment_dict = {
**submitted_assessment_dict, "type": assessment.type,
"pass_status": pass_status,
"status": status,
"result": result,
"attempt_no": attempt_no,
"is_autogradable": is_autogradable,
"learner_session_data": session_data,
"metadata": {
"tag_info": items
}
}
new_submitted_assessment = SubmittedAssessment()
new_submitted_assessment = new_submitted_assessment.from_dict(
submitted_assessment_dict)
new_submitted_assessment.assessor_id = assessor_id
new_submitted_assessment.uuid = ""
new_submitted_assessment.save()
new_submitted_assessment.uuid = new_submitted_assessment.id
if valid_gcs_path:
attached_files_path = attach_files_to_assessment_submission(
learner_id, assessment_id, new_submitted_assessment.id,
submission_gcs_paths, CONTENT_SERVING_BUCKET)
new_submitted_assessment.submission_gcs_paths = attached_files_path
elif submission_gcs_paths:
raise ValidationError(
"Some of the GCS Path for the assessment submission does not exist")
new_submitted_assessment.timer_start_time = \
new_submitted_assessment.created_time
new_submitted_assessment.update()
submitted_assessment_fields = new_submitted_assessment.get_fields(
reformat_datetime=True)
submitted_assessment_fields["timer_start_time"] = str(
submitted_assessment_fields["timer_start_time"])
return submitted_assessment_fields