コード例 #1
0
ファイル: tasks.py プロジェクト: deepa-vn/registrar
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)
コード例 #2
0
ファイル: tasks.py プロジェクト: deepa-vn/registrar
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)
コード例 #3
0
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)
コード例 #4
0
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)
コード例 #5
0
ファイル: tasks.py プロジェクト: deepa-vn/registrar
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)
コード例 #6
0
ファイル: tasks.py プロジェクト: deepa-vn/registrar
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)