utils/scripts/import_grade-async-version.py (131 lines of code) (raw):

# pylint: disable=unspecified-encoding,missing-module-docstring,broad-exception-raised,broad-exception-caught,invalid-name,unused-variable, # pylint: disable=consider-using-dict-items,consider-iterating-dictionary from concurrent.futures import ThreadPoolExecutor import pandas as pd from google.oauth2 import service_account from googleapiclient.discovery import build import asyncio SCOPES = [ "https://www.googleapis.com/auth/classroom.courses", "https://www.googleapis.com/auth/classroom.rosters", "https://www.googleapis.com/auth/classroom.topics", "https://www.googleapis.com/auth/classroom.coursework.students", "https://www.googleapis.com/auth/classroom.coursework.me", "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/forms.body.readonly", "https://www.googleapis.com/auth/classroom.profile.photos", "https://www.googleapis.com/auth/classroom.courseworkmaterials", "https://www.googleapis.com/auth/classroom.courseworkmaterials.readonly", "https://www.googleapis.com/auth/classroom.push-notifications", "https://www.googleapis.com/auth/classroom.student-submissions." + "students.readonly", "https://www.googleapis.com/auth/classroom.rosters.readonly" ] CLASSROOM_ADMIN_EMAIL = "studyhallregistrar@asu.edu" csv_file_name = "Lab Participation 02 - Painting a Wall.csv" def get_credentials(): source_credentials = ( service_account.Credentials.from_service_account_file( "asu-prod-key.json", scopes=SCOPES, subject=CLASSROOM_ADMIN_EMAIL)) # print("Get credentials worked",source_credentials) return source_credentials STUDENT_JSON = {} STUDENT_ARRAY = [] def prepare_json(): print("In prepare JSON CSV file name is", csv_file_name) csvFile = pd.read_csv(csv_file_name) print(type(csvFile)) for d in csvFile: print(d) print("----------------------------------") for index, row in csvFile.iterrows(): if STUDENT_JSON.get(row["Email"], None): if STUDENT_JSON[row["Email"]]["score"] <= row["Score"]: STUDENT_JSON[row["Email"]] = { "email": row["Email"], "score": row["Score"], "section_id": row["SectionId"], "classroom_id": row["CourseId"], "coursework_id": row["AssignmentId"], "section_name": row["SectionName"] } # This array is getting duplicatly added # STUDENT_ARRAY.append({ # "email": row["Email"], # "score": row["Score"], # "section_id": row["SectionId"], # "classroom_id": row["CourseId"], # "coursework_id": row["AssignmentId"], # "section_name": row["SectionName"] # }) else: STUDENT_JSON[row["Email"]] = { "email": row["Email"], "score": row["Score"], "section_id": row["SectionId"], "classroom_id": row["CourseId"], "coursework_id": row["AssignmentId"], "section_name": row["SectionName"] } # STUDENT_ARRAY.append({ # "email": row["Email"], # "score": row["Score"], # "section_id": row["SectionId"], # "classroom_id": row["CourseId"], # "coursework_id": row["AssignmentId"], # "section_name": row["SectionName"] # }) # print(row) for key in STUDENT_JSON.keys(): STUDENT_ARRAY.append(STUDENT_JSON[key]) with open("student_json_" + csv_file_name, "w") as file: file.write(str(STUDENT_JSON)) print("Length of Student JSON is ----------------", len(STUDENT_JSON)) print("Length of Student Array is -----------------", len(STUDENT_ARRAY)) # Make student JSON prepare_json() def list_coursework_submissions_user(classroomId, courseworkId, email): service = build("classroom", "v1", credentials=get_credentials()) submissions = [] page_token = None while True: coursework = service.courses().courseWork() response = coursework.studentSubmissions().list( pageToken=page_token, courseId=classroomId, courseWorkId=courseworkId, userId=email).execute() submissions.extend(response.get("studentSubmissions", [])) page_token = response.get("nextPageToken", None) if not page_token: break return submissions def patch_student_submission(course_id, coursework_id, student_submission_id, assigned_grade, draft_grade): """Get list of coursework from classroom Args: course_id Returns: returns list of coursework of given course in classroom """ "" service = build("classroom", "v1", credentials=get_credentials()) student_submission = { "assignedGrade": assigned_grade, "draftGrade": draft_grade } patch_result = service.courses().courseWork().studentSubmissions().patch( courseId=course_id, courseWorkId=coursework_id, id=student_submission_id, updateMask="assignedGrade,draftGrade", body=student_submission).execute() return patch_result def push_grade(email, classroom_id, coursework_id, draft_grade, assigned_grade): submissions = list_coursework_submissions_user(classroom_id, coursework_id, email) if submissions: try: result = patch_student_submission(classroom_id, coursework_id, submissions[0]["id"], draft_grade, assigned_grade) with open("Success_logs" + csv_file_name, "a") as fa: fa.write(f"\nGrade import successful for {email} {assigned_grade}") print("Grade imported for", email) except Exception as e: with open("error_logs" + csv_file_name, "a") as file: file.write(f"\nStudent DATA-{email}") file.write(f"Error is {e}") else: print("Student not found in given course", email) with open("Student_not_found" + csv_file_name, "a") as fa: fa.write(f"\nStudent_not_found for {email}") # def import_form_grade_from_JSON(): # print("Inside Import form grade function") # print("Length of student JSON is ", len(STUDENT_JSON)) # for key, values in STUDENT_JSON.items(): # push_grade(STUDENT_JSON[key]["email"], # STUDENT_JSON[key]["classroom_id"], # STUDENT_JSON[key]["coursework_id"], # STUDENT_JSON[key]["score"], STUDENT_JSON[key]["score"]) async def initiate_grade_push(data_list): with ThreadPoolExecutor(max_workers=15) as executor: loop = asyncio.get_event_loop() tasks = [] for data in data_list: runner = loop.run_in_executor( executor, push_grade, *(data.get("email"), data.get("classroom_id"), data.get("coursework_id"), data.get("score"), data.get("score"))) 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(data_list)) loop.run_until_complete(future) # FOr Loop # Prepare array async_push_grades(STUDENT_ARRAY)