Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
c4823c5e
Commit
c4823c5e
authored
May 22, 2017
by
rabia23
Committed by
rabiaiftikhar
May 26, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
EDUCATOR-394 Disable self generation certificates when course is reset to instructor-paced.
parent
31912ac1
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
53 additions
and
27 deletions
+53
-27
common/test/acceptance/tests/lms/test_certificate_web_view.py
+6
-2
lms/djangoapps/certificates/models.py
+8
-4
lms/djangoapps/certificates/signals.py
+9
-13
lms/djangoapps/certificates/tests/test_signals.py
+15
-5
lms/djangoapps/courseware/tests/test_views.py
+15
-3
No files found.
common/test/acceptance/tests/lms/test_certificate_web_view.py
View file @
c4823c5e
...
...
@@ -12,6 +12,7 @@ from common.test.acceptance.pages.lms.course_info import CourseInfoPage
from
common.test.acceptance.pages.lms.courseware
import
CoursewarePage
from
common.test.acceptance.pages.lms.progress
import
ProgressPage
from
common.test.acceptance.pages.lms.tab_nav
import
TabNavPage
from
common.test.acceptance.pages.lms.instructor_dashboard
import
InstructorDashboardPage
@attr
(
shard
=
5
)
...
...
@@ -158,6 +159,7 @@ class CertificateProgressPageTest(UniqueCourseTest):
self
.
courseware_page
=
CoursewarePage
(
self
.
browser
,
self
.
course_id
)
self
.
course_home_page
=
CourseHomePage
(
self
.
browser
,
self
.
course_id
)
self
.
tab_nav
=
TabNavPage
(
self
.
browser
)
self
.
instructor_dashboard_page
=
InstructorDashboardPage
(
self
.
browser
,
self
.
course_id
)
def
log_in_as_unique_user
(
self
):
"""
...
...
@@ -168,7 +170,8 @@ class CertificateProgressPageTest(UniqueCourseTest):
username
=
"testprogress"
,
email
=
"progress@example.com"
,
password
=
"testuser"
,
course_id
=
self
.
course_id
course_id
=
self
.
course_id
,
staff
=
True
,
)
.
visit
()
def
test_progress_page_has_view_certificate_button
(
self
):
...
...
@@ -245,4 +248,4 @@ class CertificateProgressPageTest(UniqueCourseTest):
# Submit the answer
self
.
courseware_page
.
q
(
css
=
'button.submit'
)
.
click
()
self
.
courseware_page
.
wait_for_ajax
()
self
.
courseware_page
.
wait_for_ajax
()
\ No newline at end of file
lms/djangoapps/certificates/models.py
View file @
c4823c5e
...
...
@@ -54,6 +54,7 @@ from django.conf import settings
from
django.contrib.auth.models
import
User
from
django.core.exceptions
import
ValidationError
from
django.db
import
models
,
transaction
from
django.db.utils
import
IntegrityError
from
django.db.models
import
Count
from
django.dispatch
import
receiver
from
django.utils.translation
import
ugettext_lazy
as
_
...
...
@@ -890,10 +891,13 @@ class CertificateGenerationCourseSetting(TimeStampedModel):
is_enabled (boolean): Whether to enable or disable self-generated certificates.
"""
CertificateGenerationCourseSetting
.
objects
.
create
(
course_key
=
course_key
,
enabled
=
is_enabled
)
certificate_generation_course_setting
=
CertificateGenerationCourseSetting
(
course_key
=
course_key
,
enabled
=
is_enabled
)
try
:
with
transaction
.
atomic
():
certificate_generation_course_setting
.
save
()
except
IntegrityError
:
pass
class
CertificateGenerationConfiguration
(
ConfigurationModel
):
...
...
lms/djangoapps/certificates/signals.py
View file @
c4823c5e
""" Signal handler for enabling self-generated certificates
by default
for self
-paced courses.
""" Signal handler for enabling self-generated certificates
for self-paced
courses and disabling for instructor
-paced courses.
"""
from
celery.task
import
task
from
django.dispatch.dispatcher
import
receiver
from
certificates.models
import
CertificateGenerationCourseSetting
from
opaque_keys.edx.keys
import
CourseKey
from
openedx.core.djangoapps.content.course_overviews.models
import
CourseOverview
from
xmodule.modulestore.django
import
SignalHandler
from
xmodule.modulestore.django
import
SignalHandler
,
modulestore
@receiver
(
SignalHandler
.
course_published
)
def
_listen_for_course_publish
(
sender
,
course_key
,
**
kwargs
):
# pylint: disable=unused-argument
""" Catches the signal that a course has been published in Studio and
enable the self-generated certificates by default for self-paced
courses.
enable/disable the self-generated certificates for courses according to pacing.
"""
enable
_self_generated_certs
.
delay
(
unicode
(
course_key
))
set
_self_generated_certs
.
delay
(
unicode
(
course_key
))
@task
()
def
enable
_self_generated_certs
(
course_key
):
"""Enable
the self-generated certificates by default for self-paced courses
."""
def
set
_self_generated_certs
(
course_key
):
"""Enable
or disable self-generated certificates for a course according to pacing
."""
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
)
course
=
modulestore
()
.
get_course
(
course_key
)
CertificateGenerationCourseSetting
.
set_enabled_for_course
(
course_key
,
course
.
self_paced
)
lms/djangoapps/certificates/tests/test_signals.py
View file @
c4823c5e
""" Unit tests for enabling self-generated certificates
by default
for self
-paced courses.
""" Unit tests for enabling self-generated certificates
for
self-paced courses and disabling for instructor
-paced courses.
"""
from
certificates
import
api
as
certs_api
from
certificates.models
import
CertificateGenerationConfiguration
...
...
@@ -10,8 +10,8 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
class
SelfGeneratedCertsSignalTest
(
ModuleStoreTestCase
):
""" Tests for enabling
self-generated certificates by default
for self-paced courses
.
""" Tests for enabling
/disabling self-generated certificates
according to pacing
.
"""
def
setUp
(
self
):
...
...
@@ -22,10 +22,20 @@ class SelfGeneratedCertsSignalTest(ModuleStoreTestCase):
CertificateGenerationConfiguration
.
objects
.
create
(
enabled
=
True
)
def
test_cert_generation_enabled_for_self_paced
(
self
):
""" Verify the signal enable the self-generated certificates
by default
for
""" Verify the signal enable the self-generated certificates for
self-paced courses.
"""
self
.
assertFalse
(
certs_api
.
cert_generation_enabled
(
self
.
course
.
id
))
_listen_for_course_publish
(
'store'
,
self
.
course
.
id
)
self
.
assertTrue
(
certs_api
.
cert_generation_enabled
(
self
.
course
.
id
))
def
test_cert_generation_disabled_for_instructor_paced
(
self
):
""" Verify the signal disable the self-generated certificates for
instructor-paced courses.
"""
self
.
course
.
self_paced
=
False
self
.
store
.
update_item
(
self
.
course
,
self
.
user
.
id
)
_listen_for_course_publish
(
'store'
,
self
.
course
.
id
)
self
.
assertFalse
(
certs_api
.
cert_generation_enabled
(
self
.
course
.
id
))
lms/djangoapps/courseware/tests/test_views.py
View file @
c4823c5e
...
...
@@ -1331,9 +1331,6 @@ class ProgressPageTests(ModuleStoreTestCase):
# Enable the feature, but do not enable it for this course
CertificateGenerationConfiguration
(
enabled
=
True
)
.
save
()
# Enable certificate generation for this course
certs_api
.
set_cert_generation_enabled
(
self
.
course
.
id
,
True
)
# Course certificate configurations
certificates
=
[
{
...
...
@@ -1352,6 +1349,13 @@ class ProgressPageTests(ModuleStoreTestCase):
self
.
course
.
save
()
self
.
store
.
update_item
(
self
.
course
,
self
.
user
.
id
)
# verify that certificate web view button disappears for disabled self-generation certificates
resp
=
self
.
_get_progress_page
()
self
.
assertNotContains
(
resp
,
u"View Certificate"
)
# Enable certificate self-generation for this course
certs_api
.
set_cert_generation_enabled
(
self
.
course
.
id
,
True
)
resp
=
self
.
_get_progress_page
()
self
.
assertContains
(
resp
,
u"View Certificate"
)
...
...
@@ -1363,6 +1367,11 @@ class ProgressPageTests(ModuleStoreTestCase):
certificates
[
0
][
'is_active'
]
=
False
self
.
store
.
update_item
(
self
.
course
,
self
.
user
.
id
)
# Re-enable certificate self-generation for this course because whenever
# course content changes then self-generation changes according to pacing
# (EDUCATOR-394)
certs_api
.
set_cert_generation_enabled
(
self
.
course
.
id
,
True
)
resp
=
self
.
_get_progress_page
()
self
.
assertNotContains
(
resp
,
u"View Your Certificate"
)
self
.
assertNotContains
(
resp
,
u"You can now view your certificate"
)
...
...
@@ -1493,6 +1502,9 @@ class ProgressPageTests(ModuleStoreTestCase):
self
.
course
.
save
()
self
.
store
.
update_item
(
self
.
course
,
self
.
user
.
id
)
# Enable certificate generation for this course (EDUCATOR-394)
certs_api
.
set_cert_generation_enabled
(
self
.
course
.
id
,
True
)
resp
=
self
.
_get_progress_page
()
self
.
assertContains
(
resp
,
u"View Certificate"
)
self
.
assert_invalidate_certificate
(
generated_certificate
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment