From 45831a07f09c958ae29f9caae413f8e6c9c31020 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Thu, 22 Mar 2018 16:01:43 +0500 Subject: [PATCH] Modify Enterprise API to accept list of course_ids for consent_required endpoint WL-1491 --- openedx/features/enterprise_support/api.py | 28 ++++++++++++++++++- .../enterprise_support/tests/test_api.py | 27 ++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/openedx/features/enterprise_support/api.py b/openedx/features/enterprise_support/api.py index ed614f7ca9..a995de64aa 100644 --- a/openedx/features/enterprise_support/api.py +++ b/openedx/features/enterprise_support/api.py @@ -22,7 +22,8 @@ from third_party_auth.pipeline import get as get_partial_pipeline from third_party_auth.provider import Registry try: - from enterprise.models import EnterpriseCustomer + from consent.models import DataSharingConsent + from enterprise.models import EnterpriseCustomer, EnterpriseCustomerUser except ImportError: pass @@ -430,6 +431,31 @@ def consent_needed_for_course(request, user, course_id, enrollment_exists=False) return consent_needed +def get_consent_required_courses(user, course_ids): + """ + Returns a set of course_ids that require consent + Note that this function makes use of the Enterprise models directly instead of using the API calls + """ + result = set() + if not enterprise_enabled(): + return result + + enterprise_learner = EnterpriseCustomerUser.objects.filter(user_id=user.id).first() + if not enterprise_learner or not enterprise_learner.enterprise_customer: + return result + + enterprise_uuid = enterprise_learner.enterprise_customer.uuid + data_sharing_consent = DataSharingConsent.objects.filter(username=user.username, + course_id__in=course_ids, + enterprise_customer__uuid=enterprise_uuid) + + for consent in data_sharing_consent: + if consent.consent_required(): + result.add(consent.course_id) + + return result + + def get_enterprise_consent_url(request, course_id, user=None, return_to=None, enrollment_exists=False): """ Build a URL to redirect the user to the Enterprise app to provide data sharing diff --git a/openedx/features/enterprise_support/tests/test_api.py b/openedx/features/enterprise_support/tests/test_api.py index d33b11c631..5481c1bb40 100644 --- a/openedx/features/enterprise_support/tests/test_api.py +++ b/openedx/features/enterprise_support/tests/test_api.py @@ -14,11 +14,13 @@ from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.test.utils import override_settings +from consent.models import DataSharingConsent from openedx.core.djangolib.testing.utils import CacheIsolationTestCase from openedx.features.enterprise_support.api import ( ConsentApiClient, ConsentApiServiceClient, consent_needed_for_course, + get_consent_required_courses, data_sharing_consent_required, EnterpriseApiClient, EnterpriseApiServiceClient, @@ -28,6 +30,7 @@ from openedx.features.enterprise_support.api import ( insert_enterprise_pipeline_elements, enterprise_enabled, ) +from openedx.features.enterprise_support.tests.factories import EnterpriseCustomerUserFactory from openedx.features.enterprise_support.tests.mixins.enterprise import EnterpriseServiceMockMixin from openedx.features.enterprise_support.utils import get_cache_key from student.tests.factories import UserFactory @@ -183,6 +186,30 @@ class TestEnterpriseApi(EnterpriseServiceMockMixin, CacheIsolationTestCase): httpretty.reset() self.assertFalse(consent_needed_for_course(request, user, 'fake-course')) + @httpretty.activate + @mock.patch('enterprise.models.EnterpriseCustomer.catalog_contains_course') + def test_get_consent_required_courses(self, mock_catalog_contains_course): + mock_catalog_contains_course.return_value = True + user = UserFactory() + enterprise_customer_user = EnterpriseCustomerUserFactory(user_id=user.id) + + course_id = 'fake-course' + data_sharing_consent = DataSharingConsent( + course_id=course_id, + enterprise_customer=enterprise_customer_user.enterprise_customer, + username=user.username, + granted=False + ) + data_sharing_consent.save() + consent_required = get_consent_required_courses(user, [course_id]) + self.assertTrue(course_id in consent_required) + + # now grant consent and call our method again + data_sharing_consent.granted = True + data_sharing_consent.save() + consent_required = get_consent_required_courses(user, [course_id]) + self.assertFalse(course_id in consent_required) + @httpretty.activate @mock.patch('openedx.features.enterprise_support.api.get_enterprise_learner_data') @mock.patch('openedx.features.enterprise_support.api.EnterpriseCustomer')