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 |     return "%s" % url | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| @register.filter('get_value_from_dict') | @register.filter('get_value_from_dict') | ||||||
| def get_value_from_dict(dict_data, key): | 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 utils.stripe_utils import StripeUtils | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
| from membership.models import CustomUser, StripeCustomer | from membership.models import CustomUser, StripeCustomer | ||||||
| 
 | from oca.pool import WrongIdError | ||||||
| from opennebula_api.models import OpenNebulaManager | from opennebula_api.models import OpenNebulaManager | ||||||
| from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer | from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer | ||||||
| 
 | 
 | ||||||
|  | @ -34,6 +34,7 @@ class SuccessView(TemplateView): | ||||||
|     def get(self, request, *args, **kwargs): |     def get(self, request, *args, **kwargs): | ||||||
|         if 'specs' not in request.session or 'user' not in request.session: |         if 'specs' not in request.session or 'user' not in request.session: | ||||||
|             return HttpResponseRedirect(reverse('datacenterlight:index')) |             return HttpResponseRedirect(reverse('datacenterlight:index')) | ||||||
|  | 
 | ||||||
|         elif 'token' not in request.session: |         elif 'token' not in request.session: | ||||||
|             return HttpResponseRedirect(reverse('datacenterlight:payment')) |             return HttpResponseRedirect(reverse('datacenterlight:payment')) | ||||||
|         elif 'order_confirmation' not in request.session: |         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) |     @cache_control(no_cache=True, must_revalidate=True, no_store=True) | ||||||
|     def get(self, request, *args, **kwargs): |     def get(self, request, *args, **kwargs): | ||||||
|  | 
 | ||||||
|         for session_var in ['specs', 'user', 'billing_address_data']: |         for session_var in ['specs', 'user', 'billing_address_data']: | ||||||
|             if session_var in request.session: |             if session_var in request.session: | ||||||
|                 del request.session[session_var] |                 del request.session[session_var] | ||||||
|  | @ -401,6 +403,7 @@ class PaymentOrderView(FormView): | ||||||
| 
 | 
 | ||||||
|             # Create Billing Address |             # Create Billing Address | ||||||
|             billing_address = form.save() |             billing_address = form.save() | ||||||
|  | 
 | ||||||
|             request.session['billing_address_data'] = billing_address_data |             request.session['billing_address_data'] = billing_address_data | ||||||
|             request.session['billing_address'] = billing_address.id |             request.session['billing_address'] = billing_address.id | ||||||
|             request.session['token'] = token |             request.session['token'] = token | ||||||
|  | @ -416,6 +419,7 @@ class OrderConfirmationView(DetailView): | ||||||
|     context_object_name = "order" |     context_object_name = "order" | ||||||
|     model = HostingOrder |     model = HostingOrder | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|     @cache_control(no_cache=True, must_revalidate=True, no_store=True) |     @cache_control(no_cache=True, must_revalidate=True, no_store=True) | ||||||
|     def get(self, request, *args, **kwargs): |     def get(self, request, *args, **kwargs): | ||||||
|         if 'specs' not in request.session or 'user' not in request.session: |         if 'specs' not in request.session or 'user' not in request.session: | ||||||
|  |  | ||||||
|  | @ -195,7 +195,7 @@ CMS_TEMPLATES = ( | ||||||
| DATABASES = { | DATABASES = { | ||||||
|     'default': { |     'default': { | ||||||
|         'ENGINE': 'django.db.backends.postgresql_psycopg2', |         'ENGINE': 'django.db.backends.postgresql_psycopg2', | ||||||
|         'NAME': 'app' |         'NAME': 'app', | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ DEBUG = False | ||||||
| 
 | 
 | ||||||
| EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' | EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| CACHES = { | CACHES = { | ||||||
|     'default': { |     'default': { | ||||||
|         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', |         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', | ||||||
|  |  | ||||||
|  | @ -1,3 +1,5 @@ | ||||||
|  | import datetime | ||||||
|  | 
 | ||||||
| from django import forms | from django import forms | ||||||
| from membership.models import CustomUser | from membership.models import CustomUser | ||||||
| from django.contrib.auth import authenticate | from django.contrib.auth import authenticate | ||||||
|  | @ -7,6 +9,10 @@ from django.utils.translation import ugettext_lazy as _ | ||||||
| from .models import UserHostingKey | 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): | class HostingUserLoginForm(forms.Form): | ||||||
| 
 | 
 | ||||||
|     email = forms.CharField(widget=forms.EmailInput()) |     email = forms.CharField(widget=forms.EmailInput()) | ||||||
|  | @ -20,9 +26,11 @@ class HostingUserLoginForm(forms.Form): | ||||||
|         password = self.cleaned_data.get('password') |         password = self.cleaned_data.get('password') | ||||||
|         is_auth = authenticate(email=email, password=password) |         is_auth = authenticate(email=email, password=password) | ||||||
|         if not is_auth: |         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: |         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 |         return self.cleaned_data | ||||||
| 
 | 
 | ||||||
|     def clean_email(self): |     def clean_email(self): | ||||||
|  | @ -58,15 +66,19 @@ class HostingUserSignupForm(forms.ModelForm): | ||||||
| 
 | 
 | ||||||
| class UserHostingKeyForm(forms.ModelForm): | class UserHostingKeyForm(forms.ModelForm): | ||||||
|     private_key = forms.CharField(widget=forms.HiddenInput(), required=False) |     private_key = forms.CharField(widget=forms.HiddenInput(), required=False) | ||||||
|     public_key = forms.CharField(widget=forms.Textarea(), required=False, |     public_key = forms.CharField(widget=forms.Textarea( | ||||||
|                                  help_text=_('Paste here your public key')) |         attrs={'class': 'form_public_key', 'placeholder': _('Paste here your public key')}), | ||||||
|  |         required=False, | ||||||
|  |     ) | ||||||
|     user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(), |     user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(), | ||||||
|                                          required=False, widget=forms.HiddenInput()) |                                          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): |     def __init__(self, *args, **kwargs): | ||||||
|         self.request = kwargs.pop("request") |         self.request = kwargs.pop("request") | ||||||
|         super(UserHostingKeyForm, self).__init__(*args, **kwargs) |         super(UserHostingKeyForm, self).__init__(*args, **kwargs) | ||||||
|  |         self.fields['name'].label = _('Key name') | ||||||
| 
 | 
 | ||||||
|     def clean_name(self): |     def clean_name(self): | ||||||
|         return self.data.get('name') |         return self.data.get('name') | ||||||
|  | @ -76,7 +88,8 @@ class UserHostingKeyForm(forms.ModelForm): | ||||||
| 
 | 
 | ||||||
|     def clean(self): |     def clean(self): | ||||||
|         cleaned_data = self.cleaned_data |         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'): |         if not cleaned_data.get('public_key'): | ||||||
|             private_key, public_key = UserHostingKey.generate_keys() |             private_key, public_key = UserHostingKey.generate_keys() | ||||||
|             cleaned_data.update({ |             cleaned_data.update({ | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: PACKAGE VERSION\n" | "Project-Id-Version: PACKAGE VERSION\n" | ||||||
| "Report-Msgid-Bugs-To: \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" | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | "Language-Team: LANGUAGE <LL@li.org>\n" | ||||||
|  | @ -18,359 +18,398 @@ msgstr "" | ||||||
| "Content-Transfer-Encoding: 8bit\n" | "Content-Transfer-Encoding: 8bit\n" | ||||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||||
| 
 | 
 | ||||||
| #: forms.py:25 | #: .\hosting\forms.py:33 | ||||||
| msgid "Your account is not activated yet." | msgid "Your account is not activated yet." | ||||||
| msgstr "Dein Account wurde noch nicht aktiviert." | msgstr "Dein Account wurde noch nicht aktiviert." | ||||||
| 
 | 
 | ||||||
| #: forms.py:62 | #: .\hosting\forms.py:70 | ||||||
| msgid "Paste here your public key" | 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" | msgid "My Virtual Machines" | ||||||
| msgstr "Meine virtuellen Maschinen" | 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" | msgid "My Orders" | ||||||
| msgstr "Meine Bestellungen" | msgstr "Meine Bestellungen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/base_short.html:85 | #: .\hosting\templates\hosting\base_short.html:93 | ||||||
| msgid "Keys" |  | ||||||
| msgstr "Schlüssel" |  | ||||||
| 
 |  | ||||||
| #: templates/hosting/base_short.html:90 |  | ||||||
| msgid "Notifications " | msgid "Notifications " | ||||||
| msgstr "Benachrichtigungen" | msgstr "Benachrichtigungen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/base_short.html:93 | #: .\hosting\templates\hosting\base_short.html:96 | ||||||
| msgid "Logout" | msgid "Logout" | ||||||
| msgstr "Abmelden" | msgstr "Abmelden" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/base_short.html:98 | #: .\hosting\templates\hosting\bill_detail.html:11 | ||||||
| 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 |  | ||||||
| msgid "Invoice" | msgid "Invoice" | ||||||
| msgstr "Rechnung" | 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 #" | msgid "Order #" | ||||||
| msgstr "Bestellung #" | msgstr "Bestellung #" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:25 | #: .\hosting\templates\hosting\bill_detail.html:25 | ||||||
| msgid "ungleich GmbH" | msgid "ungleich GmbH" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:26 | #: .\hosting\templates\hosting\bill_detail.html:26 | ||||||
| msgid "buchhaltung@ungleich.ch" | msgid "buchhaltung@ungleich.ch" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:27 | #: .\hosting\templates\hosting\bill_detail.html:27 | ||||||
| msgid "Hauptstrasse 14" | msgid "Hauptstrasse 14" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:28 | #: .\hosting\templates\hosting\bill_detail.html:28 | ||||||
| msgid "CH-8775 Luchsingen" | msgid "CH-8775 Luchsingen" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:29 | #: .\hosting\templates\hosting\bill_detail.html:29 | ||||||
| msgid "Mwst-Nummer: CHE-109.549.333 MWST" | msgid "Mwst-Nummer: CHE-109.549.333 MWST" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:60 | #: .\hosting\templates\hosting\bill_detail.html:60 | ||||||
| msgid "Total:" | msgid "Total:" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:68 | #: .\hosting\templates\hosting\bill_detail.html:68 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "Alles Preise in CHF mit 8%% Mehrwertsteuer." | msgid "Alles Preise in CHF mit 8%% Mehrwertsteuer." | ||||||
| msgstr "All prices in CHF including 8%% VAT" | 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." | msgid "Betrag zahlbar innerhalb von 30 Tagen ab Rechnungseingang." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:70 | #: .\hosting\templates\hosting\bill_detail.html:70 | ||||||
| msgid "Kontoverbindung:" | msgid "Kontoverbindung:" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:73 | #: .\hosting\templates\hosting\bill_detail.html:73 | ||||||
| msgid "IBAN:" | msgid "IBAN:" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:76 | #: .\hosting\templates\hosting\bill_detail.html:76 | ||||||
| msgid "BIC:" | msgid "BIC:" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:81 | #: .\hosting\templates\hosting\bill_detail.html:81 | ||||||
| msgid "CH02 0900 0000 6071 8848 8" | msgid "CH02 0900 0000 6071 8848 8" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bill_detail.html:84 | #: .\hosting\templates\hosting\bill_detail.html:84 | ||||||
| msgid "POFICHBEXXX" | msgid "POFICHBEXXX" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bills.html:12 | #: .\hosting\templates\hosting\bills.html:12 | ||||||
| msgid "Customers" | msgid "Customers" | ||||||
| msgstr "Kunden" | 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" | msgid "Name" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bills.html:17 | #: .\hosting\templates\hosting\bills.html:17 | ||||||
| msgid "Email" | msgid "Email" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bills.html:28 | #: .\hosting\templates\hosting\bills.html:28 | ||||||
| msgid "View Bill" | msgid "View Bill" | ||||||
| msgstr "Rechnung anzeigen" | msgstr "Rechnung anzeigen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bills.html:41 templates/hosting/orders.html.py:82 | #: .\hosting\templates\hosting\bills.html:41 | ||||||
| #: templates/hosting/virtual_machines.html:70 | #: .\hosting\templates\hosting\orders.html:82 | ||||||
|  | #: .\hosting\templates\hosting\virtual_machines.html:70 | ||||||
| msgid "previous" | msgid "previous" | ||||||
| msgstr "vorherige" | msgstr "vorherige" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/bills.html:47 templates/hosting/orders.html.py:88 | #: .\hosting\templates\hosting\bills.html:47 | ||||||
| #: templates/hosting/virtual_machines.html:76 | #: .\hosting\templates\hosting\orders.html:88 | ||||||
|  | #: .\hosting\templates\hosting\virtual_machines.html:76 | ||||||
| msgid "next" | msgid "next" | ||||||
| msgstr "nächste" | msgstr "nächste" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/confirm_reset_password.html:10 | #: .\hosting\templates\hosting\choice_ssh_keys.html:8 | ||||||
| #: templates/hosting/login.html:12 templates/hosting/reset_password.html:10 | msgid "SSH Key" | ||||||
| #: templates/hosting/signup.html:9 templates/hosting/signup_validate.html:9 | 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" | msgid "Your VM hosted in Switzerland" | ||||||
| msgstr "deine VM in der Schweiz" | 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" | msgid "Set your new password" | ||||||
| msgstr "Setze dein neues Passwort" | msgstr "Setze dein neues Passwort" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/confirm_reset_password.html:29 | #: .\hosting\templates\hosting\confirm_reset_password.html:29 | ||||||
| #: templates/hosting/reset_password.html:23 | #: .\hosting\templates\hosting\reset_password.html:28 | ||||||
| msgid "Reset" | msgid "Reset" | ||||||
| msgstr "Zurücksetzen" | msgstr "Zurücksetzen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/confirm_reset_password.html:35 | #: .\hosting\templates\hosting\confirm_reset_password.html:35 | ||||||
| #: templates/hosting/reset_password.html:29 templates/hosting/signup.html:27 | #: .\hosting\templates\hosting\reset_password.html:34 | ||||||
|  | #: .\hosting\templates\hosting\signup.html:31 | ||||||
| msgid "Already have an account ?" | msgid "Already have an account ?" | ||||||
| msgstr "Hast Du bereits ein Benutzerkonto?" | 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" | msgid "New Virtual Machine" | ||||||
| msgstr "Neue virtuelle Maschine" | 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:" | msgid "Step 1. Select VM Template:" | ||||||
| msgstr "Wähle eine Vorlage" | 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" | msgid "Step2. Select VM Configuration" | ||||||
| msgstr "Wähle eine Konfiguration" | msgstr "Wähle eine Konfiguration" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/create_virtual_machine.html:59 | #: .\hosting\templates\hosting\create_virtual_machine.html:59 | ||||||
| msgid "Price " | msgid "Price " | ||||||
| msgstr "Preis" | msgstr "Preis" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/create_virtual_machine.html:59 | #: .\hosting\templates\hosting\create_virtual_machine.html:59 | ||||||
| msgid "CHF/Month" | msgid "CHF/Month" | ||||||
| msgstr "CHF/Monat" | msgstr "CHF/Monat" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/create_virtual_machine.html:61 | #: .\hosting\templates\hosting\create_virtual_machine.html:61 | ||||||
| msgid "Start VM" | msgid "Start VM" | ||||||
| msgstr "VM jetzt starten" | msgstr "VM jetzt starten" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/emails/password_reset_email.html:2 | #: .\hosting\templates\hosting\emails\password_reset_email.html:2 | ||||||
| #: templates/hosting/emails/password_reset_email.txt:2 | #: .\hosting\templates\hosting\emails\password_reset_email.txt:2 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "" | msgid "" | ||||||
| "You're receiving this email because you requested a password reset for your " | "You're receiving this email because you requested a password reset for your " | ||||||
| "user account at %(site_name)s." | "user account at %(site_name)s." | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/emails/password_reset_email.html:4 | #: .\hosting\templates\hosting\emails\password_reset_email.html:4 | ||||||
| #: templates/hosting/emails/password_reset_email.txt:4 | #: .\hosting\templates\hosting\emails\password_reset_email.txt:4 | ||||||
| msgid "Please go to the following page and choose a new password:" | msgid "Please go to the following page and choose a new password:" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/emails/password_reset_email.html:9 | #: .\hosting\templates\hosting\emails\password_reset_email.html:9 | ||||||
| #: templates/hosting/emails/password_reset_email.txt:9 | #: .\hosting\templates\hosting\emails\password_reset_email.txt:9 | ||||||
| msgid "Thanks for using our site!" | msgid "Thanks for using our site!" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/emails/password_reset_email.html:11 | #: .\hosting\templates\hosting\emails\password_reset_email.html:11 | ||||||
| #: templates/hosting/emails/password_reset_email.txt:11 | #: .\hosting\templates\hosting\emails\password_reset_email.txt:11 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "The %(site_name)s team" | msgid "The %(site_name)s team" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/login.html:34 | #: .\hosting\templates\hosting\login.html:39 | ||||||
| msgid "Don't have an account yet ? " | msgid "Don't have an account yet ? " | ||||||
| msgstr "Besitzt du kein Benutzerkonto?" | msgstr "Besitzt du kein Benutzerkonto?" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/login.html:37 templates/hosting/signup.html.py:13 | #: .\hosting\templates\hosting\login.html:42 | ||||||
| #: templates/hosting/signup.html:21 views.py:219 | #: .\hosting\templates\hosting\signup.html:17 | ||||||
|  | #: .\hosting\templates\hosting\signup.html:25 .\hosting\views.py:227 | ||||||
| msgid "Sign up" | msgid "Sign up" | ||||||
| msgstr "Registrieren" | msgstr "Registrieren" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/login.html:39 | #: .\hosting\templates\hosting\login.html:44 | ||||||
| msgid "Forgot your password ? " | msgid "Forgot your password ? " | ||||||
| msgstr "Passwort vergessen?" | msgstr "Passwort vergessen?" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/notifications.html:9 | #: .\hosting\templates\hosting\notifications.html:9 | ||||||
| msgid "Notifications" | msgid "Notifications" | ||||||
| msgstr "Benachrichtigungen" | msgstr "Benachrichtigungen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/notifications.html:16 | #: .\hosting\templates\hosting\notifications.html:16 | ||||||
| msgid "Unread" | msgid "Unread" | ||||||
| msgstr "Ungelesen" | msgstr "Ungelesen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/notifications.html:26 | #: .\hosting\templates\hosting\notifications.html:26 | ||||||
| msgid "All" | msgid "All" | ||||||
| msgstr "Alle" | msgstr "Alle" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/notifications.html:38 | #: .\hosting\templates\hosting\notifications.html:38 | ||||||
| msgid "Unread notifications" | msgid "Unread notifications" | ||||||
| msgstr "Ungelesene Benachrichtigungen" | msgstr "Ungelesene Benachrichtigungen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/notifications.html:48 | #: .\hosting\templates\hosting\notifications.html:48 | ||||||
| msgid "Mark as read" | msgid "Mark as read" | ||||||
| msgstr "Als gelesen markieren" | msgstr "Als gelesen markieren" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/notifications.html:59 | #: .\hosting\templates\hosting\notifications.html:59 | ||||||
| msgid "All notifications" | msgid "All notifications" | ||||||
| msgstr "Alle Benachrichtigungen" | msgstr "Alle Benachrichtigungen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/order_detail.html:23 | #: .\hosting\templates\hosting\order_detail.html:23 | ||||||
| msgid "Confirm Order" | msgid "Confirm Order" | ||||||
| msgstr "Bestellung Bestätigen" | msgstr "Bestellung Bestätigen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/order_detail.html:29 | #: .\hosting\templates\hosting\order_detail.html:29 | ||||||
| msgid "Billed To:" | #: .\hosting\templates\hosting\orders.html:17 | ||||||
| msgstr "Rechnungsadresse" |  | ||||||
| 
 |  | ||||||
| #: templates/hosting/order_detail.html:37 templates/hosting/orders.html:17 |  | ||||||
| msgid "Date" | msgid "Date" | ||||||
| msgstr "Datum" | msgstr "Datum" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/order_detail.html:39 | #: .\hosting\templates\hosting\order_detail.html:31 | ||||||
| msgid "Status:" | msgid "Status:" | ||||||
| msgstr "" | 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:" | msgid "Payment Method:" | ||||||
| msgstr "Bezahlmethode" | msgstr "Bezahlmethode" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/order_detail.html:62 | #: .\hosting\templates\hosting\order_detail.html:63 | ||||||
| msgid "Order summary" | msgid "Order summary" | ||||||
| msgstr "Bestellungsübersicht" | msgstr "Bestellungsübersicht" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/order_detail.html:65 templates/hosting/payment.html:13 | #: .\hosting\templates\hosting\order_detail.html:66 | ||||||
| #: templates/hosting/virtual_machine_detail.html:76 | #: .\hosting\templates\hosting\payment.html:13 | ||||||
|  | #: .\hosting\templates\hosting\virtual_machine_detail.html:76 | ||||||
| msgid "Cores" | msgid "Cores" | ||||||
| msgstr "Prozessorkerne" | msgstr "Prozessorkerne" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/order_detail.html:67 templates/hosting/payment.html:16 | #: .\hosting\templates\hosting\order_detail.html:68 | ||||||
| #: templates/hosting/virtual_machine_detail.html:82 | #: .\hosting\templates\hosting\payment.html:16 | ||||||
|  | #: .\hosting\templates\hosting\virtual_machine_detail.html:82 | ||||||
| msgid "Memory" | msgid "Memory" | ||||||
| msgstr "Arbeitsspeicher" | 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" | msgid "Disk space" | ||||||
| msgstr "Festplattenkapazität" | 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" | msgid "Total" | ||||||
| msgstr "Gesamt" | msgstr "Gesamt" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/order_detail.html:77 | #: .\hosting\templates\hosting\order_detail.html:78 | ||||||
| msgid "Finish Configuration" | msgid "Finish Configuration" | ||||||
| msgstr "Konfiguration beenden" | msgstr "Konfiguration beenden" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/orders.html:18 | #: .\hosting\templates\hosting\orders.html:18 | ||||||
| msgid "Amount" | msgid "Amount" | ||||||
| msgstr "Betrag" | msgstr "Betrag" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/orders.html:19 templates/hosting/user_keys.html.py:27 | #: .\hosting\templates\hosting\orders.html:19 | ||||||
| #: templates/hosting/virtual_machine_detail.html:30 | #: .\hosting\templates\hosting\virtual_machine_detail.html:30 | ||||||
| #: templates/hosting/virtual_machines.html:31 | #: .\hosting\templates\hosting\virtual_machines.html:31 | ||||||
| msgid "Status" | msgid "Status" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/orders.html:30 | #: .\hosting\templates\hosting\orders.html:30 | ||||||
| msgid "Approved" | msgid "Approved" | ||||||
| msgstr "Akzeptiert" | msgstr "Akzeptiert" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/orders.html:32 | #: .\hosting\templates\hosting\orders.html:32 | ||||||
| msgid "Declined" | msgid "Declined" | ||||||
| msgstr "Abgelehnt" | 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" | msgid "View Detail" | ||||||
| msgstr "Details anzeigen" | msgstr "Details anzeigen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/orders.html:40 | #: .\hosting\templates\hosting\orders.html:40 | ||||||
| msgid "Cancel Order" | msgid "Cancel Order" | ||||||
| msgstr "Bestellung stornieren" | msgstr "Bestellung stornieren" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/orders.html:55 | #: .\hosting\templates\hosting\orders.html:55 | ||||||
| msgid "Do You want to delete your order?" | msgid "Do You want to delete your order?" | ||||||
| msgstr "Willst du deine Bestellung löschen?" | 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" | msgid "Close" | ||||||
| msgstr "Schliessen" | 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" | msgid "Delete" | ||||||
| msgstr "Löschen" | msgstr "Löschen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:10 | #: .\hosting\templates\hosting\payment.html:10 | ||||||
| msgid "Your Order" | msgid "Your Order" | ||||||
| msgstr "Deine Bestellung" | msgstr "Deine Bestellung" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:22 | #: .\hosting\templates\hosting\payment.html:22 | ||||||
| #: templates/hosting/virtual_machine_detail.html:98 | #: .\hosting\templates\hosting\virtual_machine_detail.html:98 | ||||||
| msgid "Configuration" | msgid "Configuration" | ||||||
| msgstr "Konfiguration" | msgstr "Konfiguration" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:41 | #: .\hosting\templates\hosting\payment.html:41 | ||||||
| msgid "including VAT" | msgid "including VAT" | ||||||
| msgstr "inkl. Mehrwertsteuer" | msgstr "inkl. Mehrwertsteuer" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:55 | #: .\hosting\templates\hosting\payment.html:55 | ||||||
| msgid "Billing Address" | msgid "Billing Address" | ||||||
| msgstr "Rechnungsadresse" | msgstr "Rechnungsadresse" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:66 | #: .\hosting\templates\hosting\payment.html:66 | ||||||
| msgid "Credit Card" | msgid "Credit Card" | ||||||
| msgstr "Kreditkarte" | msgstr "Kreditkarte" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:71 | #: .\hosting\templates\hosting\payment.html:71 | ||||||
| msgid "" | msgid "" | ||||||
| "\n" | "\n" | ||||||
| "                                Please fill in your credit card information " | "                                Please fill in your credit card information " | ||||||
|  | @ -385,7 +424,7 @@ msgstr "" | ||||||
| "\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und " | "\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und " | ||||||
| "speichern keine Informationen in unserer Datenbank." | "speichern keine Informationen in unserer Datenbank." | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:90 | #: .\hosting\templates\hosting\payment.html:90 | ||||||
| msgid "" | msgid "" | ||||||
| "\n" | "\n" | ||||||
| "                                        You are not making any payment yet. " | "                                        You are not making any payment yet. " | ||||||
|  | @ -399,27 +438,28 @@ msgstr "" | ||||||
| "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite " | "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite " | ||||||
| "weitergeleitet." | "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" | msgid "Submit" | ||||||
| msgstr "Absenden" | msgstr "Absenden" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:113 | #: .\hosting\templates\hosting\payment.html:112 | ||||||
| msgid "Card Number" | msgid "Card Number" | ||||||
| msgstr "Kreditkartennummer" | msgstr "Kreditkartennummer" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:117 | #: .\hosting\templates\hosting\payment.html:116 | ||||||
| msgid "Expiry Date" | msgid "Expiry Date" | ||||||
| msgstr "Ablaufdatum" | msgstr "Ablaufdatum" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:122 | #: .\hosting\templates\hosting\payment.html:121 | ||||||
| msgid "CVC" | msgid "CVC" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:126 | #: .\hosting\templates\hosting\payment.html:125 | ||||||
| msgid "Card Type" | msgid "Card Type" | ||||||
| msgstr "Kartentyp" | msgstr "Kartentyp" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:135 | #: .\hosting\templates\hosting\payment.html:134 | ||||||
| msgid "" | msgid "" | ||||||
| "\n" | "\n" | ||||||
| "                                            You are not making any payment " | "                                            You are not making any payment " | ||||||
|  | @ -433,125 +473,151 @@ msgstr "" | ||||||
| "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite " | "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite " | ||||||
| "weitergeleitet." | "weitergeleitet." | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:178 | #: .\hosting\templates\hosting\payment.html:177 | ||||||
| msgid "Processing" | msgid "Processing" | ||||||
| msgstr "Weiter" | msgstr "Weiter" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/payment.html:179 | #: .\hosting\templates\hosting\payment.html:178 | ||||||
| msgid "Enter your credit card number" | msgid "Enter your credit card number" | ||||||
| msgstr "Deine Kreditkartennummer" | msgstr "Deine Kreditkartennummer" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/reset_password.html:15 | #: .\hosting\templates\hosting\reset_password.html:20 | ||||||
| msgid "Reset your password" | msgid "Reset your password" | ||||||
| msgstr "Passwort zurücksetzen" | msgstr "Passwort zurücksetzen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/user_key.html:11 templates/hosting/user_keys.html.py:9 | #: .\hosting\templates\hosting\user_key.html:11 | ||||||
| msgid "Access Key" | msgid "Add your public SSH key" | ||||||
| msgstr "Zugriffsschlüssel" | msgstr "Füge deinen öffentlichen SSH-Key hinzu" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/user_key.html:24 | #: .\hosting\templates\hosting\user_key.html:25 | ||||||
| msgid "Upload your own key. " | msgid "Use your created key to access to the VM" | ||||||
| msgstr "Lade deinen Key hoch" | msgstr "Benutze deinen erstellten SSH-Key um auf deine VM zugreifen zu können" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/user_key.html:28 | #: .\hosting\templates\hosting\user_key.html:28 | ||||||
| msgid "Or generate a new key pair." | #: .\hosting\templates\hosting\user_keys.html:17 | ||||||
| msgstr "Oder erstelle dein neues Keypaar" | msgid "Add SSH Key" | ||||||
|  | msgstr "Hinzufügen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/user_key.html:30 | #: .\hosting\templates\hosting\user_key.html:33 | ||||||
| msgid "Generate Key Pair" | msgid "Or you can generate a new key pair" | ||||||
| msgstr "Schlüsselpaar generieren" | msgstr "Erstelle dein neues Keypaar" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/user_key.html:40 | #: .\hosting\templates\hosting\user_key.html:45 | ||||||
| msgid "Warning!" | msgid "Warning!" | ||||||
| msgstr "Achtung!" | msgstr "Achtung!" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/user_key.html:40 | #: .\hosting\templates\hosting\user_key.html:45 | ||||||
| msgid "You can download your SSH  private key once. Don't lost your key" | #, 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 "" | msgstr "" | ||||||
| "Du kannst deinen privaten SSH Schlüssel nur einmal herunterladen. Beware ihn " | "Du kannst deinen privaten SSH Schlüssel nur einmal herunterladen. Beware ihn " | ||||||
| "sicher auf." | "sicher auf." | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/user_keys.html:18 | #: .\hosting\templates\hosting\user_keys.html:6 | ||||||
| msgid "Add Key" | msgid "Your SSH Keys" | ||||||
| msgstr "Schlüssel hinzufügen" | msgstr "Deine SSH Keys" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/user_keys.html:26 | #: .\hosting\templates\hosting\user_keys.html:15 | ||||||
| msgid "Created at" | msgid "" | ||||||
| msgstr "Erstellt am" | "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" | msgid "Delete Key" | ||||||
| msgstr "Löschen" | 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?" | msgid "Do You want to delete this key?" | ||||||
| msgstr "Möchtest Du den Schlüssel löschen?" | 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" | msgid "Settings" | ||||||
| msgstr "Einstellungen" | msgstr "Einstellungen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machine_detail.html:25 | #: .\hosting\templates\hosting\virtual_machine_detail.html:25 | ||||||
| msgid "Billing" | msgid "Billing" | ||||||
| msgstr "Abrechnungen" | msgstr "Abrechnungen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machine_detail.html:60 | #: .\hosting\templates\hosting\virtual_machine_detail.html:60 | ||||||
| msgid "Ip not assigned yet" | msgid "Ip not assigned yet" | ||||||
| msgstr "Ip nicht zugewiesen" | msgstr "Ip nicht zugewiesen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machine_detail.html:89 | #: .\hosting\templates\hosting\virtual_machine_detail.html:89 | ||||||
| msgid "Disk" | msgid "Disk" | ||||||
| msgstr "Festplatte" | msgstr "Festplatte" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machine_detail.html:108 | #: .\hosting\templates\hosting\virtual_machine_detail.html:108 | ||||||
| msgid "Current pricing" | msgid "Current pricing" | ||||||
| msgstr "Aktueller Preis" | msgstr "Aktueller Preis" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machine_detail.html:117 | #: .\hosting\templates\hosting\virtual_machine_detail.html:117 | ||||||
| msgid "Current status" | msgid "Current status" | ||||||
| msgstr "Aktueller Status" | msgstr "Aktueller Status" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machine_detail.html:142 | #: .\hosting\templates\hosting\virtual_machine_detail.html:142 | ||||||
| msgid "Terminate Virtual Machine" | msgid "Terminate Virtual Machine" | ||||||
| msgstr "Virtuelle Maschine beenden" | msgstr "Virtuelle Maschine beenden" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machine_detail.html:163 | #: .\hosting\templates\hosting\virtual_machine_detail.html:163 | ||||||
| msgid "Terminate your Virtual Machine" | msgid "Terminate your Virtual Machine" | ||||||
| msgstr "Ihre virtuelle Maschine beenden" | 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 " | msgid "Are you sure do you want to cancel your Virtual Machine " | ||||||
| msgstr "Sind Sie sicher, dass Sie ihre virtuelle Maschine beenden wollen " | 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" | msgid "Cancel" | ||||||
| msgstr "Beenden" | msgstr "Beenden" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machines.html:9 | #: .\hosting\templates\hosting\virtual_machines.html:9 | ||||||
| msgid "Virtual Machines" | msgid "Virtual Machines" | ||||||
| msgstr "Virtuelle Maschinen" | msgstr "Virtuelle Maschinen" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machines.html:22 | #: .\hosting\templates\hosting\virtual_machines.html:22 | ||||||
| msgid "Create VM" | msgid "Create VM" | ||||||
| msgstr "Neue VM" | msgstr "Neue VM" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machines.html:28 | #: .\hosting\templates\hosting\virtual_machines.html:28 | ||||||
| msgid "ID" | msgid "ID" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machines.html:29 | #: .\hosting\templates\hosting\virtual_machines.html:29 | ||||||
| msgid "Ipv4" | msgid "Ipv4" | ||||||
| msgstr "IPv4" | msgstr "IPv4" | ||||||
| 
 | 
 | ||||||
| #: templates/hosting/virtual_machines.html:30 | #: .\hosting\templates\hosting\virtual_machines.html:30 | ||||||
| msgid "Ipv6" | msgid "Ipv6" | ||||||
| msgstr "IPv6" | msgstr "IPv6" | ||||||
| 
 | 
 | ||||||
| #: views.py:207 views.py:229 | #: .\hosting\views.py:214 .\hosting\views.py:238 | ||||||
| msgid "login" | msgid "login" | ||||||
| msgstr "einloggen" | msgstr "einloggen" | ||||||
| 
 | 
 | ||||||
| #: views.py:212 | #: .\hosting\views.py:220 | ||||||
| msgid "" | msgid "" | ||||||
| "Thank you for signing up. We have sent an email to you. Please follow the " | "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 " | "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 " | "den Anweisungen um deinen Account zu aktivieren. Danach kannst du dich über " | ||||||
| "diesen" | "diesen" | ||||||
| 
 | 
 | ||||||
| #: views.py:214 views.py:240 | #: .\hosting\views.py:222 .\hosting\views.py:251 | ||||||
| msgid "Go back to" | msgid "Go back to" | ||||||
| msgstr "Zurück" | msgstr "Zurück" | ||||||
| 
 | 
 | ||||||
| #: views.py:230 | #: .\hosting\views.py:239 | ||||||
| msgid "Account activation" | msgid "Account activation" | ||||||
| msgstr "Accountaktivierung" | msgstr "Accountaktivierung" | ||||||
| 
 | 
 | ||||||
| #: views.py:233 | #: .\hosting\views.py:243 | ||||||
| msgid "Your account has been activated." | msgid "Your account has been activated." | ||||||
| msgstr "Dein Account wurde aktiviert." | msgstr "Dein Account wurde aktiviert." | ||||||
| 
 | 
 | ||||||
| #: views.py:234 | #: .\hosting\views.py:244 | ||||||
| msgid "You can now" | msgid "You can now" | ||||||
| msgstr "Du kannst dich nun" | msgstr "Du kannst dich nun" | ||||||
| 
 | 
 | ||||||
| #: views.py:239 | #: .\hosting\views.py:250 | ||||||
| msgid "Sorry. Your request is invalid." | msgid "Sorry. Your request is invalid." | ||||||
| msgstr "Entschuldigung, deine Anfrage ist ungültig." | msgstr "Entschuldigung, deine Anfrage ist ungültig." | ||||||
| 
 | 
 | ||||||
| #: views.py:757 | #: .\hosting\views.py:796 | ||||||
| msgid "" | msgid "" | ||||||
| "We could not find the requested VM. Please                            " | "We could not find the requested VM. Please                            " | ||||||
| "contact Data Center Light Support." | "contact Data Center Light Support." | ||||||
| msgstr "" | 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" | #~ msgid "Billing Amount" | ||||||
| #~ msgstr "Rechnungsbetrag" | #~ msgstr "Rechnungsbetrag" | ||||||
| 
 | 
 | ||||||
|  | @ -610,25 +782,6 @@ msgstr "" | ||||||
| #~ msgid "EXPIRATION DATE" | #~ msgid "EXPIRATION DATE" | ||||||
| #~ msgstr "Ablaufdatum" | #~ 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" | #~ msgid "Copy to Clipboard" | ||||||
| #~ msgstr "Kopieren" | #~ msgstr "Kopieren" | ||||||
| 
 | 
 | ||||||
|  | @ -638,6 +791,3 @@ msgstr "" | ||||||
| #~ msgstr "" | #~ msgstr "" | ||||||
| #~ "Dein privater SSH Schlüssel wurde bereits generiert und heruntergeladen. " | #~ "Dein privater SSH Schlüssel wurde bereits generiert und heruntergeladen. " | ||||||
| #~ "Falls du ihn verloren hast, kontaktiere uns." | #~ "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): | class UserHostingKey(models.Model): | ||||||
|     user = models.ForeignKey(CustomUser) |     user = models.ForeignKey(CustomUser) | ||||||
|     public_key = models.TextField() |     public_key = models.TextField() | ||||||
|  |     private_key = models.FileField(upload_to='private_keys',  blank=True) | ||||||
|     created_at = models.DateTimeField(auto_now_add=True) |     created_at = models.DateTimeField(auto_now_add=True) | ||||||
|     name = models.CharField(max_length=100) |     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%; |       width: 90%; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | .btn:focus, .btn:active:focus { | ||||||
|  | 	outline: 0; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| /***********Styles for Model********************/ | /***********Styles for Model********************/ | ||||||
| .modal-content { | .modal-content { | ||||||
|  | @ -176,4 +179,4 @@ | ||||||
|    display: inline-block; |    display: inline-block; | ||||||
|    text-align: left; |    text-align: left; | ||||||
|    vertical-align: middle; |    vertical-align: middle; | ||||||
|  } |  } | ||||||
|  |  | ||||||
							
								
								
									
										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 --> |     <!-- Custom CSS --> | ||||||
|     <link href="{% static 'hosting/css/landing-page.css' %}" rel="stylesheet"> |     <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/payment.css' %}" rel="stylesheet"> | ||||||
|     <link href="{% static 'hosting/css/order.css' %}" rel="stylesheet"> |     <link href="{% static 'hosting/css/order.css' %}" rel="stylesheet"> | ||||||
|     <link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet"> |     <link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet"> | ||||||
|  | @ -27,7 +28,7 @@ | ||||||
|     <!-- Custom Fonts --> |     <!-- Custom Fonts --> | ||||||
|     <link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'> |     <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 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="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.carousel.min.css' %}"> | ||||||
|     <link rel="stylesheet" href="{% static 'hosting/css/owl.theme.default.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"> |                           <ul id="g-account-menu" class="dropdown-menu" role="menu"> | ||||||
|                             <li> |                             <li> | ||||||
|                                 <a href="{% url 'hosting:ssh_keys' %}"> |                                 <a href="{% url 'hosting:ssh_keys' %}"> | ||||||
|                                     <i class="fa fa-key"></i> {% trans "Keys"%} |                                     <i class="fa fa-key"></i> SSH Keys | ||||||
|                                 </a> |                                 </a> | ||||||
|                             </li> |                             </li> | ||||||
|                             <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%} | ||||||
|  | 
 | ||||||
|  | @ -1,60 +1,61 @@ | ||||||
| {% extends "hosting/base_short.html" %} | {% extends "hosting/base_short.html" %} | ||||||
| {% load staticfiles bootstrap3 i18n %} | {% load staticfiles bootstrap3 i18n %} | ||||||
| {% block content %}  | {% block content %} | ||||||
| <div> | <div> | ||||||
| 	<div class="virtual-machine-container dashboard-container "> | 	<div class="virtual-machine-container dashboard-container"> | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
| 			<div class="container-table col-md-9 col-md-offset-2"> | 			<div class="col-md-9 col-md-offset-2"> | ||||||
| 				 <div  class="col-sm-12"> |                 <form method="POST" action="" novalidate class="form-ssh"> | ||||||
|                     <form method="POST" action="" novalidate class="form-ssh"> |                     {% csrf_token %} | ||||||
|                         {% csrf_token %} |                     <div class="page-header"> | ||||||
| 				        <h3><i class="fa fa-key fa-separate" aria-hidden="true"></i>{% trans "Access Key"%} </h3> |                         <h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i> {% trans "Add your public SSH key" %}</h1> | ||||||
|                         {% if messages %} |                     </div> | ||||||
|  |                     {% if messages %} | ||||||
|                         <div class="alert alert-warning"> |                         <div class="alert alert-warning"> | ||||||
|                             {% for message in messages %} |                             {% for message in messages %} | ||||||
|                             <span>{{ message }}</span> |                             <span>{{ message }}</span> | ||||||
|                             {% endfor %} |                             {% endfor %} | ||||||
|                         </div> |                         </div> | ||||||
| 						{% endif %} | 					{% endif %} | ||||||
|                         {% for field in form %} |                     {% for field in form %} | ||||||
|                             {% bootstrap_field field %} |                         {% bootstrap_field field %} | ||||||
|                         {% endfor %} |                     {% endfor %} | ||||||
|                         {% buttons %} |                     {% buttons %} | ||||||
|                             <button type="submit" class="btn btn-success"> |                     <div class="underform-contaner"> | ||||||
|                                 {% trans "Upload your own key. "%}  |                         <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> |                             </button> | ||||||
| <br /> |                         </div> | ||||||
| <br /> |                     </div> | ||||||
| 							{% trans "Or generate a new key pair."%} <br /> |                     <div class="underform-contaner"> | ||||||
| <br /> |                         <h4>{% trans "Or you can generate a new key pair"%}.</h4> | ||||||
|                                 <button class="btn btn-success">{% trans "Generate Key Pair"%} </a> |                         <div class="btn-container"> | ||||||
|  |                             <button type="submit" name="generate" class="btn choice-btn"> | ||||||
|  |                                 {% trans "Generate" %} | ||||||
|                             </button> |                             </button> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                     {% endbuttons %} | ||||||
|  |                 </form> | ||||||
| 
 | 
 | ||||||
|                         {% endbuttons %}  | 		        {% if private_key %} | ||||||
|                         </form> |     		 		<div class="alert alert-warning"> | ||||||
|                         <h5> Use your created key to access to the machine. If you lost it, contact us. </h5> | 						<strong>{% trans "Warning!"%}</strong>{% trans "You can download your SSH  private key once. Don't loose your key" %} | ||||||
| 
 |     				</div> | ||||||
| 				        {% if private_key %} |     				<div class="form-group"> | ||||||
| 				 		<div class="alert alert-warning"> |     				    <textarea class="form-control" rows="6" id="ssh_key" type="hidden" style="display:none">{{private_key}}</textarea> | ||||||
| 				 			  |     				</div> | ||||||
|   							<strong>{% trans "Warning!"%}</strong>{% trans "You can download your SSH  private key once. Don't lost your key"%}   | 				{% endif %} | ||||||
| 						</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> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| {% if private_key %} | {% if private_key %} | ||||||
| <!-- Force to download ssh key on page load --> | <!-- Force to download ssh key on page load --> | ||||||
| <script type="text/javascript">  | <script type="text/javascript"> | ||||||
| 
 | 
 | ||||||
|         var key = window.document.getElementById('ssh_key'); |         var key = window.document.getElementById('ssh_key'); | ||||||
| 
 | 
 | ||||||
|  | @ -75,7 +76,7 @@ | ||||||
| {%endif%} | {%endif%} | ||||||
| 
 | 
 | ||||||
| {% if next_url %} | {% if next_url %} | ||||||
|     <script type="text/javascript">  |     <script type="text/javascript"> | ||||||
|         window.location.href = '{{next_url}}'; |         window.location.href = '{{next_url}}'; | ||||||
|     </script> |     </script> | ||||||
| {% endif %} | {% endif %} | ||||||
|  |  | ||||||
|  | @ -3,85 +3,113 @@ | ||||||
| {% block content %} | {% block content %} | ||||||
| <div> | <div> | ||||||
| 	<div class="container virtual-machine-container dashboard-container "> | 	<div class="container virtual-machine-container dashboard-container "> | ||||||
| 		<div class="row"> |         <h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i> {% trans "Your SSH Keys" %}</h1> | ||||||
| 			<div class="col-md-9 col-md-offset-2"> |         {% if messages %} | ||||||
| 				 <div  class="col-sm-12"> |         <div class="alert alert-warning"> | ||||||
|                     <h3><i class="fa fa-key" aria-hidden="true"></i>{% trans "Access Key"%} </h3> |             {% for message in messages %} | ||||||
|                     {% if messages %} |             <span>{{ message }}</span> | ||||||
|                     <div class="alert alert-warning"> |             {% endfor %} | ||||||
|                         {% 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><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> |  | ||||||
| 
 |  | ||||||
|     <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">×</span> |  | ||||||
|                     </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> |  | ||||||
|                     <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> |  | ||||||
|                         </div> |  | ||||||
|                     </form> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
|         </div> |         </div> | ||||||
|     </div> |         {% endif %} | ||||||
|                                  </td> |          <div class="ssh-header-container"> | ||||||
|                             </tr> |             <p>{% trans "To generate a new key pair or to upload your existing key, click 'Add Key'" %}</p> | ||||||
|                             {% endfor %} |             <a class="btn choice-btn" href="{% url 'hosting:choice_ssh_keys' %}" > | ||||||
|                                 </tbody> |                 <span class="fa fa-plus"></span>  {% trans "Add SSH Key" %} | ||||||
|                             </table> |             </a> | ||||||
|  |          </div> | ||||||
| 
 | 
 | ||||||
|  |         <table class="table borderless table-hover ssh-keys-table"> | ||||||
|  |             <br/> | ||||||
|  |             <thead> | ||||||
|  |             <tr> | ||||||
|  |                 <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> | ||||||
|  |                         <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"> | ||||||
| 						<div class="clearfix"></div> |                             <div class="modal-dialog" role="document"> | ||||||
| 				</div> |                                 <div class="modal-content"> | ||||||
| 			</div> |                                     <div class="modal-header"> | ||||||
| 
 |                                         <button type="button" class="close" data-dismiss="modal" | ||||||
| 	    </div> |                                                 aria-label="Confirm"><span | ||||||
|  |                                                 aria-hidden="true">×</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> | ||||||
|  |                     <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> | 	</div> | ||||||
| 
 |  | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| {% if next_url %} | {% if next_url %} | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\ | ||||||
|     VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \ |     VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \ | ||||||
|     MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\ |     MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\ | ||||||
|     CreateVirtualMachinesView, HostingBillListView, HostingBillDetailView, \ |     CreateVirtualMachinesView, HostingBillListView, HostingBillDetailView, \ | ||||||
|     SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView |     SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView, SSHKeyChoiceView | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|     url(r'index/?$', IndexView.as_view(), name='index'), |     url(r'index/?$', IndexView.as_view(), name='index'), | ||||||
|  | @ -27,6 +27,8 @@ urlpatterns = [ | ||||||
|         name='virtual_machines'), |         name='virtual_machines'), | ||||||
|     url(r'ssh_keys/?$', SSHKeyListView.as_view(), |     url(r'ssh_keys/?$', SSHKeyListView.as_view(), | ||||||
|         name='ssh_keys'), |         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(), |     url(r'delete_ssh_key/(?P<pk>\d+)/?$', SSHKeyDeleteView.as_view(), | ||||||
|         name='delete_ssh_key'), |         name='delete_ssh_key'), | ||||||
|     url(r'create_ssh_key/?$', SSHKeyCreateView.as_view(), |     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 oca.pool import WrongNameError, WrongIdError | ||||||
| from django.shortcuts import render | from django.shortcuts import render | ||||||
| from django.http import Http404 | 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.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin | ||||||
| from utils.mailer import BaseEmail | from utils.mailer import BaseEmail | ||||||
| from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey | 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 .mixins import ProcessVMSelectionMixin | ||||||
| 
 | 
 | ||||||
| from opennebula_api.models import OpenNebulaManager | from opennebula_api.models import OpenNebulaManager | ||||||
|  | @ -193,8 +197,10 @@ class SignupView(CreateView): | ||||||
|         name = form.cleaned_data.get('name') |         name = form.cleaned_data.get('name') | ||||||
|         email = form.cleaned_data.get('email') |         email = form.cleaned_data.get('email') | ||||||
|         password = form.cleaned_data.get('password') |         password = form.cleaned_data.get('password') | ||||||
|         this_base_url = "{0}://{1}".format(self.request.scheme, self.request.get_host()) |         this_base_url = "{0}://{1}".format(self.request.scheme, | ||||||
|         CustomUser.register(name, password, email, app='dcl', base_url=this_base_url) |                                            self.request.get_host()) | ||||||
|  |         CustomUser.register(name, password, email, | ||||||
|  |                             app='dcl', base_url=this_base_url) | ||||||
| 
 | 
 | ||||||
|         return HttpResponseRedirect(reverse_lazy('hosting:signup-validate')) |         return HttpResponseRedirect(reverse_lazy('hosting:signup-validate')) | ||||||
| 
 | 
 | ||||||
|  | @ -204,8 +210,10 @@ class SignupValidateView(TemplateView): | ||||||
| 
 | 
 | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super(SignupValidateView, self).get_context_data(**kwargs) |         context = super(SignupValidateView, self).get_context_data(**kwargs) | ||||||
|         login_url = '<a href="' + reverse('hosting:login') + '">' + str(_('login')) + '</a>' |         login_url = '<a href="' + \ | ||||||
|         home_url = '<a href="' + reverse('datacenterlight:index') + '">Data Center Light</a>' |             reverse('hosting:login') + '">' + str(_('login')) + '</a>' | ||||||
|  |         home_url = '<a href="' + \ | ||||||
|  |             reverse('datacenterlight:index') + '">Data Center Light</a>' | ||||||
|         message = '{signup_success_message} {lurl}</a> \ |         message = '{signup_success_message} {lurl}</a> \ | ||||||
|                  <br />{go_back} {hurl}.'.format( |                  <br />{go_back} {hurl}.'.format( | ||||||
|             signup_success_message=_( |             signup_success_message=_( | ||||||
|  | @ -226,15 +234,18 @@ class SignupValidatedView(SignupValidateView): | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super(SignupValidateView, self).get_context_data(**kwargs) |         context = super(SignupValidateView, self).get_context_data(**kwargs) | ||||||
|         validated = CustomUser.validate_url(self.kwargs['validate_slug']) |         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') |         section_title = _('Account activation') | ||||||
|         if validated: |         if validated: | ||||||
|             message = '{account_activation_string} <br /> {login_string} {lurl}.'.format( |             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"), |                 login_string=_("You can now"), | ||||||
|                 lurl=login_url) |                 lurl=login_url) | ||||||
|         else: |         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( |             message = '{sorry_message} <br />{go_back_to} {hurl}'.format( | ||||||
|                 sorry_message=_("Sorry. Your request is invalid."), |                 sorry_message=_("Sorry. Your request is invalid."), | ||||||
|                 go_back_to=_('Go back to'), |                 go_back_to=_('Go back to'), | ||||||
|  | @ -364,10 +375,29 @@ class SSHKeyListView(LoginRequiredMixin, ListView): | ||||||
| 
 | 
 | ||||||
|     def render_to_response(self, context, **response_kwargs): |     def render_to_response(self, context, **response_kwargs): | ||||||
|         if not self.queryset: |         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) |         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): | class SSHKeyCreateView(LoginRequiredMixin, FormView): | ||||||
|     form_class = UserHostingKeyForm |     form_class = UserHostingKeyForm | ||||||
|     model = UserHostingKey |     model = UserHostingKey | ||||||
|  | @ -383,6 +413,11 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView): | ||||||
| 
 | 
 | ||||||
|     def form_valid(self, form): |     def form_valid(self, form): | ||||||
|         form.save() |         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() |         context = self.get_context_data() | ||||||
| 
 | 
 | ||||||
|         next_url = self.request.session.get( |         next_url = self.request.session.get( | ||||||
|  | @ -407,10 +442,11 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView): | ||||||
|         manager = OpenNebulaManager() |         manager = OpenNebulaManager() | ||||||
| 
 | 
 | ||||||
|         # Get user ssh key |         # 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 |         # Add ssh key to user | ||||||
|         try: |         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: |         except ConnectionError: | ||||||
|             pass |             pass | ||||||
|         except WrongNameError: |         except WrongNameError: | ||||||
|  | @ -421,6 +457,9 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView): | ||||||
|     def post(self, request, *args, **kwargs): |     def post(self, request, *args, **kwargs): | ||||||
|         print(self.request.POST.dict()) |         print(self.request.POST.dict()) | ||||||
|         form = self.get_form() |         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(): |         if form.is_valid(): | ||||||
|             return self.form_valid(form) |             return self.form_valid(form) | ||||||
|         else: |         else: | ||||||
|  | @ -563,7 +602,7 @@ class PaymentVMView(LoginRequiredMixin, FormView): | ||||||
| 
 | 
 | ||||||
|             # Create a Hosting Bill |             # Create a Hosting Bill | ||||||
|             HostingBill.create( |             HostingBill.create( | ||||||
|                  customer=customer, billing_address=billing_address) |                 customer=customer, billing_address=billing_address) | ||||||
| 
 | 
 | ||||||
|             # Create Billing Address for User if he does not have one |             # Create Billing Address for User if he does not have one | ||||||
|             if not customer.user.billing_addresses.count(): |             if not customer.user.billing_addresses.count(): | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue