Added new page(Choice ssh key generate/upload), changed design of generate ssh form
This commit is contained in:
parent
f49d6b398f
commit
7cc70a95ac
7 changed files with 249 additions and 22 deletions
|
@ -58,15 +58,19 @@ class HostingUserSignupForm(forms.ModelForm):
|
|||
|
||||
class UserHostingKeyForm(forms.ModelForm):
|
||||
private_key = forms.CharField(widget=forms.HiddenInput(), required=False)
|
||||
public_key = forms.CharField(widget=forms.Textarea(), required=False,
|
||||
help_text=_('Paste here your public key'))
|
||||
public_key = forms.CharField(widget=forms.Textarea(
|
||||
attrs={'class': 'form_public_key', 'placeholder': 'Paste here your public key'}),
|
||||
required=False,
|
||||
)
|
||||
user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(),
|
||||
required=False, widget=forms.HiddenInput())
|
||||
name = forms.CharField(required=True)
|
||||
name = forms.CharField(required=True, widget=forms.TextInput(
|
||||
attrs={'class': 'form_key_name', 'placeholder': 'Give a name to your key',}))
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.request = kwargs.pop("request")
|
||||
super(UserHostingKeyForm, self).__init__(*args, **kwargs)
|
||||
self.fields['name'].label = "Key name"
|
||||
|
||||
def clean_name(self):
|
||||
return self.data.get('name')
|
||||
|
|
|
@ -91,4 +91,145 @@
|
|||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.choice-container{
|
||||
margin-top: 30px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.choice-container div:first-of-type{
|
||||
border-right: 1px solid #c9c6c6;
|
||||
}
|
||||
|
||||
.choice-container div{
|
||||
padding-top: 30px;
|
||||
padding-bottom: 30px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
width: 50%;
|
||||
}
|
||||
.choice-container div h3{
|
||||
margin: auto;
|
||||
width: 95%;
|
||||
text-align: center;
|
||||
}
|
||||
.choice-container div h3 img:hover{
|
||||
cursor: pointer;
|
||||
}
|
||||
.dashboard-container {
|
||||
max-width: 930px !important;
|
||||
}
|
||||
.choice-button{
|
||||
width: 192px;
|
||||
height: 45px;
|
||||
border-radius: 0;
|
||||
color: white;
|
||||
margin-top: 70px;
|
||||
}
|
||||
.choice-button a{
|
||||
color: white;
|
||||
font-size: 20px;
|
||||
}
|
||||
.upload-btn{
|
||||
background-color: #337ab7;
|
||||
}
|
||||
.form_public_key,
|
||||
.form_key_name{
|
||||
border:none;
|
||||
border-bottom: 1px solid grey;
|
||||
box-shadow: none;
|
||||
border-radius: 0;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.form_key_name::-webkit-input-placeholder{
|
||||
position: relative;
|
||||
left:-10px;
|
||||
font-size: 20px;
|
||||
font-weight:100;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
|
||||
|
||||
}
|
||||
.form_key_name::-moz-input-placeholder{
|
||||
left:-10px;
|
||||
font-size: 20px;
|
||||
font-weight:200;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
|
||||
}
|
||||
.form_key_name:-moz-input-placeholder{
|
||||
left:-10px;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
font-size: 20px;
|
||||
font-weight:200;
|
||||
|
||||
}
|
||||
.form_key_name:-ms-input-placeholder {
|
||||
left:-10px;
|
||||
font-size: 20px;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
font-weight:200;
|
||||
}
|
||||
|
||||
.form_public_key::-webkit-input-placeholder{
|
||||
position: relative;
|
||||
top: 80%;
|
||||
left:-10px;
|
||||
font-size: 20px;
|
||||
font-weight:200;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
|
||||
}
|
||||
.form_public_key::-moz-input-placeholder{
|
||||
position: relative;
|
||||
top: 80%;
|
||||
left:-10px;
|
||||
font-size: 20px;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
font-weight:200;
|
||||
|
||||
}
|
||||
.form_public_key:-moz-input-placeholder{
|
||||
position: relative;
|
||||
top: 80%;
|
||||
left:-10px;
|
||||
font-size: 20px;
|
||||
font-weight:200;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
}
|
||||
.form_public_key:-ms-input-placeholder {
|
||||
position: relative;
|
||||
top: 80%;
|
||||
left:-10px;
|
||||
font-size: 20px;
|
||||
font-weight:200;
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
}
|
||||
.underform-contaner{
|
||||
display: flex;
|
||||
vertical-align: middle;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-direction: row;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.underform-contaner h4{
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
}
|
||||
.underform-contaner button{
|
||||
width: 120px;
|
||||
height: 35px;
|
||||
}
|
||||
.control-label{
|
||||
font-family: 'Lato-Light', sans-serif;
|
||||
font-size: 20px;
|
||||
font-weight:200;
|
||||
}
|
||||
.form-ssh h3{
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
|
70
hosting/templates/hosting/choice_ssh_keys.html
Normal file
70
hosting/templates/hosting/choice_ssh_keys.html
Normal file
|
@ -0,0 +1,70 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3 i18n %}
|
||||
{% block content %}
|
||||
<div>
|
||||
<div class="container virtual-machine-container dashboard-container ">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="col-sm-12">
|
||||
<h2><i class="fa fa-key" aria-hidden="true"></i>{% trans " SSH Key"%} </h2>
|
||||
<h4>Choose a key option in order to access your VMs.</h4>
|
||||
{% if messages %}
|
||||
<div class="alert alert-warning">
|
||||
{% for message in messages %}
|
||||
<span>{{ message }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="choice-container">
|
||||
<div class="left-choice-container">
|
||||
<h3>I want to generate a new key pair.
|
||||
<sup><sup><img src="{% static 'hosting/img/g222.png' %}"/></sup></sup>
|
||||
</h3>
|
||||
<button type="button" class="btn btn-success choice-button generate-btn">
|
||||
<a href="#">{% trans "Generate"%}</a>
|
||||
</button>
|
||||
</div>
|
||||
<div class="right-choice-container">
|
||||
<h3>I want to use my existing public key.
|
||||
<sup><sup><img src="{% static 'hosting/img/g222.png' %}"/></sup></sup>
|
||||
</h3>
|
||||
<button type="button" class="btn btn-primary choice-button upload-btn">
|
||||
<a href="{% url 'hosting:create_ssh_key' %}">{% trans "Upload"%}</a>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{% if next_url %}
|
||||
<script type="text/javascript">
|
||||
window.location.href = '{{next_url}}';
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
window.onload = function () {
|
||||
{% for user_key in keys %}
|
||||
// var locale_date = new Date(document.getElementById("ssh-created_at-{{user_key.id}}").textContent).toISOString();
|
||||
var locale_date = moment.utc(document.getElementById("ssh-created_at-{{user_key.id}}").textContent,'YYYY-MM-DD HH:mm').toDate();
|
||||
locale_date = moment(locale_date).format("YYYY-MM-DD h:mm:ss a");
|
||||
document.getElementById('ssh-created_at-{{user_key.id}}').innerHTML = locale_date;
|
||||
|
||||
{% endfor %}
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
{%endblock%}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3 i18n %}
|
||||
{% block content %}
|
||||
{% block content %}
|
||||
<div>
|
||||
<div class="virtual-machine-container dashboard-container ">
|
||||
<div class="row">
|
||||
|
@ -8,7 +8,7 @@
|
|||
<div class="col-sm-12">
|
||||
<form method="POST" action="" novalidate class="form-ssh">
|
||||
{% csrf_token %}
|
||||
<h3><i class="fa fa-key fa-separate" aria-hidden="true"></i>{% trans "Access Key"%} </h3>
|
||||
<h3><i class="fa fa-key fa-separate" aria-hidden="true"></i>{% trans "Add you public SSH key"%} </h3>
|
||||
{% if messages %}
|
||||
<div class="alert alert-warning">
|
||||
{% for message in messages %}
|
||||
|
@ -20,28 +20,29 @@
|
|||
{% bootstrap_field field %}
|
||||
{% endfor %}
|
||||
{% buttons %}
|
||||
<div class="underform-contaner">
|
||||
<h4> {% trans "Use your created key to access to the machine." %} </h4>
|
||||
<button type="submit" class="btn btn-success">
|
||||
{% trans "Upload your own key. "%}
|
||||
</button>
|
||||
<br />
|
||||
<br />
|
||||
{% trans "Or generate a new key pair."%} <br />
|
||||
<br />
|
||||
<button class="btn btn-success">{% trans "Generate Key Pair"%} </a>
|
||||
{% trans "Add SSH key"%}
|
||||
</button>
|
||||
</div>
|
||||
<div class="underform-contaner">
|
||||
<h4>{% trans "Or you can generate a new key pair."%}</h4>
|
||||
<button class="btn btn-success">{% trans "Generate"%}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{% endbuttons %}
|
||||
|
||||
{% endbuttons %}
|
||||
</form>
|
||||
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5>
|
||||
|
||||
{% if private_key %}
|
||||
<div class="alert alert-warning">
|
||||
|
||||
<strong>{% trans "Warning!"%}</strong>{% trans "You can download your SSH private key once. Don't lost your key"%}
|
||||
|
||||
<strong>{% trans "Warning!"%}</strong>{% trans "You can download your SSH private key once. Don't lost your key"%}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<textarea class="form-control" rows="6" id="ssh_key" type="hidden" style="display:none">{{private_key}}</textarea>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="clearfix"></div>
|
||||
|
@ -54,7 +55,7 @@
|
|||
|
||||
{% if private_key %}
|
||||
<!-- Force to download ssh key on page load -->
|
||||
<script type="text/javascript">
|
||||
<script type="text/javascript">
|
||||
|
||||
var key = window.document.getElementById('ssh_key');
|
||||
|
||||
|
@ -75,7 +76,7 @@
|
|||
{%endif%}
|
||||
|
||||
{% if next_url %}
|
||||
<script type="text/javascript">
|
||||
<script type="text/javascript">
|
||||
window.location.href = '{{next_url}}';
|
||||
</script>
|
||||
{% endif %}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
{% endif %}
|
||||
<div class="ssh-header-container">
|
||||
<p>
|
||||
<a class="btn btn-primary btn-custom-download" href="{% url 'hosting:create_ssh_key' %}" >
|
||||
<a class="btn btn-primary btn-custom-download" href="{% url 'hosting:choice_ssh_keys' %}" >
|
||||
<span class="button-plus">✚</span> {% trans "Add Key"%}
|
||||
</a>
|
||||
</p>
|
||||
|
|
|
@ -6,7 +6,7 @@ from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
|
|||
VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \
|
||||
MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\
|
||||
CreateVirtualMachinesView, HostingBillListView, HostingBillDetailView, \
|
||||
SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView
|
||||
SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView, SSHKeyChoiceView
|
||||
|
||||
urlpatterns = [
|
||||
url(r'index/?$', IndexView.as_view(), name='index'),
|
||||
|
@ -26,6 +26,8 @@ urlpatterns = [
|
|||
name='virtual_machines'),
|
||||
url(r'ssh_keys/?$', SSHKeyListView.as_view(),
|
||||
name='ssh_keys'),
|
||||
url(r'ssh_keys_choice/?$', SSHKeyChoiceView.as_view(),
|
||||
name='choice_ssh_keys'),
|
||||
url(r'delete_ssh_key/(?P<pk>\d+)/?$', SSHKeyDeleteView.as_view(),
|
||||
name='delete_ssh_key'),
|
||||
url(r'create_ssh_key/?$', SSHKeyCreateView.as_view(),
|
||||
|
|
|
@ -368,6 +368,15 @@ class SSHKeyListView(LoginRequiredMixin, ListView):
|
|||
return super(SSHKeyListView, self).render_to_response(context, **response_kwargs)
|
||||
|
||||
|
||||
class SSHKeyChoiceView(LoginRequiredMixin, View):
|
||||
template_name = "hosting/choice_ssh_keys.html"
|
||||
login_url = reverse_lazy('hosting:login')
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
context = {}
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
|
||||
class SSHKeyCreateView(LoginRequiredMixin, FormView):
|
||||
form_class = UserHostingKeyForm
|
||||
model = UserHostingKey
|
||||
|
|
Loading…
Reference in a new issue