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):
return None
mode = badge_classes[0].mode
course = modulestore().get_course(course_id)
if not course.issue_badges:
return None
return BadgeClass.get_badge_class(
slug=course_slug(course_id, mode),
issuing_component='',
......
......@@ -111,11 +111,13 @@ class Command(BaseCommand):
course_id
)
badge_class = get_completion_badge(course_id, student)
badge = badge_class.get_for_user(student)
if badge:
badge.delete()
LOGGER.info(u"Cleared badge for student %s.", student.id)
if course.issue_badges:
badge_class = get_completion_badge(course_id, student)
badge = badge_class.get_for_user(student)
if badge:
badge.delete()
LOGGER.info(u"Cleared badge for student %s.", student.id)
# Add the certificate request to the queue
ret = regenerate_user_certificates(
......
......@@ -150,6 +150,7 @@ class ResubmitErrorCertificatesTest(CertificateManagementTest):
self._assert_cert_status(phantom_course, self.user, CertificateStatuses.error)
@ddt.ddt
@attr('shard_1')
class RegenerateCertificatesTest(CertificateManagementTest):
"""
......@@ -164,20 +165,23 @@ class RegenerateCertificatesTest(CertificateManagementTest):
super(RegenerateCertificatesTest, self).setUp()
self.course = self.courses[0]
@ddt.data(True, False)
@override_settings(CERT_QUEUE='test-queue')
@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
If I run regeneration for a user
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
self._create_cert(key, self.user, CertificateStatuses.downloadable)
badge_class = get_completion_badge(key, self.user)
BadgeAssertionFactory(badge_class=badge_class, user=self.user)
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(
username=self.user.email, course=unicode(key), noop=False, insecure=False, template_file=None,
grade_value=None
......@@ -190,7 +194,9 @@ class RegenerateCertificatesTest(CertificateManagementTest):
template_file=None,
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')
@patch('capa.xqueue_interface.XQueueInterface.send_to_queue', spec=True)
......
......@@ -14,12 +14,9 @@ from django.core.urlresolvers import reverse
from django.test.client import Client
from django.test.utils import override_settings
<<<<<<< HEAD
from course_modes.models import CourseMode
=======
from badges.events.course_complete import get_completion_badge
>>>>>>> a248c5a... Add completion and enrollment badges.
from badges.tests.factories import BadgeAssertionFactory, CourseCompleteImageConfigurationFactory
from badges.tests.factories import BadgeAssertionFactory, CourseCompleteImageConfigurationFactory, BadgeClassFactory
from openedx.core.lib.tests.assertions.events import assert_event_matches
from student.tests.factories import UserFactory, CourseEnrollmentFactory
from student.roles import CourseStaffRole
......@@ -338,6 +335,26 @@ class CertificatesViewsTests(ModuleStoreTestCase, EventTrackingTestCase):
)
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)
@patch.dict("django.conf.settings.SOCIAL_SHARING_SETTINGS", {
"CERTIFICATE_TWITTER": True,
......
......@@ -359,7 +359,11 @@ def _track_certificate_events(request, context, course, user, user_certificate):
if 'evidence_visit' in request.GET:
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:
# There should only ever be one of these.
badge = badges[0]
......@@ -441,7 +445,7 @@ def _update_badge_context(context, course, user):
Updates context with badge info.
"""
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)
if badges:
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