utils/scripts/lti_assignment_gradeimport.py [446:499]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    submissions = get_submitted_course_work_list(classroom_id, user_email,
                                                 course_work_id)
    if submissions:
      submission_id = submissions[0].get("id")
      output = post_grade_of_the_user(classroom_id, course_work_id,
                                      submission_id, assigned_grade,
                                      draft_grade)
      if not output:
        raise Exception("Output None")
      else:
        print(f"successfully pushed grade for {user_email}")
        message = f"submission completed for {user_email} with grades {assigned_grade}"
        write_log(message, "successful_submissions.txt")
  except Exception as e:
    print(f"failed to push grade for {user_email}")
    message = f"submission failed for {user_email} with error {e}"
    write_log(message, "unsuccessful_submissions.txt")
    FAILED_SUBMISSIONS.append({
        "user_email": user_email,
        "final_grade_percentage": str(final_grade_percentage),
        "lti_max_points": lti_max_points,
        "classroom_id": classroom_id,
        "course_work_id": course_work_id
    })


async def initiate_grade_push_process(data_list):
  with ThreadPoolExecutor(max_workers=150) as executor:
    # Set any session parameters here before calling `insert_claim`
    loop = asyncio.get_event_loop()
    tasks = []
    for grade_data in data_list:
      runner = loop.run_in_executor(
          executor, push_grades,
          *(grade_data.get("user_email"),
            grade_data.get("final_grade_percentage"),
            grade_data.get("lti_max_points"), grade_data.get("classroom_id"),
            grade_data.get("course_work_id")))
      tasks.append(runner)

    for response in await asyncio.gather(*tasks):  # pylint: disable=unused-variable
      pass


def async_push_grades(data_list):
  loop = asyncio.get_event_loop()
  future = asyncio.ensure_future(initiate_grade_push_process(data_list))
  loop.run_until_complete(future)


async def initiate_data_collection_process(data_list):
  with ThreadPoolExecutor(max_workers=200) as executor:
    loop = asyncio.get_event_loop()
    tasks = []
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



utils/scripts/zybooks_finals_grade_import.py [310:363]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    submissions = get_submitted_course_work_list(classroom_id, user_email,
                                                 course_work_id)
    if submissions:
      submission_id = submissions[0].get("id")
      output = post_grade_of_the_user(classroom_id, course_work_id,
                                      submission_id, assigned_grade,
                                      draft_grade)
      if not output:
        raise Exception("Output None")
      else:
        print(f"successfully pushed grade for {user_email}")
        message = f"submission completed for {user_email} with grades {assigned_grade}"
        write_log(message, "successful_submissions.txt")
  except Exception as e:
    print(f"failed to push grade for {user_email}")
    message = f"submission failed for {user_email} with error {e}"
    write_log(message, "unsuccessful_submissions.txt")
    FAILED_SUBMISSIONS.append({
        "user_email": user_email,
        "final_grade_percentage": str(final_grade_percentage),
        "lti_max_points": lti_max_points,
        "classroom_id": classroom_id,
        "course_work_id": course_work_id
    })


async def initiate_grade_push_process(data_list):
  with ThreadPoolExecutor(max_workers=150) as executor:
    # Set any session parameters here before calling `insert_claim`
    loop = asyncio.get_event_loop()
    tasks = []
    for grade_data in data_list:
      runner = loop.run_in_executor(
          executor, push_grades,
          *(grade_data.get("user_email"),
            grade_data.get("final_grade_percentage"),
            grade_data.get("lti_max_points"), grade_data.get("classroom_id"),
            grade_data.get("course_work_id")))
      tasks.append(runner)

    for response in await asyncio.gather(*tasks):  # pylint: disable=unused-variable
      pass


def async_push_grades(data_list):
  loop = asyncio.get_event_loop()
  future = asyncio.ensure_future(initiate_grade_push_process(data_list))
  loop.run_until_complete(future)


async def initiate_data_collection_process(data_list):
  with ThreadPoolExecutor(max_workers=200) as executor:
    loop = asyncio.get_event_loop()
    tasks = []
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



