Merge branch 'master' into feature/task3637
This commit is contained in:
commit
657e97fc6d
28 changed files with 1154 additions and 614 deletions
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-07-24 18:51+0300\n"
|
||||
"POT-Creation-Date: 2017-08-03 03:10+0530\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,23 +18,18 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: templates/datacenterlight/beta_access.html:13
|
||||
msgid "Enter name"
|
||||
msgstr "Name"
|
||||
|
||||
#: templates/datacenterlight/beta_access.html:17
|
||||
msgid "Enter email"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
#: templates/datacenterlight/beta_access.html:21
|
||||
msgid "Request Beta Access"
|
||||
msgstr "Beantrage Beta-Zugang"
|
||||
|
||||
#: templates/datacenterlight/beta_success.html:10
|
||||
msgid "Request Sent"
|
||||
msgstr "Anfrage verschickt"
|
||||
|
||||
#: templates/datacenterlight/beta_success.html:13
|
||||
msgid ""
|
||||
"Thank you for your subscription! You will receive a confirmation mail from "
|
||||
"our team"
|
||||
|
@ -42,91 +37,64 @@ msgstr ""
|
|||
"Vielen dank für Ihre Anmeldung. Sie erhalten in kürze eine Bestätigungsmail "
|
||||
"von unserem Team"
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:5
|
||||
#: templates/datacenterlight/pricing.html:22
|
||||
msgid "VM hosting"
|
||||
msgstr ""
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:9
|
||||
msgid "month"
|
||||
msgstr "Monat"
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:11
|
||||
#: templates/datacenterlight/pricing.html:28
|
||||
msgid "VAT included"
|
||||
msgstr "MwSt. inklusive"
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:16
|
||||
#: templates/datacenterlight/pricing.html:33
|
||||
msgid "Hosted in Switzerland"
|
||||
msgstr "Standort: Schweiz"
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:21
|
||||
msgid "Please enter a value in range 1 - 48."
|
||||
msgstr "Bitte gib einen Wert von 1 bis 48 ein."
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:30
|
||||
msgid "Please enter a value in range 2 - 200."
|
||||
msgstr "Bitte gib einen Wert von 2 bis 200 ein."
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:39
|
||||
msgid "Please enter a value in range 10 - 2000."
|
||||
msgstr "Bitte gib einen Wert von 10 bis 200 ein."
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:40
|
||||
#: templates/datacenterlight/pricing.html:50
|
||||
msgid "GB Storage (SSD)"
|
||||
msgstr "GB Storage (SSD)"
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:59
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:60
|
||||
msgid "Your Name"
|
||||
msgstr "Dein Name"
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:60
|
||||
msgid "Please enter your name."
|
||||
msgstr "Bitte gib Deinen Namen ein."
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:74
|
||||
msgid "Email"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:75
|
||||
msgid "Your Email"
|
||||
msgstr "Deine E-Mail"
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:75
|
||||
msgid "Please enter a valid email address."
|
||||
msgstr "Bitte gib eine gültige E-Mailadresse ein."
|
||||
|
||||
#: templates/datacenterlight/calculator_form.html:88
|
||||
msgid "Continue"
|
||||
msgstr "Weiter"
|
||||
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.html:99
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:99
|
||||
msgid "Thank you for your request."
|
||||
msgstr "Vielen Dank für Ihre Anfrage."
|
||||
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.html:104
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:104
|
||||
msgid "You are one step away from being our beta tester!"
|
||||
msgstr ""
|
||||
"Sie sind nur noch einen Schritt davon entfernt, unser Beta-Tester zu werden!"
|
||||
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.html:105
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:105
|
||||
msgid ""
|
||||
"Currently we are running our tests to make sure everything runs perfectly."
|
||||
msgstr ""
|
||||
"Momentan testen wir die Beta-Umgebung um sie für Ihren Gebrauch "
|
||||
"sicherzustellen."
|
||||
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.html:106
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:106
|
||||
msgid ""
|
||||
"In the meantime, we would like to ask you a little patience<br/> until our "
|
||||
"team contacts you with beta access."
|
||||
|
@ -134,17 +102,12 @@ msgstr ""
|
|||
"Wir werden dann sobald als möglich Ihren Beta-Zugang erstellen und Sie "
|
||||
"daraufhin kontaktieren.Bis dahin bitten wir Sie um etwas Geduld."
|
||||
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.html:107
|
||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:107
|
||||
msgid "Thank you!"
|
||||
msgstr "Vielen Dank!"
|
||||
|
||||
#: templates/datacenterlight/emails/user_activation.html:99
|
||||
#: templates/datacenterlight/emails/user_activation.txt:3
|
||||
msgid "account activation"
|
||||
msgstr "Accountaktivierung"
|
||||
|
||||
#: templates/datacenterlight/emails/user_activation.html:105
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
|
@ -165,17 +128,12 @@ msgstr ""
|
|||
" %(base_url)s%(activation_link)s\n"
|
||||
" "
|
||||
|
||||
#: templates/datacenterlight/emails/user_activation.html:123
|
||||
#: templates/datacenterlight/emails/user_activation.txt:11
|
||||
msgid "Your"
|
||||
msgstr "Dein"
|
||||
|
||||
#: templates/datacenterlight/emails/user_activation.html:123
|
||||
#: templates/datacenterlight/emails/user_activation.txt:11
|
||||
msgid "team"
|
||||
msgstr "Team"
|
||||
|
||||
#: templates/datacenterlight/emails/user_activation.txt:5
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
|
@ -190,75 +148,50 @@ msgstr ""
|
|||
"Du kannst deinen %(dcl_text)s Account aktivieren, indem du hier klickst "
|
||||
"%(base_url)s%(activation_link)s\n"
|
||||
|
||||
#: templates/datacenterlight/includes/_footer.html:11
|
||||
#: templates/datacenterlight/includes/_footer.html:31
|
||||
#: templates/datacenterlight/includes/_navbar.html:27
|
||||
#: templates/datacenterlight/includes/_navbar.html:28
|
||||
#: templates/datacenterlight/index.html:19
|
||||
#: templates/datacenterlight/index.html:46
|
||||
msgid "Highlights"
|
||||
msgstr ""
|
||||
|
||||
#: templates/datacenterlight/includes/_footer.html:14
|
||||
#: templates/datacenterlight/includes/_footer.html:34
|
||||
#: templates/datacenterlight/includes/_navbar.html:30
|
||||
#: templates/datacenterlight/index.html:85
|
||||
msgid "Scale out"
|
||||
msgstr "Skalierung"
|
||||
|
||||
#: templates/datacenterlight/includes/_footer.html:17
|
||||
#: templates/datacenterlight/includes/_footer.html:37
|
||||
#: templates/datacenterlight/includes/_navbar.html:31
|
||||
#: templates/datacenterlight/index.html:111
|
||||
msgid "Reliable and light"
|
||||
msgstr "Zuverlässig und leicht"
|
||||
|
||||
#: templates/datacenterlight/includes/_footer.html:20
|
||||
#: templates/datacenterlight/includes/_navbar.html:32
|
||||
msgid "Order VM"
|
||||
msgstr "VM bestellen"
|
||||
|
||||
#: templates/datacenterlight/includes/_footer.html:23
|
||||
#: templates/datacenterlight/includes/_footer.html:44
|
||||
#: templates/datacenterlight/includes/_navbar.html:39
|
||||
msgid "Contact"
|
||||
msgstr "Kontakt"
|
||||
|
||||
#: templates/datacenterlight/includes/_footer.html:27
|
||||
msgid "Home"
|
||||
msgstr "Home"
|
||||
|
||||
#: templates/datacenterlight/includes/_footer.html:40
|
||||
msgid "Pricing"
|
||||
msgstr "Preise"
|
||||
|
||||
#: templates/datacenterlight/includes/_navbar.html:36
|
||||
#: templates/datacenterlight/whydatacenterlight.html:12
|
||||
msgid "All Rights Reserved"
|
||||
msgstr "Alle Rechte vorbehalten"
|
||||
|
||||
msgid "Why Data Center Light?"
|
||||
msgstr "Warum Data Center Light?"
|
||||
|
||||
#: templates/datacenterlight/index.html:15
|
||||
msgid "Finally, an affordable VM hosting in Switzerland!"
|
||||
msgstr "Endlich: bezahlbares VM Hosting in der Schweiz"
|
||||
|
||||
#: templates/datacenterlight/index.html:22
|
||||
msgid "I want it!"
|
||||
msgstr "Das will ich haben!"
|
||||
|
||||
#: templates/datacenterlight/index.html:52
|
||||
msgid ""
|
||||
"Reuses existing factory halls instead of building a new expensive building."
|
||||
msgstr ""
|
||||
"Verwendet ehemalige Fabrikhallen anstatt ein neues, teures Gebäude zu "
|
||||
"errichten.
"
|
||||
|
||||
#: templates/datacenterlight/index.html:57
|
||||
msgid "Only wants you to pay for what you actually need."
|
||||
msgstr ""
|
||||
"Möchte, dass du nur bezahlst, was du auch wirklich brauchst: Wähle deine "
|
||||
"Ressourcen individuell aus!
"
|
||||
|
||||
#: templates/datacenterlight/index.html:61
|
||||
msgid ""
|
||||
"Is creative, using a modern and alternative design for a data center in "
|
||||
"order to make it more sustainable and affordable at the same time."
|
||||
|
@ -267,7 +200,6 @@ msgstr ""
|
|||
"macht um Nachhaltigkeit zu fördern und somit erschwingliche Preise bieten zu "
|
||||
"können.
"
|
||||
|
||||
#: templates/datacenterlight/index.html:65
|
||||
msgid ""
|
||||
"Cuts down the costs for you by using FOSS (Free Open Source Software) "
|
||||
"exclusively, wherefore we can save money from paying licenses."
|
||||
|
@ -276,7 +208,6 @@ msgstr ""
|
|||
"mit FOSS (Free Open Source Software) arbeitet und wir daher auf "
|
||||
"Lizenzgebühren verzichten können.
"
|
||||
|
||||
#: templates/datacenterlight/index.html:88
|
||||
msgid ""
|
||||
"We don't use special hardware. We use commodity hardware: we buy computers "
|
||||
"that you buy. Just many more and put them in a cozy home for computers "
|
||||
|
@ -286,7 +217,6 @@ msgstr ""
|
|||
"erschwingliche Systeme. Bei grösserer Auslastung werden mehr "
|
||||
"Standardkomponenten hinzugekauft und skalieren so das Datencenter."
|
||||
|
||||
#: templates/datacenterlight/index.html:114
|
||||
msgid ""
|
||||
"Our VMs are located in Switzerland, with reliable power supply and fast "
|
||||
"internet connection. Our VM costs less thanks to our featherlight "
|
||||
|
@ -296,86 +226,65 @@ msgstr ""
|
|||
"Energieversorgung, sowie schneller Internetverbindung ausgestattet. Unser "
|
||||
"Angebot ist aufgrund unserer leichten Infrastruktur überaus kostengünstig."
|
||||
|
||||
#: templates/datacenterlight/index.html:132
|
||||
#: templates/datacenterlight/pricing.html:86
|
||||
msgid "Simple and affordable: Try our virtual machine with featherlight price."
|
||||
msgstr ""
|
||||
"Einfach und bezahlbar: Teste nun unsere virtuellen Maschinen mit "
|
||||
"federleichten Preisen."
|
||||
|
||||
#: templates/datacenterlight/index.html:133
|
||||
msgid "Affordable VM hosting based in Switzerland"
|
||||
msgstr "Bezahlbares VM Hosting in der Schweiz"
|
||||
|
||||
#: templates/datacenterlight/index.html:166
|
||||
msgid "Switzerland "
|
||||
msgstr "Schweiz"
|
||||
|
||||
#: templates/datacenterlight/index.html:183
|
||||
msgid "Questions?"
|
||||
msgstr "Fragen?"
|
||||
|
||||
#: templates/datacenterlight/index.html:183
|
||||
msgid "Contact us!"
|
||||
msgstr "Kontaktiere uns!"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:24
|
||||
msgid "Confirm Order"
|
||||
msgstr "Bestellung Bestätigen"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:30
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:36
|
||||
msgid "Billed To:"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:47
|
||||
msgid "Payment Method:"
|
||||
msgstr "Bezahlmethode"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:48
|
||||
msgid "ending"
|
||||
msgstr "endend in"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:58
|
||||
msgid "Order summary"
|
||||
msgstr "Bestellungsübersicht"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:62
|
||||
msgid "Cores"
|
||||
msgstr "Prozessorkerne"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:64
|
||||
msgid "Memory"
|
||||
msgstr "Arbeitsspeicher"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:66
|
||||
msgid "Disk space"
|
||||
msgstr "Festplattenkapazität"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:68
|
||||
msgid "Configuration"
|
||||
msgstr "Konfiguration"
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:70
|
||||
msgid "Total"
|
||||
msgstr ""
|
||||
|
||||
#: templates/datacenterlight/order_detail.html:77
|
||||
msgid "Place order"
|
||||
msgstr "Bestellen"
|
||||
|
||||
#: templates/datacenterlight/pricing.html:9
|
||||
msgid "We are cutting down the costs significantly!"
|
||||
msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen"
|
||||
|
||||
#: templates/datacenterlight/pricing.html:79
|
||||
msgid "Order Now!"
|
||||
msgstr "Bestelle jetzt!"
|
||||
|
||||
#: templates/datacenterlight/pricing.html:89
|
||||
msgid ""
|
||||
"Our VMs are hosted in Glarus, Switzerland, and our website is currently "
|
||||
"running in BETA mode. If you want more information that you did not find on "
|
||||
|
@ -391,25 +300,20 @@ msgstr ""
|
|||
"uns unter support@datacenterlight.ch. Unser Team wird sich umgehend um dein "
|
||||
"Anliegen kümmern!"
|
||||
|
||||
#: templates/datacenterlight/success.html:8
|
||||
msgid "Thank you for order! Our team will contact you via email"
|
||||
msgstr ""
|
||||
"Vielen Dank für die Bestellung. Unser Team setzt sich sobald wie möglich mit "
|
||||
"Ihnen via E-Mail in Verbindung."
|
||||
|
||||
#: templates/datacenterlight/success.html:10
|
||||
msgid "as soon as possible!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:26
|
||||
msgid "Tech Stack"
|
||||
msgstr "Tech Stack"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:29
|
||||
msgid "We are seriously open source."
|
||||
msgstr "Wir sind vollends opensource."
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:30
|
||||
msgid ""
|
||||
" Our full software stack is open source – We don't use anything that isn't "
|
||||
"open source. <br>Yes, we are that cool. "
|
||||
|
@ -417,43 +321,33 @@ msgstr ""
|
|||
"Unser gesamter Softwaresstack ist Open-Source – Wir verwenden nichts, das "
|
||||
"nicht Open-Source ist.<br/>Yep, so cool sind wir."
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:37
|
||||
msgid "Our services run on"
|
||||
msgstr "Unsere Dienste läuft auf"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:41
|
||||
msgid "Our monitoring"
|
||||
msgstr "Unser Monitoring"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:45
|
||||
msgid "Our storage layer"
|
||||
msgstr "Unser Storage-Layer"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:49
|
||||
msgid "Our web frontend"
|
||||
msgstr "Unser Web-Frontend"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:53
|
||||
msgid "Our cloud"
|
||||
msgstr "Unsere Cloud"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:57
|
||||
msgid "Our configuration management system"
|
||||
msgstr "Unser Konfigurationsmanagementsystem"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:61
|
||||
msgid "Our awesome juice"
|
||||
msgstr "Unser Treibstoff"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:65
|
||||
msgid "Our NAT64 gateway"
|
||||
msgstr "Unser NAT64 Gateway"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:90
|
||||
msgid "We believe in giving back to the FOSS community."
|
||||
msgstr "Wir unterstützen die FOSS Community."
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:91
|
||||
msgid ""
|
||||
"Data Center Light is the child of free and open source software (FOSS) "
|
||||
"movement. <br>We grew up with it, live by it, and believe in it.<br> The "
|
||||
|
@ -465,22 +359,18 @@ msgstr ""
|
|||
"<br/> Je weiter wir mit unserem Data Center Light vorankommen, desto mehr "
|
||||
"können wir etwas an die FOSS Community zurückgeben."
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:104
|
||||
msgid "We bring the future to you."
|
||||
msgstr "Wir bringen die Zukunft zu dir."
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:107
|
||||
msgid ""
|
||||
" Data Center Light uses the most modern technologies out there.<br>\n"
|
||||
" Your VM needs only IPv6. Data Center Light "
|
||||
"provides<br> transparent two-way IPv6/IPv4 translation.\n"
|
||||
" "
|
||||
"Data Center Light uses the most modern technologies out there.<br>Your VM "
|
||||
"needs only IPv6. Data Center Light provides<br> transparent two-way IPv6/"
|
||||
"IPv4 translation."
|
||||
msgstr ""
|
||||
"Data Center Light verwendet die zur Zeit modernsten Technologien.<br/>Deine "
|
||||
"VM läuft mit IPv6. Data Center Light bietet eine transparente IPv6/IPv4-"
|
||||
"Zweiweglösung."
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:122
|
||||
msgid ""
|
||||
" No more spinning metal plates! Data Center Light uses only SSDs. We keep "
|
||||
"things faster and lighter. "
|
||||
|
@ -488,19 +378,24 @@ msgstr ""
|
|||
"Keine drehenden Metallplatten mehr! Data Center Light verwendet "
|
||||
"ausschliesslich SSDs. Wir halten die Dinge schnell, leicht und effizient."
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:138
|
||||
msgid "Starting from only 15CHF per month. Try now."
|
||||
msgstr "Unser Angebot beginnt bei 15 CHF pro Monat. Probier's jetzt aus!"
|
||||
|
||||
#: templates/datacenterlight/whydatacenterlight.html:139
|
||||
msgid "Actions speak louder than words. Let's do it, try our VM now."
|
||||
msgstr "Tagen sagen mehr als Worte – Teste jetzt unsere VM!"
|
||||
|
||||
#: views.py:235
|
||||
msgid "Invalid number of cores"
|
||||
msgstr "Ungültige Anzahle CPU-Kerne"
|
||||
|
||||
msgid "Invalid RAM size"
|
||||
msgstr "Ungültige RAM-Grösse"
|
||||
|
||||
msgid "Invalid storage size"
|
||||
msgstr "Ungültige Speicher-Grösse"
|
||||
|
||||
msgid "is not a proper name"
|
||||
msgstr "ist kein gültiger Name"
|
||||
|
||||
#: views.py:242
|
||||
msgid "is not a proper email"
|
||||
msgstr "ist keine gültige E-Mailadresse"
|
||||
|
||||
|
|
|
@ -786,6 +786,7 @@ tech-sub-sec h2 {
|
|||
}
|
||||
|
||||
.percent-text {
|
||||
font-family: 'Lato', sans-serif;
|
||||
font-size: 50px;
|
||||
color: #999;
|
||||
}
|
||||
|
@ -794,17 +795,20 @@ tech-sub-sec h2 {
|
|||
font-size: 40px;
|
||||
line-height: 55px;
|
||||
}
|
||||
|
||||
.space-middle{
|
||||
padding: 45px 0;
|
||||
display: inline-block;
|
||||
}
|
||||
.ssdimg {
|
||||
vertical-align: middle;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.padding-vertical{
|
||||
padding: 35px 0;
|
||||
padding: 30px 9px;
|
||||
}
|
||||
|
||||
.percent-text img {
|
||||
margin-left: 20px;
|
||||
/* margin-left: 20px; */
|
||||
}
|
||||
|
||||
.space-block {
|
||||
|
@ -1086,7 +1090,7 @@ tech-sub-sec h2 {
|
|||
|
||||
@media(max-width:767px) {
|
||||
.percent-text {
|
||||
font-size: 50px;
|
||||
/* font-size: 50px; */
|
||||
}
|
||||
#tech_stack h3 {
|
||||
font-size: 30px;
|
||||
|
@ -1158,11 +1162,12 @@ tech-sub-sec h2 {
|
|||
|
||||
@media(max-width:768px) {
|
||||
.percent-text {
|
||||
font-size: 43px;
|
||||
/* font-size: 43px; */
|
||||
}
|
||||
.tech-sub-sec h2 {
|
||||
font-size: 30px;
|
||||
line-height: 40px;
|
||||
/* font-size: 30px; */
|
||||
/* line-height: 40px; */
|
||||
/* font-weight: 500; */
|
||||
}
|
||||
.single-heading h2 {
|
||||
font-size: 50px;
|
||||
|
@ -1348,7 +1353,9 @@ tech-sub-sec h2 {
|
|||
padding: 30px;
|
||||
}
|
||||
.percent-text {
|
||||
text-align: center;
|
||||
font-family: 'Lato';
|
||||
font-size: 31px;
|
||||
/* text-align: center; */
|
||||
}
|
||||
.pricing-section .card {
|
||||
width: 90%;
|
||||
|
@ -1472,3 +1479,33 @@ a#forgotpassword {
|
|||
.error-message-box {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.flex-row-rev {
|
||||
margin-top: 25px;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.flex-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.flex-row .percent-text {
|
||||
flex-shrink : 0;
|
||||
padding: 0 15px;
|
||||
}
|
||||
.flex-row .percent-text,
|
||||
.flex-row .desc-text {
|
||||
max-width: 600px;
|
||||
}
|
||||
.flex-row-rev .percent-text {
|
||||
order: 2;
|
||||
}
|
||||
.flex-row-rev {
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
}
|
||||
|
||||
.w380 {
|
||||
max-width: 380px !important;
|
||||
}
|
|
@ -2,19 +2,18 @@
|
|||
{% load i18n %}
|
||||
|
||||
<div class="modal fade bs-example-modal-sm" style="color:black;" id="successModal" tabindex="-1" role="dialog">
|
||||
<div class="vertical-alignment-helper">
|
||||
<div class="modal-dialog vertical-align-center">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">{% trans "Request Sent" %}</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>{% trans "Thank you for your subscription! You will receive a confirmation mail from our team" %}</p>
|
||||
<div class="modal-icon"><i class="fa fa-check" aria-hidden="true"></i></div>
|
||||
<h4 class="modal-title">{% trans "Request Sent" %}</h4>
|
||||
<p class="modal-text">{% trans "Thank you for your subscription! You will receive a confirmation mail from our team" %}</p>
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /.modal -->
|
||||
<script>
|
||||
// Show modal
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
{% endif %}
|
||||
</ul>
|
||||
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. All Rights Reserved</p>
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -98,34 +98,27 @@
|
|||
<hr class="thick-divider"/><!-- Divider -->
|
||||
<div class="space">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 tech-sub-sec">
|
||||
<div class="tech-sub-sec">
|
||||
<h2>{% trans "We bring the future to you." %}</h2>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 text-left tech-sub-sec landscape-xs-6">
|
||||
<p class="lead new-lead">{% blocktrans %} Data Center Light uses the most modern technologies out there.<br>
|
||||
Your VM needs only IPv6. Data Center Light provides<br> transparent two-way IPv6/IPv4 translation.
|
||||
{% endblocktrans %}</p>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 percent-text text-right landscape-xs-6">
|
||||
<div class="flex-row flex-row-rev">
|
||||
<div class="percent-text">
|
||||
100% <strong>IPv6</strong>
|
||||
</div>
|
||||
<div class="desc-text padding-vertical">
|
||||
<p class="lead new-lead">{% blocktrans %}Data Center Light uses the most modern technologies out there.<br>Your VM needs only IPv6. Data Center Light provides<br> transparent two-way IPv6/IPv4 translation.{% endblocktrans %}</p>
|
||||
</div>
|
||||
<div class="col-lg-12 space-block"></div>
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
|
||||
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 percent-text landscape-xs-8">
|
||||
<span class="pull-left space-middle"> 100% <strong>SSD</strong></span> <span class="pull-left ssdimg"><img class="img-responsive" src="{% static 'datacenterlight/img/ssd.jpg' %}" alt="SSD"></span>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 text-right tech-sub-sec padding-vertical landscape-xs-4">
|
||||
<div>
|
||||
<div class="flex-row">
|
||||
<div class="percent-text">
|
||||
<span class="space-middle"> 100% <strong>SSD</strong></span> <span class="ssdimg"><img class="img-responsive" src="{% static 'datacenterlight/img/ssd.jpg' %}" alt="SSD"></span>
|
||||
</div>
|
||||
<div class="desc-text padding-vertical w380">
|
||||
<p class="lead new-lead">{% blocktrans %} No more spinning metal plates! Data Center Light uses only SSDs. We keep things faster and lighter. {% endblocktrans %}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.container -->
|
||||
</div>
|
||||
<!-- /.content-section-b -->
|
||||
|
|
|
@ -19,7 +19,6 @@ from hosting.models import HostingOrder, HostingBill
|
|||
from utils.stripe_utils import StripeUtils
|
||||
from datetime import datetime
|
||||
from membership.models import CustomUser, StripeCustomer
|
||||
|
||||
from opennebula_api.models import OpenNebulaManager
|
||||
from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer
|
||||
|
||||
|
@ -34,6 +33,7 @@ class SuccessView(TemplateView):
|
|||
def get(self, request, *args, **kwargs):
|
||||
if 'specs' not in request.session or 'user' not in request.session:
|
||||
return HttpResponseRedirect(reverse('datacenterlight:index'))
|
||||
|
||||
elif 'token' not in request.session:
|
||||
return HttpResponseRedirect(reverse('datacenterlight:payment'))
|
||||
elif 'order_confirmation' not in request.session:
|
||||
|
@ -79,7 +79,8 @@ class PricingView(TemplateView):
|
|||
manager = OpenNebulaManager()
|
||||
template = manager.get_template(template_id)
|
||||
|
||||
request.session['template'] = VirtualMachineTemplateSerializer(template).data
|
||||
request.session['template'] = VirtualMachineTemplateSerializer(
|
||||
template).data
|
||||
|
||||
if not request.user.is_authenticated():
|
||||
request.session['next'] = reverse('hosting:payment')
|
||||
|
@ -131,7 +132,8 @@ class BetaAccessView(FormView):
|
|||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
|
||||
messages.add_message(self.request, messages.SUCCESS, self.success_message)
|
||||
messages.add_message(
|
||||
self.request, messages.SUCCESS, self.success_message)
|
||||
return render(self.request, 'datacenterlight/beta_success.html', {})
|
||||
|
||||
|
||||
|
@ -183,7 +185,8 @@ class BetaProgramView(CreateView):
|
|||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
|
||||
messages.add_message(self.request, messages.SUCCESS, self.success_message)
|
||||
messages.add_message(
|
||||
self.request, messages.SUCCESS, self.success_message)
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
|
||||
|
@ -196,15 +199,15 @@ class IndexView(CreateView):
|
|||
|
||||
def validate_cores(self, value):
|
||||
if (value > 48) or (value < 1):
|
||||
raise ValidationError(_('Not a proper cores number'))
|
||||
raise ValidationError(_('Invalid number of cores'))
|
||||
|
||||
def validate_memory(self, value):
|
||||
if (value > 200) or (value < 2):
|
||||
raise ValidationError(_('Not a proper ram number'))
|
||||
raise ValidationError(_('Invalid RAM size'))
|
||||
|
||||
def validate_storage(self, value):
|
||||
if (value > 2000) or (value < 10):
|
||||
raise ValidationError(_('Not a proper storage number'))
|
||||
raise ValidationError(_('Invalid storage size'))
|
||||
|
||||
@cache_control(no_cache=True, must_revalidate=True, no_store=True)
|
||||
def get(self, request, *args, **kwargs):
|
||||
|
@ -227,7 +230,8 @@ class IndexView(CreateView):
|
|||
storage_field = forms.IntegerField(validators=[self.validate_storage])
|
||||
price = request.POST.get('total')
|
||||
template_id = int(request.POST.get('config'))
|
||||
template = VMTemplate.objects.filter(opennebula_vm_template_id=template_id).first()
|
||||
template = VMTemplate.objects.filter(
|
||||
opennebula_vm_template_id=template_id).first()
|
||||
template_data = VMTemplateSerializer(template).data
|
||||
|
||||
name = request.POST.get('name')
|
||||
|
@ -239,35 +243,40 @@ class IndexView(CreateView):
|
|||
cores = cores_field.clean(cores)
|
||||
except ValidationError as err:
|
||||
msg = '{} : {}.'.format(cores, str(err))
|
||||
messages.add_message(self.request, messages.ERROR, msg, extra_tags='cores')
|
||||
messages.add_message(
|
||||
self.request, messages.ERROR, msg, extra_tags='cores')
|
||||
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
try:
|
||||
memory = memory_field.clean(memory)
|
||||
except ValidationError as err:
|
||||
msg = '{} : {}.'.format(memory, str(err))
|
||||
messages.add_message(self.request, messages.ERROR, msg, extra_tags='memory')
|
||||
messages.add_message(
|
||||
self.request, messages.ERROR, msg, extra_tags='memory')
|
||||
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
try:
|
||||
storage = storage_field.clean(storage)
|
||||
except ValidationError as err:
|
||||
msg = '{} : {}.'.format(storage, str(err))
|
||||
messages.add_message(self.request, messages.ERROR, msg, extra_tags='storage')
|
||||
messages.add_message(
|
||||
self.request, messages.ERROR, msg, extra_tags='storage')
|
||||
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
try:
|
||||
name = name_field.clean(name)
|
||||
except ValidationError as err:
|
||||
msg = '{} {}.'.format(name, _('is not a proper name'))
|
||||
messages.add_message(self.request, messages.ERROR, msg, extra_tags='name')
|
||||
messages.add_message(
|
||||
self.request, messages.ERROR, msg, extra_tags='name')
|
||||
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
try:
|
||||
email = email_field.clean(email)
|
||||
except ValidationError as err:
|
||||
msg = '{} {}.'.format(email, _('is not a proper email'))
|
||||
messages.add_message(self.request, messages.ERROR, msg, extra_tags='email')
|
||||
messages.add_message(
|
||||
self.request, messages.ERROR, msg, extra_tags='email')
|
||||
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
specs = {
|
||||
|
@ -332,7 +341,8 @@ class IndexView(CreateView):
|
|||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
|
||||
messages.add_message(self.request, messages.SUCCESS, self.success_message)
|
||||
messages.add_message(
|
||||
self.request, messages.SUCCESS, self.success_message)
|
||||
return super(IndexView, self).form_valid(form)
|
||||
|
||||
|
||||
|
@ -401,6 +411,7 @@ class PaymentOrderView(FormView):
|
|||
|
||||
# Create Billing Address
|
||||
billing_address = form.save()
|
||||
|
||||
request.session['billing_address_data'] = billing_address_data
|
||||
request.session['billing_address'] = billing_address.id
|
||||
request.session['token'] = token
|
||||
|
@ -425,11 +436,13 @@ class OrderConfirmationView(DetailView):
|
|||
stripe_customer_id = request.session.get('customer')
|
||||
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
||||
stripe_utils = StripeUtils()
|
||||
card_details = stripe_utils.get_card_details(customer.stripe_id, request.session.get('token'))
|
||||
card_details = stripe_utils.get_card_details(
|
||||
customer.stripe_id, request.session.get('token'))
|
||||
if not card_details.get('response_object') and not card_details.get('paid'):
|
||||
msg = card_details.get('error')
|
||||
messages.add_message(self.request, messages.ERROR, msg, extra_tags='failed_payment')
|
||||
return HttpResponseRedirect(reverse('datacenterlight:payment'))
|
||||
|
||||
context = {
|
||||
'site_url': reverse('datacenterlight:index'),
|
||||
'cc_last4': card_details.get('response_object').get('last4'),
|
||||
|
@ -445,7 +458,8 @@ class OrderConfirmationView(DetailView):
|
|||
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
||||
billing_address_data = request.session.get('billing_address_data')
|
||||
billing_address_id = request.session.get('billing_address')
|
||||
billing_address = BillingAddress.objects.filter(id=billing_address_id).first()
|
||||
billing_address = BillingAddress.objects.filter(
|
||||
id=billing_address_id).first()
|
||||
vm_template_id = template.get('id', 1)
|
||||
final_price = specs.get('price')
|
||||
|
||||
|
|
|
@ -195,7 +195,7 @@ CMS_TEMPLATES = (
|
|||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': 'app'
|
||||
'NAME': 'app',
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import datetime
|
||||
|
||||
from django import forms
|
||||
from membership.models import CustomUser
|
||||
from django.contrib.auth import authenticate
|
||||
|
@ -7,6 +9,10 @@ from django.utils.translation import ugettext_lazy as _
|
|||
from .models import UserHostingKey
|
||||
|
||||
|
||||
def generate_ssh_key_name():
|
||||
return 'dcl-generated-key-' + datetime.datetime.now().strftime('%m%d%y%H%M')
|
||||
|
||||
|
||||
class HostingUserLoginForm(forms.Form):
|
||||
|
||||
email = forms.CharField(widget=forms.EmailInput())
|
||||
|
@ -20,9 +26,11 @@ class HostingUserLoginForm(forms.Form):
|
|||
password = self.cleaned_data.get('password')
|
||||
is_auth = authenticate(email=email, password=password)
|
||||
if not is_auth:
|
||||
raise forms.ValidationError("Your username and/or password were incorrect.")
|
||||
raise forms.ValidationError(
|
||||
_("Your username and/or password were incorrect."))
|
||||
elif is_auth.validated == 0:
|
||||
raise forms.ValidationError(_("Your account is not activated yet."))
|
||||
raise forms.ValidationError(
|
||||
_("Your account is not activated yet."))
|
||||
return self.cleaned_data
|
||||
|
||||
def clean_email(self):
|
||||
|
@ -58,15 +66,19 @@ class HostingUserSignupForm(forms.ModelForm):
|
|||
|
||||
class UserHostingKeyForm(forms.ModelForm):
|
||||
private_key = forms.CharField(widget=forms.HiddenInput(), required=False)
|
||||
public_key = forms.CharField(widget=forms.Textarea(), required=False,
|
||||
help_text=_('Paste here your public key'))
|
||||
public_key = forms.CharField(widget=forms.Textarea(
|
||||
attrs={'class': 'form_public_key', 'placeholder': _('Paste here your public key')}),
|
||||
required=False,
|
||||
)
|
||||
user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(),
|
||||
required=False, widget=forms.HiddenInput())
|
||||
name = forms.CharField(required=True)
|
||||
name = forms.CharField(required=False, widget=forms.TextInput(
|
||||
attrs={'class': 'form_key_name', 'placeholder': _('Give a name to your key')}))
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.request = kwargs.pop("request")
|
||||
super(UserHostingKeyForm, self).__init__(*args, **kwargs)
|
||||
self.fields['name'].label = _('Key name')
|
||||
|
||||
def clean_name(self):
|
||||
return self.data.get('name')
|
||||
|
@ -76,7 +88,8 @@ class UserHostingKeyForm(forms.ModelForm):
|
|||
|
||||
def clean(self):
|
||||
cleaned_data = self.cleaned_data
|
||||
|
||||
if not self.cleaned_data.get('name', ''):
|
||||
self.cleaned_data['name'] = generate_ssh_key_name()
|
||||
if not cleaned_data.get('public_key'):
|
||||
private_key, public_key = UserHostingKey.generate_keys()
|
||||
cleaned_data.update({
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-07-17 00:53+0530\n"
|
||||
"POT-Creation-Date: 2017-08-03 03:31+0530\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,359 +18,274 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: forms.py:25
|
||||
msgid "Your username and/or password were incorrect."
|
||||
msgstr "Dein Benutzername und/oder Dein Passwort ist falsch."
|
||||
|
||||
msgid "Your account is not activated yet."
|
||||
msgstr "Dein Account wurde noch nicht aktiviert."
|
||||
|
||||
#: forms.py:62
|
||||
msgid "Paste here your public key"
|
||||
msgstr "Fügen Sie Ihren public key ein"
|
||||
msgstr "Füge deinen Public Key ein"
|
||||
|
||||
msgid "Give a name to your key"
|
||||
msgstr "Gebe deinem SSH-Key einen Name"
|
||||
|
||||
msgid "Key name"
|
||||
msgstr "Key-Name"
|
||||
|
||||
#: templates/hosting/base_short.html:71
|
||||
msgid "My Virtual Machines"
|
||||
msgstr "Meine virtuellen Maschinen"
|
||||
|
||||
#: templates/hosting/base_short.html:76 templates/hosting/orders.html.py:12
|
||||
msgid "My Orders"
|
||||
msgstr "Meine Bestellungen"
|
||||
|
||||
#: templates/hosting/base_short.html:85
|
||||
msgid "Keys"
|
||||
msgstr "Schlüssel"
|
||||
|
||||
#: templates/hosting/base_short.html:90
|
||||
msgid "Notifications "
|
||||
msgstr "Benachrichtigungen"
|
||||
|
||||
#: templates/hosting/base_short.html:93
|
||||
msgid "Logout"
|
||||
msgstr "Abmelden"
|
||||
|
||||
#: templates/hosting/base_short.html:98
|
||||
msgid "How it works"
|
||||
msgstr "So funktioniert es"
|
||||
msgid "All Rights Reserved"
|
||||
msgstr "Alle Rechte vorbehalten"
|
||||
|
||||
#: 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"
|
||||
msgstr "Rechnung"
|
||||
|
||||
#: templates/hosting/bill_detail.html:11 templates/hosting/order_detail.html:23
|
||||
msgid "Order #"
|
||||
msgstr "Bestellung #"
|
||||
|
||||
#: templates/hosting/bill_detail.html:25
|
||||
msgid "ungleich GmbH"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:26
|
||||
msgid "buchhaltung@ungleich.ch"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:27
|
||||
msgid "Hauptstrasse 14"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:28
|
||||
msgid "CH-8775 Luchsingen"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:29
|
||||
msgid "Mwst-Nummer: CHE-109.549.333 MWST"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:60
|
||||
msgid "Total:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:68
|
||||
#, python-format
|
||||
msgid "Alles Preise in CHF mit 8%% Mehrwertsteuer."
|
||||
msgstr "All prices in CHF including 8%% VAT"
|
||||
|
||||
#: templates/hosting/bill_detail.html:69
|
||||
msgid "Betrag zahlbar innerhalb von 30 Tagen ab Rechnungseingang."
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:70
|
||||
msgid "Kontoverbindung:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:73
|
||||
msgid "IBAN:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:76
|
||||
msgid "BIC:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:81
|
||||
msgid "CH02 0900 0000 6071 8848 8"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bill_detail.html:84
|
||||
msgid "POFICHBEXXX"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bills.html:12
|
||||
msgid "Customers"
|
||||
msgstr "Kunden"
|
||||
|
||||
#: templates/hosting/bills.html:16 templates/hosting/user_keys.html.py:25
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bills.html:17
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/bills.html:28
|
||||
msgid "View Bill"
|
||||
msgstr "Rechnung anzeigen"
|
||||
|
||||
#: templates/hosting/bills.html:41 templates/hosting/orders.html.py:82
|
||||
#: templates/hosting/virtual_machines.html:70
|
||||
msgid "previous"
|
||||
msgstr "vorherige"
|
||||
|
||||
#: templates/hosting/bills.html:47 templates/hosting/orders.html.py:88
|
||||
#: templates/hosting/virtual_machines.html:76
|
||||
msgid "next"
|
||||
msgstr "nächste"
|
||||
|
||||
#: templates/hosting/confirm_reset_password.html:10
|
||||
#: templates/hosting/login.html:12 templates/hosting/reset_password.html:10
|
||||
#: templates/hosting/signup.html:9 templates/hosting/signup_validate.html:9
|
||||
msgid "SSH Key"
|
||||
msgstr "SSH Key"
|
||||
|
||||
msgid "Choose a key option in order to access your VM"
|
||||
msgstr "Wähle eine Option um Zugriff auf deine VM zu erhalten"
|
||||
|
||||
msgid "Generating a new key pair"
|
||||
msgstr "Neuen SSH-Key erstellen"
|
||||
|
||||
msgid "I want to generate a new key pair"
|
||||
msgstr "Ich möchte einen neuen SSH-Key erstellen"
|
||||
|
||||
msgid "Generate"
|
||||
msgstr "Generieren"
|
||||
|
||||
msgid "Using existing key"
|
||||
msgstr "Nutzung eines existierenden SSH-Keys"
|
||||
|
||||
msgid "I want to use my existing public key"
|
||||
msgstr "Ich möchte einen existierenden SSH-Key nutzen"
|
||||
|
||||
msgid "Upload"
|
||||
msgstr "Hochladen"
|
||||
|
||||
msgid "Your VM hosted in Switzerland"
|
||||
msgstr "deine VM in der Schweiz"
|
||||
|
||||
#: templates/hosting/confirm_reset_password.html:14
|
||||
msgid "Set your new password"
|
||||
msgstr "Setze dein neues Passwort"
|
||||
|
||||
#: templates/hosting/confirm_reset_password.html:29
|
||||
#: templates/hosting/reset_password.html:23
|
||||
msgid "Reset"
|
||||
msgstr "Zurücksetzen"
|
||||
|
||||
#: templates/hosting/confirm_reset_password.html:35
|
||||
#: templates/hosting/reset_password.html:29 templates/hosting/signup.html:27
|
||||
msgid "Already have an account ?"
|
||||
msgstr "Hast Du bereits ein Benutzerkonto?"
|
||||
|
||||
#: templates/hosting/create_virtual_machine.html:20
|
||||
msgid "Login"
|
||||
msgstr "Anmelden"
|
||||
|
||||
msgid "New Virtual Machine"
|
||||
msgstr "Neue virtuelle Maschine"
|
||||
|
||||
#: templates/hosting/create_virtual_machine.html:28
|
||||
msgid "Step 1. Select VM Template:"
|
||||
msgstr "Wähle eine Vorlage"
|
||||
|
||||
#: templates/hosting/create_virtual_machine.html:42
|
||||
msgid "Step2. Select VM Configuration"
|
||||
msgstr "Wähle eine Konfiguration"
|
||||
|
||||
#: templates/hosting/create_virtual_machine.html:59
|
||||
msgid "Price "
|
||||
msgstr "Preis"
|
||||
|
||||
#: templates/hosting/create_virtual_machine.html:59
|
||||
msgid "CHF/Month"
|
||||
msgstr "CHF/Monat"
|
||||
|
||||
#: templates/hosting/create_virtual_machine.html:61
|
||||
msgid "Start VM"
|
||||
msgstr "VM jetzt starten"
|
||||
|
||||
#: templates/hosting/emails/password_reset_email.html:2
|
||||
#: templates/hosting/emails/password_reset_email.txt:2
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You're receiving this email because you requested a password reset for your "
|
||||
"user account at %(site_name)s."
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/emails/password_reset_email.html:4
|
||||
#: templates/hosting/emails/password_reset_email.txt:4
|
||||
msgid "Please go to the following page and choose a new password:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/emails/password_reset_email.html:9
|
||||
#: templates/hosting/emails/password_reset_email.txt:9
|
||||
msgid "Thanks for using our site!"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/emails/password_reset_email.html:11
|
||||
#: templates/hosting/emails/password_reset_email.txt:11
|
||||
#, python-format
|
||||
msgid "The %(site_name)s team"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/login.html:34
|
||||
msgid "Don't have an account yet ? "
|
||||
msgstr "Besitzt du kein Benutzerkonto?"
|
||||
|
||||
#: templates/hosting/login.html:37 templates/hosting/signup.html.py:13
|
||||
#: templates/hosting/signup.html:21 views.py:219
|
||||
msgid "Sign up"
|
||||
msgstr "Registrieren"
|
||||
|
||||
#: templates/hosting/login.html:39
|
||||
msgid "Forgot your password ? "
|
||||
msgstr "Passwort vergessen?"
|
||||
|
||||
#: templates/hosting/notifications.html:9
|
||||
msgid "Notifications"
|
||||
msgstr "Benachrichtigungen"
|
||||
|
||||
#: templates/hosting/notifications.html:16
|
||||
msgid "Unread"
|
||||
msgstr "Ungelesen"
|
||||
|
||||
#: templates/hosting/notifications.html:26
|
||||
msgid "All"
|
||||
msgstr "Alle"
|
||||
|
||||
#: templates/hosting/notifications.html:38
|
||||
msgid "Unread notifications"
|
||||
msgstr "Ungelesene Benachrichtigungen"
|
||||
|
||||
#: templates/hosting/notifications.html:48
|
||||
msgid "Mark as read"
|
||||
msgstr "Als gelesen markieren"
|
||||
|
||||
#: templates/hosting/notifications.html:59
|
||||
msgid "All notifications"
|
||||
msgstr "Alle Benachrichtigungen"
|
||||
|
||||
#: templates/hosting/order_detail.html:23
|
||||
msgid "Confirm Order"
|
||||
msgstr "Bestellung Bestätigen"
|
||||
|
||||
#: templates/hosting/order_detail.html:29
|
||||
msgid "Billed To:"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
#: templates/hosting/order_detail.html:37 templates/hosting/orders.html:17
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
#: templates/hosting/order_detail.html:39
|
||||
msgid "Status:"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/order_detail.html:51
|
||||
msgid "Billed To:"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
msgid "Payment Method:"
|
||||
msgstr "Bezahlmethode"
|
||||
|
||||
#: templates/hosting/order_detail.html:62
|
||||
msgid "Order summary"
|
||||
msgstr "Bestellungsübersicht"
|
||||
|
||||
#: templates/hosting/order_detail.html:65 templates/hosting/payment.html:13
|
||||
#: templates/hosting/virtual_machine_detail.html:76
|
||||
msgid "Cores"
|
||||
msgstr "Prozessorkerne"
|
||||
|
||||
#: templates/hosting/order_detail.html:67 templates/hosting/payment.html:16
|
||||
#: templates/hosting/virtual_machine_detail.html:82
|
||||
msgid "Memory"
|
||||
msgstr "Arbeitsspeicher"
|
||||
|
||||
#: templates/hosting/order_detail.html:69 templates/hosting/payment.html:19
|
||||
msgid "Disk space"
|
||||
msgstr "Festplattenkapazität"
|
||||
|
||||
#: templates/hosting/order_detail.html:71 templates/hosting/payment.html:41
|
||||
msgid "Total"
|
||||
msgstr "Gesamt"
|
||||
|
||||
#: templates/hosting/order_detail.html:77
|
||||
msgid "Finish Configuration"
|
||||
msgstr "Konfiguration beenden"
|
||||
|
||||
#: templates/hosting/orders.html:18
|
||||
msgid "Amount"
|
||||
msgstr "Betrag"
|
||||
|
||||
#: templates/hosting/orders.html:19 templates/hosting/user_keys.html.py:27
|
||||
#: templates/hosting/virtual_machine_detail.html:30
|
||||
#: templates/hosting/virtual_machines.html:31
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/orders.html:30
|
||||
msgid "Approved"
|
||||
msgstr "Akzeptiert"
|
||||
|
||||
#: templates/hosting/orders.html:32
|
||||
msgid "Declined"
|
||||
msgstr "Abgelehnt"
|
||||
|
||||
#: templates/hosting/orders.html:37 templates/hosting/virtual_machines.html:58
|
||||
msgid "View Detail"
|
||||
msgstr "Details anzeigen"
|
||||
|
||||
#: templates/hosting/orders.html:40
|
||||
msgid "Cancel Order"
|
||||
msgstr "Bestellung stornieren"
|
||||
|
||||
#: templates/hosting/orders.html:55
|
||||
msgid "Do You want to delete your order?"
|
||||
#, fuzzy
|
||||
#| msgid "Do You want to delete your order?"
|
||||
msgid "Do you want to delete your order?"
|
||||
msgstr "Willst du deine Bestellung löschen?"
|
||||
|
||||
#: templates/hosting/orders.html:63 templates/hosting/user_keys.html.py:63
|
||||
msgid "Close"
|
||||
msgstr "Schliessen"
|
||||
|
||||
#: templates/hosting/orders.html:65 templates/hosting/user_keys.html.py:65
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
#: templates/hosting/payment.html:10
|
||||
msgid "Your Order"
|
||||
msgstr "Deine Bestellung"
|
||||
|
||||
#: templates/hosting/payment.html:22
|
||||
#: templates/hosting/virtual_machine_detail.html:98
|
||||
msgid "Configuration"
|
||||
msgstr "Konfiguration"
|
||||
|
||||
#: templates/hosting/payment.html:41
|
||||
msgid "including VAT"
|
||||
msgstr "inkl. Mehrwertsteuer"
|
||||
|
||||
#: templates/hosting/payment.html:55
|
||||
msgid "Billing Address"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
#: templates/hosting/payment.html:66
|
||||
msgid "Credit Card"
|
||||
msgstr "Kreditkarte"
|
||||
|
||||
#: templates/hosting/payment.html:71
|
||||
msgid ""
|
||||
"\n"
|
||||
" Please fill in your credit card information "
|
||||
|
@ -385,7 +300,6 @@ msgstr ""
|
|||
"\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und "
|
||||
"speichern keine Informationen in unserer Datenbank."
|
||||
|
||||
#: templates/hosting/payment.html:90
|
||||
msgid ""
|
||||
"\n"
|
||||
" You are not making any payment yet. "
|
||||
|
@ -399,27 +313,21 @@ msgstr ""
|
|||
"Kreditkateninformationen wirst du auf die Bestellbestätigungsseite "
|
||||
"weitergeleitet."
|
||||
|
||||
#: templates/hosting/payment.html:101 templates/hosting/payment.html.py:143
|
||||
msgid "Submit"
|
||||
msgstr "Absenden"
|
||||
|
||||
#: templates/hosting/payment.html:113
|
||||
msgid "Card Number"
|
||||
msgstr "Kreditkartennummer"
|
||||
|
||||
#: templates/hosting/payment.html:117
|
||||
msgid "Expiry Date"
|
||||
msgstr "Ablaufdatum"
|
||||
|
||||
#: templates/hosting/payment.html:122
|
||||
msgid "CVC"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/payment.html:126
|
||||
msgid "Card Type"
|
||||
msgstr "Kartentyp"
|
||||
|
||||
#: templates/hosting/payment.html:135
|
||||
msgid ""
|
||||
"\n"
|
||||
" You are not making any payment "
|
||||
|
@ -433,125 +341,115 @@ msgstr ""
|
|||
"Kreditkateninformationen wirst du auf die Bestellbestätigungsseite "
|
||||
"weitergeleitet."
|
||||
|
||||
#: templates/hosting/payment.html:178
|
||||
msgid "Processing"
|
||||
msgstr "Weiter"
|
||||
|
||||
#: templates/hosting/payment.html:179
|
||||
msgid "Enter your credit card number"
|
||||
msgstr "Deine Kreditkartennummer"
|
||||
|
||||
#: templates/hosting/reset_password.html:15
|
||||
msgid "Reset your password"
|
||||
msgstr "Passwort zurücksetzen"
|
||||
|
||||
#: templates/hosting/user_key.html:11 templates/hosting/user_keys.html.py:9
|
||||
msgid "Access Key"
|
||||
msgstr "Zugriffsschlüssel"
|
||||
msgid "Add your public SSH key"
|
||||
msgstr "Füge deinen öffentlichen SSH-Key hinzu"
|
||||
|
||||
#: templates/hosting/user_key.html:24
|
||||
msgid "Upload your own key. "
|
||||
msgstr "Lade deinen Key hoch"
|
||||
msgid "Use your created key to access to the VM"
|
||||
msgstr "Benutze deinen erstellten SSH-Key um auf deine VM zugreifen zu können"
|
||||
|
||||
#: templates/hosting/user_key.html:28
|
||||
msgid "Or generate a new key pair."
|
||||
msgstr "Oder erstelle dein neues Keypaar"
|
||||
msgid "Add SSH Key"
|
||||
msgstr "Hinzufügen"
|
||||
|
||||
#: templates/hosting/user_key.html:30
|
||||
msgid "Generate Key Pair"
|
||||
msgstr "Schlüsselpaar generieren"
|
||||
msgid "Or you can generate a new key pair"
|
||||
msgstr "Erstelle dein neues Keypaar"
|
||||
|
||||
#: templates/hosting/user_key.html:40
|
||||
msgid "Warning!"
|
||||
msgstr "Achtung!"
|
||||
|
||||
#: templates/hosting/user_key.html:40
|
||||
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 ""
|
||||
"Du kannst deinen privaten SSH Schlüssel nur einmal herunterladen. Beware ihn "
|
||||
"sicher auf."
|
||||
|
||||
#: templates/hosting/user_keys.html:18
|
||||
msgid "Add Key"
|
||||
msgstr "Schlüssel hinzufügen"
|
||||
msgid "Your SSH Keys"
|
||||
msgstr "Deine SSH Keys"
|
||||
|
||||
#: templates/hosting/user_keys.html:26
|
||||
msgid "Created at"
|
||||
msgstr "Erstellt am"
|
||||
msgid ""
|
||||
"To generate a new key pair or to upload your existing key, click 'Add Key'"
|
||||
msgstr ""
|
||||
"Um einen neuen SSH-Key zu erstellen oder um einen vorhandenen SSH-Key "
|
||||
"hinzuzufügen, klicke auf 'Hinzufügen'"
|
||||
|
||||
#: templates/hosting/user_keys.html:43
|
||||
msgid "Delete Key"
|
||||
msgstr "Löschen"
|
||||
|
||||
#: templates/hosting/user_keys.html:56
|
||||
msgid "Public Key"
|
||||
msgstr ""
|
||||
|
||||
msgid "Private Key"
|
||||
msgstr ""
|
||||
|
||||
msgid "Do You want to delete this key?"
|
||||
msgstr "Möchtest Du den Schlüssel löschen?"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:19
|
||||
msgid "Close"
|
||||
msgstr "Schliessen"
|
||||
|
||||
msgid "Show"
|
||||
msgstr "Anzeigen"
|
||||
|
||||
msgid "Public ssh key"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
msgid "Settings"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:25
|
||||
msgid "Billing"
|
||||
msgstr "Abrechnungen"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:60
|
||||
msgid "Ip not assigned yet"
|
||||
msgstr "Ip nicht zugewiesen"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:89
|
||||
msgid "Disk"
|
||||
msgstr "Festplatte"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:108
|
||||
msgid "Current pricing"
|
||||
msgstr "Aktueller Preis"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:117
|
||||
msgid "Current status"
|
||||
msgstr "Aktueller Status"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:142
|
||||
msgid "Terminate Virtual Machine"
|
||||
msgstr "Virtuelle Maschine beenden"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:163
|
||||
msgid "Terminate your Virtual Machine"
|
||||
msgstr "Ihre virtuelle Maschine beenden"
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:166
|
||||
msgid "Are you sure do you want to cancel your Virtual Machine "
|
||||
msgstr "Sind Sie sicher, dass Sie ihre virtuelle Maschine beenden wollen "
|
||||
|
||||
#: templates/hosting/virtual_machine_detail.html:169
|
||||
msgid "Cancel"
|
||||
msgstr "Beenden"
|
||||
|
||||
#: templates/hosting/virtual_machines.html:9
|
||||
msgid "Virtual Machines"
|
||||
msgstr "Virtuelle Maschinen"
|
||||
|
||||
#: templates/hosting/virtual_machines.html:22
|
||||
msgid "Create VM"
|
||||
msgstr "Neue VM"
|
||||
|
||||
#: templates/hosting/virtual_machines.html:28
|
||||
msgid "ID"
|
||||
msgstr ""
|
||||
|
||||
#: templates/hosting/virtual_machines.html:29
|
||||
msgid "Ipv4"
|
||||
msgstr "IPv4"
|
||||
|
||||
#: templates/hosting/virtual_machines.html:30
|
||||
msgid "Ipv6"
|
||||
msgstr "IPv6"
|
||||
|
||||
#: views.py:207 views.py:229
|
||||
msgid "login"
|
||||
msgstr "einloggen"
|
||||
|
||||
#: views.py:212
|
||||
msgid ""
|
||||
"Thank you for signing up. We have sent an email to you. Please follow the "
|
||||
"instructions in it to activate your account. Once activated, you can login "
|
||||
|
@ -561,32 +459,135 @@ msgstr ""
|
|||
"den Anweisungen um deinen Account zu aktivieren. Danach kannst du dich über "
|
||||
"diesen"
|
||||
|
||||
#: views.py:214 views.py:240
|
||||
msgid "Go back to"
|
||||
msgstr "Zurück"
|
||||
|
||||
#: views.py:230
|
||||
msgid "Account activation"
|
||||
msgstr "Accountaktivierung"
|
||||
|
||||
#: views.py:233
|
||||
msgid "Your account has been activated."
|
||||
msgstr "Dein Account wurde aktiviert."
|
||||
|
||||
#: views.py:234
|
||||
msgid "You can now"
|
||||
msgstr "Du kannst dich nun"
|
||||
|
||||
#: views.py:239
|
||||
msgid "Sorry. Your request is invalid."
|
||||
msgstr "Entschuldigung, deine Anfrage ist ungültig."
|
||||
|
||||
#: views.py:757
|
||||
msgid ""
|
||||
"We could not find the requested VM. Please "
|
||||
"contact Data Center Light Support."
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Cancel"
|
||||
#~ msgstr "Beenden"
|
||||
|
||||
#~ msgid "Add SSH key"
|
||||
#~ msgstr "Hinzufügen"
|
||||
|
||||
#~ msgid "Keys"
|
||||
#~ msgstr "Schlüssel"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Contact"
|
||||
#~ msgid "Content"
|
||||
#~ msgstr "Kontakt"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Contact"
|
||||
#~ msgid "DG.Contact"
|
||||
#~ msgstr "Kontakt"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Home"
|
||||
#~ msgid "DG.Home"
|
||||
#~ msgstr "Home"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Amount"
|
||||
#~ msgid "Country"
|
||||
#~ msgstr "Betrag"
|
||||
|
||||
#~ msgid "Log in"
|
||||
#~ msgstr "Anmelden"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Configuration"
|
||||
#~ msgid "Donation #"
|
||||
#~ msgstr "Konfiguration"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Billing Address"
|
||||
#~ msgid "Billing Address:"
|
||||
#~ msgstr "Rechnungsadresse"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Date"
|
||||
#~ msgid "Date:"
|
||||
#~ msgstr "Datum"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Configuration"
|
||||
#~ msgid "Donation"
|
||||
#~ msgstr "Konfiguration"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "View Detail"
|
||||
#~ msgid "View Donations"
|
||||
#~ msgstr "Details anzeigen"
|
||||
|
||||
#~ msgid "You haven been logged out"
|
||||
#~ msgstr "Sie wurden abgmeldet"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Log in"
|
||||
#~ msgid "Log in "
|
||||
#~ msgstr "Anmelden"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "View Detail"
|
||||
#~ msgid "DG.Detail"
|
||||
#~ msgstr "Details anzeigen"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Cancel"
|
||||
#~ msgid "France"
|
||||
#~ msgstr "Beenden"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Enter your credit card number"
|
||||
#~ msgid "Enter your name or company name"
|
||||
#~ msgstr "Deine Kreditkartennummer"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Card Number"
|
||||
#~ msgid "Cardholder Name"
|
||||
#~ msgstr "Kreditkartennummer"
|
||||
|
||||
#~ msgid "How it works"
|
||||
#~ msgstr "So funktioniert es"
|
||||
|
||||
#~ msgid "Your infrastructure"
|
||||
#~ msgstr "deine Infrastruktur"
|
||||
|
||||
#~ msgid "Our inftrastructure"
|
||||
#~ msgstr "Unsere Infrastruktur"
|
||||
|
||||
#~ msgid "Pricing"
|
||||
#~ msgstr "Preise"
|
||||
|
||||
#~ msgid "Access Key"
|
||||
#~ msgstr "Zugriffsschlüssel"
|
||||
|
||||
#~ msgid "Upload your own key. "
|
||||
#~ msgstr "Lade deinen Key hoch"
|
||||
|
||||
#~ msgid "Generate Key Pair"
|
||||
#~ msgstr "Schlüsselpaar generieren"
|
||||
|
||||
#~ msgid "Created at"
|
||||
#~ msgstr "Erstellt am"
|
||||
|
||||
#~ msgid "Billing Amount"
|
||||
#~ msgstr "Rechnungsbetrag"
|
||||
|
||||
|
@ -610,25 +611,6 @@ msgstr ""
|
|||
#~ msgid "EXPIRATION DATE"
|
||||
#~ msgstr "Ablaufdatum"
|
||||
|
||||
#~ msgid "Home"
|
||||
#~ msgstr "Home"
|
||||
|
||||
#~ msgid "Log in"
|
||||
#~ msgstr "Anmelden"
|
||||
|
||||
#~ msgid "You haven been logged out"
|
||||
#~ msgstr "Sie wurden abgmeldet"
|
||||
|
||||
#~ msgid "Upload Key"
|
||||
#~ msgstr "Schlüssel hochladen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Use your created key to access to the machine. If you lost it, contact us."
|
||||
#~ msgstr ""
|
||||
#~ "Verwende deinen privaten SSH Schlüssel, um dich mit deinen Maschinen zu "
|
||||
#~ "verbinden. Solltest du deinen privaten Schlüssel verloren haben, dann "
|
||||
#~ "kontaktiere uns."
|
||||
|
||||
#~ msgid "Copy to Clipboard"
|
||||
#~ msgstr "Kopieren"
|
||||
|
||||
|
@ -638,6 +620,3 @@ msgstr ""
|
|||
#~ msgstr ""
|
||||
#~ "Dein privater SSH Schlüssel wurde bereits generiert und heruntergeladen. "
|
||||
#~ "Falls du ihn verloren hast, kontaktiere uns."
|
||||
|
||||
#~ msgid "Generate my key"
|
||||
#~ msgstr "Generiere meinen Schlüssel"
|
||||
|
|
20
hosting/migrations/0041_userhostingkey_private_key.py
Normal file
20
hosting/migrations/0041_userhostingkey_private_key.py
Normal file
|
@ -0,0 +1,20 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-07-06 09:06
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('hosting', '0040_hostingplan'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='userhostingkey',
|
||||
name='private_key',
|
||||
field=models.FileField(blank=True, upload_to='private_keys'),
|
||||
),
|
||||
]
|
|
@ -101,6 +101,7 @@ class HostingOrder(AssignPermissionsMixin, models.Model):
|
|||
class UserHostingKey(models.Model):
|
||||
user = models.ForeignKey(CustomUser)
|
||||
public_key = models.TextField()
|
||||
private_key = models.FileField(upload_to='private_keys', blank=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
name = models.CharField(max_length=100)
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
.dashboard-container {
|
||||
padding-top:70px; padding-bottom: 70px;
|
||||
padding-top:70px;
|
||||
padding-bottom: 70px;
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
max-width: 768px;
|
||||
|
@ -57,4 +58,129 @@
|
|||
width: 90%;
|
||||
}
|
||||
}
|
||||
.btn:focus, .btn:active:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/***********Styles for Model********************/
|
||||
.modal-content {
|
||||
border-radius: 0px;
|
||||
font-family: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
width: 100%;
|
||||
float: left;
|
||||
border-radius: 0;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
.modal-header .close {
|
||||
font-size: 75px;
|
||||
font-weight: 300;
|
||||
margin-top: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 11px;
|
||||
z-index: 10;
|
||||
line-height: 60px;
|
||||
}
|
||||
.modal-header .close span {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.modal-header .close:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
border-bottom: 0px solid #e5e5e5;
|
||||
padding: 0px 15px;
|
||||
width: 100%;
|
||||
}
|
||||
.modal-body {
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
float: left;
|
||||
padding: 0px 40px 15px 30px;
|
||||
}
|
||||
.modal-body .modal-icon i {
|
||||
font-size: 80px;
|
||||
font-weight: 100;
|
||||
color: #999;
|
||||
}
|
||||
.modal-title {
|
||||
margin: 0;
|
||||
line-height: 1.42857143;
|
||||
font-size: 25px;
|
||||
padding: 0;
|
||||
font-family: 'Lato', sans-serif;
|
||||
}
|
||||
.modal-text {
|
||||
padding-top: 15px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.modal-footer {
|
||||
border-top: 0px solid #e5e5e5;
|
||||
width: 100%;
|
||||
float: left;
|
||||
text-align: center;
|
||||
padding: 15px 15px;
|
||||
}
|
||||
.modal-footer button[type="submit"] {
|
||||
min-width: 80px;
|
||||
}
|
||||
@media (min-width: 1300px) {
|
||||
.modal-dialog {/* top: 30%; */width: 35%;}
|
||||
}
|
||||
@media (max-width: 1299px) {
|
||||
.modal-dialog {
|
||||
/* top: 20%; */
|
||||
width: 43%;
|
||||
}
|
||||
}
|
||||
@media (max-width: 900px) {
|
||||
.modal-dialog {
|
||||
/* top: 20%; */
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.modal-dialog {
|
||||
/* top: 30%; */
|
||||
width: 95%;
|
||||
margin: 0 auto !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ========= */
|
||||
@media(min-width: 320px) {
|
||||
.modal:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
vertical-align: middle;
|
||||
margin-right: -4px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.modal-dialog {
|
||||
/* width: 520px; */
|
||||
margin: 15px auto;
|
||||
}
|
||||
}
|
||||
|
||||
.modal {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.modal-dialog {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
|
|
@ -225,7 +225,7 @@ h6 {
|
|||
}
|
||||
|
||||
.auth-bg {
|
||||
background: url(../img/auth-bg.jpg);
|
||||
background: url(../img/auth-bg-sm.jpg);
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
|
@ -538,6 +538,10 @@ a.unlink:hover {
|
|||
padding: 5px;
|
||||
}
|
||||
|
||||
.card-warning-addtional-margin {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.stripe-payment-btn {
|
||||
outline: none;
|
||||
width: auto;
|
||||
|
|
325
hosting/static/hosting/css/user_keys.css
Normal file
325
hosting/static/hosting/css/user_keys.css
Normal file
|
@ -0,0 +1,325 @@
|
|||
/* 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;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 420px) {
|
||||
.ssh-keys-table {table-layout: fixed;}
|
||||
}
|
||||
|
||||
.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/auth-bg-sm.jpg
Normal file
BIN
hosting/static/hosting/img/auth-bg-sm.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 114 KiB |
BIN
hosting/static/hosting/img/g222.png
Normal file
BIN
hosting/static/hosting/img/g222.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 774 B |
|
@ -18,6 +18,7 @@
|
|||
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'hosting/css/landing-page.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'hosting/css/user_keys.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'hosting/css/payment.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'hosting/css/order.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet">
|
||||
|
@ -27,7 +28,7 @@
|
|||
<!-- Custom Fonts -->
|
||||
<link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
|
||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,500,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
|
||||
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon" />
|
||||
<link rel="stylesheet" href="{% static 'hosting/css/owl.carousel.min.css' %}">
|
||||
<link rel="stylesheet" href="{% static 'hosting/css/owl.theme.default.min.css' %}">
|
||||
|
@ -84,7 +85,7 @@
|
|||
<ul id="g-account-menu" class="dropdown-menu" role="menu">
|
||||
<li>
|
||||
<a href="{% url 'hosting:ssh_keys' %}">
|
||||
<i class="fa fa-key"></i> {% trans "Keys"%}
|
||||
<i class="fa fa-key"></i> {% trans "SSH Keys" %}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
|
@ -114,7 +115,7 @@
|
|||
{% if request.user.is_authenticated %}
|
||||
<footer class="footer-vm">
|
||||
<div class="container">
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. All Rights Reserved</p>
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
|
||||
</div>
|
||||
</footer>
|
||||
{% else %}
|
||||
|
|
66
hosting/templates/hosting/choice_ssh_keys.html
Normal file
66
hosting/templates/hosting/choice_ssh_keys.html
Normal file
|
@ -0,0 +1,66 @@
|
|||
{% 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 = 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%}
|
||||
|
|
@ -26,7 +26,7 @@
|
|||
<a href="#contact">Contact</a>
|
||||
</li>
|
||||
</ul>
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. All Rights Reserved</p>
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<div class="row">
|
||||
<div class="col-xs-12 col-md-8 col-md-offset-2">
|
||||
<div class="invoice-title">
|
||||
<h2>{% trans "Confirm Order"%}</h2><h3 class="pull-right">{% trans "Order #"%} {{order.id}}</h3>
|
||||
<h2>{{page_header_text}}</h2><h3 class="pull-right">{% trans "Order #"%} {{order.id}}</h3>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="row">
|
||||
|
|
|
@ -52,16 +52,13 @@
|
|||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<h4 class="modal-title" id="ModalLabel">{% trans "Do You want to delete your order?"%}</h4>
|
||||
<div class="modal-icon"><i class="fa fa-trash" aria-hidden="true"></i></div>
|
||||
<h4 class="modal-title" id="ModalLabel">{% trans "Do you want to delete your order?"%}</h4>
|
||||
|
||||
<form method="post"
|
||||
action="{% url 'hosting:delete_order' order.id %}">
|
||||
{% 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>
|
||||
|
@ -71,7 +68,6 @@
|
|||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
</form>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<p>
|
||||
<p class="card-warning-content card-warning-addtional-margin">
|
||||
{% blocktrans %}
|
||||
You are not making any payment yet. After submitting your card
|
||||
information, you will be taken to the Confirm Order Page.
|
||||
|
|
|
@ -4,11 +4,12 @@
|
|||
<div>
|
||||
<div class="virtual-machine-container dashboard-container">
|
||||
<div class="row">
|
||||
<div class="container-table col-md-9 col-md-offset-2">
|
||||
<div class="col-sm-12">
|
||||
<div class="col-md-9 col-md-offset-2">
|
||||
<form method="POST" action="" novalidate class="form-ssh">
|
||||
{% csrf_token %}
|
||||
<h3><i class="fa fa-key fa-separate" aria-hidden="true"></i>{% trans "Access Key"%} </h3>
|
||||
<div class="page-header">
|
||||
<h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i> {% trans "Add your public SSH key" %}</h1>
|
||||
</div>
|
||||
{% if messages %}
|
||||
<div class="alert alert-warning">
|
||||
{% for message in messages %}
|
||||
|
@ -20,35 +21,35 @@
|
|||
{% bootstrap_field field %}
|
||||
{% endfor %}
|
||||
{% buttons %}
|
||||
<button type="submit" class="btn btn-success">
|
||||
{% trans "Upload your own key. "%}
|
||||
<div class="underform-contaner">
|
||||
<h4>{% trans "Use your created key to access to the VM" %}.</h4>
|
||||
<div class="btn-container">
|
||||
<button type="submit" name="add_ssh" class="btn choice-btn choice-btn-faded">
|
||||
{% trans "Add SSH Key" %}
|
||||
</button>
|
||||
<br />
|
||||
<br />
|
||||
{% trans "Or generate a new key pair."%} <br />
|
||||
<br />
|
||||
<button class="btn btn-success">{% trans "Generate Key Pair"%} </a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="underform-contaner">
|
||||
<h4>{% trans "Or you can generate a new key pair"%}.</h4>
|
||||
<div class="btn-container">
|
||||
<button type="submit" name="generate" class="btn choice-btn">
|
||||
{% trans "Generate" %}
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endbuttons %}
|
||||
</form>
|
||||
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5>
|
||||
|
||||
{% if private_key %}
|
||||
<div class="alert alert-warning">
|
||||
|
||||
<strong>{% trans "Warning!"%}</strong>{% trans "You can download your SSH private key once. Don't lost your key"%}
|
||||
<strong>{% trans "Warning!"%}</strong>{% trans "You can download your SSH private key once. Don't loose your key" %}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<textarea class="form-control" rows="6" id="ssh_key" type="hidden" style="display:none">{{private_key}}</textarea>
|
||||
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -3,10 +3,7 @@
|
|||
{% block content %}
|
||||
<div>
|
||||
<div class="container virtual-machine-container dashboard-container ">
|
||||
<div class="row">
|
||||
<div class="col-md-9 col-md-offset-2">
|
||||
<div class="col-sm-12">
|
||||
<h3><i class="fa fa-key" aria-hidden="true"></i>{% trans "Access Key"%} </h3>
|
||||
<h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i> {% trans "Your SSH Keys" %}</h1>
|
||||
{% if messages %}
|
||||
<div class="alert alert-warning">
|
||||
{% for message in messages %}
|
||||
|
@ -14,33 +11,32 @@
|
|||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<p class="pull-right">
|
||||
<a class="btn btn-success" href="{% url 'hosting:create_ssh_key' %}" >{% trans "Add Key"%} </a>
|
||||
</p>
|
||||
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5>
|
||||
<table class="table borderless table-hover">
|
||||
<div class="ssh-header-container">
|
||||
<p>{% trans "To generate a new key pair or to upload your existing key, click 'Add Key'" %}</p>
|
||||
<a class="btn choice-btn" href="{% url 'hosting:choice_ssh_keys' %}" >
|
||||
<span class="fa fa-plus"></span> {% trans "Add SSH Key" %}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<table class="table borderless table-hover ssh-keys-table">
|
||||
<br/>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% trans "Name" %}</th>
|
||||
<th>{% trans "Created at"%} </th>
|
||||
<th>{% trans "Status"%} </th>
|
||||
<th></th>
|
||||
<th>{% trans "Delete Key" %}</th>
|
||||
<th>{% trans "Public Key" %}</th>
|
||||
<th>{% trans "Private Key" %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for user_key in keys %}
|
||||
<tr>
|
||||
<td scope="row">{{user_key.name}}</td>
|
||||
|
||||
<td><span id="ssh-created_at-{{user_key.id}}">{{user_key.created_at|date:'Y-m-d H:i' }}</span></td>
|
||||
<td>
|
||||
<span class="h3 label label-success"><strong>Active</strong></span>
|
||||
</td>
|
||||
<td>
|
||||
<button type="button" class="btn btn-default" data-toggle="modal"
|
||||
data-target="#Modal{{ user_key.id }}"><a
|
||||
href="#">{% trans "Delete Key"%}</a>
|
||||
<button type="button" class="btn btn-default btn-custom-delete" data-toggle="modal"
|
||||
data-target="#Modal{{ user_key.id }}" style="color: #717274">
|
||||
<span class="pc-only">{% trans "Delete" %}</span>
|
||||
<span class="mob-only"><i class="fa fa-trash"></i></span>
|
||||
</button>
|
||||
|
||||
<div class="modal fade" id="Modal{{user_key.id }}" tabindex="-1" role="dialog">
|
||||
|
@ -54,14 +50,9 @@
|
|||
</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>
|
||||
|
@ -71,22 +62,52 @@
|
|||
</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>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<h4 class="modal-title" id="ModalLabel_Public_Key">{% trans "Public ssh key" %}</h4>
|
||||
<p style="margin-top: 10px;">{{ user_key.public_key }}</p>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default"
|
||||
data-dismiss="modal">
|
||||
{% trans "Close" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</td>
|
||||
<td>
|
||||
{% if user_key.private_key %}
|
||||
<form action="{{ user_key.private_key.url }}">
|
||||
<button style="color: #717274" type="submit" class="btn btn-default" data-toggle="modal"
|
||||
>
|
||||
<span class="pc-only">{% trans "Download" %}</span>
|
||||
<span class="mob-only"><i class="fa fa-download"></i></span>
|
||||
</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{% if next_url %}
|
||||
<script type="text/javascript">
|
||||
window.location.href = '{{next_url}}';
|
||||
|
@ -98,7 +119,6 @@
|
|||
|
||||
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;
|
||||
|
|
|
@ -160,13 +160,17 @@
|
|||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
{% trans "Terminate your Virtual Machine"%}
|
||||
<button type="button" class="close" data-dismiss="modal"
|
||||
aria-label="Confirm"><span
|
||||
aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
{% trans "Are you sure do you want to cancel your Virtual Machine "%} {{virtual_machine.name}} ?
|
||||
<div class="modal-icon"><i class="fa fa-ban" aria-hidden="true"></i></div>
|
||||
<h4 class="modal-title" id="ModalLabel">{% trans "Terminate your Virtual Machine"%}</h4>
|
||||
<p class="modal-text">{% trans "Are you sure do you want to cancel your Virtual Machine "%} {{virtual_machine.name}} ?</p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{% trans "Cancel"%}</button>
|
||||
<a class="btn btn-danger btn-ok">OK</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -7,7 +7,7 @@ from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
|
|||
VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \
|
||||
MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\
|
||||
CreateVirtualMachinesView, HostingBillListView, HostingBillDetailView, \
|
||||
SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView
|
||||
SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView, SSHKeyChoiceView
|
||||
|
||||
urlpatterns = [
|
||||
url(r'index/?$', IndexView.as_view(), name='index'),
|
||||
|
@ -27,6 +27,8 @@ urlpatterns = [
|
|||
name='virtual_machines'),
|
||||
url(r'ssh_keys/?$', SSHKeyListView.as_view(),
|
||||
name='ssh_keys'),
|
||||
url(r'ssh_keys_choice/?$', SSHKeyChoiceView.as_view(),
|
||||
name='choice_ssh_keys'),
|
||||
url(r'delete_ssh_key/(?P<pk>\d+)/?$', SSHKeyDeleteView.as_view(),
|
||||
name='delete_ssh_key'),
|
||||
url(r'create_ssh_key/?$', SSHKeyCreateView.as_view(),
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
import uuid
|
||||
|
||||
from django.core.files.base import ContentFile
|
||||
|
||||
from oca.pool import WrongNameError, WrongIdError
|
||||
from django.shortcuts import render
|
||||
from django.http import Http404
|
||||
|
@ -24,7 +28,7 @@ from utils.forms import BillingAddressForm, PasswordResetRequestForm, UserBillin
|
|||
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin
|
||||
from utils.mailer import BaseEmail
|
||||
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
|
||||
from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm
|
||||
from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm, generate_ssh_key_name
|
||||
from .mixins import ProcessVMSelectionMixin
|
||||
|
||||
from opennebula_api.models import OpenNebulaManager
|
||||
|
@ -32,7 +36,6 @@ from opennebula_api.serializers import VirtualMachineSerializer, \
|
|||
VirtualMachineTemplateSerializer
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
||||
CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a backend \
|
||||
connection error. please try again in a few minutes."
|
||||
|
||||
|
@ -193,8 +196,10 @@ class SignupView(CreateView):
|
|||
name = form.cleaned_data.get('name')
|
||||
email = form.cleaned_data.get('email')
|
||||
password = form.cleaned_data.get('password')
|
||||
this_base_url = "{0}://{1}".format(self.request.scheme, self.request.get_host())
|
||||
CustomUser.register(name, password, email, app='dcl', base_url=this_base_url)
|
||||
this_base_url = "{0}://{1}".format(self.request.scheme,
|
||||
self.request.get_host())
|
||||
CustomUser.register(name, password, email,
|
||||
app='dcl', base_url=this_base_url)
|
||||
|
||||
return HttpResponseRedirect(reverse_lazy('hosting:signup-validate'))
|
||||
|
||||
|
@ -204,8 +209,10 @@ class SignupValidateView(TemplateView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(SignupValidateView, self).get_context_data(**kwargs)
|
||||
login_url = '<a href="' + reverse('hosting:login') + '">' + str(_('login')) + '</a>'
|
||||
home_url = '<a href="' + reverse('datacenterlight:index') + '">Data Center Light</a>'
|
||||
login_url = '<a href="' + \
|
||||
reverse('hosting:login') + '">' + str(_('login')) + '</a>'
|
||||
home_url = '<a href="' + \
|
||||
reverse('datacenterlight:index') + '">Data Center Light</a>'
|
||||
message = '{signup_success_message} {lurl}</a> \
|
||||
<br />{go_back} {hurl}.'.format(
|
||||
signup_success_message=_(
|
||||
|
@ -226,15 +233,18 @@ class SignupValidatedView(SignupValidateView):
|
|||
def get_context_data(self, **kwargs):
|
||||
context = super(SignupValidateView, self).get_context_data(**kwargs)
|
||||
validated = CustomUser.validate_url(self.kwargs['validate_slug'])
|
||||
login_url = '<a href="' + reverse('hosting:login') + '">' + str(_('login')) + '</a>'
|
||||
login_url = '<a href="' + \
|
||||
reverse('hosting:login') + '">' + str(_('login')) + '</a>'
|
||||
section_title = _('Account activation')
|
||||
if validated:
|
||||
message = '{account_activation_string} <br /> {login_string} {lurl}.'.format(
|
||||
account_activation_string=_("Your account has been activated."),
|
||||
account_activation_string=_(
|
||||
"Your account has been activated."),
|
||||
login_string=_("You can now"),
|
||||
lurl=login_url)
|
||||
else:
|
||||
home_url = '<a href="' + reverse('datacenterlight:index') + '">Data Center Light</a>'
|
||||
home_url = '<a href="' + \
|
||||
reverse('datacenterlight:index') + '">Data Center Light</a>'
|
||||
message = '{sorry_message} <br />{go_back_to} {hurl}'.format(
|
||||
sorry_message=_("Sorry. Your request is invalid."),
|
||||
go_back_to=_('Go back to'),
|
||||
|
@ -364,10 +374,29 @@ class SSHKeyListView(LoginRequiredMixin, ListView):
|
|||
|
||||
def render_to_response(self, context, **response_kwargs):
|
||||
if not self.queryset:
|
||||
return HttpResponseRedirect(reverse('hosting:create_ssh_key'))
|
||||
return HttpResponseRedirect(reverse('hosting:choice_ssh_keys'))
|
||||
return super(SSHKeyListView, self).render_to_response(context, **response_kwargs)
|
||||
|
||||
|
||||
class SSHKeyChoiceView(LoginRequiredMixin, View):
|
||||
template_name = "hosting/choice_ssh_keys.html"
|
||||
login_url = reverse_lazy('hosting:login')
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
context = {}
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
name = generate_ssh_key_name()
|
||||
private_key, public_key = UserHostingKey.generate_keys()
|
||||
content = ContentFile(private_key)
|
||||
ssh_key = UserHostingKey.objects.create(
|
||||
user=request.user, public_key=public_key, name=name)
|
||||
filename = name + '_' + str(uuid.uuid4())[:8] + '_private.pem'
|
||||
ssh_key.private_key.save(filename, content)
|
||||
return redirect(reverse_lazy('hosting:ssh_keys'), foo='bar')
|
||||
|
||||
|
||||
class SSHKeyCreateView(LoginRequiredMixin, FormView):
|
||||
form_class = UserHostingKeyForm
|
||||
model = UserHostingKey
|
||||
|
@ -383,6 +412,11 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView):
|
|||
|
||||
def form_valid(self, form):
|
||||
form.save()
|
||||
if 'dcl-generated-key-' in form.instance.name:
|
||||
content = ContentFile(form.cleaned_data.get('private_key'))
|
||||
filename = form.cleaned_data.get(
|
||||
'name') + '_' + str(uuid.uuid4())[:8] + '_private.pem'
|
||||
form.instance.private_key.save(filename, content)
|
||||
context = self.get_context_data()
|
||||
|
||||
next_url = self.request.session.get(
|
||||
|
@ -407,10 +441,11 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView):
|
|||
manager = OpenNebulaManager()
|
||||
|
||||
# Get user ssh key
|
||||
public_key = form.cleaned_data.get('public_key', '').decode('utf-8')
|
||||
public_key = str(form.cleaned_data.get('public_key', ''))
|
||||
# Add ssh key to user
|
||||
try:
|
||||
manager.add_public_key(user=owner, public_key=public_key, merge=True)
|
||||
manager.add_public_key(
|
||||
user=owner, public_key=public_key, merge=True)
|
||||
except ConnectionError:
|
||||
pass
|
||||
except WrongNameError:
|
||||
|
@ -421,6 +456,9 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView):
|
|||
def post(self, request, *args, **kwargs):
|
||||
print(self.request.POST.dict())
|
||||
form = self.get_form()
|
||||
required = 'add_ssh' in self.request.POST
|
||||
form.fields['name'].required = required
|
||||
form.fields['public_key'].required = required
|
||||
if form.is_valid():
|
||||
return self.form_valid(form)
|
||||
else:
|
||||
|
@ -600,7 +638,9 @@ class PaymentVMView(LoginRequiredMixin, FormView):
|
|||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
|
||||
return HttpResponseRedirect(reverse('hosting:orders', kwargs={'pk': order.id}))
|
||||
return HttpResponseRedirect(
|
||||
"{url}?{query_params}".format(url=reverse('hosting:orders', kwargs={'pk': order.id}),
|
||||
query_params='page=payment'))
|
||||
else:
|
||||
return self.form_invalid(form)
|
||||
|
||||
|
@ -619,6 +659,10 @@ class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin, Detai
|
|||
owner = self.request.user
|
||||
manager = OpenNebulaManager(email=owner.email,
|
||||
password=owner.password)
|
||||
if self.request.GET.get('page', '') == 'payment':
|
||||
context['page_header_text'] = _('Confirm Order')
|
||||
else:
|
||||
context['page_header_text'] = _('Invoice')
|
||||
try:
|
||||
vm = manager.get_vm(obj.vm_id)
|
||||
context['vm'] = VirtualMachineSerializer(vm).data
|
||||
|
|
Loading…
Reference in a new issue