Merge branch 'task/3620/ssh_keys' of https://github.com/tiwariav/dynamicweb into bug/3638/ssh_key_without_download_option
This commit is contained in:
		
				commit
				
					
						2e9d838b64
					
				
			
		
					 18 changed files with 997 additions and 346 deletions
				
			
		|  | @ -21,7 +21,6 @@ def change_lang(context, lang=None, *args, **kwargs): | |||
| 
 | ||||
|     return "%s" % url | ||||
| 
 | ||||
| 
 | ||||
| @register.filter('get_value_from_dict') | ||||
| def get_value_from_dict(dict_data, key): | ||||
|     """ | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ from hosting.models import HostingOrder, HostingBill | |||
| from utils.stripe_utils import StripeUtils | ||||
| from datetime import datetime | ||||
| from membership.models import CustomUser, StripeCustomer | ||||
| 
 | ||||
| from oca.pool import WrongIdError | ||||
| from opennebula_api.models import OpenNebulaManager | ||||
| from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer | ||||
| 
 | ||||
|  | @ -34,6 +34,7 @@ class SuccessView(TemplateView): | |||
|     def get(self, request, *args, **kwargs): | ||||
|         if 'specs' not in request.session or 'user' not in request.session: | ||||
|             return HttpResponseRedirect(reverse('datacenterlight:index')) | ||||
| 
 | ||||
|         elif 'token' not in request.session: | ||||
|             return HttpResponseRedirect(reverse('datacenterlight:payment')) | ||||
|         elif 'order_confirmation' not in request.session: | ||||
|  | @ -208,6 +209,7 @@ class IndexView(CreateView): | |||
| 
 | ||||
|     @cache_control(no_cache=True, must_revalidate=True, no_store=True) | ||||
|     def get(self, request, *args, **kwargs): | ||||
| 
 | ||||
|         for session_var in ['specs', 'user', 'billing_address_data']: | ||||
|             if session_var in request.session: | ||||
|                 del request.session[session_var] | ||||
|  | @ -401,6 +403,7 @@ class PaymentOrderView(FormView): | |||
| 
 | ||||
|             # Create Billing Address | ||||
|             billing_address = form.save() | ||||
| 
 | ||||
|             request.session['billing_address_data'] = billing_address_data | ||||
|             request.session['billing_address'] = billing_address.id | ||||
|             request.session['token'] = token | ||||
|  | @ -416,6 +419,7 @@ class OrderConfirmationView(DetailView): | |||
|     context_object_name = "order" | ||||
|     model = HostingOrder | ||||
| 
 | ||||
| 
 | ||||
|     @cache_control(no_cache=True, must_revalidate=True, no_store=True) | ||||
|     def get(self, request, *args, **kwargs): | ||||
|         if 'specs' not in request.session or 'user' not in request.session: | ||||
|  |  | |||
|  | @ -195,7 +195,7 @@ CMS_TEMPLATES = ( | |||
| DATABASES = { | ||||
|     'default': { | ||||
|         'ENGINE': 'django.db.backends.postgresql_psycopg2', | ||||
|         'NAME': 'app' | ||||
|         'NAME': 'app', | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ DEBUG = False | |||
| 
 | ||||
| EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' | ||||
| 
 | ||||
| 
 | ||||
| CACHES = { | ||||
|     'default': { | ||||
|         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', | ||||
|  |  | |||
|  | @ -1,3 +1,5 @@ | |||
| import datetime | ||||
| 
 | ||||
| from django import forms | ||||
| from membership.models import CustomUser | ||||
| from django.contrib.auth import authenticate | ||||
|  | @ -7,6 +9,10 @@ from django.utils.translation import ugettext_lazy as _ | |||
| from .models import UserHostingKey | ||||
| 
 | ||||
| 
 | ||||
| def generate_ssh_key_name(): | ||||
|     return 'dcl-generated-key-' + datetime.datetime.now().strftime('%m%d%y%H%M') | ||||
| 
 | ||||
| 
 | ||||
| class HostingUserLoginForm(forms.Form): | ||||
| 
 | ||||
|     email = forms.CharField(widget=forms.EmailInput()) | ||||
|  | @ -20,9 +26,11 @@ class HostingUserLoginForm(forms.Form): | |||
|         password = self.cleaned_data.get('password') | ||||
|         is_auth = authenticate(email=email, password=password) | ||||
|         if not is_auth: | ||||
|             raise forms.ValidationError("Your username and/or password were incorrect.") | ||||
|             raise forms.ValidationError( | ||||
|                 "Your username and/or password were incorrect.") | ||||
|         elif is_auth.validated == 0: | ||||
|             raise forms.ValidationError(_("Your account is not activated yet.")) | ||||
|             raise forms.ValidationError( | ||||
|                 _("Your account is not activated yet.")) | ||||
|         return self.cleaned_data | ||||
| 
 | ||||
|     def clean_email(self): | ||||
|  | @ -58,15 +66,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=False, 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') | ||||
|  | @ -76,7 +88,8 @@ class UserHostingKeyForm(forms.ModelForm): | |||
| 
 | ||||
|     def clean(self): | ||||
|         cleaned_data = self.cleaned_data | ||||
| 
 | ||||
|         if not self.cleaned_data.get('name', ''): | ||||
|             self.cleaned_data['name'] = generate_ssh_key_name() | ||||
|         if not cleaned_data.get('public_key'): | ||||
|             private_key, public_key = UserHostingKey.generate_keys() | ||||
|             cleaned_data.update({ | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ msgid "" | |||
| msgstr "" | ||||
| "Project-Id-Version: PACKAGE VERSION\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2017-07-17 00:53+0530\n" | ||||
| "POT-Creation-Date: 2017-08-03 00:19+0530\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
|  | @ -18,359 +18,398 @@ msgstr "" | |||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
| 
 | ||||
| #: forms.py:25 | ||||
| #: .\hosting\forms.py:33 | ||||
| msgid "Your account is not activated yet." | ||||
| msgstr "Dein Account wurde noch nicht aktiviert." | ||||
| 
 | ||||
| #: forms.py:62 | ||||
| #: .\hosting\forms.py:70 | ||||
| msgid "Paste here your public key" | ||||
| msgstr "Fügen Sie Ihren public key ein" | ||||
| msgstr "Füge deinen Public Key ein" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:71 | ||||
| #: .\hosting\forms.py:76 | ||||
| msgid "Give a name to your key" | ||||
| msgstr "Gebe deinem SSH-Key einen Name" | ||||
| 
 | ||||
| #: .\hosting\forms.py:81 | ||||
| msgid "Key name" | ||||
| msgstr "Key-Name" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\base_short.html:74 | ||||
| msgid "My Virtual Machines" | ||||
| msgstr "Meine virtuellen Maschinen" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:76 templates/hosting/orders.html.py:12 | ||||
| #: .\hosting\templates\hosting\base_short.html:79 | ||||
| #: .\hosting\templates\hosting\orders.html:12 | ||||
| msgid "My Orders" | ||||
| msgstr "Meine Bestellungen" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:85 | ||||
| msgid "Keys" | ||||
| msgstr "Schlüssel" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:90 | ||||
| #: .\hosting\templates\hosting\base_short.html:93 | ||||
| msgid "Notifications " | ||||
| msgstr "Benachrichtigungen" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:93 | ||||
| #: .\hosting\templates\hosting\base_short.html:96 | ||||
| msgid "Logout" | ||||
| msgstr "Abmelden" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:98 | ||||
| msgid "How it works" | ||||
| msgstr "So funktioniert es" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:101 | ||||
| msgid "Your infrastructure" | ||||
| msgstr "deine Infrastruktur" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:104 | ||||
| msgid "Our inftrastructure" | ||||
| msgstr "Unsere Infrastruktur" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:107 | ||||
| msgid "Pricing" | ||||
| msgstr "Preise" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:110 | ||||
| msgid "Contact" | ||||
| msgstr "Kontakt" | ||||
| 
 | ||||
| #: templates/hosting/base_short.html:113 | ||||
| #: templates/hosting/confirm_reset_password.html:38 | ||||
| #: templates/hosting/login.html:17 templates/hosting/login.html.py:26 | ||||
| #: templates/hosting/reset_password.html:32 templates/hosting/signup.html:30 | ||||
| msgid "Login" | ||||
| msgstr "Anmelden" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:11 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:11 | ||||
| msgid "Invoice" | ||||
| msgstr "Rechnung" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:11 templates/hosting/order_detail.html:23 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:11 | ||||
| #: .\hosting\templates\hosting\order_detail.html:23 | ||||
| msgid "Order #" | ||||
| msgstr "Bestellung #" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:25 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:25 | ||||
| msgid "ungleich GmbH" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:26 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:26 | ||||
| msgid "buchhaltung@ungleich.ch" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:27 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:27 | ||||
| msgid "Hauptstrasse 14" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:28 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:28 | ||||
| msgid "CH-8775 Luchsingen" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:29 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:29 | ||||
| msgid "Mwst-Nummer: CHE-109.549.333 MWST" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:60 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:60 | ||||
| msgid "Total:" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:68 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:68 | ||||
| #, python-format | ||||
| msgid "Alles Preise in CHF mit 8%% Mehrwertsteuer." | ||||
| msgstr "All prices in CHF including 8%% VAT" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:69 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:69 | ||||
| msgid "Betrag zahlbar innerhalb von 30 Tagen ab Rechnungseingang." | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:70 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:70 | ||||
| msgid "Kontoverbindung:" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:73 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:73 | ||||
| msgid "IBAN:" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:76 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:76 | ||||
| msgid "BIC:" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:81 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:81 | ||||
| msgid "CH02 0900 0000 6071 8848 8" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bill_detail.html:84 | ||||
| #: .\hosting\templates\hosting\bill_detail.html:84 | ||||
| msgid "POFICHBEXXX" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bills.html:12 | ||||
| #: .\hosting\templates\hosting\bills.html:12 | ||||
| msgid "Customers" | ||||
| msgstr "Kunden" | ||||
| 
 | ||||
| #: templates/hosting/bills.html:16 templates/hosting/user_keys.html.py:25 | ||||
| #: .\hosting\templates\hosting\bills.html:16 | ||||
| #: .\hosting\templates\hosting\user_keys.html:25 | ||||
| msgid "Name" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bills.html:17 | ||||
| #: .\hosting\templates\hosting\bills.html:17 | ||||
| msgid "Email" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/bills.html:28 | ||||
| #: .\hosting\templates\hosting\bills.html:28 | ||||
| msgid "View Bill" | ||||
| msgstr "Rechnung anzeigen" | ||||
| 
 | ||||
| #: templates/hosting/bills.html:41 templates/hosting/orders.html.py:82 | ||||
| #: templates/hosting/virtual_machines.html:70 | ||||
| #: .\hosting\templates\hosting\bills.html:41 | ||||
| #: .\hosting\templates\hosting\orders.html:82 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:70 | ||||
| msgid "previous" | ||||
| msgstr "vorherige" | ||||
| 
 | ||||
| #: templates/hosting/bills.html:47 templates/hosting/orders.html.py:88 | ||||
| #: templates/hosting/virtual_machines.html:76 | ||||
| #: .\hosting\templates\hosting\bills.html:47 | ||||
| #: .\hosting\templates\hosting\orders.html:88 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:76 | ||||
| msgid "next" | ||||
| msgstr "nächste" | ||||
| 
 | ||||
| #: templates/hosting/confirm_reset_password.html:10 | ||||
| #: templates/hosting/login.html:12 templates/hosting/reset_password.html:10 | ||||
| #: templates/hosting/signup.html:9 templates/hosting/signup_validate.html:9 | ||||
| #: .\hosting\templates\hosting\choice_ssh_keys.html:8 | ||||
| msgid "SSH Key" | ||||
| msgstr "SSH Key" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\choice_ssh_keys.html:9 | ||||
| msgid "Choose a key option in order to access your VM" | ||||
| msgstr "Wähle eine Option um Zugriff auf deine VM zu erhalten" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\choice_ssh_keys.html:20 | ||||
| msgid "Generating a new key pair" | ||||
| msgstr "Neuen SSH-Key erstellen" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\choice_ssh_keys.html:21 | ||||
| msgid "I want to generate a new key pair" | ||||
| msgstr "Ich möchte einen neuen SSH-Key erstellen" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\choice_ssh_keys.html:25 | ||||
| #: .\hosting\templates\hosting\user_key.html:36 | ||||
| msgid "Generate" | ||||
| msgstr "Generieren" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\choice_ssh_keys.html:31 | ||||
| msgid "Using existing key" | ||||
| msgstr "Nutzung eines existierenden SSH-Keys" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\choice_ssh_keys.html:32 | ||||
| msgid "I want to use my existing public key" | ||||
| msgstr "Ich möchte einen existierenden SSH-Key nutzen" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\choice_ssh_keys.html:35 | ||||
| #, fuzzy | ||||
| #| msgid "Upload Key" | ||||
| msgid "Upload" | ||||
| msgstr "Schlüssel hochladen" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\confirm_reset_password.html:10 | ||||
| #: .\hosting\templates\hosting\login.html:17 | ||||
| #: .\hosting\templates\hosting\reset_password.html:15 | ||||
| #: .\hosting\templates\hosting\signup.html:13 | ||||
| #: .\hosting\templates\hosting\signup_validate.html:9 | ||||
| msgid "Your VM hosted in Switzerland" | ||||
| msgstr "deine VM in der Schweiz" | ||||
| 
 | ||||
| #: templates/hosting/confirm_reset_password.html:14 | ||||
| #: .\hosting\templates\hosting\confirm_reset_password.html:14 | ||||
| msgid "Set your new password" | ||||
| msgstr "Setze dein neues Passwort" | ||||
| 
 | ||||
| #: templates/hosting/confirm_reset_password.html:29 | ||||
| #: templates/hosting/reset_password.html:23 | ||||
| #: .\hosting\templates\hosting\confirm_reset_password.html:29 | ||||
| #: .\hosting\templates\hosting\reset_password.html:28 | ||||
| msgid "Reset" | ||||
| msgstr "Zurücksetzen" | ||||
| 
 | ||||
| #: templates/hosting/confirm_reset_password.html:35 | ||||
| #: templates/hosting/reset_password.html:29 templates/hosting/signup.html:27 | ||||
| #: .\hosting\templates\hosting\confirm_reset_password.html:35 | ||||
| #: .\hosting\templates\hosting\reset_password.html:34 | ||||
| #: .\hosting\templates\hosting\signup.html:31 | ||||
| msgid "Already have an account ?" | ||||
| msgstr "Hast Du bereits ein Benutzerkonto?" | ||||
| 
 | ||||
| #: templates/hosting/create_virtual_machine.html:20 | ||||
| #: .\hosting\templates\hosting\confirm_reset_password.html:38 | ||||
| #: .\hosting\templates\hosting\login.html:22 | ||||
| #: .\hosting\templates\hosting\login.html:31 | ||||
| #: .\hosting\templates\hosting\reset_password.html:37 | ||||
| #: .\hosting\templates\hosting\signup.html:34 | ||||
| msgid "Login" | ||||
| msgstr "Anmelden" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\create_virtual_machine.html:20 | ||||
| msgid "New Virtual Machine" | ||||
| msgstr "Neue virtuelle Maschine" | ||||
| 
 | ||||
| #: templates/hosting/create_virtual_machine.html:28 | ||||
| #: .\hosting\templates\hosting\create_virtual_machine.html:28 | ||||
| msgid "Step 1. Select VM Template:" | ||||
| msgstr "Wähle eine Vorlage" | ||||
| 
 | ||||
| #: templates/hosting/create_virtual_machine.html:42 | ||||
| #: .\hosting\templates\hosting\create_virtual_machine.html:42 | ||||
| msgid "Step2. Select VM Configuration" | ||||
| msgstr "Wähle eine Konfiguration" | ||||
| 
 | ||||
| #: templates/hosting/create_virtual_machine.html:59 | ||||
| #: .\hosting\templates\hosting\create_virtual_machine.html:59 | ||||
| msgid "Price " | ||||
| msgstr "Preis" | ||||
| 
 | ||||
| #: templates/hosting/create_virtual_machine.html:59 | ||||
| #: .\hosting\templates\hosting\create_virtual_machine.html:59 | ||||
| msgid "CHF/Month" | ||||
| msgstr "CHF/Monat" | ||||
| 
 | ||||
| #: templates/hosting/create_virtual_machine.html:61 | ||||
| #: .\hosting\templates\hosting\create_virtual_machine.html:61 | ||||
| msgid "Start VM" | ||||
| msgstr "VM jetzt starten" | ||||
| 
 | ||||
| #: templates/hosting/emails/password_reset_email.html:2 | ||||
| #: templates/hosting/emails/password_reset_email.txt:2 | ||||
| #: .\hosting\templates\hosting\emails\password_reset_email.html:2 | ||||
| #: .\hosting\templates\hosting\emails\password_reset_email.txt:2 | ||||
| #, python-format | ||||
| msgid "" | ||||
| "You're receiving this email because you requested a password reset for your " | ||||
| "user account at %(site_name)s." | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/emails/password_reset_email.html:4 | ||||
| #: templates/hosting/emails/password_reset_email.txt:4 | ||||
| #: .\hosting\templates\hosting\emails\password_reset_email.html:4 | ||||
| #: .\hosting\templates\hosting\emails\password_reset_email.txt:4 | ||||
| msgid "Please go to the following page and choose a new password:" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/emails/password_reset_email.html:9 | ||||
| #: templates/hosting/emails/password_reset_email.txt:9 | ||||
| #: .\hosting\templates\hosting\emails\password_reset_email.html:9 | ||||
| #: .\hosting\templates\hosting\emails\password_reset_email.txt:9 | ||||
| msgid "Thanks for using our site!" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/emails/password_reset_email.html:11 | ||||
| #: templates/hosting/emails/password_reset_email.txt:11 | ||||
| #: .\hosting\templates\hosting\emails\password_reset_email.html:11 | ||||
| #: .\hosting\templates\hosting\emails\password_reset_email.txt:11 | ||||
| #, python-format | ||||
| msgid "The %(site_name)s team" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/login.html:34 | ||||
| #: .\hosting\templates\hosting\login.html:39 | ||||
| msgid "Don't have an account yet ? " | ||||
| msgstr "Besitzt du kein Benutzerkonto?" | ||||
| 
 | ||||
| #: templates/hosting/login.html:37 templates/hosting/signup.html.py:13 | ||||
| #: templates/hosting/signup.html:21 views.py:219 | ||||
| #: .\hosting\templates\hosting\login.html:42 | ||||
| #: .\hosting\templates\hosting\signup.html:17 | ||||
| #: .\hosting\templates\hosting\signup.html:25 .\hosting\views.py:227 | ||||
| msgid "Sign up" | ||||
| msgstr "Registrieren" | ||||
| 
 | ||||
| #: templates/hosting/login.html:39 | ||||
| #: .\hosting\templates\hosting\login.html:44 | ||||
| msgid "Forgot your password ? " | ||||
| msgstr "Passwort vergessen?" | ||||
| 
 | ||||
| #: templates/hosting/notifications.html:9 | ||||
| #: .\hosting\templates\hosting\notifications.html:9 | ||||
| msgid "Notifications" | ||||
| msgstr "Benachrichtigungen" | ||||
| 
 | ||||
| #: templates/hosting/notifications.html:16 | ||||
| #: .\hosting\templates\hosting\notifications.html:16 | ||||
| msgid "Unread" | ||||
| msgstr "Ungelesen" | ||||
| 
 | ||||
| #: templates/hosting/notifications.html:26 | ||||
| #: .\hosting\templates\hosting\notifications.html:26 | ||||
| msgid "All" | ||||
| msgstr "Alle" | ||||
| 
 | ||||
| #: templates/hosting/notifications.html:38 | ||||
| #: .\hosting\templates\hosting\notifications.html:38 | ||||
| msgid "Unread notifications" | ||||
| msgstr "Ungelesene Benachrichtigungen" | ||||
| 
 | ||||
| #: templates/hosting/notifications.html:48 | ||||
| #: .\hosting\templates\hosting\notifications.html:48 | ||||
| msgid "Mark as read" | ||||
| msgstr "Als gelesen markieren" | ||||
| 
 | ||||
| #: templates/hosting/notifications.html:59 | ||||
| #: .\hosting\templates\hosting\notifications.html:59 | ||||
| msgid "All notifications" | ||||
| msgstr "Alle Benachrichtigungen" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:23 | ||||
| #: .\hosting\templates\hosting\order_detail.html:23 | ||||
| msgid "Confirm Order" | ||||
| msgstr "Bestellung Bestätigen" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:29 | ||||
| msgid "Billed To:" | ||||
| msgstr "Rechnungsadresse" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:37 templates/hosting/orders.html:17 | ||||
| #: .\hosting\templates\hosting\order_detail.html:29 | ||||
| #: .\hosting\templates\hosting\orders.html:17 | ||||
| msgid "Date" | ||||
| msgstr "Datum" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:39 | ||||
| #: .\hosting\templates\hosting\order_detail.html:31 | ||||
| msgid "Status:" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:51 | ||||
| #: .\hosting\templates\hosting\order_detail.html:41 | ||||
| msgid "Billed To:" | ||||
| msgstr "Rechnungsadresse" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\order_detail.html:52 | ||||
| msgid "Payment Method:" | ||||
| msgstr "Bezahlmethode" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:62 | ||||
| #: .\hosting\templates\hosting\order_detail.html:63 | ||||
| msgid "Order summary" | ||||
| msgstr "Bestellungsübersicht" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:65 templates/hosting/payment.html:13 | ||||
| #: templates/hosting/virtual_machine_detail.html:76 | ||||
| #: .\hosting\templates\hosting\order_detail.html:66 | ||||
| #: .\hosting\templates\hosting\payment.html:13 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:76 | ||||
| msgid "Cores" | ||||
| msgstr "Prozessorkerne" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:67 templates/hosting/payment.html:16 | ||||
| #: templates/hosting/virtual_machine_detail.html:82 | ||||
| #: .\hosting\templates\hosting\order_detail.html:68 | ||||
| #: .\hosting\templates\hosting\payment.html:16 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:82 | ||||
| msgid "Memory" | ||||
| msgstr "Arbeitsspeicher" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:69 templates/hosting/payment.html:19 | ||||
| #: .\hosting\templates\hosting\order_detail.html:70 | ||||
| #: .\hosting\templates\hosting\payment.html:19 | ||||
| msgid "Disk space" | ||||
| msgstr "Festplattenkapazität" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:71 templates/hosting/payment.html:41 | ||||
| #: .\hosting\templates\hosting\order_detail.html:72 | ||||
| #: .\hosting\templates\hosting\payment.html:41 | ||||
| msgid "Total" | ||||
| msgstr "Gesamt" | ||||
| 
 | ||||
| #: templates/hosting/order_detail.html:77 | ||||
| #: .\hosting\templates\hosting\order_detail.html:78 | ||||
| msgid "Finish Configuration" | ||||
| msgstr "Konfiguration beenden" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:18 | ||||
| #: .\hosting\templates\hosting\orders.html:18 | ||||
| msgid "Amount" | ||||
| msgstr "Betrag" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:19 templates/hosting/user_keys.html.py:27 | ||||
| #: templates/hosting/virtual_machine_detail.html:30 | ||||
| #: templates/hosting/virtual_machines.html:31 | ||||
| #: .\hosting\templates\hosting\orders.html:19 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:30 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:31 | ||||
| msgid "Status" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:30 | ||||
| #: .\hosting\templates\hosting\orders.html:30 | ||||
| msgid "Approved" | ||||
| msgstr "Akzeptiert" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:32 | ||||
| #: .\hosting\templates\hosting\orders.html:32 | ||||
| msgid "Declined" | ||||
| msgstr "Abgelehnt" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:37 templates/hosting/virtual_machines.html:58 | ||||
| #: .\hosting\templates\hosting\orders.html:37 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:58 | ||||
| msgid "View Detail" | ||||
| msgstr "Details anzeigen" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:40 | ||||
| #: .\hosting\templates\hosting\orders.html:40 | ||||
| msgid "Cancel Order" | ||||
| msgstr "Bestellung stornieren" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:55 | ||||
| #: .\hosting\templates\hosting\orders.html:55 | ||||
| msgid "Do You want to delete your order?" | ||||
| msgstr "Willst du deine Bestellung löschen?" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:63 templates/hosting/user_keys.html.py:63 | ||||
| #: .\hosting\templates\hosting\orders.html:63 | ||||
| #: .\hosting\templates\hosting\user_keys.html:59 | ||||
| #: .\hosting\templates\hosting\user_keys.html:89 | ||||
| msgid "Close" | ||||
| msgstr "Schliessen" | ||||
| 
 | ||||
| #: templates/hosting/orders.html:65 templates/hosting/user_keys.html.py:65 | ||||
| #: .\hosting\templates\hosting\orders.html:65 | ||||
| #: .\hosting\templates\hosting\user_keys.html:40 | ||||
| #: .\hosting\templates\hosting\user_keys.html:61 | ||||
| msgid "Delete" | ||||
| msgstr "Löschen" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:10 | ||||
| #: .\hosting\templates\hosting\payment.html:10 | ||||
| msgid "Your Order" | ||||
| msgstr "Deine Bestellung" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:22 | ||||
| #: templates/hosting/virtual_machine_detail.html:98 | ||||
| #: .\hosting\templates\hosting\payment.html:22 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:98 | ||||
| msgid "Configuration" | ||||
| msgstr "Konfiguration" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:41 | ||||
| #: .\hosting\templates\hosting\payment.html:41 | ||||
| msgid "including VAT" | ||||
| msgstr "inkl. Mehrwertsteuer" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:55 | ||||
| #: .\hosting\templates\hosting\payment.html:55 | ||||
| msgid "Billing Address" | ||||
| msgstr "Rechnungsadresse" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:66 | ||||
| #: .\hosting\templates\hosting\payment.html:66 | ||||
| msgid "Credit Card" | ||||
| msgstr "Kreditkarte" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:71 | ||||
| #: .\hosting\templates\hosting\payment.html:71 | ||||
| msgid "" | ||||
| "\n" | ||||
| "                                Please fill in your credit card information " | ||||
|  | @ -385,7 +424,7 @@ msgstr "" | |||
| "\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und " | ||||
| "speichern keine Informationen in unserer Datenbank." | ||||
| 
 | ||||
| #: templates/hosting/payment.html:90 | ||||
| #: .\hosting\templates\hosting\payment.html:90 | ||||
| msgid "" | ||||
| "\n" | ||||
| "                                        You are not making any payment yet. " | ||||
|  | @ -399,27 +438,28 @@ msgstr "" | |||
| "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite " | ||||
| "weitergeleitet." | ||||
| 
 | ||||
| #: templates/hosting/payment.html:101 templates/hosting/payment.html.py:143 | ||||
| #: .\hosting\templates\hosting\payment.html:100 | ||||
| #: .\hosting\templates\hosting\payment.html:142 | ||||
| msgid "Submit" | ||||
| msgstr "Absenden" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:113 | ||||
| #: .\hosting\templates\hosting\payment.html:112 | ||||
| msgid "Card Number" | ||||
| msgstr "Kreditkartennummer" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:117 | ||||
| #: .\hosting\templates\hosting\payment.html:116 | ||||
| msgid "Expiry Date" | ||||
| msgstr "Ablaufdatum" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:122 | ||||
| #: .\hosting\templates\hosting\payment.html:121 | ||||
| msgid "CVC" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:126 | ||||
| #: .\hosting\templates\hosting\payment.html:125 | ||||
| msgid "Card Type" | ||||
| msgstr "Kartentyp" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:135 | ||||
| #: .\hosting\templates\hosting\payment.html:134 | ||||
| msgid "" | ||||
| "\n" | ||||
| "                                            You are not making any payment " | ||||
|  | @ -433,125 +473,151 @@ msgstr "" | |||
| "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite " | ||||
| "weitergeleitet." | ||||
| 
 | ||||
| #: templates/hosting/payment.html:178 | ||||
| #: .\hosting\templates\hosting\payment.html:177 | ||||
| msgid "Processing" | ||||
| msgstr "Weiter" | ||||
| 
 | ||||
| #: templates/hosting/payment.html:179 | ||||
| #: .\hosting\templates\hosting\payment.html:178 | ||||
| msgid "Enter your credit card number" | ||||
| msgstr "Deine Kreditkartennummer" | ||||
| 
 | ||||
| #: templates/hosting/reset_password.html:15 | ||||
| #: .\hosting\templates\hosting\reset_password.html:20 | ||||
| msgid "Reset your password" | ||||
| msgstr "Passwort zurücksetzen" | ||||
| 
 | ||||
| #: templates/hosting/user_key.html:11 templates/hosting/user_keys.html.py:9 | ||||
| msgid "Access Key" | ||||
| msgstr "Zugriffsschlüssel" | ||||
| #: .\hosting\templates\hosting\user_key.html:11 | ||||
| msgid "Add your public SSH key" | ||||
| msgstr "Füge deinen öffentlichen SSH-Key hinzu" | ||||
| 
 | ||||
| #: templates/hosting/user_key.html:24 | ||||
| msgid "Upload your own key. " | ||||
| msgstr "Lade deinen Key hoch" | ||||
| #: .\hosting\templates\hosting\user_key.html:25 | ||||
| msgid "Use your created key to access to the VM" | ||||
| msgstr "Benutze deinen erstellten SSH-Key um auf deine VM zugreifen zu können" | ||||
| 
 | ||||
| #: templates/hosting/user_key.html:28 | ||||
| msgid "Or generate a new key pair." | ||||
| msgstr "Oder erstelle dein neues Keypaar" | ||||
| #: .\hosting\templates\hosting\user_key.html:28 | ||||
| #: .\hosting\templates\hosting\user_keys.html:17 | ||||
| msgid "Add SSH Key" | ||||
| msgstr "Hinzufügen" | ||||
| 
 | ||||
| #: templates/hosting/user_key.html:30 | ||||
| msgid "Generate Key Pair" | ||||
| msgstr "Schlüsselpaar generieren" | ||||
| #: .\hosting\templates\hosting\user_key.html:33 | ||||
| msgid "Or you can generate a new key pair" | ||||
| msgstr "Erstelle dein neues Keypaar" | ||||
| 
 | ||||
| #: templates/hosting/user_key.html:40 | ||||
| #: .\hosting\templates\hosting\user_key.html:45 | ||||
| msgid "Warning!" | ||||
| msgstr "Achtung!" | ||||
| 
 | ||||
| #: templates/hosting/user_key.html:40 | ||||
| msgid "You can download your SSH  private key once. Don't lost your key" | ||||
| #: .\hosting\templates\hosting\user_key.html:45 | ||||
| #, fuzzy | ||||
| #| msgid "You can download your SSH  private key once. Don't lost your key" | ||||
| msgid "You can download your SSH  private key once. Don't loose your key" | ||||
| msgstr "" | ||||
| "Du kannst deinen privaten SSH Schlüssel nur einmal herunterladen. Beware ihn " | ||||
| "sicher auf." | ||||
| 
 | ||||
| #: templates/hosting/user_keys.html:18 | ||||
| msgid "Add Key" | ||||
| msgstr "Schlüssel hinzufügen" | ||||
| #: .\hosting\templates\hosting\user_keys.html:6 | ||||
| msgid "Your SSH Keys" | ||||
| msgstr "Deine SSH Keys" | ||||
| 
 | ||||
| #: templates/hosting/user_keys.html:26 | ||||
| msgid "Created at" | ||||
| msgstr "Erstellt am" | ||||
| #: .\hosting\templates\hosting\user_keys.html:15 | ||||
| msgid "" | ||||
| "To generate a new key pair or to upload your existing key, click 'Add Key'" | ||||
| msgstr "" | ||||
| "Um einen neuen SSH-Key zu erstellen oder um einen vorhandenen SSH-Key " | ||||
| "hinzuzufügen, klicke auf 'Hinzufügen'" | ||||
| 
 | ||||
| #: templates/hosting/user_keys.html:43 | ||||
| #: .\hosting\templates\hosting\user_keys.html:26 | ||||
| msgid "Delete Key" | ||||
| msgstr "Löschen" | ||||
| 
 | ||||
| #: templates/hosting/user_keys.html:56 | ||||
| #: .\hosting\templates\hosting\user_keys.html:27 | ||||
| msgid "Public Key" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\user_keys.html:28 | ||||
| msgid "Private Key" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\user_keys.html:53 | ||||
| msgid "Do You want to delete this key?" | ||||
| msgstr "Möchtest Du den Schlüssel löschen?" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:19 | ||||
| #: .\hosting\templates\hosting\user_keys.html:72 | ||||
| msgid "Show" | ||||
| msgstr "Anzeigen" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\user_keys.html:82 | ||||
| msgid "Public ssh key" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\user_keys.html:103 | ||||
| msgid "Download" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:19 | ||||
| msgid "Settings" | ||||
| msgstr "Einstellungen" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:25 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:25 | ||||
| msgid "Billing" | ||||
| msgstr "Abrechnungen" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:60 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:60 | ||||
| msgid "Ip not assigned yet" | ||||
| msgstr "Ip nicht zugewiesen" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:89 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:89 | ||||
| msgid "Disk" | ||||
| msgstr "Festplatte" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:108 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:108 | ||||
| msgid "Current pricing" | ||||
| msgstr "Aktueller Preis" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:117 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:117 | ||||
| msgid "Current status" | ||||
| msgstr "Aktueller Status" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:142 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:142 | ||||
| msgid "Terminate Virtual Machine" | ||||
| msgstr "Virtuelle Maschine beenden" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:163 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:163 | ||||
| msgid "Terminate your Virtual Machine" | ||||
| msgstr "Ihre virtuelle Maschine beenden" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:166 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:166 | ||||
| msgid "Are you sure do you want to cancel your Virtual Machine " | ||||
| msgstr "Sind Sie sicher, dass Sie ihre virtuelle Maschine beenden wollen " | ||||
| 
 | ||||
| #: templates/hosting/virtual_machine_detail.html:169 | ||||
| #: .\hosting\templates\hosting\virtual_machine_detail.html:169 | ||||
| msgid "Cancel" | ||||
| msgstr "Beenden" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machines.html:9 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:9 | ||||
| msgid "Virtual Machines" | ||||
| msgstr "Virtuelle Maschinen" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machines.html:22 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:22 | ||||
| msgid "Create VM" | ||||
| msgstr "Neue VM" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machines.html:28 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:28 | ||||
| msgid "ID" | ||||
| msgstr "" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machines.html:29 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:29 | ||||
| msgid "Ipv4" | ||||
| msgstr "IPv4" | ||||
| 
 | ||||
| #: templates/hosting/virtual_machines.html:30 | ||||
| #: .\hosting\templates\hosting\virtual_machines.html:30 | ||||
| msgid "Ipv6" | ||||
| msgstr "IPv6" | ||||
| 
 | ||||
| #: views.py:207 views.py:229 | ||||
| #: .\hosting\views.py:214 .\hosting\views.py:238 | ||||
| msgid "login" | ||||
| msgstr "einloggen" | ||||
| 
 | ||||
| #: views.py:212 | ||||
| #: .\hosting\views.py:220 | ||||
| msgid "" | ||||
| "Thank you for signing up. We have sent an email to you. Please follow the " | ||||
| "instructions in it to activate your account. Once activated, you can login " | ||||
|  | @ -561,32 +627,138 @@ msgstr "" | |||
| "den Anweisungen um deinen Account zu aktivieren. Danach kannst du dich über " | ||||
| "diesen" | ||||
| 
 | ||||
| #: views.py:214 views.py:240 | ||||
| #: .\hosting\views.py:222 .\hosting\views.py:251 | ||||
| msgid "Go back to" | ||||
| msgstr "Zurück" | ||||
| 
 | ||||
| #: views.py:230 | ||||
| #: .\hosting\views.py:239 | ||||
| msgid "Account activation" | ||||
| msgstr "Accountaktivierung" | ||||
| 
 | ||||
| #: views.py:233 | ||||
| #: .\hosting\views.py:243 | ||||
| msgid "Your account has been activated." | ||||
| msgstr "Dein Account wurde aktiviert." | ||||
| 
 | ||||
| #: views.py:234 | ||||
| #: .\hosting\views.py:244 | ||||
| msgid "You can now" | ||||
| msgstr "Du kannst dich nun" | ||||
| 
 | ||||
| #: views.py:239 | ||||
| #: .\hosting\views.py:250 | ||||
| msgid "Sorry. Your request is invalid." | ||||
| msgstr "Entschuldigung, deine Anfrage ist ungültig." | ||||
| 
 | ||||
| #: views.py:757 | ||||
| #: .\hosting\views.py:796 | ||||
| msgid "" | ||||
| "We could not find the requested VM. Please                            " | ||||
| "contact Data Center Light Support." | ||||
| msgstr "" | ||||
| 
 | ||||
| #~ msgid "Add SSH key" | ||||
| #~ msgstr "Hinzufügen" | ||||
| 
 | ||||
| #~ msgid "Keys" | ||||
| #~ msgstr "Schlüssel" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Contact" | ||||
| #~ msgid "Content" | ||||
| #~ msgstr "Kontakt" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Contact" | ||||
| #~ msgid "DG.Contact" | ||||
| #~ msgstr "Kontakt" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Home" | ||||
| #~ msgid "DG.Home" | ||||
| #~ msgstr "Home" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Amount" | ||||
| #~ msgid "Country" | ||||
| #~ msgstr "Betrag" | ||||
| 
 | ||||
| #~ msgid "Log in" | ||||
| #~ msgstr "Anmelden" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Configuration" | ||||
| #~ msgid "Donation #" | ||||
| #~ msgstr "Konfiguration" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Billing Address" | ||||
| #~ msgid "Billing Address:" | ||||
| #~ msgstr "Rechnungsadresse" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Date" | ||||
| #~ msgid "Date:" | ||||
| #~ msgstr "Datum" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Configuration" | ||||
| #~ msgid "Donation" | ||||
| #~ msgstr "Konfiguration" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "View Detail" | ||||
| #~ msgid "View Donations" | ||||
| #~ msgstr "Details anzeigen" | ||||
| 
 | ||||
| #~ msgid "You haven been logged out" | ||||
| #~ msgstr "Sie wurden abgmeldet" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Log in" | ||||
| #~ msgid "Log in " | ||||
| #~ msgstr "Anmelden" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "View Detail" | ||||
| #~ msgid "DG.Detail" | ||||
| #~ msgstr "Details anzeigen" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Cancel" | ||||
| #~ msgid "France" | ||||
| #~ msgstr "Beenden" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Enter your credit card number" | ||||
| #~ msgid "Enter your name or company name" | ||||
| #~ msgstr "Deine Kreditkartennummer" | ||||
| 
 | ||||
| #, fuzzy | ||||
| #~| msgid "Card Number" | ||||
| #~ msgid "Cardholder Name" | ||||
| #~ msgstr "Kreditkartennummer" | ||||
| 
 | ||||
| #~ msgid "How it works" | ||||
| #~ msgstr "So funktioniert es" | ||||
| 
 | ||||
| #~ msgid "Your infrastructure" | ||||
| #~ msgstr "deine Infrastruktur" | ||||
| 
 | ||||
| #~ msgid "Our inftrastructure" | ||||
| #~ msgstr "Unsere Infrastruktur" | ||||
| 
 | ||||
| #~ msgid "Pricing" | ||||
| #~ msgstr "Preise" | ||||
| 
 | ||||
| #~ msgid "Access Key" | ||||
| #~ msgstr "Zugriffsschlüssel" | ||||
| 
 | ||||
| #~ msgid "Upload your own key. " | ||||
| #~ msgstr "Lade deinen Key hoch" | ||||
| 
 | ||||
| #~ msgid "Generate Key Pair" | ||||
| #~ msgstr "Schlüsselpaar generieren" | ||||
| 
 | ||||
| #~ msgid "Created at" | ||||
| #~ msgstr "Erstellt am" | ||||
| 
 | ||||
| #~ msgid "Billing Amount" | ||||
| #~ msgstr "Rechnungsbetrag" | ||||
| 
 | ||||
|  | @ -610,25 +782,6 @@ msgstr "" | |||
| #~ msgid "EXPIRATION DATE" | ||||
| #~ msgstr "Ablaufdatum" | ||||
| 
 | ||||
| #~ msgid "Home" | ||||
| #~ msgstr "Home" | ||||
| 
 | ||||
| #~ msgid "Log in" | ||||
| #~ msgstr "Anmelden" | ||||
| 
 | ||||
| #~ msgid "You haven been logged out" | ||||
| #~ msgstr "Sie wurden abgmeldet" | ||||
| 
 | ||||
| #~ msgid "Upload Key" | ||||
| #~ msgstr "Schlüssel hochladen" | ||||
| 
 | ||||
| #~ msgid "" | ||||
| #~ "Use your created key to access to the machine. If you lost it, contact us." | ||||
| #~ msgstr "" | ||||
| #~ "Verwende deinen privaten SSH Schlüssel, um dich mit deinen Maschinen zu " | ||||
| #~ "verbinden. Solltest du deinen privaten Schlüssel verloren haben, dann " | ||||
| #~ "kontaktiere uns." | ||||
| 
 | ||||
| #~ msgid "Copy to Clipboard" | ||||
| #~ msgstr "Kopieren" | ||||
| 
 | ||||
|  | @ -638,6 +791,3 @@ msgstr "" | |||
| #~ msgstr "" | ||||
| #~ "Dein privater SSH Schlüssel wurde bereits generiert und heruntergeladen. " | ||||
| #~ "Falls du ihn verloren hast, kontaktiere uns." | ||||
| 
 | ||||
| #~ msgid "Generate my key" | ||||
| #~ msgstr "Generiere meinen Schlüssel" | ||||
|  |  | |||
							
								
								
									
										20
									
								
								hosting/migrations/0041_userhostingkey_private_key.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								hosting/migrations/0041_userhostingkey_private_key.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # Generated by Django 1.9.4 on 2017-07-06 09:06 | ||||
| from __future__ import unicode_literals | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('hosting', '0040_hostingplan'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AddField( | ||||
|             model_name='userhostingkey', | ||||
|             name='private_key', | ||||
|             field=models.FileField(blank=True, upload_to='private_keys'), | ||||
|         ), | ||||
|     ] | ||||
|  | @ -101,6 +101,7 @@ class HostingOrder(AssignPermissionsMixin, models.Model): | |||
| class UserHostingKey(models.Model): | ||||
|     user = models.ForeignKey(CustomUser) | ||||
|     public_key = models.TextField() | ||||
|     private_key = models.FileField(upload_to='private_keys',  blank=True) | ||||
|     created_at = models.DateTimeField(auto_now_add=True) | ||||
|     name = models.CharField(max_length=100) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										2
									
								
								hosting/static/hosting/css/bootstrap.min.css
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								hosting/static/hosting/css/bootstrap.min.css
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -58,6 +58,9 @@ | |||
|       width: 90%; | ||||
|   } | ||||
| } | ||||
| .btn:focus, .btn:active:focus { | ||||
| 	outline: 0; | ||||
| } | ||||
| 
 | ||||
| /***********Styles for Model********************/ | ||||
| .modal-content { | ||||
|  |  | |||
							
								
								
									
										321
									
								
								hosting/static/hosting/css/user_keys.css
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										321
									
								
								hosting/static/hosting/css/user_keys.css
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,321 @@ | |||
| /* ssh_keys_choice */ | ||||
| .h1-thin { | ||||
|     font-family: Lato, sans-serif; | ||||
|     font-weight: 300; | ||||
|     font-size: 32px; | ||||
| } | ||||
| .dashboard-container .page-header { | ||||
|     border: 0; | ||||
|     margin-top: 0; | ||||
| } | ||||
| .dashboard-choice-container .page-header p { | ||||
|     font-size: 16px; | ||||
|     font-family: Lato, sans-serif; | ||||
|     font-weight: 300; | ||||
| } | ||||
| .dashboard-choice-container h2 { | ||||
|     font-family: Lato, sans-serif; | ||||
|     font-weight: 400; | ||||
|     font-size: 22px; | ||||
|     margin-top: 0; | ||||
| } | ||||
| .choice-container { | ||||
|     border: 1px solid #C9C6C6; | ||||
|     padding: 25px; | ||||
|     border-radius: 1px; | ||||
| } | ||||
| .choice-container p{ | ||||
|     font-size: 18px; | ||||
|     font-family: Lato, sans-serif; | ||||
|     font-weight: 300; | ||||
| } | ||||
| .choice-container-top { | ||||
|     border-bottom: 1px solid #C9C6C6; | ||||
|     padding-bottom: 25px; | ||||
|     margin-bottom: 25px; | ||||
| } | ||||
| .choice-container .choice-btn { | ||||
|     margin-top: 25px; | ||||
| } | ||||
| .choice-btn { | ||||
|     min-width: 110px; | ||||
|     background-color: #3C5480; | ||||
|     color: #fff; | ||||
|     border: 2px solid #3C5480; | ||||
|     padding: 4px 10px; | ||||
|     transition: 0.3s all ease-out; | ||||
| } | ||||
| .choice-btn:focus, | ||||
| .choice-btn:hover, | ||||
| .choice-btn:active { | ||||
|     color: #3C5480; | ||||
|     background-color: #fff; | ||||
| } | ||||
| .choice-btn-faded { | ||||
|     background-color: #8396C4; | ||||
|     border: 2px solid #8396C4; | ||||
| } | ||||
| 
 | ||||
| @media (max-width: 767px) { | ||||
|     .h1-thin { | ||||
|         font-size: 27px; | ||||
|     } | ||||
|     .dashboard-choice-container h2 { | ||||
|         font-size: 20px; | ||||
|     } | ||||
|     .choice-container p { | ||||
|         font-size: 16px; | ||||
|     } | ||||
|     .choice-btn{ | ||||
|         margin-top: 15px; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| .ssh-keys-table thead tr th, | ||||
| .ssh-keys-table tbody tr td{ | ||||
|     color: #717274; | ||||
|     text-align: center; | ||||
|     border-bottom: 1px solid #cbcbcb; | ||||
|     vertical-align: middle; | ||||
| } | ||||
| .ssh-keys-table tbody tr{ | ||||
|     border-bottom: 1px solid #cbcbcb; | ||||
| } | ||||
| .ssh-keys-table thead tr th:first-of-type, | ||||
| .ssh-keys-table tbody tr td:first-of-type{ | ||||
|     text-align: left; | ||||
| } | ||||
| .ssh-keys-table thead tr th:last-of-type, | ||||
| .ssh-keys-table tbody tr td:last-of-type{ | ||||
|     width: 20%; | ||||
| } | ||||
| .ssh-key-header { | ||||
|     color: #717274; | ||||
|     font-size: 16px; | ||||
|     font-weight: 300; | ||||
|     text-align: justify; | ||||
| } | ||||
| .ssh-header-container{ | ||||
|     padding-top: 15px; | ||||
| } | ||||
| 
 | ||||
| @media (min-width: 768px) { | ||||
|     .ssh-header-container { | ||||
|         display: flex; | ||||
|         justify-content: space-between; | ||||
|         align-items: flex-start; | ||||
|     } | ||||
|     .ssh-header-container p{ | ||||
|         margin-bottom: 0; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| .ssh-header-container p{ | ||||
|     padding: 0; | ||||
|     color: #717274; | ||||
|     font-size: 16px; | ||||
|     font-weight: 300; | ||||
|     font-family: 'Lato'; | ||||
| } | ||||
| 
 | ||||
| .borderless tbody:before { | ||||
|     display: none !important; | ||||
| } | ||||
| .btn-custom-download{ | ||||
|     background-color: #337ab7; | ||||
|     margin-top: auto; | ||||
|     margin-bottom: auto; | ||||
|     /* font-weight: 700; */ | ||||
|     vertical-align: middle; | ||||
|     margin-right: 25px; | ||||
| } | ||||
| .btn-custom-delete{ | ||||
|     width: 100px; | ||||
|     background-color: #f1f0f0; | ||||
| } | ||||
| .btn-custom-delete a, .btn-custom-download a{ | ||||
|     text-decoration: none; | ||||
| } | ||||
| .modal-body p{ | ||||
|     width: 100%; | ||||
|     word-wrap: break-word; | ||||
|     text-align: left; | ||||
| } | ||||
| 
 | ||||
| @media screen and (max-width: 768px) { | ||||
|     .ssh-header-container{ | ||||
|         flex-direction: column-reverse; | ||||
|         align-items: flex-start; | ||||
|     } | ||||
|     .btn-custom-delete{ | ||||
|     width: auto; | ||||
|     } | ||||
|     .dashboard-container { | ||||
|      width: 100% !important; | ||||
|     } | ||||
|     .row { | ||||
|      /* margin-right: 0; */ | ||||
|      /* margin-left: 0; */ | ||||
|     } | ||||
|     .col-md-12, .col-sm-12{ | ||||
|         padding-left: 5px; | ||||
|         padding-right: 5px; | ||||
|     } | ||||
| } | ||||
| @media (max-width: 360px){ | ||||
|     .content-dashboard { | ||||
|         /* width: 100% !important; */ | ||||
|     } | ||||
|     .container { | ||||
|         padding-right: 5px; | ||||
|         padding-left: 5px; | ||||
|     } | ||||
| } | ||||
| .dashboard-choice-container { | ||||
|     max-width: 834px !important; | ||||
| } | ||||
| .form_public_key{ | ||||
|     resize: none; | ||||
| } | ||||
| @media (min-width: 768px) { | ||||
|     .form_key_name{ | ||||
|         width:60%; | ||||
|         min-width: 215px; | ||||
|     } | ||||
| } | ||||
| .form_public_key, | ||||
| .form_key_name{ | ||||
|     position: relative; | ||||
|     border:none; | ||||
|     border-bottom: 1px solid grey; | ||||
|     box-shadow: none; | ||||
|     border-radius: 0; | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
|     font-size: 20px; | ||||
|     padding-left: 0; | ||||
| } | ||||
| 
 | ||||
| .form_key_name::-webkit-input-placeholder{ | ||||
|     font-size: 20px; | ||||
|     font-weight:100; | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| .form_key_name::-moz-input-placeholder{ | ||||
|     font-size: 20px; | ||||
|     font-weight:200; | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
| 
 | ||||
| } | ||||
| .form_key_name:-moz-input-placeholder{ | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
|     font-size: 20px; | ||||
|     font-weight:200; | ||||
| 
 | ||||
| } | ||||
| .form_key_name:-ms-input-placeholder { | ||||
|     font-size: 20px; | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
|     font-weight:200; | ||||
| } | ||||
| 
 | ||||
| .form_public_key::-webkit-input-placeholder{ | ||||
|     position: relative; | ||||
|     top: 110px; | ||||
|     font-size: 20px; | ||||
|     font-weight: 200; | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
| 
 | ||||
| } | ||||
| .form_public_key::-moz-input-placeholder{ | ||||
|     position: relative; | ||||
|     top: 110px; | ||||
|     font-size: 20px; | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
|     font-weight:200; | ||||
| 
 | ||||
| } | ||||
| .form_public_key:-moz-input-placeholder{ | ||||
|     position: relative; | ||||
|     top: 110px; | ||||
|     font-size: 20px; | ||||
|     font-weight:200; | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
| } | ||||
| .form_public_key:-ms-input-placeholder { | ||||
|     position: relative; | ||||
|     top: 110px; | ||||
|     font-size: 20px; | ||||
|     font-weight:200; | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
| } | ||||
| .underform-contaner{ | ||||
|     margin-bottom: 20px; | ||||
| } | ||||
| @media (min-width: 767px) { | ||||
|     .underform-contaner { | ||||
|         display: flex; | ||||
|         vertical-align: middle; | ||||
|         align-items: center; | ||||
|         justify-content: space-between; | ||||
|         flex-direction: row; | ||||
|     } | ||||
| } | ||||
| @media (max-width: 767px) { | ||||
|     .underform-contaner .btn-container { | ||||
|         text-align: right; | ||||
|     } | ||||
| } | ||||
| .underform-contaner h4{ | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
| } | ||||
| .underform-contaner button{ | ||||
|     /* font-family: Lato; */ | ||||
|     /* font-weight: 600; */ | ||||
|     min-width: 120px; | ||||
|     height: 35px; | ||||
|     margin-top: 0; | ||||
| } | ||||
| .underform-contaner .btn-default{ | ||||
|     background-color: #ccc; | ||||
|     color: #fff; | ||||
| } | ||||
| .control-label{ | ||||
|     font-family: 'Lato-Light', sans-serif; | ||||
|     font-size: 20px; | ||||
|     font-weight:200; | ||||
| } | ||||
| .form-ssh h3{ | ||||
|     margin-bottom: 40px; | ||||
| } | ||||
| .custom_form_button{ | ||||
|     border-radius: 0; | ||||
| } | ||||
| .form_key_name:focus, | ||||
| .form_public_key:focus, | ||||
| .has-error .form_key_name, | ||||
| .has-error .form_key_name:focus, | ||||
| .has-error .form_public_key, | ||||
| .has-error .form_public_key:focus, | ||||
| .has-success .form_key_name, | ||||
| .has-success .form_key_name:focus, | ||||
| .has-success .form_public_key, | ||||
| .has-success .form_public_key:focus { | ||||
|     box-shadow: none; | ||||
| } | ||||
| .wide440 { | ||||
|     max-width: 440px; | ||||
|     margin: auto; | ||||
| } | ||||
| .mob-only { | ||||
|     display: none; | ||||
| } | ||||
| @media (max-width: 767px) { | ||||
|     .mob-only { | ||||
|         display: initial; | ||||
|     } | ||||
|     .pc-only { | ||||
|         display: none; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								hosting/static/hosting/img/g222.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								hosting/static/hosting/img/g222.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 774 B | 
|  | @ -18,6 +18,7 @@ | |||
| 
 | ||||
|     <!-- Custom CSS --> | ||||
|     <link href="{% static 'hosting/css/landing-page.css' %}" rel="stylesheet"> | ||||
|     <link href="{% static 'hosting/css/user_keys.css' %}" rel="stylesheet"> | ||||
|     <link href="{% static 'hosting/css/payment.css' %}" rel="stylesheet"> | ||||
|     <link href="{% static 'hosting/css/order.css' %}" rel="stylesheet"> | ||||
|     <link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet"> | ||||
|  | @ -27,7 +28,7 @@ | |||
|     <!-- Custom Fonts --> | ||||
|     <link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'> | ||||
|     <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> | ||||
|     <link href="//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css"> | ||||
|     <link href="//fonts.googleapis.com/css?family=Lato:300,400,500,700,300italic,400italic,700italic" rel="stylesheet" type="text/css"> | ||||
|     <link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon" /> | ||||
|     <link rel="stylesheet" href="{% static 'hosting/css/owl.carousel.min.css' %}"> | ||||
|     <link rel="stylesheet" href="{% static 'hosting/css/owl.theme.default.min.css' %}"> | ||||
|  | @ -84,7 +85,7 @@ | |||
|                           <ul id="g-account-menu" class="dropdown-menu" role="menu"> | ||||
|                             <li> | ||||
|                                 <a href="{% url 'hosting:ssh_keys' %}"> | ||||
|                                     <i class="fa fa-key"></i> {% trans "Keys"%} | ||||
|                                     <i class="fa fa-key"></i> SSH Keys | ||||
|                                 </a> | ||||
|                             </li> | ||||
|                             <li> | ||||
|  |  | |||
							
								
								
									
										68
									
								
								hosting/templates/hosting/choice_ssh_keys.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								hosting/templates/hosting/choice_ssh_keys.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,68 @@ | |||
| {% extends "hosting/base_short.html" %} | ||||
| {% load staticfiles bootstrap3 i18n %} | ||||
| {% block content %} | ||||
| <div> | ||||
| 	<div class="container virtual-machine-container dashboard-container dashboard-choice-container"> | ||||
| 		<div class="wide440"> | ||||
|             <div class="page-header"> | ||||
|                 <h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i> {% trans "SSH Key"%}</h1> | ||||
|                 <p>{% trans "Choose a key option in order to access your VM" %}.</p> | ||||
|             </div> | ||||
|             {% if messages %} | ||||
|             <div class="alert alert-warning"> | ||||
|                 {% for message in messages %} | ||||
|                 <span>{{ message }}</span> | ||||
|                 {% endfor %} | ||||
|             </div> | ||||
|             {% endif %} | ||||
|             <div class="choice-container"> | ||||
|                 <div class="choice-container-top"> | ||||
|                     <h2>{% trans "Generating a new key pair" %}</h2> | ||||
|                     <p>{% trans "I want to generate a new key pair" %}.</p> | ||||
|                     <form class="text-right" action="" method="post"> | ||||
|                         {% csrf_token %} | ||||
|                         <button type="submit" class="btn choice-btn choice-btn-faded"> | ||||
|                             {% trans "Generate" %} | ||||
|                         </button> | ||||
|                     </form> | ||||
| 
 | ||||
|                 </div> | ||||
|                 <div> | ||||
|                     <h2>{% trans "Using existing key" %}</h2> | ||||
|                     <p>{% trans "I want to use my existing public key"%}.</p> | ||||
|                     <form class="text-right" action="{% url 'hosting:create_ssh_key' %}"> | ||||
|                         <button type="submit" class="btn choice-btn"> | ||||
|                             {% trans "Upload" %} | ||||
|                         </button> | ||||
|                     </form> | ||||
|                 </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%} | ||||
| 
 | ||||
|  | @ -2,13 +2,14 @@ | |||
| {% load staticfiles bootstrap3 i18n %} | ||||
| {% block content %} | ||||
| <div> | ||||
| 	<div class="virtual-machine-container dashboard-container "> | ||||
| 	<div class="virtual-machine-container dashboard-container"> | ||||
| 		<div class="row"> | ||||
| 			<div class="container-table col-md-9 col-md-offset-2"> | ||||
| 				 <div  class="col-sm-12"> | ||||
| 			<div class="col-md-9 col-md-offset-2"> | ||||
|                 <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> | ||||
|                     <div class="page-header"> | ||||
|                         <h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i> {% trans "Add your public SSH key" %}</h1> | ||||
|                     </div> | ||||
|                     {% if messages %} | ||||
|                         <div class="alert alert-warning"> | ||||
|                             {% for message in messages %} | ||||
|  | @ -20,35 +21,35 @@ | |||
|                         {% bootstrap_field field %} | ||||
|                     {% endfor %} | ||||
|                     {% buttons %} | ||||
|                             <button type="submit" class="btn btn-success"> | ||||
|                                 {% trans "Upload your own key. "%}  | ||||
|                     <div class="underform-contaner"> | ||||
|                         <h4>{% trans "Use your created key to access to the VM" %}.</h4> | ||||
|                         <div class="btn-container"> | ||||
|                             <button type="submit" name="add_ssh" class="btn choice-btn choice-btn-faded"> | ||||
|                                 {% trans "Add SSH Key" %} | ||||
|                             </button> | ||||
| <br /> | ||||
| <br /> | ||||
| 							{% trans "Or generate a new key pair."%} <br /> | ||||
| <br /> | ||||
|                                 <button class="btn btn-success">{% trans "Generate Key Pair"%} </a> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     <div class="underform-contaner"> | ||||
|                         <h4>{% trans "Or you can generate a new key pair"%}.</h4> | ||||
|                         <div class="btn-container"> | ||||
|                             <button type="submit" name="generate" class="btn choice-btn"> | ||||
|                                 {% trans "Generate" %} | ||||
|                             </button> | ||||
| 
 | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {% 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 loose 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> | ||||
| 			</div> | ||||
| 	    </div> | ||||
| 
 | ||||
| 	    </div> | ||||
| 	</div> | ||||
| </div> | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,10 +3,7 @@ | |||
| {% 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> | ||||
|         <h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i> {% trans "Your SSH Keys" %}</h1> | ||||
|         {% if messages %} | ||||
|         <div class="alert alert-warning"> | ||||
|             {% for message in messages %} | ||||
|  | @ -14,33 +11,32 @@ | |||
|             {% 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"> | ||||
|          <div class="ssh-header-container"> | ||||
|             <p>{% trans "To generate a new key pair or to upload your existing key, click 'Add Key'" %}</p> | ||||
|             <a class="btn choice-btn" href="{% url 'hosting:choice_ssh_keys' %}" > | ||||
|                 <span class="fa fa-plus"></span>  {% trans "Add SSH Key" %} | ||||
|             </a> | ||||
|          </div> | ||||
| 
 | ||||
|         <table class="table borderless table-hover ssh-keys-table"> | ||||
|             <br/> | ||||
|             <thead> | ||||
|             <tr> | ||||
|                             <th>{% trans "Name"%}</th> | ||||
|                             <th>{% trans "Created at"%} </th> | ||||
|                             <th>{% trans "Status"%} </th> | ||||
|                             <th></th> | ||||
|                 <th>{% trans "Name" %}</th> | ||||
|                 <th>{% trans "Delete Key" %}</th> | ||||
|                 <th>{% trans "Public Key" %}</th> | ||||
|                 <th>{% trans "Private Key" %}</th> | ||||
|             </tr> | ||||
|             </thead> | ||||
|             <tbody> | ||||
|                 {% for user_key in keys %} | ||||
|                 <tr> | ||||
|                     <td scope="row">{{user_key.name}}</td> | ||||
| 
 | ||||
|                                 <td><span id="ssh-created_at-{{user_key.id}}">{{user_key.created_at|date:'Y-m-d H:i' }}</span></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 type="button" class="btn btn-default btn-custom-delete" data-toggle="modal" | ||||
|                                 data-target="#Modal{{ user_key.id }}" style="color: #717274"> | ||||
|                             <span class="pc-only">{% trans "Delete" %}</span> | ||||
|                             <span class="mob-only"><i class="fa fa-trash"></i></span> | ||||
|                         </button> | ||||
| 
 | ||||
|                         <div class="modal fade" id="Modal{{user_key.id }}" tabindex="-1" role="dialog"> | ||||
|  | @ -53,13 +49,15 @@ | |||
|                                         </button> | ||||
|                                     </div> | ||||
|                                     <div class="modal-body"> | ||||
|                  <div class="modal-icon"><i class="fa fa-trash" aria-hidden="true"></i></div> | ||||
|                   <h4 class="modal-title" id="ModalLabel">{% trans "Delete SSH Key"%}</h4> | ||||
|                      <p class="modal-text">{% trans "Do You want to delete this key?"%}</p> | ||||
|                                         <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="submit" class="btn btn-danger">{% trans "Delete"%} | ||||
|                                                 <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> | ||||
|  | @ -68,20 +66,50 @@ | |||
|                             </div> | ||||
|                         </div> | ||||
|                      </td> | ||||
|                     <td> | ||||
|                         <p type="button"  data-toggle="modal" style="margin: 0" data-target="#Modal_public_key{{ user_key.id }}"> | ||||
|                             <a href="#">{% trans "Show" %}</a> | ||||
|                         </p> | ||||
|                         <div class="modal fade" id="Modal_public_key{{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">×</span> | ||||
|                                         </button> | ||||
|                                         <h4 class="modal-title" id="ModalLabel_Public_Key">{% trans "Public ssh key" %}</h4> | ||||
|                                     </div> | ||||
|                                     <div class="modal-body"> | ||||
|                                         <p>{{ user_key.public_key }}</p> | ||||
|                                         <div class="modal-footer"> | ||||
|                                             <button type="button" class="btn btn-default" | ||||
|                                                     data-dismiss="modal"> | ||||
|                                                 {% trans "Close" %} | ||||
|                                             </button> | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                      </td> | ||||
|                     </td> | ||||
|                     <td> | ||||
|                         {% if user_key.private_key %} | ||||
|                         <form action="{{ user_key.private_key.url }}"> | ||||
|                             <button style="color: #717274" type="submit" class="btn btn-default" data-toggle="modal" | ||||
|                                     > | ||||
|                                     <span class="pc-only">{% trans "Download" %}</span> | ||||
|                                     <span class="mob-only"><i class="fa fa-download"></i></span> | ||||
|                             </button> | ||||
|                         </form> | ||||
|                         {% endif %} | ||||
|                     </td> | ||||
|                 </tr> | ||||
|                 {% endfor %} | ||||
|             </tbody> | ||||
|         </table> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 						<div class="clearfix"></div> | ||||
| 	</div> | ||||
| 			</div> | ||||
| 
 | ||||
| 	    </div> | ||||
| 	</div> | ||||
| 
 | ||||
| </div> | ||||
| 
 | ||||
| {% if next_url %} | ||||
|  |  | |||
|  | @ -7,7 +7,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'), | ||||
|  | @ -27,6 +27,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(), | ||||
|  |  | |||
|  | @ -1,3 +1,7 @@ | |||
| import uuid | ||||
| 
 | ||||
| from django.core.files.base import ContentFile | ||||
| 
 | ||||
| from oca.pool import WrongNameError, WrongIdError | ||||
| from django.shortcuts import render | ||||
| from django.http import Http404 | ||||
|  | @ -24,7 +28,7 @@ from utils.forms import BillingAddressForm, PasswordResetRequestForm, UserBillin | |||
| from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin | ||||
| from utils.mailer import BaseEmail | ||||
| from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey | ||||
| from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm | ||||
| from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm, generate_ssh_key_name | ||||
| from .mixins import ProcessVMSelectionMixin | ||||
| 
 | ||||
| from opennebula_api.models import OpenNebulaManager | ||||
|  | @ -193,8 +197,10 @@ class SignupView(CreateView): | |||
|         name = form.cleaned_data.get('name') | ||||
|         email = form.cleaned_data.get('email') | ||||
|         password = form.cleaned_data.get('password') | ||||
|         this_base_url = "{0}://{1}".format(self.request.scheme, self.request.get_host()) | ||||
|         CustomUser.register(name, password, email, app='dcl', base_url=this_base_url) | ||||
|         this_base_url = "{0}://{1}".format(self.request.scheme, | ||||
|                                            self.request.get_host()) | ||||
|         CustomUser.register(name, password, email, | ||||
|                             app='dcl', base_url=this_base_url) | ||||
| 
 | ||||
|         return HttpResponseRedirect(reverse_lazy('hosting:signup-validate')) | ||||
| 
 | ||||
|  | @ -204,8 +210,10 @@ class SignupValidateView(TemplateView): | |||
| 
 | ||||
|     def get_context_data(self, **kwargs): | ||||
|         context = super(SignupValidateView, self).get_context_data(**kwargs) | ||||
|         login_url = '<a href="' + reverse('hosting:login') + '">' + str(_('login')) + '</a>' | ||||
|         home_url = '<a href="' + reverse('datacenterlight:index') + '">Data Center Light</a>' | ||||
|         login_url = '<a href="' + \ | ||||
|             reverse('hosting:login') + '">' + str(_('login')) + '</a>' | ||||
|         home_url = '<a href="' + \ | ||||
|             reverse('datacenterlight:index') + '">Data Center Light</a>' | ||||
|         message = '{signup_success_message} {lurl}</a> \ | ||||
|                  <br />{go_back} {hurl}.'.format( | ||||
|             signup_success_message=_( | ||||
|  | @ -226,15 +234,18 @@ class SignupValidatedView(SignupValidateView): | |||
|     def get_context_data(self, **kwargs): | ||||
|         context = super(SignupValidateView, self).get_context_data(**kwargs) | ||||
|         validated = CustomUser.validate_url(self.kwargs['validate_slug']) | ||||
|         login_url = '<a href="' + reverse('hosting:login') + '">' + str(_('login')) + '</a>' | ||||
|         login_url = '<a href="' + \ | ||||
|             reverse('hosting:login') + '">' + str(_('login')) + '</a>' | ||||
|         section_title = _('Account activation') | ||||
|         if validated: | ||||
|             message = '{account_activation_string} <br /> {login_string} {lurl}.'.format( | ||||
|                 account_activation_string=_("Your account has been activated."), | ||||
|                 account_activation_string=_( | ||||
|                     "Your account has been activated."), | ||||
|                 login_string=_("You can now"), | ||||
|                 lurl=login_url) | ||||
|         else: | ||||
|             home_url = '<a href="' + reverse('datacenterlight:index') + '">Data Center Light</a>' | ||||
|             home_url = '<a href="' + \ | ||||
|                 reverse('datacenterlight:index') + '">Data Center Light</a>' | ||||
|             message = '{sorry_message} <br />{go_back_to} {hurl}'.format( | ||||
|                 sorry_message=_("Sorry. Your request is invalid."), | ||||
|                 go_back_to=_('Go back to'), | ||||
|  | @ -364,10 +375,29 @@ class SSHKeyListView(LoginRequiredMixin, ListView): | |||
| 
 | ||||
|     def render_to_response(self, context, **response_kwargs): | ||||
|         if not self.queryset: | ||||
|             return HttpResponseRedirect(reverse('hosting:create_ssh_key')) | ||||
|             return HttpResponseRedirect(reverse('hosting:choice_ssh_keys')) | ||||
|         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) | ||||
| 
 | ||||
|     def post(self, request, *args, **kwargs): | ||||
|         name = generate_ssh_key_name() | ||||
|         private_key, public_key = UserHostingKey.generate_keys() | ||||
|         content = ContentFile(private_key) | ||||
|         ssh_key = UserHostingKey.objects.create( | ||||
|             user=request.user, public_key=public_key, name=name) | ||||
|         filename = name + '_' + str(uuid.uuid4())[:8] + '_private.pem' | ||||
|         ssh_key.private_key.save(filename, content) | ||||
|         return redirect(reverse_lazy('hosting:ssh_keys'), foo='bar') | ||||
| 
 | ||||
| 
 | ||||
| class SSHKeyCreateView(LoginRequiredMixin, FormView): | ||||
|     form_class = UserHostingKeyForm | ||||
|     model = UserHostingKey | ||||
|  | @ -383,6 +413,11 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView): | |||
| 
 | ||||
|     def form_valid(self, form): | ||||
|         form.save() | ||||
|         if 'dcl-generated-key-' in form.instance.name: | ||||
|             content = ContentFile(form.cleaned_data.get('private_key')) | ||||
|             filename = form.cleaned_data.get( | ||||
|                 'name') + '_' + str(uuid.uuid4())[:8] + '_private.pem' | ||||
|             form.instance.private_key.save(filename, content) | ||||
|         context = self.get_context_data() | ||||
| 
 | ||||
|         next_url = self.request.session.get( | ||||
|  | @ -407,10 +442,11 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView): | |||
|         manager = OpenNebulaManager() | ||||
| 
 | ||||
|         # Get user ssh key | ||||
|         public_key = form.cleaned_data.get('public_key', '').decode('utf-8') | ||||
|         public_key = str(form.cleaned_data.get('public_key', '')) | ||||
|         # Add ssh key to user | ||||
|         try: | ||||
|             manager.add_public_key(user=owner, public_key=public_key, merge=True) | ||||
|             manager.add_public_key( | ||||
|                 user=owner, public_key=public_key, merge=True) | ||||
|         except ConnectionError: | ||||
|             pass | ||||
|         except WrongNameError: | ||||
|  | @ -421,6 +457,9 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView): | |||
|     def post(self, request, *args, **kwargs): | ||||
|         print(self.request.POST.dict()) | ||||
|         form = self.get_form() | ||||
|         required = 'add_ssh' in self.request.POST | ||||
|         form.fields['name'].required = required | ||||
|         form.fields['public_key'].required = required | ||||
|         if form.is_valid(): | ||||
|             return self.form_valid(form) | ||||
|         else: | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue