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 _load_enrollment_requests(job_id, program_key, json_filepath): """ Load enrollment reqeusts from JSON file. If file doesn't exist or isn't valid JSON, post job failure and retrurn None. Else, return data loaded from JSON. """ json_text = uploads_filestore.retrieve(json_filepath) if not json_text: post_job_failure( job_id, "Enrollment file for program_key={} not found at {}".format( program_key, json_filepath ) ) return None try: return json.loads(json_text) except json.decoder.JSONDecodeError: post_job_failure( job_id, "Enrollment file for program_key={} at {} is not valid JSON".format( program_key, json_filepath ) ) return None
def _get_program(job_id, program_key): """ Load a Program by key. Fails job and returns None if key invalid. """ try: return Program.objects.get(key=program_key) except Program.DoesNotExist: post_job_failure(job_id, "Bad program key: {}".format(program_key)) return None
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)