コード例 #1
0
ファイル: api.py プロジェクト: zimka/edx-platform-1
def _validate_course_mode(course_id, mode):
    """Checks to see if the specified course mode is valid for the course.

    If the requested course mode is not available for the course, raise an error with corresponding
    course enrollment information.

    'honor' is special cased. If there are no course modes configured, and the specified mode is
    'honor', return true, allowing the enrollment to be 'honor' even if the mode is not explicitly
    set for the course.

    Args:
        course_id (str): The course to check against for available course modes.
        mode (str): The slug for the course mode specified in the enrollment.

    Returns:
        None

    Raises:
        CourseModeNotFound: raised if the course mode is not found.
    """
    course_enrollment_info = _data_api().get_course_enrollment_info(course_id)
    course_modes = course_enrollment_info["course_modes"]
    available_modes = [m['slug'] for m in course_modes]
    if mode not in available_modes:
        msg = (
            u"Specified course mode '{mode}' unavailable for course {course_id}.  "
            u"Available modes were: {available}").format(
                mode=mode,
                course_id=course_id,
                available=", ".join(available_modes))
        log.warn(msg)
        raise errors.CourseModeNotFoundError(msg, course_enrollment_info)
コード例 #2
0
ファイル: api.py プロジェクト: mbareta/edx-platform-ft
def validate_course_mode(course_id,
                         mode,
                         is_active=None,
                         include_expired=False):
    """Checks to see if the specified course mode is valid for the course.

    If the requested course mode is not available for the course, raise an error with corresponding
    course enrollment information.

    Arguments:
        course_id (str): The course to check against for available course modes.
        mode (str): The slug for the course mode specified in the enrollment.

    Keyword Arguments:
        is_active (bool): Whether the enrollment is to be activated or deactivated.
        include_expired (bool): Boolean denoting whether expired course modes should be included.

    Returns:
        None

    Raises:
        CourseModeNotFound: raised if the course mode is not found.
    """
    # If the client has requested an enrollment deactivation, we want to include expired modes
    # in the set of available modes. This allows us to unenroll users from expired modes.
    # If include_expired is set as True we should not redetermine its value.
    if not include_expired:
        include_expired = not is_active if is_active is not None else False

    course_enrollment_info = _data_api().get_course_enrollment_info(
        course_id, include_expired=include_expired)
    course_modes = course_enrollment_info["course_modes"]
    available_modes = [m['slug'] for m in course_modes]
    if mode not in available_modes:
        msg = (
            u"Specified course mode '{mode}' unavailable for course {course_id}.  "
            u"Available modes were: {available}").format(
                mode=mode,
                course_id=course_id,
                available=", ".join(available_modes))
        log.warn(msg)
        raise errors.CourseModeNotFoundError(msg, course_enrollment_info)
コード例 #3
0
def _validate_course_mode(course_id, mode, is_active=None):
    """Checks to see if the specified course mode is valid for the course.

    If the requested course mode is not available for the course, raise an error with corresponding
    course enrollment information.

    'honor' is special cased. If there are no course modes configured, and the specified mode is
    'honor', return true, allowing the enrollment to be 'honor' even if the mode is not explicitly
    set for the course.

    Arguments:
        course_id (str): The course to check against for available course modes.
        mode (str): The slug for the course mode specified in the enrollment.

    Keyword Arguments:
        is_active (bool): Whether the enrollment is to be activated or deactivated.

    Returns:
        None

    Raises:
        CourseModeNotFound: raised if the course mode is not found.
    """
    # If the client has requested an enrollment deactivation, we want to include expired modes
    # in the set of available modes. This allows us to unenroll users from expired modes.
    include_expired = not is_active if is_active is not None else False

    course_enrollment_info = _data_api().get_course_enrollment_info(
        course_id, include_expired=include_expired)
    course_modes = course_enrollment_info["course_modes"]
    available_modes = [m['slug'] for m in course_modes]
    if mode not in available_modes:
        msg = (
            u"Specified course mode '{mode}' unavailable for course {course_id}.  "
            u"Available modes were: {available}").format(
                mode=mode,
                course_id=course_id,
                available=", ".join(available_modes))
        log.warn(msg)
        raise errors.CourseModeNotFoundError(msg, course_enrollment_info)
コード例 #4
0
def add_enrollment(user_id,
                   course_id,
                   mode=None,
                   is_active=True,
                   enrollment_attributes=None,
                   user=None,
                   is_ecommerce_request=False):
    """Enrolls a user in a course.

    Enrolls a user in a course. If the mode is not specified, this will default to `CourseMode.DEFAULT_MODE_SLUG`.

    Arguments:
        user_id (str): The user to enroll.
        course_id (str): The course to enroll the user in.
        mode (str): Optional argument for the type of enrollment to create. Ex. 'audit', 'honor', 'verified',
            'professional'. If not specified, this defaults to the default course mode.
        is_active (boolean): Optional argument for making the new enrollment inactive. If not specified, is_active
            defaults to True.
        enrollment_attributes (list): Attributes to be set the enrollment.

    Returns:
        A serializable dictionary of the new course enrollment.

    Example:
        >>> add_enrollment("Bob", "edX/DemoX/2014T2", mode="audit")
        {
            "created": "2014-10-20T20:18:00Z",
            "mode": "audit",
            "is_active": True,
            "user": "******",
            "course_details": {
                "course_id": "edX/DemoX/2014T2",
                "course_name": "edX Demonstration Course",
                "enrollment_end": "2014-12-20T20:18:00Z",
                "enrollment_start": "2014-10-15T20:18:00Z",
                "course_start": "2015-02-03T00:00:00Z",
                "course_end": "2015-05-06T00:00:00Z",
                "course_modes": [
                    {
                        "slug": "audit",
                        "name": "Audit",
                        "min_price": 0,
                        "suggested_prices": "",
                        "currency": "usd",
                        "expiration_datetime": null,
                        "description": null,
                        "sku": null,
                        "bulk_sku": null
                    }
                ],
                "invite_only": False
            }
        }
    """
    if mode is None:
        mode = _default_course_mode(course_id)
    validate_course_mode(course_id, mode, is_active=is_active)

    if settings.FEATURES.get(
            'ENABLE_MEMBERSHIP_INTEGRATION') and is_ecommerce_request:
        from membership.models import VIPCourseEnrollment
        course_key = CourseKey.from_string(course_id)
        VIPCourseEnrollment.objects.filter(
            user=user, course_id=course_key).update(is_active=False)

    with transaction.atomic():
        enrollment = _data_api().create_course_enrollment(
            user_id, course_id, mode, is_active)

        if enrollment_attributes is not None:
            set_enrollment_attributes(user_id, course_id,
                                      enrollment_attributes)

        if settings.FEATURES.get('ENABLE_MEMBERSHIP_INTEGRATION',
                                 False) and not is_ecommerce_request:
            from membership.models import VIPCourseEnrollment
            from student.models import User

            if user is None:
                try:
                    user = User.objects.get(username=user_id)
                except User.DoesNotExist:
                    msg = u"Not user with username '{username}' found.".format(
                        username=user_id)
                    log.warn(msg)
                    raise UserNotFoundError(msg)

            course_key = CourseKey.from_string(course_id)
            can_vip_enroll = VIPCourseEnrollment.can_vip_enroll(
                user, course_key)
            if mode in ('professional', 'no-id-professional', 'verified'):
                if not can_vip_enroll:
                    msg = u"Sorry, your VIP has expired."
                    error_data = {
                        'mode': mode,
                        'can_vip_enroll': can_vip_enroll
                    }
                    raise errors.CourseModeNotFoundError(msg, error_data)
                else:
                    VIPCourseEnrollment.enroll(user, course_key)

    return enrollment