Commit ccb5b6c7 by Jonathan Piacenti

Adjust get_completion_badge usages to handle exceptions.

parent 4fde73fa
...@@ -82,6 +82,8 @@ def get_completion_badge(course_id, user): ...@@ -82,6 +82,8 @@ def get_completion_badge(course_id, user):
return None return None
mode = badge_classes[0].mode mode = badge_classes[0].mode
course = modulestore().get_course(course_id) course = modulestore().get_course(course_id)
if not course.issue_badges:
return None
return BadgeClass.get_badge_class( return BadgeClass.get_badge_class(
slug=course_slug(course_id, mode), slug=course_slug(course_id, mode),
issuing_component='', issuing_component='',
......
...@@ -111,11 +111,13 @@ class Command(BaseCommand): ...@@ -111,11 +111,13 @@ class Command(BaseCommand):
course_id course_id
) )
badge_class = get_completion_badge(course_id, student) if course.issue_badges:
badge = badge_class.get_for_user(student) badge_class = get_completion_badge(course_id, student)
if badge: badge = badge_class.get_for_user(student)
badge.delete()
LOGGER.info(u"Cleared badge for student %s.", student.id) if badge:
badge.delete()
LOGGER.info(u"Cleared badge for student %s.", student.id)
# Add the certificate request to the queue # Add the certificate request to the queue
ret = regenerate_user_certificates( ret = regenerate_user_certificates(
......
...@@ -150,6 +150,7 @@ class ResubmitErrorCertificatesTest(CertificateManagementTest): ...@@ -150,6 +150,7 @@ class ResubmitErrorCertificatesTest(CertificateManagementTest):
self._assert_cert_status(phantom_course, self.user, CertificateStatuses.error) self._assert_cert_status(phantom_course, self.user, CertificateStatuses.error)
@ddt.ddt
@attr('shard_1') @attr('shard_1')
class RegenerateCertificatesTest(CertificateManagementTest): class RegenerateCertificatesTest(CertificateManagementTest):
""" """
...@@ -164,20 +165,23 @@ class RegenerateCertificatesTest(CertificateManagementTest): ...@@ -164,20 +165,23 @@ class RegenerateCertificatesTest(CertificateManagementTest):
super(RegenerateCertificatesTest, self).setUp() super(RegenerateCertificatesTest, self).setUp()
self.course = self.courses[0] self.course = self.courses[0]
@ddt.data(True, False)
@override_settings(CERT_QUEUE='test-queue') @override_settings(CERT_QUEUE='test-queue')
@patch('certificates.api.XQueueCertInterface', spec=True) @patch('certificates.api.XQueueCertInterface', spec=True)
def test_clear_badge(self, xqueue): def test_clear_badge(self, issue_badges, xqueue):
""" """
Given that I have a user with a badge Given that I have a user with a badge
If I run regeneration for a user If I run regeneration for a user
Then certificate generation will be requested Then certificate generation will be requested
And the badge will be deleted And the badge will be deleted if badge issuing is enabled
""" """
key = self.course.location.course_key key = self.course.location.course_key
self._create_cert(key, self.user, CertificateStatuses.downloadable) self._create_cert(key, self.user, CertificateStatuses.downloadable)
badge_class = get_completion_badge(key, self.user) badge_class = get_completion_badge(key, self.user)
BadgeAssertionFactory(badge_class=badge_class, user=self.user) BadgeAssertionFactory(badge_class=badge_class, user=self.user)
self.assertTrue(BadgeAssertion.objects.filter(user=self.user, badge_class=badge_class)) self.assertTrue(BadgeAssertion.objects.filter(user=self.user, badge_class=badge_class))
self.course.issue_badges = issue_badges
self.store.update_item(self.course, None)
self._run_command( self._run_command(
username=self.user.email, course=unicode(key), noop=False, insecure=False, template_file=None, username=self.user.email, course=unicode(key), noop=False, insecure=False, template_file=None,
grade_value=None grade_value=None
...@@ -190,7 +194,9 @@ class RegenerateCertificatesTest(CertificateManagementTest): ...@@ -190,7 +194,9 @@ class RegenerateCertificatesTest(CertificateManagementTest):
template_file=None, template_file=None,
generate_pdf=True generate_pdf=True
) )
self.assertFalse(BadgeAssertion.objects.filter(user=self.user, badge_class=badge_class)) self.assertEquals(
bool(BadgeAssertion.objects.filter(user=self.user, badge_class=badge_class)), not issue_badges
)
@override_settings(CERT_QUEUE='test-queue') @override_settings(CERT_QUEUE='test-queue')
@patch('capa.xqueue_interface.XQueueInterface.send_to_queue', spec=True) @patch('capa.xqueue_interface.XQueueInterface.send_to_queue', spec=True)
......
...@@ -14,12 +14,9 @@ from django.core.urlresolvers import reverse ...@@ -14,12 +14,9 @@ from django.core.urlresolvers import reverse
from django.test.client import Client from django.test.client import Client
from django.test.utils import override_settings from django.test.utils import override_settings
<<<<<<< HEAD
from course_modes.models import CourseMode from course_modes.models import CourseMode
=======
from badges.events.course_complete import get_completion_badge from badges.events.course_complete import get_completion_badge
>>>>>>> a248c5a... Add completion and enrollment badges. from badges.tests.factories import BadgeAssertionFactory, CourseCompleteImageConfigurationFactory, BadgeClassFactory
from badges.tests.factories import BadgeAssertionFactory, CourseCompleteImageConfigurationFactory
from openedx.core.lib.tests.assertions.events import assert_event_matches from openedx.core.lib.tests.assertions.events import assert_event_matches
from student.tests.factories import UserFactory, CourseEnrollmentFactory from student.tests.factories import UserFactory, CourseEnrollmentFactory
from student.roles import CourseStaffRole from student.roles import CourseStaffRole
...@@ -338,6 +335,26 @@ class CertificatesViewsTests(ModuleStoreTestCase, EventTrackingTestCase): ...@@ -338,6 +335,26 @@ class CertificatesViewsTests(ModuleStoreTestCase, EventTrackingTestCase):
) )
self.assertIn('logo_test1.png', response.content) self.assertIn('logo_test1.png', response.content)
@ddt.data(True, False)
@patch('certificates.views.webview.get_completion_badge')
@override_settings(FEATURES=FEATURES_WITH_BADGES_ENABLED)
def test_fetch_badge_info(self, issue_badges, mock_get_completion_badge):
"""
Test: Fetch badge class info if badges are enabled.
"""
badge_class = BadgeClassFactory(course_id=self.course_id, mode=self.cert.mode)
mock_get_completion_badge.return_value = badge_class
self._add_course_certificates(count=1, signatory_count=1, is_active=True)
test_url = get_certificate_url(course_id=self.cert.course_id, uuid=self.cert.verify_uuid)
response = self.client.get(test_url)
self.assertEqual(response.status_code, 200)
if issue_badges:
mock_get_completion_badge.assertCalled()
else:
mock_get_completion_badge.assertNotCalled()
@override_settings(FEATURES=FEATURES_WITH_BADGES_ENABLED) @override_settings(FEATURES=FEATURES_WITH_BADGES_ENABLED)
@patch.dict("django.conf.settings.SOCIAL_SHARING_SETTINGS", { @patch.dict("django.conf.settings.SOCIAL_SHARING_SETTINGS", {
"CERTIFICATE_TWITTER": True, "CERTIFICATE_TWITTER": True,
......
...@@ -359,7 +359,11 @@ def _track_certificate_events(request, context, course, user, user_certificate): ...@@ -359,7 +359,11 @@ def _track_certificate_events(request, context, course, user, user_certificate):
if 'evidence_visit' in request.GET: if 'evidence_visit' in request.GET:
badge_class = get_completion_badge(course_key, user) badge_class = get_completion_badge(course_key, user)
badges = badge_class.get_for_user(user) if not badge_class:
log.warning('Visit to evidence URL for badge, but badges not configured for course "%s"', course_key)
badges = []
else:
badges = badge_class.get_for_user(user)
if badges: if badges:
# There should only ever be one of these. # There should only ever be one of these.
badge = badges[0] badge = badges[0]
...@@ -441,7 +445,7 @@ def _update_badge_context(context, course, user): ...@@ -441,7 +445,7 @@ def _update_badge_context(context, course, user):
Updates context with badge info. Updates context with badge info.
""" """
badge = None badge = None
if settings.FEATURES.get('ENABLE_OPENBADGES'): if settings.FEATURES.get('ENABLE_OPENBADGES') and course.issue_badges:
badges = get_completion_badge(course.location.course_key, user).get_for_user(user) badges = get_completion_badge(course.location.course_key, user).get_for_user(user)
if badges: if badges:
badge = badges[0] badge = badges[0]
......
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