Signup Panel
* Accessible at /signup/ * Link placed on bottom of login page. * Submits a simple signup request to Adjutant. * Added overextends to based Adjutant enabled file. * Added back button to match login form to forgot password. * Change forgot password to match signup autofocus logic. Change-Id: I1628495a3c35186a45061d07d5e392dc63121ee9
This commit is contained in:
parent
490a16c08b
commit
dfa0388152
@ -3,6 +3,7 @@ include setup.py
|
|||||||
recursive-include adjutant_ui/content/default/templates *
|
recursive-include adjutant_ui/content/default/templates *
|
||||||
recursive-include adjutant_ui/content/forgotpassword/templates *
|
recursive-include adjutant_ui/content/forgotpassword/templates *
|
||||||
recursive-include adjutant_ui/content/project_users/templates *
|
recursive-include adjutant_ui/content/project_users/templates *
|
||||||
|
recursive-include adjutant_ui/content/signup/templates *
|
||||||
recursive-include adjutant_ui/content/tasks/templates *
|
recursive-include adjutant_ui/content/tasks/templates *
|
||||||
recursive-include adjutant_ui/content/token/templates *
|
recursive-include adjutant_ui/content/token/templates *
|
||||||
recursive-include adjutant_ui/static *
|
recursive-include adjutant_ui/static *
|
||||||
|
@ -258,6 +258,17 @@ def forgotpassword_submit(request, data):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
def signup_submit(request, data):
|
||||||
|
headers = {"Content-Type": "application/json"}
|
||||||
|
try:
|
||||||
|
return post(request, 'openstack/sign-up',
|
||||||
|
data=json.dumps(data),
|
||||||
|
headers=headers)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.error(e)
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
def task_list(request, filters={}, page=1):
|
def task_list(request, filters={}, page=1):
|
||||||
tasks_per_page = utils.get_page_size(request)
|
tasks_per_page = utils.get_page_size(request)
|
||||||
tasklist = []
|
tasklist = []
|
||||||
|
@ -27,17 +27,18 @@ USERNAME_IS_EMAIL = True
|
|||||||
|
|
||||||
|
|
||||||
class ForgotPasswordForm(hforms.SelfHandlingForm):
|
class ForgotPasswordForm(hforms.SelfHandlingForm):
|
||||||
username = forms.CharField(max_length=255, label=_("User Name"))
|
username = forms.CharField(
|
||||||
email = forms.EmailField(
|
max_length=255, label=_("User Name"),
|
||||||
label=_("Email"),
|
widget=forms.TextInput(attrs={"autofocus": "autofocus"}))
|
||||||
widget=forms.TextInput(attrs={"autofocus": "autofocus"})
|
email = forms.EmailField(label=_("Email"))
|
||||||
)
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(ForgotPasswordForm, self).__init__(*args, **kwargs)
|
super(ForgotPasswordForm, self).__init__(*args, **kwargs)
|
||||||
if (hasattr(settings, 'USERNAME_IS_EMAIL') and
|
if (hasattr(settings, 'USERNAME_IS_EMAIL') and
|
||||||
getattr(settings, 'USERNAME_IS_EMAIL')):
|
getattr(settings, 'USERNAME_IS_EMAIL')):
|
||||||
self.fields.pop('username')
|
self.fields.pop('username')
|
||||||
|
self.fields['email'].widget = forms.TextInput(
|
||||||
|
attrs={"autofocus": "autofocus"})
|
||||||
|
|
||||||
def clean(self, *args, **kwargs):
|
def clean(self, *args, **kwargs):
|
||||||
# validate username and email?
|
# validate username and email?
|
||||||
|
@ -42,6 +42,9 @@
|
|||||||
<span ng-show="auth_type==='credentials'">{% trans "Submit" %}</span>
|
<span ng-show="auth_type==='credentials'">{% trans "Submit" %}</span>
|
||||||
<span ng-hide="auth_type==='credentials'" ng-cloak>{% trans "Submit" %}</span>
|
<span ng-hide="auth_type==='credentials'" ng-cloak>{% trans "Submit" %}</span>
|
||||||
</button>
|
</button>
|
||||||
|
<a href="/" class="btn btn-default cancel">
|
||||||
|
{% trans "Back to login" %}
|
||||||
|
</a>
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
@ -55,7 +55,7 @@ class UpdateUserView(forms.ModalFormView):
|
|||||||
def get_object(self):
|
def get_object(self):
|
||||||
try:
|
try:
|
||||||
return adjutant.user_get(self.request,
|
return adjutant.user_get(self.request,
|
||||||
self.kwargs['user_id'])
|
self.kwargs['user_id'])
|
||||||
except Exception:
|
except Exception:
|
||||||
msg = _('Unable to retrieve user.')
|
msg = _('Unable to retrieve user.')
|
||||||
url = reverse('horizon:management:project_users:index')
|
url = reverse('horizon:management:project_users:index')
|
||||||
|
0
adjutant_ui/content/signup/__init__.py
Normal file
0
adjutant_ui/content/signup/__init__.py
Normal file
58
adjutant_ui/content/signup/forms.py
Normal file
58
adjutant_ui/content/signup/forms.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Copyright (c) 2016 Catalyst IT Ltd.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django import forms
|
||||||
|
from django import http
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
from horizon import forms as hforms
|
||||||
|
from horizon.utils import functions as utils
|
||||||
|
|
||||||
|
from adjutant_ui.api import adjutant
|
||||||
|
|
||||||
|
|
||||||
|
class SignupForm(hforms.SelfHandlingForm):
|
||||||
|
username = forms.CharField(
|
||||||
|
max_length=255, label=_("User Name"),
|
||||||
|
widget=forms.TextInput(attrs={"autofocus": "autofocus"}))
|
||||||
|
email = forms.EmailField(label=_("Email"))
|
||||||
|
project_name = forms.CharField(label=_("Project Name"), max_length=64)
|
||||||
|
setup_network = forms.BooleanField(
|
||||||
|
label=_("Create Default Network"),
|
||||||
|
help_text=_("Create a basic network during account creation so that "
|
||||||
|
"you can deploy VMs immediately."),
|
||||||
|
required=False,
|
||||||
|
initial=True)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(SignupForm, self).__init__(*args, **kwargs)
|
||||||
|
if (hasattr(settings, 'USERNAME_IS_EMAIL') and
|
||||||
|
getattr(settings, 'USERNAME_IS_EMAIL')):
|
||||||
|
self.fields.pop('username')
|
||||||
|
self.fields['email'].widget = forms.TextInput(
|
||||||
|
attrs={"autofocus": "autofocus"})
|
||||||
|
|
||||||
|
def handle(self, request, data):
|
||||||
|
submit_response = adjutant.signup_submit(
|
||||||
|
request, data)
|
||||||
|
if submit_response.ok:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Send the user back to the login page.
|
||||||
|
msg = _("The signup service is currently unavailable. "
|
||||||
|
"Please try again later.")
|
||||||
|
response = http.HttpResponseRedirect(settings.LOGOUT_URL)
|
||||||
|
utils.add_logout_reason(self.request, response, msg)
|
||||||
|
return response
|
23
adjutant_ui/content/signup/panel.py
Normal file
23
adjutant_ui/content/signup/panel.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Copyright (c) 2016 Catalyst IT Ltd.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
import horizon
|
||||||
|
|
||||||
|
|
||||||
|
class SignupPanel(horizon.Panel):
|
||||||
|
name = _('Sign Up')
|
||||||
|
slug = 'signup'
|
||||||
|
nav = False
|
@ -0,0 +1,7 @@
|
|||||||
|
{% overextends 'auth/_login_page.html' %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block login_footer %}
|
||||||
|
{{ block.super }}
|
||||||
|
<p>Don't have an account? <a href="{% url 'horizon:signup:signup:index' %}">Sign up</a>.</p>
|
||||||
|
{% endblock %}
|
23
adjutant_ui/content/signup/templates/signup/_index.html
Normal file
23
adjutant_ui/content/signup/templates/signup/_index.html
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{% extends 'signup/_signup_form.html' %}
|
||||||
|
|
||||||
|
{% load url from future %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block pre_login %}
|
||||||
|
<div class="container login">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-11 col-sm-8 col-md-6 col-lg-5 horizontal-center">
|
||||||
|
{{ block.super }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block login_header %}
|
||||||
|
{% include 'auth/_splash.html' %}
|
||||||
|
{{ block.super }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block post_login %}
|
||||||
|
{{ block.super }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -0,0 +1,54 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block pre_login %}
|
||||||
|
<form id="" class="ng-pristine ng-valid ng-scope"
|
||||||
|
method="POST"
|
||||||
|
action="{% url 'horizon:signup:signup:index' %}"
|
||||||
|
autocomplete="off"
|
||||||
|
ng-controller="hzLoginController">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<div class="panel panel-default">
|
||||||
|
|
||||||
|
<div class="panel-heading">
|
||||||
|
{% block login_header %}
|
||||||
|
<h3 class="login-title">
|
||||||
|
{% trans 'Sign Up' %}
|
||||||
|
</h3>
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="panel-body">
|
||||||
|
{% block login_body %}
|
||||||
|
{% comment %}
|
||||||
|
These fake fields are required to prevent Chrome v34+ from autofilling form.
|
||||||
|
{% endcomment %}
|
||||||
|
{% if HORIZON_CONFIG.password_autocomplete != "on" %}
|
||||||
|
<div class="fake_credentials" style="display: none">
|
||||||
|
<input type="text" name="fake_email" value="" />
|
||||||
|
<input type="password" name="fake_password" value="" />
|
||||||
|
</div>
|
||||||
|
{%endif%}
|
||||||
|
<fieldset hz-login-finder>
|
||||||
|
{% include "horizon/common/_form_fields.html" %}
|
||||||
|
</fieldset>
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="panel-footer">
|
||||||
|
{% block login_footer %}
|
||||||
|
<button id="loginBtn" type="submit" class="btn btn-primary pull-right">
|
||||||
|
<span>{% trans "Submit" %}</span>
|
||||||
|
</button>
|
||||||
|
<a href="/" class="btn btn-default cancel">
|
||||||
|
{% trans "Back to login" %}
|
||||||
|
</a>
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% block post_login%}
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
20
adjutant_ui/content/signup/templates/signup/_submitted.html
Normal file
20
adjutant_ui/content/signup/templates/signup/_submitted.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{% extends 'signup/_sent_text.html' %}
|
||||||
|
|
||||||
|
{% block pre_login %}
|
||||||
|
<div class="container login">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-11 col-sm-8 col-md-6 col-lg-5 horizontal-center">
|
||||||
|
{{ block.super }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block login_header %}
|
||||||
|
{% include 'auth/_splash.html' %}
|
||||||
|
{{ block.super }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block post_login %}
|
||||||
|
{{ block.super }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -0,0 +1,34 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block pre_login %}
|
||||||
|
<form>
|
||||||
|
{% csrf_token %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<div class="panel panel-default">
|
||||||
|
|
||||||
|
<div class="panel-heading">
|
||||||
|
{% block login_header %}
|
||||||
|
<h3 class="login-title">
|
||||||
|
{% trans 'Sign Up' %}
|
||||||
|
</h3>
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="panel-body">
|
||||||
|
{% block login_body %}
|
||||||
|
{% trans "Your signup request has been submitted. An email will be sent once an administator approves your request." %}
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="panel-footer">
|
||||||
|
{% block login_footer %}
|
||||||
|
<a href="/" class="pull-right">{% trans "Back to log in" %}</a>
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% block post_login%}
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
11
adjutant_ui/content/signup/templates/signup/index.html
Normal file
11
adjutant_ui/content/signup/templates/signup/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block title %}{% trans "Sign Up" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block body_id %}splash{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% include 'signup/_index.html' %}
|
||||||
|
{% endblock %}
|
@ -0,0 +1,9 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% block title %}{% trans "Signup Submitted" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block body_id %}splash{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% include 'signup/_sent.html' %}
|
||||||
|
{% endblock %}
|
24
adjutant_ui/content/signup/urls.py
Normal file
24
adjutant_ui/content/signup/urls.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Copyright (c) 2016 Catalyst IT Ltd.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from django.conf.urls import patterns
|
||||||
|
from django.conf.urls import url
|
||||||
|
|
||||||
|
from adjutant_ui.content.signup import views
|
||||||
|
|
||||||
|
urlpatterns = patterns(
|
||||||
|
'',
|
||||||
|
url(r'^/?$', views.SignupFormView.as_view(), name='index'),
|
||||||
|
url(r'^submitted/?$', views.signup_sent_view, name='submitted'),
|
||||||
|
)
|
31
adjutant_ui/content/signup/views.py
Normal file
31
adjutant_ui/content/signup/views.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# Copyright (c) 2016 Catalyst IT Ltd.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.core.urlresolvers import reverse_lazy
|
||||||
|
|
||||||
|
from horizon import forms
|
||||||
|
|
||||||
|
from adjutant_ui.content.signup import forms as su_forms
|
||||||
|
|
||||||
|
|
||||||
|
class SignupFormView(forms.ModalFormView):
|
||||||
|
form_class = su_forms.SignupForm
|
||||||
|
submit_url = reverse_lazy("horizon:signup:signup:index")
|
||||||
|
success_url = reverse_lazy("horizon:signup:signup:submitted")
|
||||||
|
template_name = 'signup/index.html'
|
||||||
|
|
||||||
|
|
||||||
|
def signup_sent_view(request):
|
||||||
|
return render(request, 'signup/submitted.html')
|
31
adjutant_ui/dashboards/signup_dash.py
Normal file
31
adjutant_ui/dashboards/signup_dash.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# Copyright (c) 2014 Catalyst IT Ltd.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
import horizon
|
||||||
|
|
||||||
|
from adjutant_ui.content.signup import panel
|
||||||
|
|
||||||
|
|
||||||
|
class SignupDashboard(horizon.Dashboard):
|
||||||
|
name = _("Sign Up")
|
||||||
|
slug = "signup"
|
||||||
|
default_panel = 'signup'
|
||||||
|
nav = False
|
||||||
|
public = True
|
||||||
|
|
||||||
|
|
||||||
|
horizon.register(SignupDashboard)
|
||||||
|
SignupDashboard.register(panel.SignupPanel)
|
@ -4,5 +4,6 @@ FEATURE = "adjutant-ui-base"
|
|||||||
|
|
||||||
# A list of applications to be added to INSTALLED_APPS.
|
# A list of applications to be added to INSTALLED_APPS.
|
||||||
ADD_INSTALLED_APPS = [
|
ADD_INSTALLED_APPS = [
|
||||||
'adjutant_ui'
|
'adjutant_ui',
|
||||||
|
'overextends',
|
||||||
]
|
]
|
||||||
|
@ -5,5 +5,4 @@ DASHBOARD = 'forgot_password'
|
|||||||
ADD_INSTALLED_APPS = [
|
ADD_INSTALLED_APPS = [
|
||||||
'adjutant_ui.dashboards.forgot_password_dash',
|
'adjutant_ui.dashboards.forgot_password_dash',
|
||||||
'adjutant_ui.content.forgot_password',
|
'adjutant_ui.content.forgot_password',
|
||||||
'overextends',
|
|
||||||
]
|
]
|
||||||
|
8
adjutant_ui/enabled/_6025_signup.py
Normal file
8
adjutant_ui/enabled/_6025_signup.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# The name of the dashboard to be added to HORIZON['dashboards']. Required.
|
||||||
|
DASHBOARD = 'signup'
|
||||||
|
|
||||||
|
# A list of applications to be added to INSTALLED_APPS.
|
||||||
|
ADD_INSTALLED_APPS = [
|
||||||
|
'adjutant_ui.dashboards.signup_dash',
|
||||||
|
'adjutant_ui.content.signup',
|
||||||
|
]
|
Loading…
x
Reference in New Issue
Block a user