Commit bbcbdac3 by Saleem Latif

Merge branch 'asadiqbal08/ENT-772-Update-singin-UI' into business/sprint_z

parents 17305ca1 eecc0a0a
...@@ -241,6 +241,8 @@ def update_context_for_enterprise(request, context): ...@@ -241,6 +241,8 @@ def update_context_for_enterprise(request, context):
context = context.copy() context = context.copy()
sidebar_context = enterprise_sidebar_context(request) sidebar_context = enterprise_sidebar_context(request)
enterprise_customer = enterprise_customer_for_request(request)
context['data']['enterprise_name'] = enterprise_customer.get('name') if enterprise_customer else None
if sidebar_context: if sidebar_context:
context['data']['registration_form_desc']['fields'] = enterprise_fields_only( context['data']['registration_form_desc']['fields'] = enterprise_fields_only(
...@@ -333,6 +335,7 @@ def _third_party_auth_context(request, redirect_to, tpa_hint=None): ...@@ -333,6 +335,7 @@ def _third_party_auth_context(request, redirect_to, tpa_hint=None):
"errorMessage": None, "errorMessage": None,
"registerFormSubmitButtonText": _("Create Account"), "registerFormSubmitButtonText": _("Create Account"),
"syncLearnerProfileData": False, "syncLearnerProfileData": False,
"pipeline_user_details": None
} }
if third_party_auth.is_enabled(): if third_party_auth.is_enabled():
...@@ -360,6 +363,7 @@ def _third_party_auth_context(request, redirect_to, tpa_hint=None): ...@@ -360,6 +363,7 @@ def _third_party_auth_context(request, redirect_to, tpa_hint=None):
running_pipeline = pipeline.get(request) running_pipeline = pipeline.get(request)
if running_pipeline is not None: if running_pipeline is not None:
current_provider = third_party_auth.provider.Registry.get_from_pipeline(running_pipeline) current_provider = third_party_auth.provider.Registry.get_from_pipeline(running_pipeline)
context['pipeline_user_details'] = running_pipeline['kwargs']['details']
if current_provider is not None: if current_provider is not None:
context["currentProvider"] = current_provider.name context["currentProvider"] = current_provider.name
...@@ -425,7 +429,7 @@ def _get_form_descriptions(request): ...@@ -425,7 +429,7 @@ def _get_form_descriptions(request):
return { return {
'password_reset': get_password_reset_form().to_json(), 'password_reset': get_password_reset_form().to_json(),
'login': get_login_session_form().to_json(), 'login': get_login_session_form(request).to_json(),
'registration': RegistrationFormFactory().get_registration_form(request).to_json() 'registration': RegistrationFormFactory().get_registration_form(request).to_json()
} }
......
...@@ -75,6 +75,8 @@ ...@@ -75,6 +75,8 @@
this.passwordResetSupportUrl = options.password_reset_support_link; this.passwordResetSupportUrl = options.password_reset_support_link;
this.createAccountOption = options.account_creation_allowed; this.createAccountOption = options.account_creation_allowed;
this.hideAuthWarnings = options.hide_auth_warnings || false; this.hideAuthWarnings = options.hide_auth_warnings || false;
this.pipelineUserDetails = options.third_party_auth.pipeline_user_details;
this.enterpriseName = options.enterprise_name || '';
// The login view listens for 'sync' events from the reset model // The login view listens for 'sync' events from the reset model
this.resetModel = new PasswordResetModel({}, { this.resetModel = new PasswordResetModel({}, {
...@@ -133,7 +135,9 @@ ...@@ -133,7 +135,9 @@
supportURL: this.supportURL, supportURL: this.supportURL,
passwordResetSupportUrl: this.passwordResetSupportUrl, passwordResetSupportUrl: this.passwordResetSupportUrl,
createAccountOption: this.createAccountOption, createAccountOption: this.createAccountOption,
hideAuthWarnings: this.hideAuthWarnings hideAuthWarnings: this.hideAuthWarnings,
pipelineUserDetails: this.pipelineUserDetails,
enterpriseName: this.enterpriseName
}); });
// Listen for 'password-help' event to toggle sub-views // Listen for 'password-help' event to toggle sub-views
......
...@@ -50,6 +50,8 @@ ...@@ -50,6 +50,8 @@
this.createAccountOption = data.createAccountOption; this.createAccountOption = data.createAccountOption;
this.accountActivationMessages = data.accountActivationMessages; this.accountActivationMessages = data.accountActivationMessages;
this.hideAuthWarnings = data.hideAuthWarnings; this.hideAuthWarnings = data.hideAuthWarnings;
this.pipelineUserDetails = data.pipelineUserDetails;
this.enterpriseName = data.enterpriseName;
this.listenTo(this.model, 'sync', this.saveSuccess); this.listenTo(this.model, 'sync', this.saveSuccess);
this.listenTo(this.resetModel, 'sync', this.resetEmail); this.listenTo(this.resetModel, 'sync', this.resetEmail);
...@@ -68,7 +70,9 @@ ...@@ -68,7 +70,9 @@
providers: this.providers, providers: this.providers,
hasSecondaryProviders: this.hasSecondaryProviders, hasSecondaryProviders: this.hasSecondaryProviders,
platformName: this.platformName, platformName: this.platformName,
createAccountOption: this.createAccountOption createAccountOption: this.createAccountOption,
pipelineUserDetails: this.pipelineUserDetails,
enterpriseName: this.enterpriseName
} }
})); }));
......
...@@ -91,6 +91,7 @@ ...@@ -91,6 +91,7 @@
<% } %> <% } %>
<% if ( restrictions.min_length ) { %> minlength="<%- restrictions.min_length %>"<% } %> <% if ( restrictions.min_length ) { %> minlength="<%- restrictions.min_length %>"<% } %>
<% if ( restrictions.max_length ) { %> maxlength="<%- restrictions.max_length %>"<% } %> <% if ( restrictions.max_length ) { %> maxlength="<%- restrictions.max_length %>"<% } %>
<% if ( restrictions.readonly ) { %> readonly <% } %>
<% if ( required ) { %> required<% } %> <% if ( required ) { %> required<% } %>
<% if ( typeof errorMessages !== 'undefined' ) { <% if ( typeof errorMessages !== 'undefined' ) {
_.each(errorMessages, function( msg, type ) {%> _.each(errorMessages, function( msg, type ) {%>
......
<div class="js-form-feedback" aria-live="assertive" tabindex="-1"> <div class="js-form-feedback" aria-live="assertive" tabindex="-1">
</div> </div>
<% if ( context.createAccountOption !== false && !context.syncLearnerProfileData) { %> <% if ( context.createAccountOption !== false && !context.syncLearnerProfileData && context.enterpriseName == "") { %>
<div class="toggle-form"> <div class="toggle-form">
<span class="text"><%- gettext("First time here?") %></span> <span class="text"><%- gettext("First time here?") %></span>
<a href="#login" class="form-toggle" data-type="register"><%- gettext("Create an Account.") %></a> <a href="#login" class="form-toggle" data-type="register"><%- gettext("Create an Account.") %></a>
</div> </div>
<% } %> <% } %>
<h2><%- gettext("Sign In") %></h2> <% if (context.enterpriseName) { %>
<% if (context.pipelineUserDetails.email) { %>
<h2><%- gettext("Sign in to continue learning as {email}").replace("{email}", context.pipelineUserDetails.email) %></h2>
<% } else { %>
<h2><%- gettext("Sign in to continue learning") %></h2>
<% } %>
<p><%- gettext("You already have an edX account with your {enterprise_name} email address. Going forward, your account information will be updated and maintained by {enterprise_name}. You can view your information or unlink from {enterprise_name} anytime in your Account Settings.").replace(/{enterprise_name}/g, context.enterpriseName) %> </p>
<p><%- gettext("To continue learning with this account, sign in below.") %></p>
<% } else { %>
<h2><%- gettext("Sign In") %></h2>
<% } %>
<form id="login" class="login-form" tabindex="-1" method="POST"> <form id="login" class="login-form" tabindex="-1" method="POST">
......
...@@ -62,7 +62,7 @@ def get_password_reset_form(): ...@@ -62,7 +62,7 @@ def get_password_reset_form():
return form_desc return form_desc
def get_login_session_form(): def get_login_session_form(request):
"""Return a description of the login form. """Return a description of the login form.
This decouples clients from the API definition: This decouples clients from the API definition:
...@@ -77,6 +77,7 @@ def get_login_session_form(): ...@@ -77,6 +77,7 @@ def get_login_session_form():
""" """
form_desc = FormDescription("post", reverse("user_api_login_session")) form_desc = FormDescription("post", reverse("user_api_login_session"))
_apply_third_party_auth_overrides(request, form_desc)
# Translators: This label appears above a field on the login form # Translators: This label appears above a field on the login form
# meant to hold the user's email address. # meant to hold the user's email address.
...@@ -127,6 +128,37 @@ def get_login_session_form(): ...@@ -127,6 +128,37 @@ def get_login_session_form():
return form_desc return form_desc
def _apply_third_party_auth_overrides(request, form_desc):
"""Modify the login form if the user has authenticated with a third-party provider.
If a user has successfully authenticated with a third-party provider,
and an email is associated with it then we fill in the email field with readonly property.
Arguments:
request (HttpRequest): The request for the registration form, used
to determine if the user has successfully authenticated
with a third-party provider.
form_desc (FormDescription): The registration form description
"""
if third_party_auth.is_enabled():
running_pipeline = third_party_auth.pipeline.get(request)
if running_pipeline:
current_provider = third_party_auth.provider.Registry.get_from_pipeline(running_pipeline)
if current_provider and enterprise_customer_for_request(request):
pipeline_kwargs = running_pipeline.get('kwargs')
# Details about the user sent back from the provider.
details = pipeline_kwargs.get('details').copy()
email = details.get('email', '')
# override the email field.
form_desc.override_field_properties(
"email",
default=email if email else '',
restrictions={"readonly": "readonly"} if email else {
"min_length": accounts.EMAIL_MIN_LENGTH,
"max_length": accounts.EMAIL_MAX_LENGTH,
}
)
class RegistrationFormFactory(object): class RegistrationFormFactory(object):
"""HTTP end-points for creating a new user. """ """HTTP end-points for creating a new user. """
......
...@@ -126,7 +126,7 @@ class FormDescription(object): ...@@ -126,7 +126,7 @@ class FormDescription(object):
ALLOWED_RESTRICTIONS = { ALLOWED_RESTRICTIONS = {
"text": ["min_length", "max_length"], "text": ["min_length", "max_length"],
"password": ["min_length", "max_length"], "password": ["min_length", "max_length"],
"email": ["min_length", "max_length"], "email": ["min_length", "max_length", "readonly"],
} }
FIELD_TYPE_MAP = { FIELD_TYPE_MAP = {
......
...@@ -43,7 +43,7 @@ class LoginSessionView(APIView): ...@@ -43,7 +43,7 @@ class LoginSessionView(APIView):
@method_decorator(ensure_csrf_cookie) @method_decorator(ensure_csrf_cookie)
def get(self, request): def get(self, request):
return HttpResponse(get_login_session_form().to_json(), content_type="application/json") return HttpResponse(get_login_session_form(request).to_json(), content_type="application/json")
@method_decorator(require_post_params(["email", "password"])) @method_decorator(require_post_params(["email", "password"]))
@method_decorator(csrf_protect) @method_decorator(csrf_protect)
......
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