Commit 5d068cec by Jesse Shapiro Committed by GitHub

Merge pull request #14496 from open-craft/haikuginger/remove-consent-from-logistration

[ENT-173] Remove data sharing consent from logistration
parents 583cd26f 358e73c0
......@@ -188,19 +188,6 @@ class AccountCreationForm(forms.Form):
"required": _("To enroll, you must follow the honor code.")
}
)
elif field_name == 'data_sharing_consent':
if field_value == "required":
self.fields[field_name] = TrueField(
error_messages={
"required": _(
"You must consent to data sharing to register."
)
}
)
elif field_value == 'optional':
self.fields[field_name] = forms.BooleanField(
required=False
)
else:
required = field_value == "required"
min_length = 1 if field_name in ("gender", "level_of_education") else 2
......
......@@ -47,7 +47,6 @@ from social.exceptions import AuthException, AuthAlreadyAssociated
from edxmako.shortcuts import render_to_response, render_to_string
from util.enterprise_helpers import data_sharing_consent_requirement_at_login
from course_modes.models import CourseMode
from shoppingcart.api import order_history
from student.models import (
......@@ -1672,10 +1671,6 @@ def create_account_with_params(request, params):
if should_link_with_social_auth or (third_party_auth.is_enabled() and pipeline.running(request)):
params["password"] = pipeline.make_random_password()
# Add a form requirement for data sharing consent if the EnterpriseCustomer
# for the request requires it at login
extra_fields['data_sharing_consent'] = data_sharing_consent_requirement_at_login(request)
# if doing signup for an external authorization, then get email, password, name from the eamap
# don't use the ones from the form, since the user could have hacked those
# unless originally we didn't get a valid email or name from the external auth
......@@ -1772,9 +1767,6 @@ def create_account_with_params(request, params):
if third_party_auth.is_enabled() and pipeline.running(request):
running_pipeline = pipeline.get(request)
third_party_provider = provider.Registry.get_from_pipeline(running_pipeline)
# Store received data sharing consent field values in the pipeline for use
# by any downstream pipeline elements which require them.
running_pipeline['kwargs']['data_sharing_consent'] = form.cleaned_data.get('data_sharing_consent', None)
# Track the user's registration
if hasattr(settings, 'LMS_SEGMENT_KEY') and settings.LMS_SEGMENT_KEY:
......
......@@ -58,84 +58,6 @@ def get_course_specific_consent_url(request, course_id, return_to):
return full_url
def data_sharing_consent_requested(request):
"""
Determine if the EnterpriseCustomer for a given HTTP request
requests data sharing consent
"""
if not enterprise_enabled():
return False
return active_provider_requests_data_sharing(request)
def data_sharing_consent_required_at_login(request):
"""
Determines if data sharing consent is required at
a given location
"""
if not enterprise_enabled():
return False
return active_provider_enforces_data_sharing(request, EnterpriseCustomer.AT_LOGIN)
def data_sharing_consent_requirement_at_login(request):
"""
Returns either 'optional' or 'required' based on where we are.
"""
if not enterprise_enabled():
return None
if data_sharing_consent_required_at_login(request):
return 'required'
if data_sharing_consent_requested(request):
return 'optional'
return None
def insert_enterprise_fields(request, form_desc):
"""
Enterprise methods which modify the logistration form are called from this method.
"""
if not enterprise_enabled():
return
add_data_sharing_consent_field(request, form_desc)
def add_data_sharing_consent_field(request, form_desc):
"""
Adds a checkbox field to be selected if the user consents to share data with
the EnterpriseCustomer attached to the SSO provider with which they're authenticating.
"""
enterprise_customer = get_enterprise_customer_for_request(request)
required = data_sharing_consent_required_at_login(request)
if not data_sharing_consent_requested(request):
return
label = _(
"I agree to allow {platform_name} to share data about my enrollment, "
"completion and performance in all {platform_name} courses and programs "
"where my enrollment is sponsored by {ec_name}."
).format(
platform_name=configuration_helpers.get_value("PLATFORM_NAME", settings.PLATFORM_NAME),
ec_name=enterprise_customer.name
)
error_msg = _(
"To link your account with {ec_name}, you are required to consent to data sharing."
).format(
ec_name=enterprise_customer.name
)
form_desc.add_field(
"data_sharing_consent",
label=label,
field_type="checkbox",
default=False,
required=required,
error_messages={"required": error_msg},
)
def insert_enterprise_pipeline_elements(pipeline):
"""
If the enterprise app is enabled, insert additional elements into the
......
......@@ -8,10 +8,6 @@ import mock
from util.enterprise_helpers import (
enterprise_enabled,
data_sharing_consent_requested,
data_sharing_consent_required_at_login,
data_sharing_consent_requirement_at_login,
insert_enterprise_fields,
insert_enterprise_pipeline_elements,
set_enterprise_branding_filter_param,
get_enterprise_branding_filter_param,
......@@ -32,10 +28,6 @@ class TestEnterpriseHelpers(unittest.TestCase):
the utilities to return the expected default values.
"""
mock_enterprise_enabled.return_value = False
self.assertFalse(data_sharing_consent_requested(None))
self.assertFalse(data_sharing_consent_required_at_login(None))
self.assertEqual(data_sharing_consent_requirement_at_login(None), None)
self.assertEqual(insert_enterprise_fields(None, None), None)
self.assertEqual(insert_enterprise_pipeline_elements(None), None)
def test_enterprise_enabled(self):
......@@ -45,109 +37,6 @@ class TestEnterpriseHelpers(unittest.TestCase):
"""
self.assertTrue(enterprise_enabled())
@mock.patch('enterprise.tpa_pipeline.get_enterprise_customer_for_request')
def test_data_sharing_consent_requested(self, mock_get_ec):
"""
Test that we correctly check whether data sharing consent is requested.
"""
request = mock.MagicMock(session={'partial_pipeline': 'thing'})
mock_get_ec.return_value = mock.MagicMock(requests_data_sharing_consent=True)
self.assertTrue(data_sharing_consent_requested(request))
mock_get_ec.return_value = mock.MagicMock(requests_data_sharing_consent=False)
self.assertFalse(data_sharing_consent_requested(request))
mock_get_ec.return_value = None
self.assertFalse(data_sharing_consent_requested(request))
request = mock.MagicMock(session={})
self.assertFalse(data_sharing_consent_requested(request))
@mock.patch('enterprise.tpa_pipeline.get_enterprise_customer_for_request')
def test_data_sharing_consent_required(self, mock_get_ec):
"""
Test that we correctly check whether data sharing consent is required at login.
"""
check_method = mock.MagicMock(return_value=True)
request = mock.MagicMock(session={'partial_pipeline': 'thing'})
mock_get_ec.return_value = mock.MagicMock(enforces_data_sharing_consent=check_method)
self.assertTrue(data_sharing_consent_required_at_login(request))
check_method.return_value = False
mock_get_ec.return_value = mock.MagicMock(enforces_data_sharing_consent=check_method)
self.assertFalse(data_sharing_consent_required_at_login(request))
mock_get_ec.return_value = None
self.assertFalse(data_sharing_consent_required_at_login(request))
request = mock.MagicMock(session={})
self.assertFalse(data_sharing_consent_required_at_login(request))
@mock.patch('enterprise.tpa_pipeline.get_enterprise_customer_for_request')
def test_data_sharing_consent_requirement(self, mock_get_ec):
"""
Test that we get the correct requirement string for the current consent statae.
"""
request = mock.MagicMock(session={'partial_pipeline': 'thing'})
mock_ec = mock.MagicMock(
enforces_data_sharing_consent=mock.MagicMock(return_value=True),
requests_data_sharing_consent=True,
)
mock_get_ec.return_value = mock_ec
self.assertEqual(data_sharing_consent_requirement_at_login(request), 'required')
mock_ec.enforces_data_sharing_consent.return_value = False
self.assertEqual(data_sharing_consent_requirement_at_login(request), 'optional')
mock_ec.requests_data_sharing_consent = False
self.assertEqual(data_sharing_consent_requirement_at_login(request), None)
@mock.patch('util.enterprise_helpers.get_enterprise_customer_for_request')
@mock.patch('enterprise.tpa_pipeline.get_enterprise_customer_for_request')
@mock.patch('util.enterprise_helpers.configuration_helpers')
def test_insert_enterprise_fields(self, mock_config_helpers, mock_get_ec, mock_get_ec2):
"""
Test that the insertion of the enterprise fields is processed as expected.
"""
request = mock.MagicMock(session={'partial_pipeline': 'thing'})
mock_ec = mock.MagicMock(
enforces_data_sharing_consent=mock.MagicMock(return_value=True),
requests_data_sharing_consent=True,
)
# Name values in a MagicMock constructor don't fill a `name` attribute
mock_ec.name = 'MassiveCorp'
mock_get_ec.return_value = mock_ec
mock_get_ec2.return_value = mock_ec
mock_config_helpers.get_value.return_value = 'OpenEdX'
form_desc = mock.MagicMock()
form_desc.add_field.return_value = None
expected_label = (
"I agree to allow OpenEdX to share data about my enrollment, "
"completion and performance in all OpenEdX courses and programs "
"where my enrollment is sponsored by MassiveCorp."
)
expected_err_msg = (
"To link your account with MassiveCorp, you are required to consent to data sharing."
)
insert_enterprise_fields(request, form_desc)
mock_ec.enforces_data_sharing_consent.return_value = False
insert_enterprise_fields(request, form_desc)
calls = [
mock.call(
'data_sharing_consent',
label=expected_label,
field_type='checkbox',
default=False,
required=True,
error_messages={'required': expected_err_msg}
),
mock.call(
'data_sharing_consent',
label=expected_label,
field_type='checkbox',
default=False,
required=False,
error_messages={'required': expected_err_msg}
)
]
form_desc.add_field.assert_has_calls(calls)
form_desc.add_field.reset_mock()
mock_ec.requests_data_sharing_consent = False
insert_enterprise_fields(request, form_desc)
form_desc.add_field.assert_not_called()
def test_set_enterprise_branding_filter_param(self):
"""
Test that the enterprise customer branding parameters are setting correctly.
......
......@@ -1027,43 +1027,6 @@ class RegistrationViewTest(ThirdPartyAuthTestMixin, UserAPITestCase):
}
)
@mock.patch('util.enterprise_helpers.active_provider_requests_data_sharing')
@mock.patch('util.enterprise_helpers.active_provider_enforces_data_sharing')
@mock.patch('util.enterprise_helpers.get_enterprise_customer_for_request')
@mock.patch('util.enterprise_helpers.configuration_helpers')
def test_register_form_consent_field(self, config_helper, get_ec, mock_enforce, mock_request):
"""
Test that if we have an EnterpriseCustomer active for the request, and that
EnterpriseCustomer is set to require data sharing consent, the correct
field is added to the form descriptor.
"""
fake_ec = mock.MagicMock(
enforces_data_sharing_consent=mock.MagicMock(return_value=True),
requests_data_sharing_consent=True,
)
fake_ec.name = 'MegaCorp'
get_ec.return_value = fake_ec
config_helper.get_value.return_value = 'OpenEdX'
mock_request.return_value = True
mock_enforce.return_value = True
self._assert_reg_field(
dict(),
{
u"name": u"data_sharing_consent",
u"type": u"checkbox",
u"required": True,
u"label": (
"I agree to allow OpenEdX to share data about my enrollment, "
"completion and performance in all OpenEdX courses and programs "
"where my enrollment is sponsored by MegaCorp."
),
u"defaultValue": False,
u"errorMessages": {
u'required': u'To link your account with MegaCorp, you are required to consent to data sharing.',
}
}
)
@mock.patch('openedx.core.djangoapps.user_api.views._')
def test_register_form_level_of_education_translations(self, fake_gettext):
fake_gettext.side_effect = lambda text: text + ' TRANSLATED'
......
......@@ -31,7 +31,6 @@ from student.cookies import set_logged_in_cookies
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.lib.api.authentication import SessionAuthenticationAllowInactiveUser
from util.json_request import JsonResponse
from util.enterprise_helpers import insert_enterprise_fields
from .preferences.api import get_country_time_zones, update_email_opt_in
from .helpers import FormDescription, shim_student_view, require_post_params
from .models import UserPreference, UserProfile
......@@ -280,9 +279,6 @@ class RegistrationView(APIView):
required=self._is_field_required(field_name)
)
# Add any Enterprise fields if the app is enabled
insert_enterprise_fields(request, form_desc)
return HttpResponse(form_desc.to_json(), content_type="application/json")
@method_decorator(csrf_exempt)
......
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