in microservices/lms/src/services/section_service.py [0:0]
def update_grades(material, section, coursework_id, lms_job_id, classroom_course):
"""Takes the forms all responses ,section, and coursework_id and
updates the grades of student who have responsed to form and
submitted the coursework
"""
lms_job = LmsJob.find_by_id(lms_job_id)
logs = lms_job.logs
Logger.info(classroom_course)
try:
student_grades = {}
count = 0
info_msg = f"Student grade update background tasks started\
for coursework_id {coursework_id}"
logs["info"].append(info_msg)
Logger.info(info_msg)
lms_job.start_time = datetime.datetime.utcnow()
lms_job.status = "running"
lms_job.update()
#Get url mapping of google forms view links and edit ids
# url_mapping = classroom_crud.get_edit_url_and_view_url_mapping_of_folder(
# classroom_course["teacherFolder"]["id"]
# )
# form_details = url_mapping.get(material["form"]["formUrl"])
# if not form_details:
# raise ResourceNotFound(
# "Google form attached to coursework is not present\
# in drive folder.Please verify if google form\
# attached to coursework is present in classroom\
# drive folder of this section.")
# form_id = form_details["file_id"]
# Get all responses for the form if no responses of
# the form then return
form_url = material["form"]["formUrl"]
form_l = form_url.split("/")
form_id = form_l[-2]
Logger.info(form_url)
Logger.info(f"Form Id is {form_id}")
all_responses_of_form = classroom_crud.\
retrieve_all_form_responses(form_id)
if all_responses_of_form == {}:
logs["errors"].append("Responses not available for google form")
Logger.error("Responses not available for google form")
for response in all_responses_of_form.get("responses", []):
try:
if "respondentEmail" not in response.keys():
error_msg = f"Respondent Email is not collected in form for\
coursework {coursework_id} Update form settings to collect Email"
logs["errors"].append(error_msg)
raise Exception(error_msg)
respondent_email = response["respondentEmail"]
submissions = classroom_crud.list_coursework_submissions_user(
section.classroom_id, coursework_id, response["respondentEmail"])
if submissions:
if submissions[0]["state"] == "TURNED_IN":
logs["info"].append(f"Updating grades for {respondent_email}")
Logger.info(f"Updating grades for {respondent_email}")
if "totalScore" not in response.keys():
response["totalScore"] = 0
classroom_crud.patch_student_submission(section.classroom_id,
coursework_id,
submissions[0]["id"],
response["totalScore"],
response["totalScore"])
count += 1
student_grades[response["respondentEmail"]] = response["totalScore"]
logs["info"].append(f"Updated grades for {respondent_email}")
Logger.info(f"Updated grades for {respondent_email}")
else:
logs["info"].append(
f"Submission state is not turn in {respondent_email}")
Logger.info(f"Submission state is not turn in {respondent_email}")
except Exception as e:
error = traceback.format_exc().replace("\n", " ")
Logger.error(error)
Logger.error(e)
logs["errors"].append(f"Error - {e}")
continue
Logger.info(f"Student grades updated\
for {count} student_data {student_grades}")
logs["info"].append(f"Student grades updated\
for {count} student_data {student_grades}")
lms_job.logs = logs
lms_job.end_time = datetime.datetime.utcnow()
lms_job.status = "success"
lms_job.update()
return count, student_grades
except Exception as e:
Logger.error(f"Grade import failed due to error - {str(e)}")
error = traceback.format_exc().replace("\n", " ")
Logger.error(f"Traceback - {error}")
logs["errors"].append(f"Grade import failed due to error - {str(e)}")
lms_job.end_time = datetime.datetime.utcnow()
lms_job.logs = logs
lms_job.status = "failed"
lms_job.update()
raise InternalServerError(str(e)) from e