Example #1
0
def set_cert_generation_enabled(course_key, is_enabled):
    """Enable or disable self-generated certificates for a course.

    There are two "switches" that control whether self-generated certificates
    are enabled for a course:

    1) Whether the self-generated certificates feature is enabled.
    2) Whether self-generated certificates have been enabled for this particular course.

    The second flag should be enabled *only* when someone has successfully
    generated example certificates for the course.  This helps avoid
    configuration errors (for example, not having a template configured
    for the course installed on the workers).  The UI for the instructor
    dashboard enforces this constraint.

    Arguments:
        course_key (CourseKey): The course identifier.

    Keyword Arguments:
        is_enabled (boolean): If provided, enable/disable self-generated
            certificates for this course.

    """
    CertificateGenerationCourseSetting.set_enabled_for_course(course_key, is_enabled)
    cert_event_type = 'enabled' if is_enabled else 'disabled'
    event_name = '.'.join(['edx', 'certificate', 'generation', cert_event_type])
    tracker.emit(event_name, {
        'course_id': unicode(course_key),
    })
    if is_enabled:
        log.info(u"Enabled self-generated certificates for course '%s'.", unicode(course_key))
    else:
        log.info(u"Disabled self-generated certificates for course '%s'.", unicode(course_key))
Example #2
0
def set_cert_generation_enabled(course_key, is_enabled):
    """Enable or disable self-generated certificates for a course.

    There are two "switches" that control whether self-generated certificates
    are enabled for a course:

    1) Whether the self-generated certificates feature is enabled.
    2) Whether self-generated certificates have been enabled for this particular course.

    The second flag should be enabled *only* when someone has successfully
    generated example certificates for the course.  This helps avoid
    configuration errors (for example, not having a template configured
    for the course installed on the workers).  The UI for the instructor
    dashboard enforces this constraint.

    Arguments:
        course_key (CourseKey): The course identifier.

    Keyword Arguments:
        is_enabled (boolean): If provided, enable/disable self-generated
            certificates for this course.

    """
    CertificateGenerationCourseSetting.set_enabled_for_course(
        course_key, is_enabled)

    if is_enabled:
        log.info(u"Enabled self-generated certificates for course '%s'.",
                 unicode(course_key))
    else:
        log.info(u"Disabled self-generated certificates for course '%s'.",
                 unicode(course_key))
Example #3
0
def enable_self_generated_certs(course_key):
    """Enable the self-generated certificates by default for self-paced courses."""
    course_key = CourseKey.from_string(course_key)
    course = modulestore().get_course(course_key)
    is_enabled_for_course = CertificateGenerationCourseSetting.is_enabled_for_course(course_key)
    if course.self_paced and not is_enabled_for_course:
        CertificateGenerationCourseSetting.set_enabled_for_course(course_key, True)
Example #4
0
def toggle_self_generated_certs(course_key, course_self_paced):
    """
    Enable or disable self-generated certificates for a course according to pacing.
    """
    course_key = CourseKey.from_string(course_key)
    CertificateGenerationCourseSetting.set_enabled_for_course(
        course_key, course_self_paced)
Example #5
0
def enable_self_generated_certs(course_key):
    """Enable the self-generated certificates by default for self-paced courses."""
    course_key = CourseKey.from_string(course_key)
    course = CourseOverview.get_from_id(course_key)
    is_enabled_for_course = CertificateGenerationCourseSetting.is_enabled_for_course(
        course_key)
    if course.self_paced and not is_enabled_for_course:
        CertificateGenerationCourseSetting.set_enabled_for_course(
            course_key, True)
def toggle_self_generated_certs(course_key, course_self_paced):
    """
    Enable or disable self-generated certificates for a course according to pacing.

    Enable self-generated certificates on course if:
    course is a self-paced course and self-generated certs on self-paced not explicitly disabled
    course is not self-paced and self-generated certs are explicitly enabled
    """
    course_key = unicode(course_key)
    course_key = CourseKey.from_string(course_key)
    enable = False if app_settings.DISABLE_SELF_GENERATED_CERTS_FOR_SELF_PACED is True else \
        (course_self_paced or app_settings.ALWAYS_ENABLE_SELF_GENERATED_CERTS)
    CertificateGenerationCourseSetting.set_enabled_for_course(
        course_key, enable)
Example #7
0
def _update_course_context(request, context, course, course_key, platform_name):
    """
    Updates context dictionary with course info.
    """
    context['full_course_image_url'] = request.build_absolute_uri(course_image_url(course))
    course_title_from_cert = context['certificate_data'].get('course_title', '')
    accomplishment_copy_course_name = course_title_from_cert if course_title_from_cert else course.display_name
    context['accomplishment_copy_course_name'] = accomplishment_copy_course_name
    course_number = course.display_coursenumber if course.display_coursenumber else course.number
    context['course_number'] = course_number
    if context['organization_long_name']:
        # Translators:  This text represents the description of course
        context['accomplishment_copy_course_description'] = _('a course of study offered by {partner_short_name}, '
                                                              'an online learning initiative of '
                                                              '{partner_long_name}.').format(
            partner_short_name=context['organization_short_name'],
            partner_long_name=context['organization_long_name'],
            platform_name=platform_name)
    else:
        # Translators:  This text represents the description of course
        context['accomplishment_copy_course_description'] = _('a course of study offered by '
                                                              '{partner_short_name}.').format(
            partner_short_name=context['organization_short_name'],
            platform_name=platform_name)
    # If language specific templates are enabled for the course, add course_run specific information to the context
    if CertificateGenerationCourseSetting.is_language_specific_templates_enabled_for_course(course_key):
        fields = ['start', 'end', 'max_effort', 'language']
        course_run_data = get_course_run_details(course_key, fields)
        context.update(course_run_data)
Example #8
0
def _get_catalog_data_for_course(course_key):
    """
    Retrieve data from the Discovery service necessary for rendering a certificate for a specific course.
    """
    course_certificate_settings = CertificateGenerationCourseSetting.get(course_key)
    if not course_certificate_settings:
        return {}

    catalog_data = {}
    course_run_fields = []
    if course_certificate_settings.language_specific_templates_enabled:
        course_run_fields.append('content_language')
    if course_certificate_settings.include_hours_of_effort:
        course_run_fields.extend(['weeks_to_complete', 'max_effort'])

    if course_run_fields:
        course_run_data = get_course_run_details(course_key, course_run_fields)
        if course_run_data.get('weeks_to_complete') and course_run_data.get('max_effort'):
            try:
                weeks_to_complete = int(course_run_data['weeks_to_complete'])
                max_effort = int(course_run_data['max_effort'])
                catalog_data['hours_of_effort'] = weeks_to_complete * max_effort
            except ValueError:
                log.exception('Error occurred while parsing course run details')
        catalog_data['content_language'] = course_run_data.get('content_language')

    return catalog_data
Example #9
0
def _get_catalog_data_for_course(course_key):
    """
    Retrieve data from the Discovery service necessary for rendering a certificate for a specific course.
    """
    course_certificate_settings = CertificateGenerationCourseSetting.get(
        course_key)
    if not course_certificate_settings:
        return {}

    catalog_data = {}
    course_run_fields = []
    if course_certificate_settings.language_specific_templates_enabled:
        course_run_fields.append('content_language')
    if course_certificate_settings.include_hours_of_effort:
        course_run_fields.extend(['weeks_to_complete', 'max_effort'])

    if course_run_fields:
        course_run_data = get_course_run_details(course_key, course_run_fields)
        if course_run_data.get('weeks_to_complete') and course_run_data.get(
                'max_effort'):
            try:
                weeks_to_complete = int(course_run_data['weeks_to_complete'])
                max_effort = int(course_run_data['max_effort'])
                catalog_data[
                    'hours_of_effort'] = weeks_to_complete * max_effort
            except ValueError:
                log.exception(
                    'Error occurred while parsing course run details')
        catalog_data['content_language'] = course_run_data.get(
            'content_language')

    return catalog_data
Example #10
0
def _update_context_with_catalog_data(context, course_key):
    """
    Updates context dictionary with relevant course run info from Discovery.
    """
    course_certificate_settings = CertificateGenerationCourseSetting.get(
        course_key)
    if course_certificate_settings:
        course_run_fields = []
        if course_certificate_settings.language_specific_templates_enabled:
            course_run_fields.append('content_language')
        if course_certificate_settings.include_hours_of_effort:
            course_run_fields.extend(['weeks_to_complete', 'max_effort'])
        if course_run_fields:
            course_run_data = get_course_run_details(course_key,
                                                     course_run_fields)
            if course_run_data.get(
                    'weeks_to_complete') and course_run_data.get('max_effort'):
                try:
                    weeks_to_complete = int(
                        course_run_data['weeks_to_complete'])
                    max_effort = int(course_run_data['max_effort'])
                    context['hours_of_effort'] = weeks_to_complete * max_effort
                except ValueError:
                    log.exception(
                        'Error occurred while parsing course run details')
            context['content_language'] = course_run_data.get(
                'content_language')
Example #11
0
def toggle_self_generated_certs(course_key, course_self_paced):
    """
    Enable or disable self-generated certificates for a course according to pacing.

    Enable self-generated certificates on course if:
    course is a self-paced course and self-generated certs on self-paced not explicitly disabled
    course is not self-paced and self-generated certs are explicitly enabled
    """
    course_key = unicode(course_key)
    course_key = CourseKey.from_string(course_key)
    if CertificateGenerationCourseSetting.is_enabled_for_course(course_key) and course_self_paced is True:
        # Catch possible edge case which may happen during upgrades:
        # Never change an enabled active config for a self-paced course to disabled
        logger.warn("""
            toggle_self_generated_certs won't override an enabled CertificateGenerationCourseSetting
            with a disabled one on a course being changed (or probably re-saved) as self-paced.
            """)
        return
    enable = False if app_settings.DISABLE_SELF_GENERATED_CERTS_FOR_SELF_PACED is True else \
        (course_self_paced or app_settings.ALWAYS_ENABLE_SELF_GENERATED_CERTS)

    CertificateGenerationCourseSetting.set_enabled_for_course(course_key, enable)
Example #12
0
def _update_course_context(request, context, course, course_key,
                           platform_name):
    """
    Updates context dictionary with course info.
    """
    context['full_course_image_url'] = request.build_absolute_uri(
        course_image_url(course))
    course_title_from_cert = context['certificate_data'].get(
        'course_title', '')
    accomplishment_copy_course_name = course_title_from_cert if course_title_from_cert else course.display_name
    context[
        'accomplishment_copy_course_name'] = accomplishment_copy_course_name
    course_number = course.display_coursenumber if course.display_coursenumber else course.number
    context['course_number'] = course_number
    if context['organization_long_name']:
        # Translators:  This text represents the description of course
        context['accomplishment_copy_course_description'] = _(
            'a course of study offered by {partner_short_name}, '
            'an online learning initiative of '
            '{partner_long_name}.').format(
                partner_short_name=context['organization_short_name'],
                partner_long_name=context['organization_long_name'],
                platform_name=platform_name)
    else:
        # Translators:  This text represents the description of course
        context['accomplishment_copy_course_description'] = _(
            'a course of study offered by '
            '{partner_short_name}.').format(
                partner_short_name=context['organization_short_name'],
                platform_name=platform_name)
    # If language specific templates are enabled for the course, add course_run specific information to the context
    if CertificateGenerationCourseSetting.is_language_specific_templates_enabled_for_course(
            course_key):
        fields = ['start', 'end', 'max_effort', 'content_language']
        course_run_data = get_course_run_details(course_key, fields)
        if course_run_data['start'] and course_run_data[
                'end'] and course_run_data['max_effort']:
            # Calculate duration of the course run in weeks, multiplied by max_effort for total Hours of Effort
            try:
                start = parser.parse(course_run_data['start'])
                end = parser.parse(course_run_data['end'])
                max_effort = int(course_run_data['max_effort'])
                context['hours_of_effort'] = (
                    (end - start).days / 7) * max_effort
            except ValueError:
                log.exception(
                    'Error occurred while parsing course run details')
        context['content_language'] = course_run_data['content_language']
Example #13
0
def _update_context_with_catalog_data(context, course_key):
    """
    Updates context dictionary with relevant course run info from Discovery.
    """
    course_certificate_settings = CertificateGenerationCourseSetting.get(course_key)
    if course_certificate_settings:
        course_run_fields = []
        if course_certificate_settings.language_specific_templates_enabled:
            course_run_fields.append('content_language')
        if course_certificate_settings.include_hours_of_effort:
            course_run_fields.extend(['weeks_to_complete', 'max_effort'])
        if course_run_fields:
            course_run_data = get_course_run_details(course_key, course_run_fields)
            if course_run_data.get('weeks_to_complete') and course_run_data.get('max_effort'):
                try:
                    weeks_to_complete = int(course_run_data['weeks_to_complete'])
                    max_effort = int(course_run_data['max_effort'])
                    context['hours_of_effort'] = weeks_to_complete * max_effort
                except ValueError:
                    log.exception('Error occurred while parsing course run details')
            context['content_language'] = course_run_data.get('content_language')
Example #14
0
def cert_generation_enabled(course_key):
    """Check whether certificate generation is enabled for a course.

    There are two "switches" that control whether self-generated certificates
    are enabled for a course:

    1) Whether the self-generated certificates feature is enabled.
    2) Whether self-generated certificates have been enabled for this particular course.

    Certificates are enabled for a course only when both switches
    are set to True.

    Arguments:
        course_key (CourseKey): The course identifier.

    Returns:
        boolean: Whether self-generated certificates are enabled
            for the course.

    """
    return (
        CertificateGenerationConfiguration.current().enabled and
        CertificateGenerationCourseSetting.is_enabled_for_course(course_key))
Example #15
0
def cert_generation_enabled(course_key):
    """Check whether certificate generation is enabled for a course.

    There are two "switches" that control whether self-generated certificates
    are enabled for a course:

    1) Whether the self-generated certificates feature is enabled.
    2) Whether self-generated certificates have been enabled for this particular course.

    Certificates are enabled for a course only when both switches
    are set to True.

    Arguments:
        course_key (CourseKey): The course identifier.

    Returns:
        boolean: Whether self-generated certificates are enabled
            for the course.

    """
    return CertificateGenerationConfiguration.current().enabled and CertificateGenerationCourseSetting.is_enabled_for_course(
        course_key
    )
Example #16
0
def _update_course_context(request, context, course, course_key,
                           platform_name):
    """
    Updates context dictionary with course info.
    """
    context['full_course_image_url'] = request.build_absolute_uri(
        course_image_url(course))
    course_title_from_cert = context['certificate_data'].get(
        'course_title', '')
    accomplishment_copy_course_name = course_title_from_cert if course_title_from_cert else course.display_name
    context[
        'accomplishment_copy_course_name'] = accomplishment_copy_course_name
    course_number = course.display_coursenumber if course.display_coursenumber else course.number
    context['course_number'] = course_number
    if context['organization_long_name']:
        # Translators:  This text represents the description of course
        context['accomplishment_copy_course_description'] = _(
            'a course of study offered by {partner_short_name}, '
            'an online learning initiative of '
            '{partner_long_name}.').format(
                partner_short_name=context['organization_short_name'],
                partner_long_name=context['organization_long_name'],
                platform_name=platform_name)
    else:
        # Translators:  This text represents the description of course
        context['accomplishment_copy_course_description'] = _(
            'a course of study offered by '
            '{partner_short_name}.').format(
                partner_short_name=context['organization_short_name'],
                platform_name=platform_name)
    # If language specific templates are enabled for the course, add course_run specific information to the context
    if CertificateGenerationCourseSetting.is_language_specific_templates_enabled_for_course(
            course_key):
        fields = ['start', 'end', 'max_effort', 'language']
        course_run_data = get_course_run_details(course_key, fields)
        context.update(course_run_data)
Example #17
0
def toggle_self_generated_certs(course_key, course_self_paced):
    """
    Enable or disable self-generated certificates for a course according to pacing.
    """
    CertificateGenerationCourseSetting.set_self_generatation_enabled_for_course(course_key, course_self_paced)