From 1d1058a73432d6f8af6ba9777e4fcc288c3ee994 Mon Sep 17 00:00:00 2001 From: Josh McLaughlin Date: Wed, 17 Jul 2019 00:57:24 -0700 Subject: [PATCH 1/3] Add certificate status to generated certificate admin view --- lms/djangoapps/certificates/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/djangoapps/certificates/admin.py b/lms/djangoapps/certificates/admin.py index f3890ed85dae..142d6979d405 100644 --- a/lms/djangoapps/certificates/admin.py +++ b/lms/djangoapps/certificates/admin.py @@ -66,7 +66,7 @@ class GeneratedCertificateAdmin(admin.ModelAdmin): raw_id_fields = ('user',) show_full_result_count = False search_fields = ('course_id', 'user__username') - list_display = ('id', 'course_id', 'mode', 'user') + list_display = ('id', 'course_id', 'mode', 'user', 'status') class CertificateGenerationCourseSettingAdmin(admin.ModelAdmin): From 168b8a79b885fcb6a00cead3bfba14def38682a9 Mon Sep 17 00:00:00 2001 From: Josh McLaughlin Date: Wed, 17 Jul 2019 00:59:14 -0700 Subject: [PATCH 2/3] Add CourseWaffleFlag to toggle login_required for certificates views --- lms/djangoapps/certificates/views/webview.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lms/djangoapps/certificates/views/webview.py b/lms/djangoapps/certificates/views/webview.py index 581b57d2e21f..98d199af879d 100644 --- a/lms/djangoapps/certificates/views/webview.py +++ b/lms/djangoapps/certificates/views/webview.py @@ -10,6 +10,7 @@ import pytz from django.conf import settings from django.contrib.auth.models import User +from django.contrib.auth.decorators import login_required from django.http import Http404, HttpResponse from django.template import RequestContext from django.utils.encoding import smart_str @@ -42,6 +43,7 @@ from openedx.core.djangoapps.catalog.utils import get_course_run_details from openedx.core.djangoapps.lang_pref.api import get_closest_released_language from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag from openedx.core.lib.courses import course_image_url from openedx.core.djangoapps.certificates.api import display_date_for_certificate, certificates_viewable_for_course from student.models import LinkedInAddToProfileConfiguration @@ -57,6 +59,19 @@ INVALID_CERTIFICATE_TEMPLATE_PATH = 'certificates/invalid.html' +def certs_login_required(view): + """ + Require login when the 'certificates.require_login' is enabled + """ + def wrap(request, user_id, course_id, *args, **kwargs): + course_key = CourseKey.from_string(course_id) + if CourseWaffleFlag('certificates', 'require_login').is_enabled(course_key): + return login_required(view)(request, user_id, course_id, *args, **kwargs) + else: + return view(request, user_id, course_id, *args, **kwargs) + return wrap + + def get_certificate_description(mode, certificate_type, platform_name): """ :return certificate_type_description on the basis of current mode @@ -482,6 +497,7 @@ def render_cert_by_uuid(request, certificate_uuid): template_path="certificates/server-error.html", test_func=lambda request: request.GET.get('preview', None) ) +@certs_login_required def render_html_view(request, user_id, course_id): """ This public view generates an HTML representation of the specified user and course From 2724db92be47827890b1cfcd18d36004a98b4e22 Mon Sep 17 00:00:00 2001 From: Josh McLaughlin Date: Fri, 26 Jul 2019 16:51:25 -0700 Subject: [PATCH 3/3] Use WaffleFlagNamespace to specify namespace --- lms/djangoapps/certificates/views/webview.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lms/djangoapps/certificates/views/webview.py b/lms/djangoapps/certificates/views/webview.py index 98d199af879d..0ef11992a657 100644 --- a/lms/djangoapps/certificates/views/webview.py +++ b/lms/djangoapps/certificates/views/webview.py @@ -43,7 +43,7 @@ from openedx.core.djangoapps.catalog.utils import get_course_run_details from openedx.core.djangoapps.lang_pref.api import get_closest_released_language from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers -from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlagNamespace from openedx.core.lib.courses import course_image_url from openedx.core.djangoapps.certificates.api import display_date_for_certificate, certificates_viewable_for_course from student.models import LinkedInAddToProfileConfiguration @@ -57,6 +57,8 @@ INVALID_CERTIFICATE_TEMPLATE_PATH = 'certificates/invalid.html' +WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='certificates') +LOGIN_REQUIRED_FLAG = CourseWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'require_login') def certs_login_required(view): @@ -65,7 +67,7 @@ def certs_login_required(view): """ def wrap(request, user_id, course_id, *args, **kwargs): course_key = CourseKey.from_string(course_id) - if CourseWaffleFlag('certificates', 'require_login').is_enabled(course_key): + if LOGIN_REQUIRED_FLAG.is_enabled(course_key): return login_required(view)(request, user_id, course_id, *args, **kwargs) else: return view(request, user_id, course_id, *args, **kwargs)