def list_program_enrollments(self, job_id, user_id, file_format, program_key): """ A user task for retrieving program enrollments from LMS. """ program = get_program(job_id, program_key) if not program: return try: enrollments = lms.get_program_enrollments(program.discovery_uuid) except HTTPError as err: post_job_failure( job_id, "HTTP error {} when getting enrollments at {}".format( err.response.status_code, err.request.url ), ) return except ValidationError as err: post_job_failure( job_id, "Invalid enrollment data from LMS: {}".format(err), ) return if file_format == 'json': serialized = json.dumps(enrollments, indent=4) elif file_format == 'csv': serialized = serialize_program_enrollments_to_csv(enrollments) else: raise ValueError('Invalid file_format: {}'.format(file_format)) post_job_success(job_id, serialized, file_format)
def write_program_enrollments( self, job_id, user_id, json_filepath, program_key ): """ A user task that reads program enrollment requests from json_filepath, writes them to the LMS, and stores a CSV-formatted results file. """ program = get_program(job_id, program_key) if not program: return requests = _load_enrollment_requests(job_id, program_key, json_filepath) if requests is None: return any_successes, any_failures, response_json = lms.write_program_enrollments( 'PUT', program.discovery_uuid, requests ) if any_successes and any_failures: code_str = str(EnrollmentWriteStatus.MULTI_STATUS.value) elif any_successes: code_str = str(EnrollmentWriteStatus.OK.value) elif any_failures: code_str = str(EnrollmentWriteStatus.UNPROCESSABLE_ENTITY.value) else: # This only happens if no enrollments are given. code_str = str(EnrollmentWriteStatus.NO_CONTENT.value) results_str = serialize_enrollment_results_to_csv(response_json) post_job_success(job_id, results_str, "csv", text=code_str)
def list_course_run_enrollments( self, job_id, user_id, file_format, program_key, internal_course_key, external_course_key, course_role_management_enabled=False, ): """ A user task for retrieving program course run enrollments from LMS. """ program = get_program(job_id, program_key) if not program: return try: enrollments = lms.get_course_run_enrollments( program.discovery_uuid, internal_course_key, external_course_key, course_role_management_enabled, ) except HTTPError as err: post_job_failure( job_id, "HTTP error {} when getting enrollments at {}".format( err.response.status_code, err.request.url), ) return except ValidationError as err: post_job_failure( job_id, f"Invalid enrollment data from LMS: {err}", ) return if file_format == 'json': serialized = json.dumps(enrollments, indent=4) elif file_format == 'csv': serialized = ( serialize_course_run_enrollments_with_course_staff_to_csv( enrollments) if course_role_management_enabled else serialize_course_run_enrollments_to_csv(enrollments)) else: raise ValueError(f'Invalid file_format: {file_format}') post_job_success(job_id, serialized, file_format)
def get_course_run_grades(self, job_id, user_id, file_format, program_key, internal_course_key): """ A user task that reads course run grade data from the LMS, and writes it to a JSON- or CSV-formatted result file. """ program = get_program(job_id, program_key) if not program: return try: any_successes, any_failures, grades = lms.get_course_run_grades( program.discovery_uuid, internal_course_key, ) except HTTPError as err: post_job_failure( job_id, "HTTP error {} when getting grades at {}".format( err.response.status_code, err.request.url ), ) return except ValidationError as err: post_job_failure( job_id, "Invalid grade data from LMS: {}".format(err), ) return if any_successes and any_failures: code_str = str(GradeReadStatus.MULTI_STATUS.value) elif not any_successes and not any_failures: code_str = str(GradeReadStatus.NO_CONTENT.value) elif any_successes: code_str = str(GradeReadStatus.OK.value) else: code_str = str(GradeReadStatus.UNPROCESSABLE_ENTITY.value) if file_format == 'json': serialized = json.dumps(grades, indent=4) elif file_format == 'csv': serialized = serialize_course_run_grades_to_csv(grades) else: raise ValueError('Invalid file_format: {}'.format(file_format)) post_job_success(job_id, serialized, file_format, text=code_str)
def list_all_course_run_enrollments(self, job_id, user_id, file_format, program_key): """ A user task for retrieving all course enrollments within a given program from LMS. """ program = get_program(job_id, program_key) if not program: return results = [] for course_run in program.course_runs: try: enrollments = lms.get_course_run_enrollments( program.discovery_uuid, course_run.key, course_run.external_key, ) except HTTPError as err: post_job_failure( job_id, "HTTP error {} when getting enrollments at {}".format( err.response.status_code, err.request.url ), ) return except ValidationError as err: post_job_failure( job_id, "Invalid enrollment data from LMS: {}".format(err), ) return results.extend(enrollments) if file_format == 'json': serialized = json.dumps(results, indent=4) elif file_format == 'csv': serialized = serialize_course_run_enrollments_to_csv(results) else: raise ValueError('Invalid file_format: {}'.format(file_format)) post_job_success(job_id, serialized, file_format)
def write_course_run_enrollments( self, job_id, user_id, json_filepath, program_key ): """ A user task that reads course run enrollment requests from json_filepath, writes them to the LMS, and stores a CSV-formatted results file. """ program = get_program(job_id, program_key) if not program: return requests = _load_enrollment_requests(job_id, program_key, json_filepath) if requests is None: return requests_by_course_key = OrderedDict() for request in requests: requested_course_key = request.pop('course_id') if requested_course_key not in requests_by_course_key: requests_by_course_key[requested_course_key] = [] requests_by_course_key[requested_course_key].append(request) successes = [] failures = [] course_responses = [] for requested_course_key, course_requests in requests_by_course_key.items(): # we don't know if the requested key was an external key or internal key, # so convert it before making requests to the LMS. internal_course_key = program.get_course_key(requested_course_key) if internal_course_key: successes_in_course, failures_in_course, status_by_student_key = lms.write_course_run_enrollments( 'PUT', program.discovery_uuid, internal_course_key, course_requests ) course_responses.extend([ CourseEnrollmentResponseItem(requested_course_key, student_key, status)._asdict() for student_key, status in status_by_student_key.items() ]) successes.append(successes_in_course) failures.append(failures_in_course) else: course_responses.extend([ CourseEnrollmentResponseItem( requested_course_key, request.get('student_key'), ENROLLMENT_ERROR_COURSE_NOT_FOUND, )._asdict() for request in course_requests ]) failures.append(True) if any(successes) and any(failures): code_str = str(EnrollmentWriteStatus.MULTI_STATUS.value) elif any(successes): code_str = str(EnrollmentWriteStatus.OK.value) elif any(failures): code_str = str(EnrollmentWriteStatus.UNPROCESSABLE_ENTITY.value) else: # This only happens if no enrollments are given. code_str = str(EnrollmentWriteStatus.NO_CONTENT.value) results_str = serialize_to_csv(course_responses, CourseEnrollmentResponseItem._fields, include_headers=True) post_job_success(job_id, results_str, "csv", text=code_str)