From b6993c392d12cb3e870a1e71b316aec77ec20c8e Mon Sep 17 00:00:00 2001 From: Ahsan Ulhaq Date: Wed, 26 Apr 2017 18:12:36 +0500 Subject: [PATCH] Stop program cert awarding if cert is not configured in credentials ECOM-4478 --- .../core/djangoapps/programs/tasks/v1/tasks.py | 6 ++++++ .../programs/tasks/v1/tests/test_tasks.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/openedx/core/djangoapps/programs/tasks/v1/tasks.py b/openedx/core/djangoapps/programs/tasks/v1/tasks.py index 4fd3a5a66e..81e27163c9 100644 --- a/openedx/core/djangoapps/programs/tasks/v1/tasks.py +++ b/openedx/core/djangoapps/programs/tasks/v1/tasks.py @@ -6,6 +6,7 @@ from celery.utils.log import get_task_logger # pylint: disable=no-name-in-modul from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ImproperlyConfigured +from edx_rest_api_client import exceptions from edx_rest_api_client.client import EdxRestApiClient from provider.oauth2.models import Client @@ -196,6 +197,11 @@ def award_program_certificates(self, username): try: award_program_certificate(credentials_client, username, program_uuid) LOGGER.info('Awarded certificate for program %s to user %s', program_uuid, username) + except exceptions.HttpNotFoundError: + LOGGER.exception( + 'Certificate for program %s not configured, unable to award certificate to %s', + program_uuid, username + ) except Exception: # pylint: disable=broad-except # keep trying to award other certs, but retry the whole task to fix any missing entries LOGGER.exception('Failed to award certificate for program %s to user %s', program_uuid, username) diff --git a/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py b/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py index ba3e82cf9e..f8a0c748c0 100644 --- a/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py +++ b/openedx/core/djangoapps/programs/tasks/v1/tests/test_tasks.py @@ -7,6 +7,7 @@ from celery.exceptions import MaxRetriesExceededError import ddt from django.conf import settings from django.test import override_settings, TestCase +from edx_rest_api_client import exceptions from edx_rest_api_client.client import EdxRestApiClient from edx_oauth2_provider.tests.factories import ClientFactory import httpretty @@ -299,3 +300,19 @@ class AwardProgramCertificatesTestCase(CatalogIntegrationMixin, CredentialsApiCo tasks.award_program_certificates.delay(self.student.username).get() self.assertEqual(mock_get_certified_programs.call_count, 2) self.assertEqual(mock_award_program_certificate.call_count, 1) + + def test_no_retry_on_credentials_api_not_found_errors( + self, + mock_get_completed_programs, + mock_get_certified_programs, + mock_award_program_certificate, + ): + mock_get_completed_programs.return_value = [1, 2] + mock_get_certified_programs.side_effect = [[], [2]] + mock_award_program_certificate.side_effect = self._make_side_effect( + [exceptions.HttpNotFoundError(), None] + ) + + tasks.award_program_certificates.delay(self.student.username).get() + + self.assertEqual(mock_award_program_certificate.call_count, 2)