diff --git a/common/test/db_fixtures/certificates_web_view.json b/common/test/db_fixtures/certificates_web_view.json index 3ef1912536..fb6beb7350 100644 --- a/common/test/db_fixtures/certificates_web_view.json +++ b/common/test/db_fixtures/certificates_web_view.json @@ -14,7 +14,8 @@ "fields": { "modified": "2015-06-18 11:02:13.007790+00:00", "course_key": "course-v1:test_org+3355358979513794782079645765720179311111+test_run", - "enabled": true + "enabled": true, + "self_generation_enabled": true } }, { diff --git a/lms/djangoapps/certificates/admin.py b/lms/djangoapps/certificates/admin.py index 39e5b8d420..afccb1fcf3 100644 --- a/lms/djangoapps/certificates/admin.py +++ b/lms/djangoapps/certificates/admin.py @@ -64,7 +64,7 @@ class CertificateGenerationCourseSettingAdmin(admin.ModelAdmin): """ Django admin customizations for CertificateGenerationCourseSetting model """ - list_display = ('course_key', 'enabled') + list_display = ('course_key', 'self_generation_enabled', 'language_specific_templates_enabled') search_fields = ('course_key',) show_full_result_count = False diff --git a/lms/djangoapps/certificates/api.py b/lms/djangoapps/certificates/api.py index 745e6f8420..8450f14fa9 100644 --- a/lms/djangoapps/certificates/api.py +++ b/lms/djangoapps/certificates/api.py @@ -267,7 +267,7 @@ def set_cert_generation_enabled(course_key, is_enabled): certificates for this course. """ - CertificateGenerationCourseSetting.set_enabled_for_course(course_key, is_enabled) + CertificateGenerationCourseSetting.set_self_generatation_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, { @@ -321,7 +321,7 @@ def cert_generation_enabled(course_key): """ return ( CertificateGenerationConfiguration.current().enabled and - CertificateGenerationCourseSetting.is_enabled_for_course(course_key) + CertificateGenerationCourseSetting.is_self_generation_enabled_for_course(course_key) ) diff --git a/lms/djangoapps/certificates/migrations/0009_certificategenerationcoursesetting_language_self_generation.py b/lms/djangoapps/certificates/migrations/0009_certificategenerationcoursesetting_language_self_generation.py new file mode 100644 index 0000000000..b6d758aa52 --- /dev/null +++ b/lms/djangoapps/certificates/migrations/0009_certificategenerationcoursesetting_language_self_generation.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import apps +from django.db import migrations, models +from django.db.models import F + +def copy_field(apps, schema_editor): + CertificateGenerationCourseSetting = apps.get_model('certificates', 'CertificateGenerationCourseSetting') + CertificateGenerationCourseSetting.objects.all().update(self_generation_enabled=F('enabled')) + +def undo_copy(apps, schema_editor): + CertificateGenerationCourseSetting = apps.get_model('certificates', 'CertificateGenerationCourseSetting') + CertificateGenerationCourseSetting.objects.all().update(enabled=F('self_generation_enabled')) + +class Migration(migrations.Migration): + """ + Adds new field 'language_specific_templates_enabled'. + Also adds field 'self_generation_enabled' which is a + replacement for 'enabled' + Lastly, copies data from 'enabled' to 'self_generation_enabled' + """ + dependencies = [ + ('certificates', '0008_schema__remove_badges'), + ] + + operations = [ + migrations.AddField( + model_name='certificategenerationcoursesetting', + name='language_specific_templates_enabled', + field=models.BooleanField(default=False, help_text="Render translated certificates rather than using the platform's default language. Available translations are controlled by the certificate template."), + ), + migrations.AddField( + model_name='certificategenerationcoursesetting', + name='self_generation_enabled', + field=models.BooleanField(default=False, help_text='Allow students to generate their own certificates for the course. Enabling this does NOT affect usage of the management command used for batch certificate generation.'), + ), + migrations.AlterField( + model_name='certificategenerationcoursesetting', + name='enabled', + field=models.BooleanField(default=False, help_text='DEPRECATED, please use self_generation_enabled instead.'), + ), + migrations.RunPython(copy_field, reverse_code=undo_copy), + ] diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index a4ad99b394..f043957cb2 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -842,26 +842,41 @@ class ExampleCertificate(TimeStampedModel): class CertificateGenerationCourseSetting(TimeStampedModel): """Enable or disable certificate generation for a particular course. - This controls whether students are allowed to "self-generate" - certificates for a course. It does NOT prevent us from - batch-generating certificates for a course using management - commands. - In general, we should only enable self-generated certificates for a course once we successfully generate example certificates for the course. This is enforced in the UI layer, but not in the data layer. - """ course_key = CourseKeyField(max_length=255, db_index=True) - enabled = models.BooleanField(default=False) + enabled = models.BooleanField( + default=False, + help_text=u"DEPRECATED, please use self_generation_enabled instead." + ) + # TODO: Learner-2549 remove deprecated enabled field + + self_generation_enabled = models.BooleanField( + default=False, + help_text=( + u"Allow students to generate their own certificates for the course. " + u"Enabling this does NOT affect usage of the management command used " + u"for batch certificate generation." + ) + ) + language_specific_templates_enabled = models.BooleanField( + default=False, + help_text=( + u"Render translated certificates rather than using the platform's " + u"default language. Available translations are controlled by the " + u"certificate template." + ) + ) class Meta(object): get_latest_by = 'created' app_label = "certificates" @classmethod - def is_enabled_for_course(cls, course_key): + def is_self_generation_enabled_for_course(cls, course_key): """Check whether self-generated certificates are enabled for a course. Arguments: @@ -876,10 +891,10 @@ class CertificateGenerationCourseSetting(TimeStampedModel): except cls.DoesNotExist: return False else: - return latest.enabled + return latest.self_generation_enabled @classmethod - def set_enabled_for_course(cls, course_key, is_enabled): + def set_self_generatation_enabled_for_course(cls, course_key, is_enabled): """Enable or disable self-generated certificates for a course. Arguments: @@ -887,9 +902,46 @@ class CertificateGenerationCourseSetting(TimeStampedModel): is_enabled (boolean): Whether to enable or disable self-generated certificates. """ - CertificateGenerationCourseSetting.objects.create( + default = { + 'self_generation_enabled': is_enabled + } + CertificateGenerationCourseSetting.objects.update_or_create( course_key=course_key, - enabled=is_enabled + defaults=default + ) + + def is_language_specific_templates_enabled_for_course(cls, course_key): + """Check whether language-specific certificates are enabled for a course. + + Arguments: + course_key (CourseKey): The identifier for the course. + + Returns: + boolean + + """ + try: + latest = cls.objects.filter(course_key=course_key).latest() + except cls.DoesNotExist: + return False + else: + return latest.language_specific_templates_enabled + + @classmethod + def set_language_specific_templates_enabled_for_course(cls, course_key, is_enabled): + """Enable or disable language-specific certificates for a course. + + Arguments: + course_key (CourseKey): The identifier for the course. + is_enabled (boolean): Whether to enable or disable language-specific certificates. + + """ + default = { + 'language_specific_templates_enabled': is_enabled, + } + CertificateGenerationCourseSetting.objects.update_or_create( + course_key=course_key, + defaults=default ) diff --git a/openedx/core/djangoapps/signals/handlers.py b/openedx/core/djangoapps/signals/handlers.py index 0b518e7d51..0eb1118259 100644 --- a/openedx/core/djangoapps/signals/handlers.py +++ b/openedx/core/djangoapps/signals/handlers.py @@ -27,4 +27,4 @@ def toggle_self_generated_certs(course_key, course_self_paced): """ Enable or disable self-generated certificates for a course according to pacing. """ - CertificateGenerationCourseSetting.set_enabled_for_course(course_key, course_self_paced) + CertificateGenerationCourseSetting.set_self_generatation_enabled_for_course(course_key, course_self_paced)