diff --git a/common/djangoapps/student/views/dashboard.py b/common/djangoapps/student/views/dashboard.py index be1f32160911..2e0b18959b08 100644 --- a/common/djangoapps/student/views/dashboard.py +++ b/common/djangoapps/student/views/dashboard.py @@ -48,12 +48,6 @@ from openedx.core.djangolib.markup import HTML, Text from openedx.features.content_type_gating.models import ContentTypeGatingConfig from openedx.features.course_duration_limits.access import get_user_course_duration, get_user_course_expiration_date -from openedx.features.enterprise_support.api import ( - get_dashboard_consent_notification, - get_enterprise_learner_portal_context, -) -from openedx.features.enterprise_support.utils import is_enterprise_learner - from common.djangoapps.student.api import COURSE_DASHBOARD_PLUGIN_VIEW_NAME from common.djangoapps.student.helpers import cert_info, check_verify_status_by_course, get_resume_urls_for_enrollments from common.djangoapps.student.models import ( @@ -617,8 +611,6 @@ def student_dashboard(request): # lint-amnesty, pylint: disable=too-many-statem link_end=HTML(""), ) - enterprise_message = get_dashboard_consent_notification(request, user, course_enrollments) - recovery_email_message = recovery_email_activation_message = None if is_secondary_email_feature_enabled(): try: @@ -645,10 +637,6 @@ def student_dashboard(request): # lint-amnesty, pylint: disable=too-many-statem ) ) - # Disable lookup of Enterprise consent_required_course due to ENT-727 - # Will re-enable after fixing WL-1315 - consent_required_courses = set() - # Account activation message account_activation_messages = [ message for message in messages.get_messages(request) if 'account-activation' in message.tags @@ -799,8 +787,6 @@ def student_dashboard(request): # lint-amnesty, pylint: disable=too-many-statem context = { 'urls': urls, 'programs_data': programs_data, - 'enterprise_message': enterprise_message, - 'consent_required_courses': consent_required_courses, 'enrollment_message': enrollment_message, 'redirect_message': Text(redirect_message), 'account_activation_messages': account_activation_messages, @@ -850,14 +836,8 @@ def student_dashboard(request): # lint-amnesty, pylint: disable=too-many-statem 'course_info': get_dashboard_course_info(user, course_enrollments), # TODO START: clean up as part of REVEM-199 (END) 'disable_unenrollment': disable_unenrollment, - # TODO: clean when experiment(Merchandise 2U LOBs - Dashboard) would be stop. [VAN-1097] - 'is_enterprise_user': is_enterprise_learner(user), } - # Include enterprise learner portal metadata and messaging - enterprise_learner_portal_context = get_enterprise_learner_portal_context(request) - context.update(enterprise_learner_portal_context) - context_from_plugins = get_plugins_view_context( ProjectType.LMS, COURSE_DASHBOARD_PLUGIN_VIEW_NAME, diff --git a/common/djangoapps/student/views/management.py b/common/djangoapps/student/views/management.py index 3af83742613d..35bd020e71b1 100644 --- a/common/djangoapps/student/views/management.py +++ b/common/djangoapps/student/views/management.py @@ -26,7 +26,7 @@ from django.urls import reverse from django.utils.translation import gettext as _ from django.views.decorators.csrf import csrf_exempt, ensure_csrf_cookie # lint-amnesty, pylint: disable=unused-import -from django.views.decorators.http import require_GET, require_http_methods, require_POST # lint-amnesty, pylint: disable=unused-import +from django.views.decorators.http import require_GET, require_POST # lint-amnesty, pylint: disable=unused-import from edx_ace import ace from edx_ace.recipient import Recipient from edx_django_utils import monitoring as monitoring_utils @@ -64,7 +64,6 @@ from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser from openedx.features.course_experience.url_helpers import make_learning_mfe_courseware_url from openedx.features.discounts.applicability import FIRST_PURCHASE_DISCOUNT_OVERRIDE_FLAG -from openedx.features.enterprise_support.utils import is_enterprise_learner from common.djangoapps.student.email_helpers import generate_activation_email_context from common.djangoapps.student.helpers import DISABLE_UNENROLL_CERT_STATES, cert_info from common.djangoapps.student.message_types import AccountActivation, EmailChange, EmailChangeConfirmation, RecoveryEmailCreate # lint-amnesty, pylint: disable=line-too-long @@ -209,7 +208,6 @@ def compose_activation_email( message_context = generate_activation_email_context(user, user_registration) message_context.update({ 'confirm_activation_link': _get_activation_confirmation_link(message_context['key'], redirect_url), - 'is_enterprise_learner': is_enterprise_learner(user), 'is_first_purchase_discount_overridden': FIRST_PURCHASE_DISCOUNT_OVERRIDE_FLAG.is_enabled(), 'route_enabled': route_enabled, 'routed_user': user.username, @@ -682,7 +680,7 @@ def activate_account(request, key): url_path = '/login?{}'.format(urllib.parse.urlencode(params)) return redirect(settings.AUTHN_MICROFRONTEND_URL + url_path) - response = redirect(redirect_url) if redirect_url and is_enterprise_learner(request.user) else redirect('dashboard') + response = redirect(redirect_url) if redirect_url else redirect('dashboard') if show_account_activation_popup: response.delete_cookie( settings.SHOW_ACTIVATE_CTA_POPUP_COOKIE_NAME, diff --git a/common/djangoapps/third_party_auth/pipeline.py b/common/djangoapps/third_party_auth/pipeline.py index 41d97a8638e0..b87c420b7c3f 100644 --- a/common/djangoapps/third_party_auth/pipeline.py +++ b/common/djangoapps/third_party_auth/pipeline.py @@ -93,7 +93,6 @@ def B(*args, **kwargs): from openedx.core.djangoapps.user_authn import cookies as user_authn_cookies from openedx.core.djangoapps.user_authn.toggles import is_auto_generated_username_enabled from openedx.core.djangoapps.user_authn.utils import is_safe_login_or_logout_redirect -from openedx.core.djangoapps.user_authn.views.utils import get_auto_generated_username from common.djangoapps.third_party_auth.utils import ( get_associated_user_by_email_response, is_oauth_provider, @@ -958,6 +957,7 @@ def get_username(strategy, details, backend, user=None, *args, **kwargs): # lin slug_func = lambda val: val if is_auto_generated_username_enabled() and details.get('username') is None: + from openedx.core.djangoapps.user_authn.views.utils import get_auto_generated_username # pylint: disable=import-outside-toplevel username = get_auto_generated_username(details) else: if email_as_username and details.get('email'): diff --git a/lms/envs/common.py b/lms/envs/common.py index 6885888cc6c5..345c32e6d870 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -3773,6 +3773,18 @@ def _should_send_certificate_events(settings): # The project ID should be obtained from the Google Cloud Console when creating a reCAPTCHA RECAPTCHA_PROJECT_ID = None +# .. setting_name: OPEN_EDX_FILTERS_CONFIG +# .. setting_default: {"org.openedx.learning.dashboard.render.started.v1": {"fail_silently": False, "pipeline": ["enterprise.filters.dashboard.DashboardContextEnricher"]}} +# .. setting_description: Configuration dict for openedx-filters pipeline steps. +# Keys are filter type strings; values are dicts with 'fail_silently' (bool) and +# 'pipeline' (list of dotted-path strings to PipelineStep subclasses). +OPEN_EDX_FILTERS_CONFIG = { + "org.openedx.learning.dashboard.render.started.v1": { + "fail_silently": False, + "pipeline": ["enterprise.filters.dashboard.DashboardContextEnricher"], + }, +} + ############################## Miscellaneous ############################### # To limit the number of courses displayed on learner dashboard diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index d44cdefc6389..b2fb1fab7592 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -220,10 +220,9 @@ is_course_voucher_refundable = (session_id in enrolled_courses_voucher_refundable) course_requirements = courses_requirements_not_met.get(session_id) related_programs = inverted_programs.get(str(entitlement.course_uuid if is_unfulfilled_entitlement else session_id)) - show_consent_link = (session_id in consent_required_courses) resume_button_url = resume_button_urls[dashboard_index] %> - <%include file='dashboard/_dashboard_course_listing.html' args='course_overview=course_overview, course_card_index=dashboard_index, enrollment=enrollment, enrollments_fbe_is_on=enrollments_fbe_is_on, is_unfulfilled_entitlement=is_unfulfilled_entitlement, is_fulfilled_entitlement=is_fulfilled_entitlement, entitlement=entitlement, entitlement_session=entitlement_session, entitlement_available_sessions=entitlement_available_sessions, entitlement_expiration_date=entitlement_expiration_date, entitlement_expired_at=entitlement_expired_at, show_courseware_link=show_courseware_link, cert_status=cert_status, can_refund_entitlement=can_refund_entitlement, can_unenroll=can_unenroll, credit_status=credit_status, show_email_settings=show_email_settings, course_mode_info=course_mode_info, is_paid_course=is_paid_course, is_course_voucher_refundable=is_course_voucher_refundable, course_requirements=course_requirements, dashboard_index=dashboard_index, share_settings=share_settings, user=user, related_programs=related_programs, display_course_modes_on_dashboard=display_course_modes_on_dashboard, show_consent_link=show_consent_link, enterprise_customer_name=enterprise_customer_name, resume_button_url=resume_button_url, partner_managed_enrollment=partner_managed_enrollment' /> + <%include file='dashboard/_dashboard_course_listing.html' args='course_overview=course_overview, course_card_index=dashboard_index, enrollment=enrollment, enrollments_fbe_is_on=enrollments_fbe_is_on, is_unfulfilled_entitlement=is_unfulfilled_entitlement, is_fulfilled_entitlement=is_fulfilled_entitlement, entitlement=entitlement, entitlement_session=entitlement_session, entitlement_available_sessions=entitlement_available_sessions, entitlement_expiration_date=entitlement_expiration_date, entitlement_expired_at=entitlement_expired_at, show_courseware_link=show_courseware_link, cert_status=cert_status, can_refund_entitlement=can_refund_entitlement, can_unenroll=can_unenroll, credit_status=credit_status, show_email_settings=show_email_settings, course_mode_info=course_mode_info, is_paid_course=is_paid_course, is_course_voucher_refundable=is_course_voucher_refundable, course_requirements=course_requirements, dashboard_index=dashboard_index, share_settings=share_settings, user=user, related_programs=related_programs, display_course_modes_on_dashboard=display_course_modes_on_dashboard, resume_button_url=resume_button_url, partner_managed_enrollment=partner_managed_enrollment' /> % endfor % if show_load_all_courses_link:
diff --git a/lms/templates/dashboard/_dashboard_course_listing.html b/lms/templates/dashboard/_dashboard_course_listing.html index 39c66f0e81fa..ff27485a87b4 100644 --- a/lms/templates/dashboard/_dashboard_course_listing.html +++ b/lms/templates/dashboard/_dashboard_course_listing.html @@ -1,4 +1,4 @@ -<%page args="course_overview, enrollment, entitlement, entitlement_session, course_card_index, enrollments_fbe_is_on, is_unfulfilled_entitlement, is_fulfilled_entitlement, entitlement_available_sessions, entitlement_expiration_date, entitlement_expired_at, show_courseware_link, cert_status, can_refund_entitlement, can_unenroll, credit_status, show_email_settings, course_mode_info, is_paid_course, is_course_voucher_refundable, course_requirements, dashboard_index, share_settings, related_programs, display_course_modes_on_dashboard, show_consent_link, enterprise_customer_name, resume_button_url, partner_managed_enrollment" expression_filter="h"/> +<%page args="course_overview, enrollment, entitlement, entitlement_session, course_card_index, enrollments_fbe_is_on, is_unfulfilled_entitlement, is_fulfilled_entitlement, entitlement_available_sessions, entitlement_expiration_date, entitlement_expired_at, show_courseware_link, cert_status, can_refund_entitlement, can_unenroll, credit_status, show_email_settings, course_mode_info, is_paid_course, is_course_voucher_refundable, course_requirements, dashboard_index, share_settings, related_programs, display_course_modes_on_dashboard, resume_button_url, partner_managed_enrollment" expression_filter="h"/> <%! import datetime @@ -370,10 +370,6 @@

<%include file="_dashboard_credit_info.html" args="credit_status=credit_status"/> % endif - % if show_consent_link: - <%include file="_dashboard_show_consent.html" args="course_overview=course_overview, course_target=course_target, enrollment=enrollment, enterprise_customer_name=enterprise_customer_name"/> - %endif - % if display_course_upgrade:
diff --git a/lms/templates/dashboard/_dashboard_show_consent.html b/lms/templates/dashboard/_dashboard_show_consent.html deleted file mode 100644 index 98f8ffd3c473..000000000000 --- a/lms/templates/dashboard/_dashboard_show_consent.html +++ /dev/null @@ -1,25 +0,0 @@ -<%page expression_filter="h" args="course_overview, course_target, enrollment, enterprise_customer_name" /> -<%! -from django.utils.translation import gettext as _ -%> -<%namespace name='static' file='../static_content.html'/> - -
-
-

- - ${_("Consent to share your data")} - -
- ${_("To access this course, you must first consent to share your learning achievements with {enterprise_customer_name}.").format(enterprise_customer_name=enterprise_customer_name)} -

- -
-
diff --git a/openedx/core/djangoapps/user_authn/tests/test_tasks.py b/openedx/core/djangoapps/user_authn/tests/test_tasks.py index 5103343a0879..60bb56133fc4 100644 --- a/openedx/core/djangoapps/user_authn/tests/test_tasks.py +++ b/openedx/core/djangoapps/user_authn/tests/test_tasks.py @@ -44,7 +44,6 @@ def test_ComposeEmail(self): assert self.msg.context['routed_user_email'] == self.student.email assert self.msg.context['routed_profile_name'] == '' assert self.msg.context['registration_flow'] is False - assert self.msg.context['is_enterprise_learner'] is False assert self.msg.context['is_first_purchase_discount_overridden'] is False @mock.patch('time.sleep', mock.Mock(return_value=None)) diff --git a/openedx/features/enterprise_support/api.py b/openedx/features/enterprise_support/api.py index a482ff877885..f6c3e229a7ed 100644 --- a/openedx/features/enterprise_support/api.py +++ b/openedx/features/enterprise_support/api.py @@ -723,29 +723,6 @@ def consent_needed_for_course(request, user, course_id, enrollment_exists=False) return True -@enterprise_is_enabled(otherwise=set()) -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() - 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 - - @enterprise_is_enabled(otherwise='') def get_enterprise_consent_url(request, course_id, user=None, return_to=None, enrollment_exists=False, source='lms'): """ diff --git a/openedx/features/enterprise_support/tests/test_api.py b/openedx/features/enterprise_support/tests/test_api.py index 6c0c41397c96..80e83d8a2721 100644 --- a/openedx/features/enterprise_support/tests/test_api.py +++ b/openedx/features/enterprise_support/tests/test_api.py @@ -41,7 +41,6 @@ enterprise_enabled, get_active_enterprise_customer_user, get_consent_notification_data, - get_consent_required_courses, get_dashboard_consent_notification, get_data_sharing_consents, get_enterprise_consent_url, @@ -530,38 +529,6 @@ def test_consent_needed_for_course_when_consent_is_required( ) ) - @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]) - assert 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]) - assert course_id not in consent_required - - def test_consent_not_required_for_non_enterprise_user(self): - user = UserFactory() - course_id = 'fake-course' - - consent_required_courses = get_consent_required_courses(user, [course_id]) - - assert set() == consent_required_courses - @mock.patch('openedx.features.enterprise_support.api.create_jwt_for_user') def test_fetch_enterprise_learner_data_unauthenticated(self, mock_jwt_builder): api_client = self._assert_api_client_with_user(EnterpriseApiClient, mock_jwt_builder)