def update_grades()

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