Fix conflicts

This commit is contained in:
Henry Bravo 2017-06-05 14:55:41 -05:00
commit c69694274f
26 changed files with 533 additions and 257 deletions

View file

@ -25,47 +25,47 @@ msgstr "Fügen Sie Ihren public key ein"
#: hosting/templates/hosting/base_short.html:68
#: hosting/templates/hosting/base_short.html:139
msgid "My Virtual Machines"
msgstr ""
msgstr "Meine virtuellen Maschinen"
#: hosting/templates/hosting/base_short.html:73
#: hosting/templates/hosting/base_short.html:145
#: hosting/templates/hosting/orders.html:12
msgid "My Orders"
msgstr ""
msgstr "Meine Bestellungen"
#: hosting/templates/hosting/base_short.html:78
#: hosting/templates/hosting/base_short.html:152
msgid "Keys"
msgstr ""
msgstr "Schlüssel"
#: hosting/templates/hosting/base_short.html:83
#: hosting/templates/hosting/base_short.html:158
msgid "Notifications "
msgstr ""
msgstr "Benachrichtigungen"
#: hosting/templates/hosting/base_short.html:90
msgid "Logout"
msgstr ""
msgstr "Abmeleden"
#: hosting/templates/hosting/base_short.html:95
msgid "How it works"
msgstr ""
msgstr "Wie es funktioniert"
#: hosting/templates/hosting/base_short.html:98
msgid "Your infrastructure"
msgstr ""
msgstr "Ihre Infrastruktur"
#: hosting/templates/hosting/base_short.html:101
msgid "Our inftrastructure"
msgstr ""
msgstr "Unsere Infrastruktur"
#: hosting/templates/hosting/base_short.html:104
msgid "Pricing"
msgstr ""
msgstr "Preise"
#: hosting/templates/hosting/base_short.html:107
msgid "Contact"
msgstr ""
msgstr "Kontakt"
#: hosting/templates/hosting/base_short.html:110
#: hosting/templates/hosting/login.html:32
@ -73,19 +73,19 @@ msgstr ""
#: hosting/templates/hosting/reset_password.html:31
#: hosting/templates/hosting/signup.html:30
msgid "Login"
msgstr ""
msgstr "Anmelden"
#: hosting/templates/hosting/base_short.html:134
msgid "Home"
msgstr ""
msgstr "Home"
#: templates/hosting/bill_detail.html:11 templates/hosting/order_detail.html:10
msgid "Invoice"
msgstr ""
msgstr "Rechnung"
#: templates/hosting/bill_detail.html:11 templates/hosting/order_detail.html:10
msgid "Order #"
msgstr ""
msgstr "Rechnung #"
#: templates/hosting/bill_detail.html:25
msgid "ungleich GmbH"
@ -114,7 +114,7 @@ msgstr ""
#: templates/hosting/bill_detail.html:68
#, python-format
msgid "Alles Preise in CHF mit 8%% Mehrwertsteuer."
msgstr ""
msgstr "All prices in CHF including 8%% VAT"
#: templates/hosting/bill_detail.html:69
msgid "Betrag zahlbar innerhalb von 30 Tagen ab Rechnungseingang."
@ -142,7 +142,7 @@ msgstr ""
#: templates/hosting/bills.html:12
msgid "Customers"
msgstr ""
msgstr "Kunden"
#: hosting/templates/hosting/bills.html:16
#: hosting/templates/hosting/virtual_machine_key.html:42
@ -155,17 +155,17 @@ msgstr ""
#: templates/hosting/bills.html:28
msgid "View Bill"
msgstr ""
msgstr "Rechnung anzeigen"
#: templates/hosting/bills.html:41 templates/hosting/orders.html.py:83
#: templates/hosting/virtual_machines.html:70
msgid "previous"
msgstr ""
msgstr "vorherige"
#: templates/hosting/bills.html:47 templates/hosting/orders.html.py:89
#: templates/hosting/virtual_machines.html:76
msgid "next"
msgstr ""
msgstr "nächste"
#: templates/hosting/confirm_reset_password.html:10
#: templates/hosting/login.html:9 templates/hosting/reset_password.html.py:9
@ -175,26 +175,42 @@ msgstr "Ihre VM in der Schweiz"
#: templates/hosting/confirm_reset_password.html:14
msgid "Set your new password"
msgstr ""
msgstr "Setzen Ihr neues Passwort"
#: hosting/templates/hosting/confirm_reset_password.html:28
#: hosting/templates/hosting/reset_password.html:22
msgid "Reset"
msgstr ""
msgstr "Zurücksetzen"
#: hosting/templates/hosting/confirm_reset_password.html:32
#: hosting/templates/hosting/reset_password.html:28
#: hosting/templates/hosting/signup.html:27
msgid "Already have an account ?"
msgstr ""
msgstr "Besitzen sie bereits ein Bentzerkonto"
#: templates/hosting/create_virtual_machine.html:19
#: hosting/templates/hosting/confirm_reset_password.html:32
msgid "Log in"
msgstr "Anmelden"
#: hosting/templates/hosting/create_virtual_machine.html:19
msgid "New Virtual Machine"
msgstr ""
msgstr "Neue virtuelle Maschine"
#: hosting/templates/hosting/create_virtual_machine.html:24
msgid "Select VM Template:"
msgstr "Wählen Sie eine Vorlage"
#: hosting/templates/hosting/create_virtual_machine.html:32
msgid "Select VM Configuration:"
msgstr "Wählen Sie eine Konfiguration"
#: hosting/templates/hosting/create_virtual_machine.html:39
msgid "CHF/Month"
msgstr "CHF/Monat"
#: templates/hosting/create_virtual_machine.html:45
msgid "Start VM"
msgstr ""
msgstr "Start VM"
#: templates/hosting/emails/password_reset_email.html:2
#: templates/hosting/emails/password_reset_email.txt:2
@ -220,48 +236,53 @@ msgstr ""
msgid "The %(site_name)s team"
msgstr ""
#: hosting/templates/hosting/login.html:10
#: hosting/templates/hosting/reset_password.html:10
#: hosting/templates/hosting/signup.html:9
msgid "Your VM hosted in Switzerland"
msgstr "Ihre VM gehostet in der Schweiz"
#: hosting/templates/hosting/login.html:26
msgid "You haven been logged out"
msgstr ""
msgstr "Sie wurden abgmeldet"
#: hosting/templates/hosting/login.html:49
msgid "Don't have an account yet ? "
msgstr ""
msgstr "Besitzen Sie kein Benutzerkonto?"
#: hosting/templates/hosting/login.html:52
#: hosting/templates/hosting/signup.html:13
#: hosting/templates/hosting/signup.html:21
msgid "Sign up"
msgstr ""
msgstr "Registrieren"
#: hosting/templates/hosting/login.html:54
msgid "Forgot your password ? "
msgstr ""
msgstr "Passwort vergessen?"
#: templates/hosting/notifications.html:9
msgid "Notifications"
msgstr ""
msgstr "Benachrichtigungen"
#: templates/hosting/notifications.html:16
msgid "Unread"
msgstr ""
msgstr "Ungelesen"
#: templates/hosting/notifications.html:26
msgid "All"
msgstr ""
msgstr "Alle"
#: templates/hosting/notifications.html:38
msgid "Unread notifications"
msgstr ""
msgstr "Ungelesene Benachrichtigungen"
#: templates/hosting/notifications.html:48
msgid "Mark as read"
msgstr ""
msgstr "Als gelesen markieren"
#: templates/hosting/notifications.html:59
msgid "All notifications"
msgstr ""
msgstr "Alle Benachrichtigungen"
#: templates/hosting/order_detail.html:16
#: templates/hosting/order_detail.html:24
@ -274,25 +295,31 @@ msgstr ""
#: templates/hosting/order_detail.html:38
msgid "Payment Method:"
msgstr ""
msgstr "Bezahlmethode"
#: templates/hosting/order_detail.html:49
msgid "Order summary"
msgstr ""
msgstr "Bestellungsübersicht"
#: templates/hosting/order_detail.html:52
#: templates/hosting/virtual_machine_detail.html:76
#: hosting/templates/hosting/order_detail.html:52
#: hosting/templates/hosting/payment.html:17
#: hosting/templates/hosting/virtual_machine_detail.html:75
msgid "Cores"
msgstr ""
msgstr "Prozessorkerne"
#: templates/hosting/order_detail.html:54
#: templates/hosting/virtual_machine_detail.html:82
#: hosting/templates/hosting/order_detail.html:54
#: hosting/templates/hosting/payment.html:20
#: hosting/templates/hosting/virtual_machine_detail.html:81
msgid "Memory"
msgstr ""
msgstr "Arbeitsspeicher"
#: templates/hosting/order_detail.html:56
#: hosting/templates/hosting/order_detail.html:56
#: hosting/templates/hosting/payment.html:23
msgid "Disk space"
msgstr ""
msgstr "Festplattenkapazität"
#: templates/hosting/order_detail.html:58
msgid "Total"
@ -300,15 +327,15 @@ msgstr ""
#: templates/hosting/order_detail.html:64
msgid "Finish Configuration"
msgstr ""
msgstr "Konfiguration beenden"
#: templates/hosting/orders.html:17
msgid "Date"
msgstr ""
msgstr "Datum"
#: templates/hosting/orders.html:18
msgid "Amount"
msgstr ""
msgstr "Betrag"
#: hosting/templates/hosting/orders.html:19
#: hosting/templates/hosting/virtual_machine_detail.html:30
@ -319,71 +346,104 @@ msgstr ""
#: templates/hosting/orders.html:30
msgid "Approved"
msgstr ""
msgstr "Akzeptiert"
#: templates/hosting/orders.html:32
msgid "Declined"
msgstr ""
msgstr "Abgelehnt"
#: templates/hosting/orders.html:37 templates/hosting/virtual_machines.html:58
msgid "View Detail"
msgstr ""
msgstr "Details anzeigen"
#: templates/hosting/orders.html:41
msgid "Cancel Order"
msgstr ""
msgstr "Bestellung stornieren"
#: templates/hosting/orders.html:56
msgid "Do You want do delete your order?"
msgstr ""
msgstr "Wollen Sie ihre Bestellung löschen?"
#: templates/hosting/orders.html:64
msgid "Close"
msgstr ""
msgstr "Schliessen"
#: templates/hosting/orders.html:66
msgid "Delete"
msgstr ""
msgstr "Löschen"
#: hosting/templates/hosting/payment.html:12
msgid "Billing Amount"
msgstr "Rechnungsbetrag"
#: hosting/templates/hosting/payment.html:35
msgid "Billing Address"
msgstr "Rechnungsadresse"
#: hosting/templates/hosting/payment.html:49
msgid "Payment Details"
msgstr "Rechnungsdetails"
#: hosting/templates/hosting/payment.html:61
#: hosting/templates/hosting/payment.html:103
msgid "Submit Payment"
msgstr "Betrag überweisen"
#: hosting/templates/hosting/payment.html:70
msgid "CARD NUMBER"
msgstr "Kreditkartennummer"
#: hosting/templates/hosting/payment.html:75
msgid "Valid Card Number"
msgstr "Gültige Kreditkartennummer"
#: hosting/templates/hosting/payment.html:84
msgid "EXPIRATION DATE"
msgstr "Ablaufdatum"
#: hosting/templates/hosting/payment.html:95
msgid "CV CODE"
msgstr "CV Code"
#: hosting/templates/hosting/reset_password.html:14
msgid "Reset your password"
msgstr ""
msgstr "Passwort zurücksetzen"
#: templates/hosting/virtual_machine_detail.html:19
msgid "Settings"
msgstr ""
msgstr "Einstellungen"
#: templates/hosting/virtual_machine_detail.html:25
msgid "Billing"
msgstr ""
msgstr "Abrechnungen"
#: templates/hosting/virtual_machine_detail.html:60
msgid "Ip not assigned yet"
msgstr ""
msgstr "Ip nicht zugewiesen"
#: templates/hosting/virtual_machine_detail.html:89
msgid "Disk"
msgstr ""
msgstr "Festplatte"
#: templates/hosting/virtual_machine_detail.html:98
msgid "Configuration"
msgstr ""
msgstr "Konfiguration"
#: templates/hosting/virtual_machine_detail.html:108
msgid "Current pricing"
msgstr ""
msgstr "Aktueller Preis"
#: templates/hosting/virtual_machine_detail.html:117
msgid "Current status"
msgstr ""
msgstr "Aktueller Status"
#: templates/hosting/virtual_machine_detail.html:142
msgid "Terminate Virtual Machine"
msgstr ""
msgstr "Virtuelle Maschine beenden"
#: templates/hosting/virtual_machine_detail.html:163
msgid "Terminate your Virtual Machine"
msgstr ""
msgstr "Ihre virtuelle Maschine beenden"
#: templates/hosting/virtual_machine_detail.html:166
msgid "Are you sure do you want to cancel your Virtual Machine "
@ -392,43 +452,57 @@ msgstr ""
#: templates/hosting/virtual_machine_detail.html:166
msgid "plan?"
msgstr ""
msgstr "Sind Sie sicher, dass Sie ihre virtuelle Maschine beenden wollen "\
#: templates/hosting/virtual_machine_detail.html:169
msgid "Cancel"
msgstr ""
msgstr "Beenden"
#: templates/hosting/virtual_machine_key.html:11
msgid "Access Key"
msgstr ""
msgstr "Zugriffsschlüssel"
#: hosting/templates/hosting/virtual_machine_key.html:25
msgid "Upload your own key. "
msgstr ""
msgstr "Laden Sie ihren Schlüssel hoch"
#: hosting/templates/hosting/virtual_machine_key.html:29
msgid "Upload Key"
msgstr "Schlüssel hochladen"
#: hosting/templates/hosting/virtual_machine_key.html:33
msgid "Or generate a new key pair."
msgstr ""
msgstr "Oder erstellen Sie ein neues Schlüsselpaar"
#: hosting/templates/hosting/virtual_machine_key.html:31
msgid "Generate Key Pair"
msgstr "Schlüsselpaar generieren"
#: hosting/templates/hosting/virtual_machine_key.html:40
msgid ""
"Use your created key to access to the machine. If you lost it, contact us."
msgstr ""
"Verwenden Sie Ihren privaten SSH Schlüssel um sich mit Ihren Maschinen zu "
"verbinden. Falls Sie ihn verloren haben kontaktieren Sie uns."
#: hosting/templates/hosting/virtual_machine_key.html:43
msgid "Created at"
msgstr ""
msgstr "Erstellt am"
#: hosting/templates/hosting/virtual_machine_key.html:66
#: hosting/templates/hosting/virtual_machine_key.html:79
msgid "Warning!"
msgstr ""
msgstr "Achtung!"
#: hosting/templates/hosting/virtual_machine_key.html:66
msgid "You can download your SSH private key once. Don't lost your key"
msgstr ""
"Sie können ihren privaten SSH Schlüssel nur einmal herunterladen. Bewaren "
"Sie ihn sicher auf."
#: hosting/templates/hosting/virtual_machine_key.html:74
msgid "Copy to Clipboard"
msgstr ""
msgstr "Kopieren"
#: hosting/templates/hosting/virtual_machine_key.html:75
msgid "Download"
@ -439,18 +513,20 @@ msgid ""
"Your SSH private key was already generated and downloaded, if you lost it, "
"contact us. "
msgstr ""
"Ihr privater SSH Schlüssel wurde bereits generiert und heruntergeladen, "
"falls Sie ihn verloren haben kontaktieren Sie uns."
#: hosting/templates/hosting/virtual_machine_key.html:82
msgid "Generate my key"
msgstr ""
msgstr "Generiere meinen Schlüssel"
#: templates/hosting/virtual_machines.html:9
msgid "Virtual Machines"
msgstr ""
msgstr "Virtuelle Maschinen"
#: templates/hosting/virtual_machines.html:22
msgid "Create VM"
msgstr ""
msgstr "Neue VM"
#: templates/hosting/virtual_machines.html:28
msgid "ID"

View file

@ -1,5 +1,8 @@
$( document ).ready(function() {
$.ajaxSetup({
beforeSend: function(xhr, settings) {
function getCookie(name) {
@ -26,6 +29,12 @@ $( document ).ready(function() {
var hasCreditcard = window.hasCreditcard || false;
if (!hasCreditcard){
var stripe = Stripe(window.stripeKey);
var elements = stripe.elements({locale: window.current_lan});
var card = elements.create('card', options={hidePostalCode: true});
card.mount('#card-element');
}
console.log("has creditcard", hasCreditcard);
// hasCreditcard= true;
@ -38,10 +47,8 @@ $( document ).ready(function() {
console.log("creditcard sdasd");
// if (hasCreditcard) {
$('#billing-form').submit();
console.log("has creditcard2");
// }
// $form.submit();
}
@ -53,33 +60,55 @@ $( document ).ready(function() {
function payWithStripe(e) {
e.preventDefault();
/* Visual feedback */
$form.find('[type=submit]').html('Validating <i class="fa fa-spinner fa-pulse"></i>');
function stripeTokenHandler(token) {
// Insert the token ID into the form so it gets submitted to the server
var form = document.getElementById('payment-form');
var hiddenInput = document.createElement('input');
$('#id_token').val(token.id);
var PublishableKey = window.stripeKey;
Stripe.setPublishableKey(PublishableKey);
Stripe.card.createToken($form, function stripeResponseHandler(status, response) {
if (response.error) {
/* Visual feedback */
$form.find('[type=submit]').html('Try again');
/* Show Stripe errors on the form */
$form.find('.payment-errors').text(response.error.message);
$form.find('.payment-errors').closest('.row').show();
$('#billing-form').submit();
}
stripe.createToken(card).then(function(result) {
if (result.error) {
// Inform the user if there was an error
var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message;
} else {
/* Visual feedback */
$form.find('[type=submit]').html('Processing <i class="fa fa-spinner fa-pulse"></i>');
/* Hide Stripe errors on the form */
$form.find('.payment-errors').closest('.row').hide();
$form.find('.payment-errors').text("");
// response contains id and card, which contains additional card details
var token = response.id;
// AJAX
//set token on a hidden input
$('#id_token').val(token);
$('#billing-form').submit();
// Send the token to your server
stripeTokenHandler(result.token);
}
});
// /* Visual feedback */
// $form.find('[type=submit]').html('Validating <i class="fa fa-spinner fa-pulse"></i>');
// var PublishableKey = window.stripeKey;
// Stripe.setPublishableKey(PublishableKey);
// Stripe.card.createToken($form, function stripeResponseHandler(status, response) {
// if (response.error) {
// /* Visual feedback */
// $form.find('[type=submit]').html('Try again');
// /* Show Stripe errors on the form */
// $form.find('.payment-errors').text(response.error.message);
// $form.find('.payment-errors').closest('.row').show();
// } else {
// /* Visual feedback */
// $form.find('[type=submit]').html('Processing <i class="fa fa-spinner fa-pulse"></i>');
// /* Hide Stripe errors on the form */
// $form.find('.payment-errors').closest('.row').hide();
// $form.find('.payment-errors').text("");
// // response contains id and card, which contains additional card details
// var token = response.id;
// // AJAX
// //set token on a hidden input
// $('#id_token').val(token);
// $('#billing-form').submit();
// }
// });
}
/* Form validation */
@ -131,7 +160,7 @@ $( document ).ready(function() {
} else {
return false;
}
}
};
// $form.find('[type=submit]').prop('disabled', true);
// var readyInterval = setInterval(function() {

View file

@ -85,7 +85,7 @@
<ul id="g-account-menu" class="dropdown-menu" role="menu">
<li><a href="{% url 'hosting:logout' %}"><i class="glyphicon glyphicon-lock"></i>{% trans "Logout"%} </a></li>
<li>
<a href="{% url 'hosting:key_pair' %}">
<a href="{% url 'hosting:ssh_keys' %}">
<i class="fa fa-key"></i> {% trans "Keys"%}
</a>
</li>
@ -128,7 +128,46 @@
{% if request.user.is_authenticated %}
<footer class="navbar-fixed-bottom">
<div class="container">
<<<<<<< HEAD
<p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. All Rights Reserved</p>
=======
<div class="row">
<div class="col-lg-12 hidden-xs">
<ul class="list-inline">
<li>
<a href="#">{% trans "Home"%}</a>
</li>
<li class="footer-menu-divider">&sdot;</li>
<li>
<a href="{% url 'hosting:virtual_machines' %}">
{% trans "My Virtual Machines"%}
</a>
</li>
<li class="footer-menu-divider">&sdot;</li>
<li>
<a href="{% url 'hosting:orders' %}">
{% trans "My Orders"%}
</a>
</li>
<li>&sdot;</li>
<li>
<li>
<a href="{% url 'hosting:ssh_keys' %}">
{% trans "Keys"%}
</a>
</li>
<li class="footer-menu-divider">&sdot;</li>
<li>
<a href="{% url 'hosting:notifications' %}">
{% trans "Notifications "%}
</a>
</li>
</ul>
<p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. All Rights Reserved</p>
</div>
</div>
>>>>>>> f4997f041ca9496bf9a63706726a20d0a31d1c28
</div>
</footer>
{% endif %}
@ -149,8 +188,9 @@
<!-- Init JavaScript -->
<script src="{% static 'hosting/js/initial.js' %}"></script>
<script src="https://js.stripe.com/v3/"></script>
<script src="https://js.stripe.com/v2/"></script>
<!-- Stripe Lib -->
<script type="text/javascript" src="//js.stripe.com/v2/"></script>
<!-- Proccess payment lib -->
<script type="text/javascript" src="{% static 'hosting/js/payment.js' %}"></script>

View file

@ -21,7 +21,7 @@
<form method="POST" action="">
{% csrf_token %}
<div class="form-group">
Select VM Template:
{% trans "Select VM Template:" %}
<select name="vm_template_id">
{% for template in templates %}
<option value="{{template.id}}">{{template.name}} </option>
@ -29,14 +29,14 @@
</select>
</div>
<div class="form-group">
Select VM Configuration:
{% trans "Select VM Configuration:" %}
<select name="configuration">
{% for config in configuration_options %}
<option value="{{config.id}}">
CORE: {{config.cpu|floatformat}},
RAM: {{config.memory|floatformat}} GiB,
SSD: {{config.disk_size|floatformat}} GiB,
PRICE: {{config.price|floatformat}} CHF/Month
RAM: {{config.memory|floatformat}} GB,
SSD: {{config.disk_size|floatformat}} GB,
PRICE: {{config.price|floatformat}} {% trans "CHF/Month" %}
</option>
{% endfor %}
</select>

View file

@ -53,7 +53,7 @@
</button>
</div>
<div class="modal-body">
<h4 class="modal-title" id="ModalLabel">{% trans "Do You want do delete your order?"%}</h4>
<h4 class="modal-title" id="ModalLabel">{% trans "Do You want to delete your order?"%}</h4>
<form method="post"
action="{% url 'hosting:delete_order' order.id %}">

View file

@ -9,18 +9,18 @@
<form role="form" novalidate>
<div class="row">
<div class="col-xs-12">
<h3><b>Billing Amount</b></h3>
<h3><b>{%trans "Billing Amount" %}</b></h3>
<hr>
<div class="content">
<!-- <p><b>Type</b> <span class="pull-right">{{request.session.vm_specs.location_code}}</span></p> -->
<!-- <hr> -->
<p><b>Cores</b> <span
<p><b>{%trans "Cores"%}</b> <span
class="pull-right">{{request.session.specs.cpu|floatformat}}</span></p>
<hr>
<p><b>Memory</b> <span
<p><b>{%trans "Memory"%}</b> <span
class="pull-right">{{request.session.specs.memory|floatformat}} GiB</span></p>
<hr>
<p><b>Disk space</b> <span
<p><b>{%trans "Disk space"%}</b> <span
class="pull-right">{{request.session.specs.disk_size|floatformat}} GiB</span></p>
<hr>
<h4>Total<p
@ -32,7 +32,7 @@
</div>
<div class="col-xs-12 col-md-4 billing">
<h3><b>Billing Address</b></h3>
<h3><b>{%trans "Billing Address"%}</b></h3>
<hr>
<form role="form" id="billing-form" method="post" action="" novalidate>
{% for field in form %}
@ -46,7 +46,7 @@
<div class="row">
<div class="col-xs-12 col-md-offset-2 col-md-4 "></div>
<div class="col-xs-12 col-md-4 creditcard-box">
<h3><b>Payment Details</b></h3>
<h3><b>{%trans "Payment Details"%}</b></h3>
<hr>
<div>
<div>
@ -57,17 +57,33 @@
<h5 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h5>
<input type="hidden" name="credit_card_needed" value="false"/>
</form>
<button id="payment_button_with_creditcard" class="btn btn-success btn-lg btn-block" type="submit">Submit Payment</button>
<div class="col-xs-6">
<button id="payment_button_with_creditcard" class="btn btn-success btn-sm btn-block" type="submit">
{% trans "Submit Payment" %}
</button>
</div>
{% else %}
<form role="form" id="payment-form" novalidate>
<div class="row">
<div class="row">
<div class="form-group">
<div id="card-element">
<!-- a Stripe Element will be inserted here. -->
</div>
</div>
</div>
<div id="card-errors" role="alert"></div>
<!-- <div class="row">
<div class="col-xs-9 col-md-12">
<div class="form-group">
<label class="control-label" for="cardNumber">CARD NUMBER</label>
<label class="control-label" for="cardNumber">{%trans "CARD NUMBER"%}</label>
<div class="input-group">
<input type="text" class="form-control" name="cardNumber" placeholder="Valid Card Number" required autofocus data-stripe="number" />
<input type="text"
class="form-control"
name="cardNumber"
placeholder="{%trans "Valid Card Number"%}" required autofocus data-stripe="number" />
<span class="input-group-addon"><i class="fa fa-credit-card"></i></span>
</div>
</div>
@ -76,7 +92,7 @@
<div class="row">
<div class="col-xs-6 col-md-7">
<div class="form-group">
<label for="expMonth">EXPIRATION DATE</label><br/>
<label for="expMonth">{%trans "EXPIRATION DATE"%}</label><br/>
<div class="col-xs-6 col-lg-6 col-md-6 pl-ziro">
<input type="text" class="form-control" name="expMonth" placeholder="MM" required data-stripe="exp_month" />
</div>
@ -87,14 +103,14 @@
</div>
<div class="col-xs-4 col-md-5 pull-right">
<div class="form-group">
<label for="cvCode">CV CODE</label>
<label for="cvCode">{%trans "CV CODE"%}</label>
<input type="password" class="form-control" name="cvCode" placeholder="CV" required data-stripe="cvc" />
</div>
</div>
</div>
</div> -->
<div class="row">
<div class="col-xs-12">
<button class="btn btn-success btn-lg btn-block" type="submit">Submit Payment</button>
<div class="col-xs-6 float-right">
<button class="btn btn-success btn-sm btn-block" type="submit">Submit Payment</button>
</div>
</div>
<div class="row" style="display:none;">
@ -115,6 +131,7 @@
</form>
{% endif %}
</div>
</div>
</div>
@ -125,8 +142,14 @@
<!-- stripe key data -->
{% if stripe_key %}
{% get_current_language as LANGUAGE_CODE %}
<script type="text/javascript">
(function () {window.stripeKey = "{{stripe_key}}";})();
(function () {
window.stripeKey = "{{stripe_key}}";
window.current_lan = "{{LANGUAGE_CODE}}";
})();
</script>
{%endif%}

View file

@ -17,7 +17,6 @@
</div>
{% endif %}
{% for field in form %}
{% bootstrap_field field %}
{% endfor %}
{% buttons %}
@ -32,33 +31,8 @@
</button>
{% endbuttons %}
<div class="form-group">
</div>
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5>
<table class="table borderless table-hover">
<br/>
<thead>
<tr>
<th>{% trans "Name"%}</th>
<th>{% trans "Created at"%} </th>
<th>{% trans "Status"%} </th>
<th></th>
</tr>
</thead>
<tbody>
{% for user_key in keys %}
<tr>
<td scope="row">{{user_key.name}}</td>
<td>{{user_key.created_at}}</td>
<td>
<span class="h3 label label-success"><strong>Active</strong></span>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</form>
</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">
@ -69,17 +43,7 @@
<textarea class="form-control" rows="6" id="ssh_key" type="hidden" style="display:none">{{private_key}}</textarea>
</div>
<!-- <div class="form-group pull-right">
<button type="button" id="copy_to_clipboard" data-clipboard-target="#ssh_key" class="btn btn-warning"
data-toggle="tooltip" data-placement="bottom" title="Copied" data-trigger="click">{% trans "Copy to Clipboard"%}</button>
<button type="button" id="download_ssh_key" class="btn btn-warning">{% trans "Download"%}</button>
</div> -->
{% else %}
<!-- <div class="alert alert-warning">
<strong>{% trans "Warning!"%}</strong>{% trans "Your SSH private key was already generated and downloaded, if you lost it, contact us. "%}
</div>
--> {% endif %}
<!-- <a class="btn btn-success" href="{% url 'hosting:virtual_machines' %}">{% trans "Generate my key"%} </a> -->
{% endif %}
<div class="clearfix"></div>
</div>
</div>

View file

@ -0,0 +1,96 @@
{% 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-9 col-md-offset-2">
<div class="col-sm-12">
<h3><i class="fa fa-key" aria-hidden="true"></i>{% trans "Access Key"%} </h3>
{% if messages %}
<div class="alert alert-warning">
{% for message in messages %}
<span>{{ message }}</span>
{% endfor %}
</div>
{% endif %}
<p class="pull-right">
<a class="btn btn-success" href="{% url 'hosting:create_ssh_key' %}" >{% trans "Add Key"%} </a>
</p>
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5>
<table class="table borderless table-hover">
<br/>
<thead>
<tr>
<th>{% trans "Name"%}</th>
<th>{% trans "Created at"%} </th>
<th>{% trans "Status"%} </th>
<th></th>
</tr>
</thead>
<tbody>
{% for user_key in keys %}
<tr>
<td scope="row">{{user_key.name}}</td>
<td>{{user_key.created_at}}</td>
<td>
<span class="h3 label label-success"><strong>Active</strong></span>
</td>
<td>
<button type="button" class="btn btn-default" data-toggle="modal"
data-target="#Modal{{ user_key.id }}"><a
href="#">{% trans "Delete Key"%}</a>
</button>
<div class="modal fade" id="Modal{{user_key.id }}" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-label="Confirm"><span
aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<h4 class="modal-title" id="ModalLabel">{% trans "Do You want to delete this key?"%}</h4>
<form method="post" action="{% url 'hosting:delete_ssh_key' user_key.id %}">
{% csrf_token %}
<div class="modal-footer">
<button type="button" class="btn btn-default"
data-dismiss="modal">
{% trans "Close"%}
</button>
<button type="submit" class="btn btn-primary">{% trans "Delete"%}
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="clearfix"></div>
</div>
</div>
</div>
</div>
</div>
{% if next_url %}
<script type="text/javascript">
window.location.href = '{{next_url}}';
</script>
{% endif %}
{%endblock%}

View file

@ -163,7 +163,7 @@
{% trans "Terminate your Virtual Machine"%}
</div>
<div class="modal-body">
{% trans "Are you sure do you want to cancel your Virtual Machine "%} {{virtual_machine.name}} {% trans "plan?"%}
{% trans "Are you sure do you want to cancel your Virtual Machine "%} {{virtual_machine.name}} ?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Cancel"%}</button>

View file

@ -2,4 +2,6 @@ from django.test import TestCase
# Create your tests here.
test_user_can_add_key()
test_user_can_add_ssh_key()
test_user_can_delete_ssh_ke()

View file

@ -3,9 +3,10 @@ from django.conf.urls import url
from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
NodeJSHostingView, LoginView, SignupView, IndexView, \
OrdersHostingListView, OrdersHostingDetailView, VirtualMachinesPlanListView,\
VirtualMachineView, GenerateVMSSHKeysView, OrdersHostingDeleteView, NotificationsView, \
VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \
MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\
CreateVirtualMachinesView, HostingBillListView, HostingBillDetailView
CreateVirtualMachinesView, HostingBillListView, HostingBillDetailView, \
SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView
urlpatterns = [
url(r'index/?$', IndexView.as_view(), name='index'),
@ -23,10 +24,12 @@ urlpatterns = [
url(r'my-virtual-machines/?$', VirtualMachinesPlanListView.as_view(), name='virtual_machines'),
url(r'my-virtual-machines/(?P<pk>\d+)/?$', VirtualMachineView.as_view(),
name='virtual_machines'),
# url(r'my-virtual-machines/(?P<pk>\d+)/delete/?$', VirtualMachineCancelView.as_view(),
# name='virtual_machines_cancel'),
url(r'vm-key-pair/?$', GenerateVMSSHKeysView.as_view(),
name='key_pair'),
url(r'ssh_keys/?$', SSHKeyListView.as_view(),
name='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(),
name='create_ssh_key'),
url(r'^notifications/$', NotificationsView.as_view(), name='notifications'),
url(r'^notifications/(?P<pk>\d+)/?$', MarkAsReadNotificationView.as_view(),
name='read_notification'),

View file

@ -188,7 +188,7 @@ class SignupView(CreateView):
template_name = 'hosting/signup.html'
form_class = HostingUserSignupForm
model = CustomUser
success_url = reverse_lazy('hosting:key_pair')
success_url = reverse_lazy('hosting:ssh_keys')
def get_success_url(self):
next_url = self.request.session.get(
@ -288,31 +288,58 @@ class MarkAsReadNotificationView(LoginRequiredMixin, UpdateView):
return HttpResponseRedirect(reverse('hosting:notifications'))
class GenerateVMSSHKeysView(LoginRequiredMixin, FormView):
class SSHKeyDeleteView(LoginRequiredMixin, DeleteView):
login_url = reverse_lazy('hosting:login')
success_url = reverse_lazy('hosting:ssh_keys')
model = UserHostingKey
def delete(self, request, *args, **kwargs):
owner = self.request.user
manager = OpenNebulaManager()
pk = self.kwargs.get('pk')
# Get user ssh key
public_key = UserHostingKey.objects.get(pk=pk)
# Add ssh key to user
try:
manager.remove_public_key(user=owner, public_key=public_key)
except ConnectionError:
pass
except WrongNameError:
pass
return super(SSHKeyDeleteView, self).delete(request, *args, **kwargs)
class SSHKeyListView(LoginRequiredMixin, ListView):
template_name = "hosting/user_keys.html"
login_url = reverse_lazy('hosting:login')
context_object_name = "keys"
model = UserHostingKey
paginate_by = 10
ordering = '-id'
def get_queryset(self):
user = self.request.user
self.queryset = UserHostingKey.objects.filter(user=user)
return super(SSHKeyListView, self).get_queryset()
def render_to_response(self, context, **response_kwargs):
if not self.queryset:
return HttpResponseRedirect(reverse('hosting:create_ssh_key'))
return super(SSHKeyListView, self).render_to_response(context, **response_kwargs)
class SSHKeyCreateView(LoginRequiredMixin, FormView):
form_class = UserHostingKeyForm
model = UserHostingKey
template_name = 'hosting/virtual_machine_key.html'
template_name = 'hosting/user_key.html'
login_url = reverse_lazy('hosting:login')
context_object_name = "virtual_machine"
success_url = reverse_lazy('hosting:ssh_keys')
def get_context_data(self, **kwargs):
context = super(
GenerateVMSSHKeysView,
self
).get_context_data(**kwargs)
user_keys = UserHostingKey.objects.filter(
user=self.request.user
)
context.update({
'keys': user_keys
})
return context
def get_form_kwargs(self):
kwargs = super(GenerateVMSSHKeysView, self).get_form_kwargs()
kwargs = super(SSHKeyCreateView, self).get_form_kwargs()
kwargs.update({'request': self.request})
return kwargs
@ -339,22 +366,22 @@ class GenerateVMSSHKeysView(LoginRequiredMixin, FormView):
})
owner = self.request.user
# Create OpenNebulaManager
manager = OpenNebulaManager(email=owner.email,
password=owner.password)
# Get OpenNebula user id
user_pool = manager._get_user_pool()
opennebula_user = user_pool.get_by_name(owner.email)
manager = OpenNebulaManager()
# Get user ssh key
public_key = form.cleaned_data.get('public_key')
# Add ssh key to user
manager.oneadmin_client.call('user.update', opennebula_user.id,
'<CONTEXT><SSH_PUBLIC_KEY>{key}</SSH_PUBLIC_KEY></CONTEXT>'.format(key=public_key))
try:
manager.add_public_key(user=owner, public_key=public_key, merge=True)
except ConnectionError:
pass
except WrongNameError:
pass
return render(self.request, self.template_name, context)
return HttpResponseRedirect(self.success_url)
def post(self, request, *args, **kwargs):
print(self.request.POST.dict())
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
@ -412,7 +439,7 @@ class PaymentVMView(LoginRequiredMixin, FormView):
request,
'In order to create a VM, you create/upload your SSH KEY first.'
)
return HttpResponseRedirect(reverse('hosting:key_pair'))
return HttpResponseRedirect(reverse('hosting:ssh_keys'))
if 'next' in request.session:
del request.session['next']
@ -628,7 +655,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
request,
'In order to create a VM, you need to create/upload your SSH KEY first.'
)
return HttpResponseRedirect(reverse('hosting:key_pair'))
return HttpResponseRedirect(reverse('hosting:ssh_keys'))
try:
manager = OpenNebulaManager()