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))
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))
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)
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)
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)
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)
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
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
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')
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)
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']
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')
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))
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 )
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)
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)