Commit 65ee2ebb by Sofiya Semenova Committed by GitHub

Merge pull request #15833 from edx/ssemenova/ed-801

EDUCATOR-801 Certificate issued date should be the certificate availability date for instructor-paced courses
parents c27af617 c7fc1929
......@@ -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(
......
......@@ -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()
......
......@@ -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(
......@@ -789,6 +795,34 @@ class CertificatesViewsTests(CommonCertificatesTestCase):
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
self.course.save()
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment