in microservices/lms/src/routes/student.py [0:0]
def enroll_student_cohort(cohort_id: str, input_data: AddStudentModel,
request: Request):
"""
Args:
input_data(AddStudentToSectionModel):
An AddStudentToSectionModel object which contains email and credentials
Raises:
InternalServerError: 500 Internal Server Error if something fails
ResourceNotFound : 404 if the section or classroom does not exist
Conflict: 409 if the student already exists
Returns:
AddStudentResponseModel: if the student successfully added,
NotFoundErrorResponseModel: if the section and course not found,
ConflictResponseModel: if any conflict occurs,
InternalServerErrorResponseModel: if the add student raises an exception
"""
section_id=None
try:
cohort = Cohort.find_by_id(cohort_id)
sections = Section.collection.filter("cohort", "==", cohort.key).filter(
"deleted_at_timestamp", "==", None).fetch()
sections = list(sections)
headers = {"Authorization": request.headers.get("Authorization")}
if cohort.enrolled_students_count >= cohort.max_students:
raise ValidationError("Cohort Max count reached hence student cannot" +
" be erolled in this cohort")
if len(sections) == 0:
raise ValidationError("Given CohortId\
does not have any sections")
if not student_service.check_student_can_enroll_in_cohort(
email=input_data.email, headers=headers, sections=sections):
raise Conflict(f"Student {input_data.email} is already\
enrolled for cohort {cohort_id}")
section = student_service.get_section_with_minimum_student(sections)
if section is None:
raise ValidationError(
"All sections in chorot are full or not open for enrollment")
section_id = section.id
Logger.info(f"Section with minimum student is {section.id},\
enroll student intiated for {input_data.email}")
user_object = classroom_crud.enroll_student(
headers=headers,
access_token=input_data.access_token,
student_email=input_data.email,
course_id=section.classroom_id,
course_code=section.classroom_code)
latest_section = Section.find_by_id(section.id)
latest_cohort = latest_section.cohort
latest_cohort.enrolled_students_count += 1
latest_cohort.update()
latest_section.enrolled_students_count += 1
latest_section.update()
course_enrollment_mapping = CourseEnrollmentMapping()
course_enrollment_mapping.section = section
course_enrollment_mapping.user = User.find_by_user_id(
user_object["user_id"])
course_enrollment_mapping.status = "active"
course_enrollment_mapping.role = "learner"
course_enrollment_id = course_enrollment_mapping.save().id
response_dict = {}
response_dict = {
"course_enrollment_id": course_enrollment_id,
"student_email": input_data.email,
"section_id": section.id,
"cohort_id": cohort_id,
"classroom_id": section.classroom_id,
"classroom_url": section.classroom_url
}
section_service.insert_section_enrollment_to_bq(
course_enrollment_mapping, section)
return {
"message":
f"Successfully Added the Student with email {input_data.email}",
"data": response_dict
}
except InvalidTokenError as ive:
err = traceback.format_exc().replace("\n", " ")
student_service.insert_failure_log(input_data.email, section_id,
cohort_id, err, "InvalidTokenError")
Logger.error(err)
raise InvalidToken(str(ive)) from ive
except ResourceNotFoundException as err:
er = traceback.format_exc().replace("\n", " ")
student_service.insert_failure_log(input_data.email, section_id,
cohort_id, er, "ResourceNotFound")
Logger.error(err)
raise ResourceNotFound(str(err)) from err
except Conflict as conflict:
Logger.error(conflict)
err = traceback.format_exc().replace("\n", " ")
student_service.insert_failure_log(input_data.email, section_id,
cohort_id, err, "Conflict")
Logger.error(err)
raise Conflict(str(conflict)) from conflict
except HttpError as ae:
err = traceback.format_exc().replace("\n", " ")
student_service.insert_failure_log(input_data.email, section_id,
cohort_id, err, "ClassroomHttpException")
Logger.error(err)
if ae.resp.status == 409:
raise ClassroomHttpException(
status_code=ae.resp.status,
message="Student already exist in classroom") from ae
else:
raise ClassroomHttpException(status_code=ae.resp.status,
message="Can't enroll student to classroom,\
Please check organizations policy or authentication scopes") from ae
except ValidationError as ve:
err = traceback.format_exc().replace("\n", " ")
student_service.insert_failure_log(input_data.email, section_id,
cohort_id, err, "BadRequest")
Logger.error(ve)
raise BadRequest(str(ve)) from ve
except Exception as e:
Logger.error(e)
err = traceback.format_exc().replace("\n", " ")
student_service.insert_failure_log(input_data.email, section_id,
cohort_id, err, "InternalServerError")
Logger.error(err)
raise InternalServerError(str(e)) from e