diff --git a/common/test/acceptance/tests/lms/test_certificate_web_view.py b/common/test/acceptance/tests/lms/test_certificate_web_view.py index 1d5ea4e9be..79b8788507 100644 --- a/common/test/acceptance/tests/lms/test_certificate_web_view.py +++ b/common/test/acceptance/tests/lms/test_certificate_web_view.py @@ -32,7 +32,7 @@ class CertificateWebViewTest(EventsTestMixin, UniqueCourseTest): 'course_title': 'Course title override', 'signatories': [], 'version': 1, - 'is_active': True + 'is_active': True, } course_settings = {'certificates': test_certificate_config} self.course_fixture = CourseFixture( diff --git a/lms/djangoapps/certificates/tests/test_views.py b/lms/djangoapps/certificates/tests/test_views.py index 3a9438a8ed..7ccbf9f367 100644 --- a/lms/djangoapps/certificates/tests/test_views.py +++ b/lms/djangoapps/certificates/tests/test_views.py @@ -4,6 +4,7 @@ import json from uuid import uuid4 import ddt +import datetime from django.conf import settings from django.core.cache import cache from django.core.urlresolvers import reverse @@ -189,7 +190,10 @@ class MicrositeCertificatesViewsTests(ModuleStoreTestCase): super(MicrositeCertificatesViewsTests, self).setUp() self.client = Client() self.course = CourseFactory.create( - org='testorg', number='run1', display_name='refundable course' + org='testorg', + number='run1', + display_name='refundable course', + certificate_available_date=datetime.datetime.today() - datetime.timedelta(days=1) ) self.course.cert_html_view_enabled = True self.course.save() diff --git a/lms/djangoapps/certificates/tests/test_webview_views.py b/lms/djangoapps/certificates/tests/test_webview_views.py index da8646fd28..0f8a9ec904 100644 --- a/lms/djangoapps/certificates/tests/test_webview_views.py +++ b/lms/djangoapps/certificates/tests/test_webview_views.py @@ -7,10 +7,13 @@ from urllib import urlencode from uuid import uuid4 import ddt +import datetime from django.conf import settings from django.core.urlresolvers import reverse from django.test.client import Client, RequestFactory from django.test.utils import override_settings +from util.date_utils import strftime_localized +from django.utils.translation import ugettext as _ from mock import patch from nose.plugins.attrib import attr @@ -73,7 +76,10 @@ class CommonCertificatesTestCase(ModuleStoreTestCase): super(CommonCertificatesTestCase, self).setUp() self.client = Client() self.course = CourseFactory.create( - org='testorg', number='run1', display_name='refundable course' + org='testorg', + number='run1', + display_name='refundable course', + certificate_available_date=datetime.datetime.today() - datetime.timedelta(days=1), ) self.course_id = self.course.location.course_key self.user = UserFactory.create( @@ -788,6 +794,34 @@ class CertificatesViewsTests(CommonCertificatesTestCase): self.assertIn('course_title_0', response.content) self.assertIn('Signatory_Title 0', response.content) + @override_settings(FEATURES=FEATURES_WITH_CERTS_ENABLED) + @ddt.data(True, False) + def test_html_view_certificate_availability_date_for_instructor_paced_courses(self, is_self_paced): + """ + test certificate web view should display the certificate availability date + as the issued date for instructor-paced courses + """ + self.course.self_paced = is_self_paced + self.course.save() + self._add_course_certificates(count=1, signatory_count=1) + test_url = get_certificate_url( + user_id=self.user.id, + course_id=unicode(self.course.id) + ) + + if is_self_paced: + expected_date = datetime.datetime.today() + else: + expected_date = self.course.certificate_available_date + + response = self.client.get(test_url) + date = '{month} {day}, {year}'.format( + month=strftime_localized(expected_date, "%B"), + day=expected_date.day, + year=expected_date.year + ) + self.assertIn(date, response.content) + @override_settings(FEATURES=FEATURES_WITH_CERTS_ENABLED) def test_render_html_view_invalid_certificate_configuration(self): self.course.cert_html_view_enabled = True diff --git a/lms/djangoapps/certificates/views/webview.py b/lms/djangoapps/certificates/views/webview.py index 4ec4050a8f..eb535020d8 100644 --- a/lms/djangoapps/certificates/views/webview.py +++ b/lms/djangoapps/certificates/views/webview.py @@ -5,15 +5,16 @@ Certificate HTML webview. import logging import urllib from datetime import datetime -import pytz from uuid import uuid4 +import pytz from django.conf import settings from django.contrib.auth.models import User from django.http import Http404, HttpResponse from django.template import RequestContext from django.utils.encoding import smart_str from django.utils.translation import ugettext as _ +from eventtracking import tracker from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey @@ -35,15 +36,15 @@ from certificates.models import ( GeneratedCertificate ) from courseware.access import has_access +from courseware.courses import get_course_by_id from edxmako.shortcuts import render_to_response from edxmako.template import Template -from eventtracking import tracker from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.lib.courses import course_image_url from student.models import LinkedInAddToProfileConfiguration from util import organizations_helpers as organization_api -from util.views import handle_500 from util.date_utils import strftime_localized +from util.views import handle_500 from xmodule.modulestore.django import modulestore from xmodule.modulestore.exceptions import ItemNotFoundError @@ -98,10 +99,16 @@ def _update_certificate_context(context, user_certificate, platform_name): ) # Translators: The format of the date includes the full name of the month + course = get_course_by_id(user_certificate.course_id) if user_certificate.course_id else None + + if course and not course.self_paced and course.certificate_available_date: + date = course.certificate_available_date + else: + date = user_certificate.modified_date context['certificate_date_issued'] = _('{month} {day}, {year}').format( - month=strftime_localized(user_certificate.modified_date, "%B"), - day=user_certificate.modified_date.day, - year=user_certificate.modified_date.year + month=strftime_localized(date, "%B"), + day=date.day, + year=date.year ) # Translators: This text represents the verification of the certificate @@ -333,10 +340,14 @@ def _get_user_certificate(request, user, course_key, course, preview_mode=None): if preview_mode: # certificate is being previewed from studio if has_access(request.user, 'instructor', course) or has_access(request.user, 'staff', course): + if course.certificate_available_date and not course.self_paced: + modified_date = course.certificate_available_date + else: + modified_date = datetime.now().date() user_certificate = GeneratedCertificate( mode=preview_mode, verify_uuid=unicode(uuid4().hex), - modified_date=datetime.now().date() + modified_date=modified_date ) else: # certificate is being viewed by learner or public