Example #1
0
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)
Example #2
0
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
Example #3
0
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
Example #4
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)
Example #5
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)
Example #6
0
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)