Merge branch 'master' into feature/task3637

This commit is contained in:
Siarhei Puhach 2017-08-04 11:05:37 +03:00 committed by GitHub
commit 657e97fc6d
28 changed files with 1154 additions and 614 deletions

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,23 +18,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: templates/datacenterlight/beta_access.html:13
msgid "Enter name" msgid "Enter name"
msgstr "Name" msgstr "Name"
#: templates/datacenterlight/beta_access.html:17
msgid "Enter email" msgid "Enter email"
msgstr "E-Mail-Adresse" msgstr "E-Mail-Adresse"
#: templates/datacenterlight/beta_access.html:21
msgid "Request Beta Access" msgid "Request Beta Access"
msgstr "Beantrage Beta-Zugang" msgstr "Beantrage Beta-Zugang"
#: templates/datacenterlight/beta_success.html:10
msgid "Request Sent" msgid "Request Sent"
msgstr "Anfrage verschickt" msgstr "Anfrage verschickt"
#: templates/datacenterlight/beta_success.html:13
msgid "" msgid ""
"Thank you for your subscription! You will receive a confirmation mail from " "Thank you for your subscription! You will receive a confirmation mail from "
"our team" "our team"
@ -42,91 +37,64 @@ msgstr ""
"Vielen dank für Ihre Anmeldung. Sie erhalten in kürze eine Bestätigungsmail " "Vielen dank für Ihre Anmeldung. Sie erhalten in kürze eine Bestätigungsmail "
"von unserem Team" "von unserem Team"
#: templates/datacenterlight/calculator_form.html:5
#: templates/datacenterlight/pricing.html:22
msgid "VM hosting" msgid "VM hosting"
msgstr "" msgstr ""
#: templates/datacenterlight/calculator_form.html:9
msgid "month" msgid "month"
msgstr "Monat" msgstr "Monat"
#: templates/datacenterlight/calculator_form.html:11
#: templates/datacenterlight/pricing.html:28
msgid "VAT included" msgid "VAT included"
msgstr "MwSt. inklusive" msgstr "MwSt. inklusive"
#: templates/datacenterlight/calculator_form.html:16
#: templates/datacenterlight/pricing.html:33
msgid "Hosted in Switzerland" msgid "Hosted in Switzerland"
msgstr "Standort: Schweiz" msgstr "Standort: Schweiz"
#: templates/datacenterlight/calculator_form.html:21
msgid "Please enter a value in range 1 - 48." msgid "Please enter a value in range 1 - 48."
msgstr "Bitte gib einen Wert von 1 bis 48 ein." 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." msgid "Please enter a value in range 2 - 200."
msgstr "Bitte gib einen Wert von 2 bis 200 ein." 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." msgid "Please enter a value in range 10 - 2000."
msgstr "Bitte gib einen Wert von 10 bis 200 ein." 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)" msgid "GB Storage (SSD)"
msgstr "GB Storage (SSD)" msgstr "GB Storage (SSD)"
#: templates/datacenterlight/calculator_form.html:59
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: templates/datacenterlight/calculator_form.html:60
msgid "Your Name" msgid "Your Name"
msgstr "Dein Name" msgstr "Dein Name"
#: templates/datacenterlight/calculator_form.html:60
msgid "Please enter your name." msgid "Please enter your name."
msgstr "Bitte gib Deinen Namen ein." msgstr "Bitte gib Deinen Namen ein."
#: templates/datacenterlight/calculator_form.html:74
msgid "Email" msgid "Email"
msgstr "E-Mail-Adresse" msgstr "E-Mail-Adresse"
#: templates/datacenterlight/calculator_form.html:75
msgid "Your Email" msgid "Your Email"
msgstr "Deine E-Mail" msgstr "Deine E-Mail"
#: templates/datacenterlight/calculator_form.html:75
msgid "Please enter a valid email address." msgid "Please enter a valid email address."
msgstr "Bitte gib eine gültige E-Mailadresse ein." msgstr "Bitte gib eine gültige E-Mailadresse ein."
#: templates/datacenterlight/calculator_form.html:88
msgid "Continue" msgid "Continue"
msgstr "Weiter" msgstr "Weiter"
#: templates/datacenterlight/emails/request_access_confirmation.html:99
#: templates/datacenterlight/emails/request_access_confirmation.txt:99
msgid "Thank you for your request." msgid "Thank you for your request."
msgstr "Vielen Dank für Ihre Anfrage." 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!" msgid "You are one step away from being our beta tester!"
msgstr "" msgstr ""
"Sie sind nur noch einen Schritt davon entfernt, unser Beta-Tester zu werden!" "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 "" msgid ""
"Currently we are running our tests to make sure everything runs perfectly." "Currently we are running our tests to make sure everything runs perfectly."
msgstr "" msgstr ""
"Momentan testen wir die Beta-Umgebung um sie für Ihren Gebrauch " "Momentan testen wir die Beta-Umgebung um sie für Ihren Gebrauch "
"sicherzustellen." "sicherzustellen."
#: templates/datacenterlight/emails/request_access_confirmation.html:106
#: templates/datacenterlight/emails/request_access_confirmation.txt:106
msgid "" msgid ""
"In the meantime, we would like to ask you a little patience<br/> until our " "In the meantime, we would like to ask you a little patience<br/> until our "
"team contacts you with beta access." "team contacts you with beta access."
@ -134,17 +102,12 @@ msgstr ""
"Wir werden dann sobald als möglich Ihren Beta-Zugang erstellen und Sie " "Wir werden dann sobald als möglich Ihren Beta-Zugang erstellen und Sie "
"daraufhin kontaktieren.Bis dahin bitten wir Sie um etwas Geduld." "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!" msgid "Thank you!"
msgstr "Vielen Dank!" msgstr "Vielen Dank!"
#: templates/datacenterlight/emails/user_activation.html:99
#: templates/datacenterlight/emails/user_activation.txt:3
msgid "account activation" msgid "account activation"
msgstr "Accountaktivierung" msgstr "Accountaktivierung"
#: templates/datacenterlight/emails/user_activation.html:105
#, python-format #, python-format
msgid "" msgid ""
"\n" "\n"
@ -165,17 +128,12 @@ msgstr ""
" %(base_url)s%(activation_link)s\n" " %(base_url)s%(activation_link)s\n"
" " " "
#: templates/datacenterlight/emails/user_activation.html:123
#: templates/datacenterlight/emails/user_activation.txt:11
msgid "Your" msgid "Your"
msgstr "Dein" msgstr "Dein"
#: templates/datacenterlight/emails/user_activation.html:123
#: templates/datacenterlight/emails/user_activation.txt:11
msgid "team" msgid "team"
msgstr "Team" msgstr "Team"
#: templates/datacenterlight/emails/user_activation.txt:5
#, python-format #, python-format
msgid "" msgid ""
"\n" "\n"
@ -190,75 +148,50 @@ msgstr ""
"Du kannst deinen %(dcl_text)s Account aktivieren, indem du hier klickst " "Du kannst deinen %(dcl_text)s Account aktivieren, indem du hier klickst "
"%(base_url)s%(activation_link)s\n" "%(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" msgid "Highlights"
msgstr "" 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" msgid "Scale out"
msgstr "Skalierung" 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" msgid "Reliable and light"
msgstr "Zuverlässig und leicht" msgstr "Zuverlässig und leicht"
#: templates/datacenterlight/includes/_footer.html:20
#: templates/datacenterlight/includes/_navbar.html:32
msgid "Order VM" msgid "Order VM"
msgstr "VM bestellen" msgstr "VM bestellen"
#: templates/datacenterlight/includes/_footer.html:23
#: templates/datacenterlight/includes/_footer.html:44
#: templates/datacenterlight/includes/_navbar.html:39
msgid "Contact" msgid "Contact"
msgstr "Kontakt" msgstr "Kontakt"
#: templates/datacenterlight/includes/_footer.html:27
msgid "Home" msgid "Home"
msgstr "Home" msgstr "Home"
#: templates/datacenterlight/includes/_footer.html:40
msgid "Pricing" msgid "Pricing"
msgstr "Preise" msgstr "Preise"
#: templates/datacenterlight/includes/_navbar.html:36 msgid "All Rights Reserved"
#: templates/datacenterlight/whydatacenterlight.html:12 msgstr "Alle Rechte vorbehalten"
msgid "Why Data Center Light?" msgid "Why Data Center Light?"
msgstr "Warum Data Center Light?" msgstr "Warum Data Center Light?"
#: templates/datacenterlight/index.html:15
msgid "Finally, an affordable VM hosting in Switzerland!" msgid "Finally, an affordable VM hosting in Switzerland!"
msgstr "Endlich: bezahlbares VM Hosting in der Schweiz" msgstr "Endlich: bezahlbares VM Hosting in der Schweiz"
#: templates/datacenterlight/index.html:22
msgid "I want it!" msgid "I want it!"
msgstr "Das will ich haben!" msgstr "Das will ich haben!"
#: templates/datacenterlight/index.html:52
msgid "" msgid ""
"Reuses existing factory halls instead of building a new expensive building." "Reuses existing factory halls instead of building a new expensive building."
msgstr "" msgstr ""
"Verwendet ehemalige Fabrikhallen anstatt ein neues, teures Gebäude zu " "Verwendet ehemalige Fabrikhallen anstatt ein neues, teures Gebäude zu "
"errichten." "errichten."
#: templates/datacenterlight/index.html:57
msgid "Only wants you to pay for what you actually need." msgid "Only wants you to pay for what you actually need."
msgstr "" msgstr ""
"Möchte, dass du nur bezahlst, was du auch wirklich brauchst: Wähle deine " "Möchte, dass du nur bezahlst, was du auch wirklich brauchst: Wähle deine "
"Ressourcen individuell aus!" "Ressourcen individuell aus!"
#: templates/datacenterlight/index.html:61
msgid "" msgid ""
"Is creative, using a modern and alternative design for a data center in " "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." "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 " "macht um Nachhaltigkeit zu fördern und somit erschwingliche Preise bieten zu "
"können." "können."
#: templates/datacenterlight/index.html:65
msgid "" msgid ""
"Cuts down the costs for you by using FOSS (Free Open Source Software) " "Cuts down the costs for you by using FOSS (Free Open Source Software) "
"exclusively, wherefore we can save money from paying licenses." "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 " "mit FOSS (Free Open Source Software) arbeitet und wir daher auf "
"Lizenzgebühren verzichten können." "Lizenzgebühren verzichten können."
#: templates/datacenterlight/index.html:88
msgid "" msgid ""
"We don't use special hardware. We use commodity hardware: we buy computers " "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 " "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 " "erschwingliche Systeme. Bei grösserer Auslastung werden mehr "
"Standardkomponenten hinzugekauft und skalieren so das Datencenter." "Standardkomponenten hinzugekauft und skalieren so das Datencenter."
#: templates/datacenterlight/index.html:114
msgid "" msgid ""
"Our VMs are located in Switzerland, with reliable power supply and fast " "Our VMs are located in Switzerland, with reliable power supply and fast "
"internet connection. Our VM costs less thanks to our featherlight " "internet connection. Our VM costs less thanks to our featherlight "
@ -296,86 +226,65 @@ msgstr ""
"Energieversorgung, sowie schneller Internetverbindung ausgestattet. Unser " "Energieversorgung, sowie schneller Internetverbindung ausgestattet. Unser "
"Angebot ist aufgrund unserer leichten Infrastruktur überaus kostengünstig." "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." msgid "Simple and affordable: Try our virtual machine with featherlight price."
msgstr "" msgstr ""
"Einfach und bezahlbar: Teste nun unsere virtuellen Maschinen mit " "Einfach und bezahlbar: Teste nun unsere virtuellen Maschinen mit "
"federleichten Preisen." "federleichten Preisen."
#: templates/datacenterlight/index.html:133
msgid "Affordable VM hosting based in Switzerland" msgid "Affordable VM hosting based in Switzerland"
msgstr "Bezahlbares VM Hosting in der Schweiz" msgstr "Bezahlbares VM Hosting in der Schweiz"
#: templates/datacenterlight/index.html:166
msgid "Switzerland " msgid "Switzerland "
msgstr "Schweiz" msgstr "Schweiz"
#: templates/datacenterlight/index.html:183
msgid "Questions?" msgid "Questions?"
msgstr "Fragen?" msgstr "Fragen?"
#: templates/datacenterlight/index.html:183
msgid "Contact us!" msgid "Contact us!"
msgstr "Kontaktiere uns!" msgstr "Kontaktiere uns!"
#: templates/datacenterlight/order_detail.html:24
msgid "Confirm Order" msgid "Confirm Order"
msgstr "Bestellung Bestätigen" msgstr "Bestellung Bestätigen"
#: templates/datacenterlight/order_detail.html:30
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
#: templates/datacenterlight/order_detail.html:36
msgid "Billed To:" msgid "Billed To:"
msgstr "Rechnungsadresse" msgstr "Rechnungsadresse"
#: templates/datacenterlight/order_detail.html:47
msgid "Payment Method:" msgid "Payment Method:"
msgstr "Bezahlmethode" msgstr "Bezahlmethode"
#: templates/datacenterlight/order_detail.html:48
msgid "ending" msgid "ending"
msgstr "endend in" msgstr "endend in"
#: templates/datacenterlight/order_detail.html:58
msgid "Order summary" msgid "Order summary"
msgstr "Bestellungsübersicht" msgstr "Bestellungsübersicht"
#: templates/datacenterlight/order_detail.html:62
msgid "Cores" msgid "Cores"
msgstr "Prozessorkerne" msgstr "Prozessorkerne"
#: templates/datacenterlight/order_detail.html:64
msgid "Memory" msgid "Memory"
msgstr "Arbeitsspeicher" msgstr "Arbeitsspeicher"
#: templates/datacenterlight/order_detail.html:66
msgid "Disk space" msgid "Disk space"
msgstr "Festplattenkapazität" msgstr "Festplattenkapazität"
#: templates/datacenterlight/order_detail.html:68
msgid "Configuration" msgid "Configuration"
msgstr "Konfiguration" msgstr "Konfiguration"
#: templates/datacenterlight/order_detail.html:70
msgid "Total" msgid "Total"
msgstr "" msgstr ""
#: templates/datacenterlight/order_detail.html:77
msgid "Place order" msgid "Place order"
msgstr "Bestellen" msgstr "Bestellen"
#: templates/datacenterlight/pricing.html:9
msgid "We are cutting down the costs significantly!" msgid "We are cutting down the costs significantly!"
msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen" msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen"
#: templates/datacenterlight/pricing.html:79
msgid "Order Now!" msgid "Order Now!"
msgstr "Bestelle jetzt!" msgstr "Bestelle jetzt!"
#: templates/datacenterlight/pricing.html:89
msgid "" msgid ""
"Our VMs are hosted in Glarus, Switzerland, and our website is currently " "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 " "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 " "uns unter support@datacenterlight.ch. Unser Team wird sich umgehend um dein "
"Anliegen kümmern!" "Anliegen kümmern!"
#: templates/datacenterlight/success.html:8
msgid "Thank you for order! Our team will contact you via email" msgid "Thank you for order! Our team will contact you via email"
msgstr "" msgstr ""
"Vielen Dank für die Bestellung. Unser Team setzt sich sobald wie möglich mit " "Vielen Dank für die Bestellung. Unser Team setzt sich sobald wie möglich mit "
"Ihnen via E-Mail in Verbindung." "Ihnen via E-Mail in Verbindung."
#: templates/datacenterlight/success.html:10
msgid "as soon as possible!" msgid "as soon as possible!"
msgstr "" msgstr ""
#: templates/datacenterlight/whydatacenterlight.html:26
msgid "Tech Stack" msgid "Tech Stack"
msgstr "Tech Stack" msgstr "Tech Stack"
#: templates/datacenterlight/whydatacenterlight.html:29
msgid "We are seriously open source." msgid "We are seriously open source."
msgstr "Wir sind vollends opensource." msgstr "Wir sind vollends opensource."
#: templates/datacenterlight/whydatacenterlight.html:30
msgid "" msgid ""
" Our full software stack is open source We don't use anything that isn't " " Our full software stack is open source We don't use anything that isn't "
"open source. <br>Yes, we are that cool. " "open source. <br>Yes, we are that cool. "
@ -417,43 +321,33 @@ msgstr ""
"Unser gesamter Softwaresstack ist Open-Source Wir verwenden nichts, das " "Unser gesamter Softwaresstack ist Open-Source Wir verwenden nichts, das "
"nicht Open-Source ist.<br/>Yep, so cool sind wir." "nicht Open-Source ist.<br/>Yep, so cool sind wir."
#: templates/datacenterlight/whydatacenterlight.html:37
msgid "Our services run on" msgid "Our services run on"
msgstr "Unsere Dienste läuft auf" msgstr "Unsere Dienste läuft auf"
#: templates/datacenterlight/whydatacenterlight.html:41
msgid "Our monitoring" msgid "Our monitoring"
msgstr "Unser Monitoring" msgstr "Unser Monitoring"
#: templates/datacenterlight/whydatacenterlight.html:45
msgid "Our storage layer" msgid "Our storage layer"
msgstr "Unser Storage-Layer" msgstr "Unser Storage-Layer"
#: templates/datacenterlight/whydatacenterlight.html:49
msgid "Our web frontend" msgid "Our web frontend"
msgstr "Unser Web-Frontend" msgstr "Unser Web-Frontend"
#: templates/datacenterlight/whydatacenterlight.html:53
msgid "Our cloud" msgid "Our cloud"
msgstr "Unsere Cloud" msgstr "Unsere Cloud"
#: templates/datacenterlight/whydatacenterlight.html:57
msgid "Our configuration management system" msgid "Our configuration management system"
msgstr "Unser Konfigurationsmanagementsystem" msgstr "Unser Konfigurationsmanagementsystem"
#: templates/datacenterlight/whydatacenterlight.html:61
msgid "Our awesome juice" msgid "Our awesome juice"
msgstr "Unser Treibstoff" msgstr "Unser Treibstoff"
#: templates/datacenterlight/whydatacenterlight.html:65
msgid "Our NAT64 gateway" msgid "Our NAT64 gateway"
msgstr "Unser NAT64 Gateway" msgstr "Unser NAT64 Gateway"
#: templates/datacenterlight/whydatacenterlight.html:90
msgid "We believe in giving back to the FOSS community." msgid "We believe in giving back to the FOSS community."
msgstr "Wir unterstützen die FOSS Community." msgstr "Wir unterstützen die FOSS Community."
#: templates/datacenterlight/whydatacenterlight.html:91
msgid "" msgid ""
"Data Center Light is the child of free and open source software (FOSS) " "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 " "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 " "<br/> Je weiter wir mit unserem Data Center Light vorankommen, desto mehr "
"können wir etwas an die FOSS Community zurückgeben." "können wir etwas an die FOSS Community zurückgeben."
#: templates/datacenterlight/whydatacenterlight.html:104
msgid "We bring the future to you." msgid "We bring the future to you."
msgstr "Wir bringen die Zukunft zu dir." msgstr "Wir bringen die Zukunft zu dir."
#: templates/datacenterlight/whydatacenterlight.html:107
msgid "" msgid ""
" Data Center Light uses the most modern technologies out there.<br>\n" "Data Center Light uses the most modern technologies out there.<br>Your VM "
" Your VM needs only IPv6. Data Center Light " "needs only IPv6. Data Center Light provides<br> transparent two-way IPv6/"
"provides<br> transparent two-way IPv6/IPv4 translation.\n" "IPv4 translation."
" "
msgstr "" msgstr ""
"Data Center Light verwendet die zur Zeit modernsten Technologien.<br/>Deine " "Data Center Light verwendet die zur Zeit modernsten Technologien.<br/>Deine "
"VM läuft mit IPv6. Data Center Light bietet eine transparente IPv6/IPv4-" "VM läuft mit IPv6. Data Center Light bietet eine transparente IPv6/IPv4-"
"Zweiweglösung." "Zweiweglösung."
#: templates/datacenterlight/whydatacenterlight.html:122
msgid "" msgid ""
" No more spinning metal plates! Data Center Light uses only SSDs. We keep " " No more spinning metal plates! Data Center Light uses only SSDs. We keep "
"things faster and lighter. " "things faster and lighter. "
@ -488,19 +378,24 @@ msgstr ""
"Keine drehenden Metallplatten mehr! Data Center Light verwendet " "Keine drehenden Metallplatten mehr! Data Center Light verwendet "
"ausschliesslich SSDs. Wir halten die Dinge schnell, leicht und effizient." "ausschliesslich SSDs. Wir halten die Dinge schnell, leicht und effizient."
#: templates/datacenterlight/whydatacenterlight.html:138
msgid "Starting from only 15CHF per month. Try now." msgid "Starting from only 15CHF per month. Try now."
msgstr "Unser Angebot beginnt bei 15 CHF pro Monat. Probier's jetzt aus!" 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." msgid "Actions speak louder than words. Let's do it, try our VM now."
msgstr "Tagen sagen mehr als Worte Teste jetzt unsere VM!" 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" msgid "is not a proper name"
msgstr "ist kein gültiger Name" msgstr "ist kein gültiger Name"
#: views.py:242
msgid "is not a proper email" msgid "is not a proper email"
msgstr "ist keine gültige E-Mailadresse" msgstr "ist keine gültige E-Mailadresse"

View file

@ -786,6 +786,7 @@ tech-sub-sec h2 {
} }
.percent-text { .percent-text {
font-family: 'Lato', sans-serif;
font-size: 50px; font-size: 50px;
color: #999; color: #999;
} }
@ -794,17 +795,20 @@ tech-sub-sec h2 {
font-size: 40px; font-size: 40px;
line-height: 55px; line-height: 55px;
} }
.space-middle{
.space-middle { padding: 45px 0;
padding: 45px 0; display: inline-block;
} }
.ssdimg {
.padding-vertical { vertical-align: middle;
padding: 35px 0; display: inline-block;
}
.padding-vertical{
padding: 30px 9px;
} }
.percent-text img { .percent-text img {
margin-left: 20px; /* margin-left: 20px; */
} }
.space-block { .space-block {
@ -1085,24 +1089,24 @@ tech-sub-sec h2 {
} }
@media(max-width:767px) { @media(max-width:767px) {
.percent-text { .percent-text {
font-size: 50px; /* font-size: 50px; */
} }
#tech_stack h3 { #tech_stack h3 {
font-size: 30px; font-size: 30px;
line-height: 40px; line-height: 40px;
width: 100%; width: 100%;
} }
.navbar-nav .open .dropdown-menu { .navbar-nav .open .dropdown-menu {
text-align: left; text-align: left;
font-size: 12px; font-size: 12px;
} }
.visible-mobile { .visible-mobile {
display: block; display:block;
} }
.visible-desktop { .visible-desktop {
display: none !important; display:none !important;
} }
.navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a,
.navbar-default .navbar-nav>.open>a:focus, .navbar-default .navbar-nav>.open>a:focus,
.navbar-default .navbar-nav>.open>a:hover { .navbar-default .navbar-nav>.open>a:hover {
@ -1158,11 +1162,12 @@ tech-sub-sec h2 {
@media(max-width:768px) { @media(max-width:768px) {
.percent-text { .percent-text {
font-size: 43px; /* font-size: 43px; */
} }
.tech-sub-sec h2 { .tech-sub-sec h2 {
font-size: 30px; /* font-size: 30px; */
line-height: 40px; /* line-height: 40px; */
/* font-weight: 500; */
} }
.single-heading h2 { .single-heading h2 {
font-size: 50px; font-size: 50px;
@ -1348,7 +1353,9 @@ tech-sub-sec h2 {
padding: 30px; padding: 30px;
} }
.percent-text { .percent-text {
text-align: center; font-family: 'Lato';
font-size: 31px;
/* text-align: center; */
} }
.pricing-section .card { .pricing-section .card {
width: 90%; width: 90%;
@ -1472,3 +1479,33 @@ a#forgotpassword {
.error-message-box { .error-message-box {
margin-top: 20px; 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;
}

View file

@ -2,19 +2,18 @@
{% load i18n %} {% load i18n %}
<div class="modal fade bs-example-modal-sm" style="color:black;" id="successModal" tabindex="-1" role="dialog"> <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">
<div class="modal-dialog vertical-align-center"> <div class="modal-content">
<div class="modal-content"> <div class="modal-header">
<div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> </div>
<h4 class="modal-title">{% trans "Request Sent" %}</h4> <div class="modal-body">
</div> <div class="modal-icon"><i class="fa fa-check" aria-hidden="true"></i></div>
<div class="modal-body"> <h4 class="modal-title">{% trans "Request Sent" %}</h4>
<p>{% trans "Thank you for your subscription! You will receive a confirmation mail from our team" %}</p> <p class="modal-text">{% trans "Thank you for your subscription! You will receive a confirmation mail from our team" %}</p>
</div> </div>
</div><!-- /.modal-content --> </div><!-- /.modal-content -->
</div> </div>
</div>
</div><!-- /.modal --> </div><!-- /.modal -->
<script> <script>
// Show modal // Show modal

View file

@ -46,7 +46,7 @@
{% endif %} {% endif %}
</ul> </ul>
<p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. All Rights Reserved</p> <p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -98,30 +98,23 @@
<hr class="thick-divider"/><!-- Divider --> <hr class="thick-divider"/><!-- Divider -->
<div class="space"> <div class="space">
<div class="container"> <div class="container">
<div class="row"> <div class="tech-sub-sec">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> <h2>{% trans "We bring the future to you." %}</h2>
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 tech-sub-sec"> </div>
<h2>{% trans "We bring the future to you." %}</h2> <div class="flex-row flex-row-rev">
</div> <div class="percent-text">
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 text-left tech-sub-sec landscape-xs-6"> 100% <strong>IPv6</strong>
<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">
100% <strong>IPv6</strong>
</div>
</div> </div>
<div class="col-lg-12 space-block"></div> <div class="desc-text padding-vertical">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> <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 class="col-xs-12 col-sm-7 col-md-8 col-lg-8 percent-text landscape-xs-8"> </div>
<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> <div class="flex-row">
<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 class="percent-text">
<div> <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>
<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 class="desc-text padding-vertical w380">
</div> <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>

View file

@ -19,7 +19,6 @@ from hosting.models import HostingOrder, HostingBill
from utils.stripe_utils import StripeUtils from utils.stripe_utils import StripeUtils
from datetime import datetime from datetime import datetime
from membership.models import CustomUser, StripeCustomer from membership.models import CustomUser, StripeCustomer
from opennebula_api.models import OpenNebulaManager from opennebula_api.models import OpenNebulaManager
from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer
@ -34,6 +33,7 @@ class SuccessView(TemplateView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if 'specs' not in request.session or 'user' not in request.session: if 'specs' not in request.session or 'user' not in request.session:
return HttpResponseRedirect(reverse('datacenterlight:index')) return HttpResponseRedirect(reverse('datacenterlight:index'))
elif 'token' not in request.session: elif 'token' not in request.session:
return HttpResponseRedirect(reverse('datacenterlight:payment')) return HttpResponseRedirect(reverse('datacenterlight:payment'))
elif 'order_confirmation' not in request.session: elif 'order_confirmation' not in request.session:
@ -79,7 +79,8 @@ class PricingView(TemplateView):
manager = OpenNebulaManager() manager = OpenNebulaManager()
template = manager.get_template(template_id) template = manager.get_template(template_id)
request.session['template'] = VirtualMachineTemplateSerializer(template).data request.session['template'] = VirtualMachineTemplateSerializer(
template).data
if not request.user.is_authenticated(): if not request.user.is_authenticated():
request.session['next'] = reverse('hosting:payment') request.session['next'] = reverse('hosting:payment')
@ -131,7 +132,8 @@ class BetaAccessView(FormView):
email = BaseEmail(**email_data) email = BaseEmail(**email_data)
email.send() 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', {}) return render(self.request, 'datacenterlight/beta_success.html', {})
@ -183,7 +185,8 @@ class BetaProgramView(CreateView):
email = BaseEmail(**email_data) email = BaseEmail(**email_data)
email.send() 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()) return HttpResponseRedirect(self.get_success_url())
@ -196,15 +199,15 @@ class IndexView(CreateView):
def validate_cores(self, value): def validate_cores(self, value):
if (value > 48) or (value < 1): if (value > 48) or (value < 1):
raise ValidationError(_('Not a proper cores number')) raise ValidationError(_('Invalid number of cores'))
def validate_memory(self, value): def validate_memory(self, value):
if (value > 200) or (value < 2): if (value > 200) or (value < 2):
raise ValidationError(_('Not a proper ram number')) raise ValidationError(_('Invalid RAM size'))
def validate_storage(self, value): def validate_storage(self, value):
if (value > 2000) or (value < 10): 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) @cache_control(no_cache=True, must_revalidate=True, no_store=True)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
@ -227,7 +230,8 @@ class IndexView(CreateView):
storage_field = forms.IntegerField(validators=[self.validate_storage]) storage_field = forms.IntegerField(validators=[self.validate_storage])
price = request.POST.get('total') price = request.POST.get('total')
template_id = int(request.POST.get('config')) 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 template_data = VMTemplateSerializer(template).data
name = request.POST.get('name') name = request.POST.get('name')
@ -239,35 +243,40 @@ class IndexView(CreateView):
cores = cores_field.clean(cores) cores = cores_field.clean(cores)
except ValidationError as err: except ValidationError as err:
msg = '{} : {}.'.format(cores, str(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") return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
try: try:
memory = memory_field.clean(memory) memory = memory_field.clean(memory)
except ValidationError as err: except ValidationError as err:
msg = '{} : {}.'.format(memory, str(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") return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
try: try:
storage = storage_field.clean(storage) storage = storage_field.clean(storage)
except ValidationError as err: except ValidationError as err:
msg = '{} : {}.'.format(storage, str(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") return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
try: try:
name = name_field.clean(name) name = name_field.clean(name)
except ValidationError as err: except ValidationError as err:
msg = '{} {}.'.format(name, _('is not a proper name')) 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") return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
try: try:
email = email_field.clean(email) email = email_field.clean(email)
except ValidationError as err: except ValidationError as err:
msg = '{} {}.'.format(email, _('is not a proper email')) 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") return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
specs = { specs = {
@ -332,7 +341,8 @@ class IndexView(CreateView):
email = BaseEmail(**email_data) email = BaseEmail(**email_data)
email.send() 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) return super(IndexView, self).form_valid(form)
@ -401,6 +411,7 @@ class PaymentOrderView(FormView):
# Create Billing Address # Create Billing Address
billing_address = form.save() billing_address = form.save()
request.session['billing_address_data'] = billing_address_data request.session['billing_address_data'] = billing_address_data
request.session['billing_address'] = billing_address.id request.session['billing_address'] = billing_address.id
request.session['token'] = token request.session['token'] = token
@ -425,11 +436,13 @@ class OrderConfirmationView(DetailView):
stripe_customer_id = request.session.get('customer') stripe_customer_id = request.session.get('customer')
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
stripe_utils = StripeUtils() 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'): if not card_details.get('response_object') and not card_details.get('paid'):
msg = card_details.get('error') msg = card_details.get('error')
messages.add_message(self.request, messages.ERROR, msg, extra_tags='failed_payment') messages.add_message(self.request, messages.ERROR, msg, extra_tags='failed_payment')
return HttpResponseRedirect(reverse('datacenterlight:payment')) return HttpResponseRedirect(reverse('datacenterlight:payment'))
context = { context = {
'site_url': reverse('datacenterlight:index'), 'site_url': reverse('datacenterlight:index'),
'cc_last4': card_details.get('response_object').get('last4'), '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() customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
billing_address_data = request.session.get('billing_address_data') billing_address_data = request.session.get('billing_address_data')
billing_address_id = request.session.get('billing_address') 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) vm_template_id = template.get('id', 1)
final_price = specs.get('price') final_price = specs.get('price')

View file

@ -195,7 +195,7 @@ CMS_TEMPLATES = (
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'app' 'NAME': 'app',
} }
} }

View file

@ -1,4 +1,4 @@
from .base import * # flake8: noqa from .base import * # flake8: noqa
# List of people that get admin messages # List of people that get admin messages
ADMINS = ((x, x + "@ungleich.ch") for x in ["web-team"]) ADMINS = ((x, x + "@ungleich.ch") for x in ["web-team"])

View file

@ -1,3 +1,5 @@
import datetime
from django import forms from django import forms
from membership.models import CustomUser from membership.models import CustomUser
from django.contrib.auth import authenticate from django.contrib.auth import authenticate
@ -7,6 +9,10 @@ from django.utils.translation import ugettext_lazy as _
from .models import UserHostingKey from .models import UserHostingKey
def generate_ssh_key_name():
return 'dcl-generated-key-' + datetime.datetime.now().strftime('%m%d%y%H%M')
class HostingUserLoginForm(forms.Form): class HostingUserLoginForm(forms.Form):
email = forms.CharField(widget=forms.EmailInput()) email = forms.CharField(widget=forms.EmailInput())
@ -20,9 +26,11 @@ class HostingUserLoginForm(forms.Form):
password = self.cleaned_data.get('password') password = self.cleaned_data.get('password')
is_auth = authenticate(email=email, password=password) is_auth = authenticate(email=email, password=password)
if not is_auth: if not is_auth:
raise forms.ValidationError("Your username and/or password were incorrect.") raise forms.ValidationError(
_("Your username and/or password were incorrect."))
elif is_auth.validated == 0: elif is_auth.validated == 0:
raise forms.ValidationError(_("Your account is not activated yet.")) raise forms.ValidationError(
_("Your account is not activated yet."))
return self.cleaned_data return self.cleaned_data
def clean_email(self): def clean_email(self):
@ -58,15 +66,19 @@ class HostingUserSignupForm(forms.ModelForm):
class UserHostingKeyForm(forms.ModelForm): class UserHostingKeyForm(forms.ModelForm):
private_key = forms.CharField(widget=forms.HiddenInput(), required=False) private_key = forms.CharField(widget=forms.HiddenInput(), required=False)
public_key = forms.CharField(widget=forms.Textarea(), required=False, public_key = forms.CharField(widget=forms.Textarea(
help_text=_('Paste here your public key')) attrs={'class': 'form_public_key', 'placeholder': _('Paste here your public key')}),
required=False,
)
user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(), user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(),
required=False, widget=forms.HiddenInput()) required=False, widget=forms.HiddenInput())
name = forms.CharField(required=True) name = forms.CharField(required=False, widget=forms.TextInput(
attrs={'class': 'form_key_name', 'placeholder': _('Give a name to your key')}))
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.request = kwargs.pop("request") self.request = kwargs.pop("request")
super(UserHostingKeyForm, self).__init__(*args, **kwargs) super(UserHostingKeyForm, self).__init__(*args, **kwargs)
self.fields['name'].label = _('Key name')
def clean_name(self): def clean_name(self):
return self.data.get('name') return self.data.get('name')
@ -76,7 +88,8 @@ class UserHostingKeyForm(forms.ModelForm):
def clean(self): def clean(self):
cleaned_data = self.cleaned_data cleaned_data = self.cleaned_data
if not self.cleaned_data.get('name', ''):
self.cleaned_data['name'] = generate_ssh_key_name()
if not cleaned_data.get('public_key'): if not cleaned_data.get('public_key'):
private_key, public_key = UserHostingKey.generate_keys() private_key, public_key = UserHostingKey.generate_keys()
cleaned_data.update({ cleaned_data.update({

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-17 00:53+0530\n" "POT-Creation-Date: 2017-08-03 03:31+0530\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,359 +18,274 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:25 msgid "Your username and/or password were incorrect."
msgstr "Dein Benutzername und/oder Dein Passwort ist falsch."
msgid "Your account is not activated yet." msgid "Your account is not activated yet."
msgstr "Dein Account wurde noch nicht aktiviert." msgstr "Dein Account wurde noch nicht aktiviert."
#: forms.py:62
msgid "Paste here your public key" msgid "Paste here your public key"
msgstr "Fügen Sie Ihren public key ein" msgstr "Füge deinen Public Key ein"
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" msgid "My Virtual Machines"
msgstr "Meine virtuellen Maschinen" msgstr "Meine virtuellen Maschinen"
#: templates/hosting/base_short.html:76 templates/hosting/orders.html.py:12
msgid "My Orders" msgid "My Orders"
msgstr "Meine Bestellungen" msgstr "Meine Bestellungen"
#: templates/hosting/base_short.html:85
msgid "Keys"
msgstr "Schlüssel"
#: templates/hosting/base_short.html:90
msgid "Notifications " msgid "Notifications "
msgstr "Benachrichtigungen" msgstr "Benachrichtigungen"
#: templates/hosting/base_short.html:93
msgid "Logout" msgid "Logout"
msgstr "Abmelden" msgstr "Abmelden"
#: templates/hosting/base_short.html:98 msgid "All Rights Reserved"
msgid "How it works" msgstr "Alle Rechte vorbehalten"
msgstr "So funktioniert es"
#: templates/hosting/base_short.html:101
msgid "Your infrastructure"
msgstr "deine Infrastruktur"
#: templates/hosting/base_short.html:104
msgid "Our inftrastructure"
msgstr "Unsere Infrastruktur"
#: templates/hosting/base_short.html:107
msgid "Pricing"
msgstr "Preise"
#: templates/hosting/base_short.html:110
msgid "Contact"
msgstr "Kontakt"
#: templates/hosting/base_short.html:113
#: templates/hosting/confirm_reset_password.html:38
#: templates/hosting/login.html:17 templates/hosting/login.html.py:26
#: templates/hosting/reset_password.html:32 templates/hosting/signup.html:30
msgid "Login"
msgstr "Anmelden"
#: templates/hosting/bill_detail.html:11
msgid "Invoice" msgid "Invoice"
msgstr "Rechnung" msgstr "Rechnung"
#: templates/hosting/bill_detail.html:11 templates/hosting/order_detail.html:23
msgid "Order #" msgid "Order #"
msgstr "Bestellung #" msgstr "Bestellung #"
#: templates/hosting/bill_detail.html:25
msgid "ungleich GmbH" msgid "ungleich GmbH"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:26
msgid "buchhaltung@ungleich.ch" msgid "buchhaltung@ungleich.ch"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:27
msgid "Hauptstrasse 14" msgid "Hauptstrasse 14"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:28
msgid "CH-8775 Luchsingen" msgid "CH-8775 Luchsingen"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:29
msgid "Mwst-Nummer: CHE-109.549.333 MWST" msgid "Mwst-Nummer: CHE-109.549.333 MWST"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:60
msgid "Total:" msgid "Total:"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:68
#, python-format #, python-format
msgid "Alles Preise in CHF mit 8%% Mehrwertsteuer." msgid "Alles Preise in CHF mit 8%% Mehrwertsteuer."
msgstr "All prices in CHF including 8%% VAT" msgstr "All prices in CHF including 8%% VAT"
#: templates/hosting/bill_detail.html:69
msgid "Betrag zahlbar innerhalb von 30 Tagen ab Rechnungseingang." msgid "Betrag zahlbar innerhalb von 30 Tagen ab Rechnungseingang."
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:70
msgid "Kontoverbindung:" msgid "Kontoverbindung:"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:73
msgid "IBAN:" msgid "IBAN:"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:76
msgid "BIC:" msgid "BIC:"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:81
msgid "CH02 0900 0000 6071 8848 8" msgid "CH02 0900 0000 6071 8848 8"
msgstr "" msgstr ""
#: templates/hosting/bill_detail.html:84
msgid "POFICHBEXXX" msgid "POFICHBEXXX"
msgstr "" msgstr ""
#: templates/hosting/bills.html:12
msgid "Customers" msgid "Customers"
msgstr "Kunden" msgstr "Kunden"
#: templates/hosting/bills.html:16 templates/hosting/user_keys.html.py:25
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: templates/hosting/bills.html:17
msgid "Email" msgid "Email"
msgstr "" msgstr ""
#: templates/hosting/bills.html:28
msgid "View Bill" msgid "View Bill"
msgstr "Rechnung anzeigen" msgstr "Rechnung anzeigen"
#: templates/hosting/bills.html:41 templates/hosting/orders.html.py:82
#: templates/hosting/virtual_machines.html:70
msgid "previous" msgid "previous"
msgstr "vorherige" msgstr "vorherige"
#: templates/hosting/bills.html:47 templates/hosting/orders.html.py:88
#: templates/hosting/virtual_machines.html:76
msgid "next" msgid "next"
msgstr "nächste" msgstr "nächste"
#: templates/hosting/confirm_reset_password.html:10 msgid "SSH Key"
#: templates/hosting/login.html:12 templates/hosting/reset_password.html:10 msgstr "SSH Key"
#: templates/hosting/signup.html:9 templates/hosting/signup_validate.html:9
msgid "Choose a key option in order to access your VM"
msgstr "Wähle eine Option um Zugriff auf deine VM zu erhalten"
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" msgid "Your VM hosted in Switzerland"
msgstr "deine VM in der Schweiz" msgstr "deine VM in der Schweiz"
#: templates/hosting/confirm_reset_password.html:14
msgid "Set your new password" msgid "Set your new password"
msgstr "Setze dein neues Passwort" msgstr "Setze dein neues Passwort"
#: templates/hosting/confirm_reset_password.html:29
#: templates/hosting/reset_password.html:23
msgid "Reset" msgid "Reset"
msgstr "Zurücksetzen" 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 ?" msgid "Already have an account ?"
msgstr "Hast Du bereits ein Benutzerkonto?" msgstr "Hast Du bereits ein Benutzerkonto?"
#: templates/hosting/create_virtual_machine.html:20 msgid "Login"
msgstr "Anmelden"
msgid "New Virtual Machine" msgid "New Virtual Machine"
msgstr "Neue virtuelle Maschine" msgstr "Neue virtuelle Maschine"
#: templates/hosting/create_virtual_machine.html:28
msgid "Step 1. Select VM Template:" msgid "Step 1. Select VM Template:"
msgstr "Wähle eine Vorlage" msgstr "Wähle eine Vorlage"
#: templates/hosting/create_virtual_machine.html:42
msgid "Step2. Select VM Configuration" msgid "Step2. Select VM Configuration"
msgstr "Wähle eine Konfiguration" msgstr "Wähle eine Konfiguration"
#: templates/hosting/create_virtual_machine.html:59
msgid "Price " msgid "Price "
msgstr "Preis" msgstr "Preis"
#: templates/hosting/create_virtual_machine.html:59
msgid "CHF/Month" msgid "CHF/Month"
msgstr "CHF/Monat" msgstr "CHF/Monat"
#: templates/hosting/create_virtual_machine.html:61
msgid "Start VM" msgid "Start VM"
msgstr "VM jetzt starten" msgstr "VM jetzt starten"
#: templates/hosting/emails/password_reset_email.html:2
#: templates/hosting/emails/password_reset_email.txt:2
#, python-format #, python-format
msgid "" msgid ""
"You're receiving this email because you requested a password reset for your " "You're receiving this email because you requested a password reset for your "
"user account at %(site_name)s." "user account at %(site_name)s."
msgstr "" msgstr ""
#: templates/hosting/emails/password_reset_email.html:4
#: templates/hosting/emails/password_reset_email.txt:4
msgid "Please go to the following page and choose a new password:" msgid "Please go to the following page and choose a new password:"
msgstr "" msgstr ""
#: templates/hosting/emails/password_reset_email.html:9
#: templates/hosting/emails/password_reset_email.txt:9
msgid "Thanks for using our site!" msgid "Thanks for using our site!"
msgstr "" msgstr ""
#: templates/hosting/emails/password_reset_email.html:11
#: templates/hosting/emails/password_reset_email.txt:11
#, python-format #, python-format
msgid "The %(site_name)s team" msgid "The %(site_name)s team"
msgstr "" msgstr ""
#: templates/hosting/login.html:34
msgid "Don't have an account yet ? " msgid "Don't have an account yet ? "
msgstr "Besitzt du kein Benutzerkonto?" msgstr "Besitzt du kein Benutzerkonto?"
#: templates/hosting/login.html:37 templates/hosting/signup.html.py:13
#: templates/hosting/signup.html:21 views.py:219
msgid "Sign up" msgid "Sign up"
msgstr "Registrieren" msgstr "Registrieren"
#: templates/hosting/login.html:39
msgid "Forgot your password ? " msgid "Forgot your password ? "
msgstr "Passwort vergessen?" msgstr "Passwort vergessen?"
#: templates/hosting/notifications.html:9
msgid "Notifications" msgid "Notifications"
msgstr "Benachrichtigungen" msgstr "Benachrichtigungen"
#: templates/hosting/notifications.html:16
msgid "Unread" msgid "Unread"
msgstr "Ungelesen" msgstr "Ungelesen"
#: templates/hosting/notifications.html:26
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: templates/hosting/notifications.html:38
msgid "Unread notifications" msgid "Unread notifications"
msgstr "Ungelesene Benachrichtigungen" msgstr "Ungelesene Benachrichtigungen"
#: templates/hosting/notifications.html:48
msgid "Mark as read" msgid "Mark as read"
msgstr "Als gelesen markieren" msgstr "Als gelesen markieren"
#: templates/hosting/notifications.html:59
msgid "All notifications" msgid "All notifications"
msgstr "Alle Benachrichtigungen" msgstr "Alle Benachrichtigungen"
#: templates/hosting/order_detail.html:23
msgid "Confirm Order" msgid "Confirm Order"
msgstr "Bestellung Bestätigen" msgstr "Bestellung Bestätigen"
#: templates/hosting/order_detail.html:29
msgid "Billed To:"
msgstr "Rechnungsadresse"
#: templates/hosting/order_detail.html:37 templates/hosting/orders.html:17
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
#: templates/hosting/order_detail.html:39
msgid "Status:" msgid "Status:"
msgstr "" msgstr ""
#: templates/hosting/order_detail.html:51 msgid "Billed To:"
msgstr "Rechnungsadresse"
msgid "Payment Method:" msgid "Payment Method:"
msgstr "Bezahlmethode" msgstr "Bezahlmethode"
#: templates/hosting/order_detail.html:62
msgid "Order summary" msgid "Order summary"
msgstr "Bestellungsübersicht" msgstr "Bestellungsübersicht"
#: templates/hosting/order_detail.html:65 templates/hosting/payment.html:13
#: templates/hosting/virtual_machine_detail.html:76
msgid "Cores" msgid "Cores"
msgstr "Prozessorkerne" msgstr "Prozessorkerne"
#: templates/hosting/order_detail.html:67 templates/hosting/payment.html:16
#: templates/hosting/virtual_machine_detail.html:82
msgid "Memory" msgid "Memory"
msgstr "Arbeitsspeicher" msgstr "Arbeitsspeicher"
#: templates/hosting/order_detail.html:69 templates/hosting/payment.html:19
msgid "Disk space" msgid "Disk space"
msgstr "Festplattenkapazität" msgstr "Festplattenkapazität"
#: templates/hosting/order_detail.html:71 templates/hosting/payment.html:41
msgid "Total" msgid "Total"
msgstr "Gesamt" msgstr "Gesamt"
#: templates/hosting/order_detail.html:77
msgid "Finish Configuration" msgid "Finish Configuration"
msgstr "Konfiguration beenden" msgstr "Konfiguration beenden"
#: templates/hosting/orders.html:18
msgid "Amount" msgid "Amount"
msgstr "Betrag" msgstr "Betrag"
#: templates/hosting/orders.html:19 templates/hosting/user_keys.html.py:27
#: templates/hosting/virtual_machine_detail.html:30
#: templates/hosting/virtual_machines.html:31
msgid "Status" msgid "Status"
msgstr "" msgstr ""
#: templates/hosting/orders.html:30
msgid "Approved" msgid "Approved"
msgstr "Akzeptiert" msgstr "Akzeptiert"
#: templates/hosting/orders.html:32
msgid "Declined" msgid "Declined"
msgstr "Abgelehnt" msgstr "Abgelehnt"
#: templates/hosting/orders.html:37 templates/hosting/virtual_machines.html:58
msgid "View Detail" msgid "View Detail"
msgstr "Details anzeigen" msgstr "Details anzeigen"
#: templates/hosting/orders.html:40
msgid "Cancel Order" msgid "Cancel Order"
msgstr "Bestellung stornieren" msgstr "Bestellung stornieren"
#: templates/hosting/orders.html:55 #, fuzzy
msgid "Do You want to delete your order?" #| msgid "Do You want to delete your order?"
msgid "Do you want to delete your order?"
msgstr "Willst du deine Bestellung löschen?" msgstr "Willst du deine Bestellung löschen?"
#: templates/hosting/orders.html:63 templates/hosting/user_keys.html.py:63
msgid "Close"
msgstr "Schliessen"
#: templates/hosting/orders.html:65 templates/hosting/user_keys.html.py:65
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
#: templates/hosting/payment.html:10
msgid "Your Order" msgid "Your Order"
msgstr "Deine Bestellung" msgstr "Deine Bestellung"
#: templates/hosting/payment.html:22
#: templates/hosting/virtual_machine_detail.html:98
msgid "Configuration" msgid "Configuration"
msgstr "Konfiguration" msgstr "Konfiguration"
#: templates/hosting/payment.html:41
msgid "including VAT" msgid "including VAT"
msgstr "inkl. Mehrwertsteuer" msgstr "inkl. Mehrwertsteuer"
#: templates/hosting/payment.html:55
msgid "Billing Address" msgid "Billing Address"
msgstr "Rechnungsadresse" msgstr "Rechnungsadresse"
#: templates/hosting/payment.html:66
msgid "Credit Card" msgid "Credit Card"
msgstr "Kreditkarte" msgstr "Kreditkarte"
#: templates/hosting/payment.html:71
msgid "" msgid ""
"\n" "\n"
" Please fill in your credit card information " " Please fill in your credit card information "
@ -385,7 +300,6 @@ msgstr ""
"\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und " "\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und "
"speichern keine Informationen in unserer Datenbank." "speichern keine Informationen in unserer Datenbank."
#: templates/hosting/payment.html:90
msgid "" msgid ""
"\n" "\n"
" You are not making any payment yet. " " You are not making any payment yet. "
@ -399,27 +313,21 @@ msgstr ""
"Kreditkateninformationen wirst du auf die Bestellbestätigungsseite " "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite "
"weitergeleitet." "weitergeleitet."
#: templates/hosting/payment.html:101 templates/hosting/payment.html.py:143
msgid "Submit" msgid "Submit"
msgstr "Absenden" msgstr "Absenden"
#: templates/hosting/payment.html:113
msgid "Card Number" msgid "Card Number"
msgstr "Kreditkartennummer" msgstr "Kreditkartennummer"
#: templates/hosting/payment.html:117
msgid "Expiry Date" msgid "Expiry Date"
msgstr "Ablaufdatum" msgstr "Ablaufdatum"
#: templates/hosting/payment.html:122
msgid "CVC" msgid "CVC"
msgstr "" msgstr ""
#: templates/hosting/payment.html:126
msgid "Card Type" msgid "Card Type"
msgstr "Kartentyp" msgstr "Kartentyp"
#: templates/hosting/payment.html:135
msgid "" msgid ""
"\n" "\n"
" You are not making any payment " " You are not making any payment "
@ -433,125 +341,115 @@ msgstr ""
"Kreditkateninformationen wirst du auf die Bestellbestätigungsseite " "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite "
"weitergeleitet." "weitergeleitet."
#: templates/hosting/payment.html:178
msgid "Processing" msgid "Processing"
msgstr "Weiter" msgstr "Weiter"
#: templates/hosting/payment.html:179
msgid "Enter your credit card number" msgid "Enter your credit card number"
msgstr "Deine Kreditkartennummer" msgstr "Deine Kreditkartennummer"
#: templates/hosting/reset_password.html:15
msgid "Reset your password" msgid "Reset your password"
msgstr "Passwort zurücksetzen" msgstr "Passwort zurücksetzen"
#: templates/hosting/user_key.html:11 templates/hosting/user_keys.html.py:9 msgid "Add your public SSH key"
msgid "Access Key" msgstr "Füge deinen öffentlichen SSH-Key hinzu"
msgstr "Zugriffsschlüssel"
#: templates/hosting/user_key.html:24 msgid "Use your created key to access to the VM"
msgid "Upload your own key. " msgstr "Benutze deinen erstellten SSH-Key um auf deine VM zugreifen zu können"
msgstr "Lade deinen Key hoch"
#: templates/hosting/user_key.html:28 msgid "Add SSH Key"
msgid "Or generate a new key pair." msgstr "Hinzufügen"
msgstr "Oder erstelle dein neues Keypaar"
#: templates/hosting/user_key.html:30 msgid "Or you can generate a new key pair"
msgid "Generate Key Pair" msgstr "Erstelle dein neues Keypaar"
msgstr "Schlüsselpaar generieren"
#: templates/hosting/user_key.html:40
msgid "Warning!" msgid "Warning!"
msgstr "Achtung!" msgstr "Achtung!"
#: templates/hosting/user_key.html:40 #, 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 lost your key"
msgid "You can download your SSH private key once. Don't loose your key"
msgstr "" msgstr ""
"Du kannst deinen privaten SSH Schlüssel nur einmal herunterladen. Beware ihn " "Du kannst deinen privaten SSH Schlüssel nur einmal herunterladen. Beware ihn "
"sicher auf." "sicher auf."
#: templates/hosting/user_keys.html:18 msgid "Your SSH Keys"
msgid "Add Key" msgstr "Deine SSH Keys"
msgstr "Schlüssel hinzufügen"
#: templates/hosting/user_keys.html:26 msgid ""
msgid "Created at" "To generate a new key pair or to upload your existing key, click 'Add Key'"
msgstr "Erstellt am" 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" msgid "Delete Key"
msgstr "Löschen" 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?" msgid "Do You want to delete this key?"
msgstr "Möchtest Du den Schlüssel löschen?" msgstr "Möchtest Du den Schlüssel löschen?"
#: templates/hosting/virtual_machine_detail.html:19 msgid "Close"
msgstr "Schliessen"
msgid "Show"
msgstr "Anzeigen"
msgid "Public ssh key"
msgstr ""
msgid "Download"
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
#: templates/hosting/virtual_machine_detail.html:25
msgid "Billing" msgid "Billing"
msgstr "Abrechnungen" msgstr "Abrechnungen"
#: templates/hosting/virtual_machine_detail.html:60
msgid "Ip not assigned yet" msgid "Ip not assigned yet"
msgstr "Ip nicht zugewiesen" msgstr "Ip nicht zugewiesen"
#: templates/hosting/virtual_machine_detail.html:89
msgid "Disk" msgid "Disk"
msgstr "Festplatte" msgstr "Festplatte"
#: templates/hosting/virtual_machine_detail.html:108
msgid "Current pricing" msgid "Current pricing"
msgstr "Aktueller Preis" msgstr "Aktueller Preis"
#: templates/hosting/virtual_machine_detail.html:117
msgid "Current status" msgid "Current status"
msgstr "Aktueller Status" msgstr "Aktueller Status"
#: templates/hosting/virtual_machine_detail.html:142
msgid "Terminate Virtual Machine" msgid "Terminate Virtual Machine"
msgstr "Virtuelle Maschine beenden" msgstr "Virtuelle Maschine beenden"
#: templates/hosting/virtual_machine_detail.html:163
msgid "Terminate your Virtual Machine" msgid "Terminate your Virtual Machine"
msgstr "Ihre virtuelle Maschine beenden" msgstr "Ihre virtuelle Maschine beenden"
#: templates/hosting/virtual_machine_detail.html:166
msgid "Are you sure do you want to cancel your Virtual Machine " msgid "Are you sure do you want to cancel your Virtual Machine "
msgstr "Sind Sie sicher, dass Sie ihre virtuelle Maschine beenden wollen " msgstr "Sind Sie sicher, dass Sie ihre virtuelle Maschine beenden wollen "
#: templates/hosting/virtual_machine_detail.html:169
msgid "Cancel"
msgstr "Beenden"
#: templates/hosting/virtual_machines.html:9
msgid "Virtual Machines" msgid "Virtual Machines"
msgstr "Virtuelle Maschinen" msgstr "Virtuelle Maschinen"
#: templates/hosting/virtual_machines.html:22
msgid "Create VM" msgid "Create VM"
msgstr "Neue VM" msgstr "Neue VM"
#: templates/hosting/virtual_machines.html:28
msgid "ID" msgid "ID"
msgstr "" msgstr ""
#: templates/hosting/virtual_machines.html:29
msgid "Ipv4" msgid "Ipv4"
msgstr "IPv4" msgstr "IPv4"
#: templates/hosting/virtual_machines.html:30
msgid "Ipv6" msgid "Ipv6"
msgstr "IPv6" msgstr "IPv6"
#: views.py:207 views.py:229
msgid "login" msgid "login"
msgstr "einloggen" msgstr "einloggen"
#: views.py:212
msgid "" msgid ""
"Thank you for signing up. We have sent an email to you. Please follow the " "Thank you for signing up. We have sent an email to you. Please follow the "
"instructions in it to activate your account. Once activated, you can login " "instructions in it to activate your account. Once activated, you can login "
@ -561,32 +459,135 @@ msgstr ""
"den Anweisungen um deinen Account zu aktivieren. Danach kannst du dich über " "den Anweisungen um deinen Account zu aktivieren. Danach kannst du dich über "
"diesen" "diesen"
#: views.py:214 views.py:240
msgid "Go back to" msgid "Go back to"
msgstr "Zurück" msgstr "Zurück"
#: views.py:230
msgid "Account activation" msgid "Account activation"
msgstr "Accountaktivierung" msgstr "Accountaktivierung"
#: views.py:233
msgid "Your account has been activated." msgid "Your account has been activated."
msgstr "Dein Account wurde aktiviert." msgstr "Dein Account wurde aktiviert."
#: views.py:234
msgid "You can now" msgid "You can now"
msgstr "Du kannst dich nun" msgstr "Du kannst dich nun"
#: views.py:239
msgid "Sorry. Your request is invalid." msgid "Sorry. Your request is invalid."
msgstr "Entschuldigung, deine Anfrage ist ungültig." msgstr "Entschuldigung, deine Anfrage ist ungültig."
#: views.py:757
msgid "" msgid ""
"We could not find the requested VM. Please " "We could not find the requested VM. Please "
"contact Data Center Light Support." "contact Data Center Light Support."
msgstr "" msgstr ""
#~ msgid "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" #~ msgid "Billing Amount"
#~ msgstr "Rechnungsbetrag" #~ msgstr "Rechnungsbetrag"
@ -610,25 +611,6 @@ msgstr ""
#~ msgid "EXPIRATION DATE" #~ msgid "EXPIRATION DATE"
#~ msgstr "Ablaufdatum" #~ msgstr "Ablaufdatum"
#~ msgid "Home"
#~ msgstr "Home"
#~ msgid "Log in"
#~ msgstr "Anmelden"
#~ msgid "You haven been logged out"
#~ msgstr "Sie wurden abgmeldet"
#~ msgid "Upload Key"
#~ msgstr "Schlüssel hochladen"
#~ msgid ""
#~ "Use your created key to access to the machine. If you lost it, contact us."
#~ msgstr ""
#~ "Verwende deinen privaten SSH Schlüssel, um dich mit deinen Maschinen zu "
#~ "verbinden. Solltest du deinen privaten Schlüssel verloren haben, dann "
#~ "kontaktiere uns."
#~ msgid "Copy to Clipboard" #~ msgid "Copy to Clipboard"
#~ msgstr "Kopieren" #~ msgstr "Kopieren"
@ -638,6 +620,3 @@ msgstr ""
#~ msgstr "" #~ msgstr ""
#~ "Dein privater SSH Schlüssel wurde bereits generiert und heruntergeladen. " #~ "Dein privater SSH Schlüssel wurde bereits generiert und heruntergeladen. "
#~ "Falls du ihn verloren hast, kontaktiere uns." #~ "Falls du ihn verloren hast, kontaktiere uns."
#~ msgid "Generate my key"
#~ msgstr "Generiere meinen Schlüssel"

View 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'),
),
]

View file

@ -101,6 +101,7 @@ class HostingOrder(AssignPermissionsMixin, models.Model):
class UserHostingKey(models.Model): class UserHostingKey(models.Model):
user = models.ForeignKey(CustomUser) user = models.ForeignKey(CustomUser)
public_key = models.TextField() public_key = models.TextField()
private_key = models.FileField(upload_to='private_keys', blank=True)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=100) name = models.CharField(max_length=100)

View file

@ -1,22 +1,23 @@
.dashboard-container { .dashboard-container {
padding-top:70px; padding-bottom: 70px; padding-top:70px;
width: 90%; padding-bottom: 70px;
margin: 0 auto; width: 90%;
max-width: 768px; margin: 0 auto;
max-width: 768px;
} }
.content-dashboard{ .content-dashboard{
min-height: 100vh; min-height: 100vh;
width: 80%; width: 80%;
margin: 0 auto; margin: 0 auto;
max-width: 1120px; max-width: 1120px;
} }
.container-table{ .container-table{
margin-top: 35px; margin-top: 35px;
overflow-y: hidden; overflow-y: hidden;
} }
.container-table table{ .container-table table{
overflow-y: auto; overflow-y: auto;
} }
.borderless td { .borderless td {
border: none !important; border: none !important;
@ -36,25 +37,150 @@
} }
.space-above { .space-above {
margin-top: 4%; margin-top: 4%;
} }
.space-above-big { .space-above-big {
margin-top: 20%; margin-top: 20%;
} }
.table>tbody>tr>td{ .table>tbody>tr>td{
vertical-align: middle; vertical-align: middle;
} }
.fa-separate{ .fa-separate{
margin-right: 15px; margin-right: 15px;
} }
@media (max-width: 540px) { @media (max-width: 540px) {
select { select {
width: 280px; width: 280px;
} }
.content-dashboard { .content-dashboard {
width: 90%; 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;
}

View file

@ -225,7 +225,7 @@ h6 {
} }
.auth-bg { .auth-bg {
background: url(../img/auth-bg.jpg); background: url(../img/auth-bg-sm.jpg);
position: fixed; position: fixed;
left: 0; left: 0;
top: 0; top: 0;
@ -538,6 +538,10 @@ a.unlink:hover {
padding: 5px; padding: 5px;
} }
.card-warning-addtional-margin {
margin-top: 15px;
}
.stripe-payment-btn { .stripe-payment-btn {
outline: none; outline: none;
width: auto; width: auto;

View 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;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

View file

@ -18,6 +18,7 @@
<!-- Custom CSS --> <!-- Custom CSS -->
<link href="{% static 'hosting/css/landing-page.css' %}" rel="stylesheet"> <link href="{% static 'hosting/css/landing-page.css' %}" rel="stylesheet">
<link href="{% static 'hosting/css/user_keys.css' %}" rel="stylesheet">
<link href="{% static 'hosting/css/payment.css' %}" rel="stylesheet"> <link href="{% static 'hosting/css/payment.css' %}" rel="stylesheet">
<link href="{% static 'hosting/css/order.css' %}" rel="stylesheet"> <link href="{% static 'hosting/css/order.css' %}" rel="stylesheet">
<link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet"> <link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet">
@ -27,7 +28,7 @@
<!-- Custom Fonts --> <!-- Custom Fonts -->
<link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'> <link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<link href="//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css"> <link href="//fonts.googleapis.com/css?family=Lato:300,400,500,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon" /> <link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="{% static 'hosting/css/owl.carousel.min.css' %}"> <link rel="stylesheet" href="{% static 'hosting/css/owl.carousel.min.css' %}">
<link rel="stylesheet" href="{% static 'hosting/css/owl.theme.default.min.css' %}"> <link rel="stylesheet" href="{% static 'hosting/css/owl.theme.default.min.css' %}">
@ -84,7 +85,7 @@
<ul id="g-account-menu" class="dropdown-menu" role="menu"> <ul id="g-account-menu" class="dropdown-menu" role="menu">
<li> <li>
<a href="{% url 'hosting:ssh_keys' %}"> <a href="{% url 'hosting:ssh_keys' %}">
<i class="fa fa-key"></i> {% trans "Keys"%} <i class="fa fa-key"></i> {% trans "SSH Keys" %}
</a> </a>
</li> </li>
<li> <li>
@ -114,7 +115,7 @@
{% if request.user.is_authenticated %} {% if request.user.is_authenticated %}
<footer class="footer-vm"> <footer class="footer-vm">
<div class="container"> <div class="container">
<p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. All Rights Reserved</p> <p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
</div> </div>
</footer> </footer>
{% else %} {% else %}

View 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>&nbsp;{% 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%}

View file

@ -26,7 +26,7 @@
<a href="#contact">Contact</a> <a href="#contact">Contact</a>
</li> </li>
</ul> </ul>
<p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. All Rights Reserved</p> <p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -20,7 +20,7 @@
<div class="row"> <div class="row">
<div class="col-xs-12 col-md-8 col-md-offset-2"> <div class="col-xs-12 col-md-8 col-md-offset-2">
<div class="invoice-title"> <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> </div>
<hr> <hr>
<div class="row"> <div class="row">

View file

@ -52,16 +52,13 @@
</button> </button>
</div> </div>
<div class="modal-body"> <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" <form method="post"
action="{% url 'hosting:delete_order' order.id %}"> action="{% url 'hosting:delete_order' order.id %}">
{% csrf_token %} {% csrf_token %}
<div class="modal-footer"> <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 type="submit" class="btn btn-primary">{% trans "Delete"%}
</button> </button>
</div> </div>
@ -71,7 +68,6 @@
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>

View file

@ -86,7 +86,7 @@
</form> </form>
<div class="row"> <div class="row">
<div class="col-xs-12"> <div class="col-xs-12">
<p> <p class="card-warning-content card-warning-addtional-margin">
{% blocktrans %} {% blocktrans %}
You are not making any payment yet. After submitting your card You are not making any payment yet. After submitting your card
information, you will be taken to the Confirm Order Page. information, you will be taken to the Confirm Order Page.

View file

@ -2,52 +2,53 @@
{% load staticfiles bootstrap3 i18n %} {% load staticfiles bootstrap3 i18n %}
{% block content %} {% block content %}
<div> <div>
<div class="virtual-machine-container dashboard-container "> <div class="virtual-machine-container dashboard-container">
<div class="row"> <div class="row">
<div class="container-table col-md-9 col-md-offset-2"> <div class="col-md-9 col-md-offset-2">
<div class="col-sm-12"> <form method="POST" action="" novalidate class="form-ssh">
<form method="POST" action="" novalidate class="form-ssh"> {% csrf_token %}
{% csrf_token %} <div class="page-header">
<h3><i class="fa fa-key fa-separate" aria-hidden="true"></i>{% trans "Access Key"%} </h3> <h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i>&nbsp;{% trans "Add your public SSH key" %}</h1>
{% if messages %} </div>
{% if messages %}
<div class="alert alert-warning"> <div class="alert alert-warning">
{% for message in messages %} {% for message in messages %}
<span>{{ message }}</span> <span>{{ message }}</span>
{% endfor %} {% endfor %}
</div> </div>
{% endif %} {% endif %}
{% for field in form %} {% for field in form %}
{% bootstrap_field field %} {% bootstrap_field field %}
{% endfor %} {% endfor %}
{% buttons %} {% buttons %}
<button type="submit" class="btn btn-success"> <div class="underform-contaner">
{% trans "Upload your own key. "%} <h4>{% trans "Use your created key to access to the VM" %}.</h4>
<div class="btn-container">
<button type="submit" name="add_ssh" class="btn choice-btn choice-btn-faded">
{% trans "Add SSH Key" %}
</button> </button>
<br /> </div>
<br /> </div>
{% trans "Or generate a new key pair."%} <br /> <div class="underform-contaner">
<br /> <h4>{% trans "Or you can generate a new key pair"%}.</h4>
<button class="btn btn-success">{% trans "Generate Key Pair"%} </a> <div class="btn-container">
<button type="submit" name="generate" class="btn choice-btn">
{% trans "Generate" %}
</button> </button>
</div>
</div>
{% endbuttons %}
</form>
{% endbuttons %} {% if private_key %}
</form> <div class="alert alert-warning">
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5> <strong>{% trans "Warning!"%}</strong>{% trans "You can download your SSH private key once. Don't loose your key" %}
</div>
{% if private_key %} <div class="form-group">
<div class="alert alert-warning"> <textarea class="form-control" rows="6" id="ssh_key" type="hidden" style="display:none">{{private_key}}</textarea>
</div>
<strong>{% trans "Warning!"%}</strong>{% trans "You can download your SSH private key once. Don't lost your key"%} {% endif %}
</div>
<div class="form-group">
<textarea class="form-control" rows="6" id="ssh_key" type="hidden" style="display:none">{{private_key}}</textarea>
</div>
{% endif %}
<div class="clearfix"></div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -3,88 +3,109 @@
{% block content %} {% block content %}
<div> <div>
<div class="container virtual-machine-container dashboard-container "> <div class="container virtual-machine-container dashboard-container ">
<div class="row"> <h1 class="h1-thin"><i class="fa fa-key" aria-hidden="true"></i>&nbsp;{% trans "Your SSH Keys" %}</h1>
<div class="col-md-9 col-md-offset-2"> {% if messages %}
<div class="col-sm-12"> <div class="alert alert-warning">
<h3><i class="fa fa-key" aria-hidden="true"></i>{% trans "Access Key"%} </h3> {% for message in messages %}
{% if messages %} <span>{{ message }}</span>
<div class="alert alert-warning"> {% endfor %}
{% for message in messages %}
<span>{{ message }}</span>
{% endfor %}
</div>
{% endif %}
<p class="pull-right">
<a class="btn btn-success" href="{% url 'hosting:create_ssh_key' %}" >{% trans "Add Key"%} </a>
</p>
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5>
<table class="table borderless table-hover">
<br/>
<thead>
<tr>
<th>{% trans "Name"%}</th>
<th>{% trans "Created at"%} </th>
<th>{% trans "Status"%} </th>
<th></th>
</tr>
</thead>
<tbody>
{% for user_key in keys %}
<tr>
<td scope="row">{{user_key.name}}</td>
<td><span id="ssh-created_at-{{user_key.id}}">{{user_key.created_at|date:'Y-m-d H:i' }}</span></td>
<td>
<span class="h3 label label-success"><strong>Active</strong></span>
</td>
<td>
<button type="button" class="btn btn-default" data-toggle="modal"
data-target="#Modal{{ user_key.id }}"><a
href="#">{% trans "Delete Key"%}</a>
</button>
<div class="modal fade" id="Modal{{user_key.id }}" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-label="Confirm"><span
aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<h4 class="modal-title" id="ModalLabel">{% trans "Do You want to delete this key?"%}</h4>
<form method="post" action="{% url 'hosting:delete_ssh_key' user_key.id %}">
{% csrf_token %}
<div class="modal-footer">
<button type="button" class="btn btn-default"
data-dismiss="modal">
{% trans "Close"%}
</button>
<button type="submit" class="btn btn-primary">{% trans "Delete"%}
</button>
</div>
</form>
</div>
</div>
</div> </div>
</div> {% endif %}
</td> <div class="ssh-header-container">
</tr> <p>{% trans "To generate a new key pair or to upload your existing key, click 'Add Key'" %}</p>
{% endfor %} <a class="btn choice-btn" href="{% url 'hosting:choice_ssh_keys' %}" >
</tbody> <span class="fa fa-plus"></span>&nbsp;&nbsp;{% trans "Add SSH Key" %}
</table> </a>
</div>
<table class="table borderless table-hover ssh-keys-table">
<br/>
<thead>
<tr>
<th>{% trans "Name" %}</th>
<th>{% trans "Delete Key" %}</th>
<th>{% trans "Public Key" %}</th>
<th>{% trans "Private Key" %}</th>
</tr>
</thead>
<tbody>
{% for user_key in keys %}
<tr>
<td scope="row">{{user_key.name}}</td>
<td>
<button type="button" class="btn btn-default btn-custom-delete" data-toggle="modal"
data-target="#Modal{{ user_key.id }}" style="color: #717274">
<span class="pc-only">{% trans "Delete" %}</span>
<span class="mob-only"><i class="fa fa-trash"></i></span>
</button>
<div class="modal fade" id="Modal{{user_key.id }}" tabindex="-1" role="dialog">
<div class="clearfix"></div> <div class="modal-dialog" role="document">
</div> <div class="modal-content">
</div> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
</div> aria-label="Confirm"><span
aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<h4 class="modal-title" id="ModalLabel">{% trans "Do You want to delete this key?" %}</h4>
<form method="post" action="{% url 'hosting:delete_ssh_key' user_key.id %}">
{% csrf_token %}
<div class="modal-footer">
<button type="submit" class="btn btn-primary">{% trans "Delete" %}
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</td>
<td>
<p type="button" data-toggle="modal" style="margin: 0" data-target="#Modal_public_key{{ user_key.id }}">
<a href="#">{% trans "Show" %}</a>
</p>
<div class="modal fade" id="Modal_public_key{{user_key.id }}" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-label="Confirm"><span
aria-hidden="true">&times;</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> </div>
</div> </div>
{% if next_url %} {% if next_url %}
@ -98,7 +119,6 @@
window.onload = function () { window.onload = function () {
{% for user_key in keys %} {% 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(); 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"); locale_date = moment(locale_date).format("YYYY-MM-DD h:mm:ss a");
document.getElementById('ssh-created_at-{{user_key.id}}').innerHTML = locale_date; document.getElementById('ssh-created_at-{{user_key.id}}').innerHTML = locale_date;

View file

@ -159,14 +159,18 @@
<div class="modal fade" id="confirm-cancel" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal fade" id="confirm-cancel" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
{% trans "Terminate your Virtual Machine"%} <button type="button" class="close" data-dismiss="modal"
</div> aria-label="Confirm"><span
aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body"> <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>
<div class="modal-footer"> <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> <a class="btn btn-danger btn-ok">OK</a>
</div> </div>
</div> </div>

View file

@ -7,7 +7,7 @@ from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \ VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \
MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\ MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\
CreateVirtualMachinesView, HostingBillListView, HostingBillDetailView, \ CreateVirtualMachinesView, HostingBillListView, HostingBillDetailView, \
SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView, SSHKeyChoiceView
urlpatterns = [ urlpatterns = [
url(r'index/?$', IndexView.as_view(), name='index'), url(r'index/?$', IndexView.as_view(), name='index'),
@ -27,6 +27,8 @@ urlpatterns = [
name='virtual_machines'), name='virtual_machines'),
url(r'ssh_keys/?$', SSHKeyListView.as_view(), url(r'ssh_keys/?$', SSHKeyListView.as_view(),
name='ssh_keys'), name='ssh_keys'),
url(r'ssh_keys_choice/?$', SSHKeyChoiceView.as_view(),
name='choice_ssh_keys'),
url(r'delete_ssh_key/(?P<pk>\d+)/?$', SSHKeyDeleteView.as_view(), url(r'delete_ssh_key/(?P<pk>\d+)/?$', SSHKeyDeleteView.as_view(),
name='delete_ssh_key'), name='delete_ssh_key'),
url(r'create_ssh_key/?$', SSHKeyCreateView.as_view(), url(r'create_ssh_key/?$', SSHKeyCreateView.as_view(),

View file

@ -1,3 +1,7 @@
import uuid
from django.core.files.base import ContentFile
from oca.pool import WrongNameError, WrongIdError from oca.pool import WrongNameError, WrongIdError
from django.shortcuts import render from django.shortcuts import render
from django.http import Http404 from django.http import Http404
@ -24,7 +28,7 @@ from utils.forms import BillingAddressForm, PasswordResetRequestForm, UserBillin
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin
from utils.mailer import BaseEmail from utils.mailer import BaseEmail
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm, generate_ssh_key_name
from .mixins import ProcessVMSelectionMixin from .mixins import ProcessVMSelectionMixin
from opennebula_api.models import OpenNebulaManager from opennebula_api.models import OpenNebulaManager
@ -32,7 +36,6 @@ from opennebula_api.serializers import VirtualMachineSerializer, \
VirtualMachineTemplateSerializer VirtualMachineTemplateSerializer
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a backend \ CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a backend \
connection error. please try again in a few minutes." connection error. please try again in a few minutes."
@ -193,8 +196,10 @@ class SignupView(CreateView):
name = form.cleaned_data.get('name') name = form.cleaned_data.get('name')
email = form.cleaned_data.get('email') email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password') password = form.cleaned_data.get('password')
this_base_url = "{0}://{1}".format(self.request.scheme, self.request.get_host()) this_base_url = "{0}://{1}".format(self.request.scheme,
CustomUser.register(name, password, email, app='dcl', base_url=this_base_url) self.request.get_host())
CustomUser.register(name, password, email,
app='dcl', base_url=this_base_url)
return HttpResponseRedirect(reverse_lazy('hosting:signup-validate')) return HttpResponseRedirect(reverse_lazy('hosting:signup-validate'))
@ -204,8 +209,10 @@ class SignupValidateView(TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(SignupValidateView, self).get_context_data(**kwargs) context = super(SignupValidateView, self).get_context_data(**kwargs)
login_url = '<a href="' + reverse('hosting:login') + '">' + str(_('login')) + '</a>' login_url = '<a href="' + \
home_url = '<a href="' + reverse('datacenterlight:index') + '">Data Center Light</a>' reverse('hosting:login') + '">' + str(_('login')) + '</a>'
home_url = '<a href="' + \
reverse('datacenterlight:index') + '">Data Center Light</a>'
message = '{signup_success_message} {lurl}</a> \ message = '{signup_success_message} {lurl}</a> \
<br />{go_back} {hurl}.'.format( <br />{go_back} {hurl}.'.format(
signup_success_message=_( signup_success_message=_(
@ -226,15 +233,18 @@ class SignupValidatedView(SignupValidateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(SignupValidateView, self).get_context_data(**kwargs) context = super(SignupValidateView, self).get_context_data(**kwargs)
validated = CustomUser.validate_url(self.kwargs['validate_slug']) validated = CustomUser.validate_url(self.kwargs['validate_slug'])
login_url = '<a href="' + reverse('hosting:login') + '">' + str(_('login')) + '</a>' login_url = '<a href="' + \
reverse('hosting:login') + '">' + str(_('login')) + '</a>'
section_title = _('Account activation') section_title = _('Account activation')
if validated: if validated:
message = '{account_activation_string} <br /> {login_string} {lurl}.'.format( message = '{account_activation_string} <br /> {login_string} {lurl}.'.format(
account_activation_string=_("Your account has been activated."), account_activation_string=_(
"Your account has been activated."),
login_string=_("You can now"), login_string=_("You can now"),
lurl=login_url) lurl=login_url)
else: else:
home_url = '<a href="' + reverse('datacenterlight:index') + '">Data Center Light</a>' home_url = '<a href="' + \
reverse('datacenterlight:index') + '">Data Center Light</a>'
message = '{sorry_message} <br />{go_back_to} {hurl}'.format( message = '{sorry_message} <br />{go_back_to} {hurl}'.format(
sorry_message=_("Sorry. Your request is invalid."), sorry_message=_("Sorry. Your request is invalid."),
go_back_to=_('Go back to'), go_back_to=_('Go back to'),
@ -364,10 +374,29 @@ class SSHKeyListView(LoginRequiredMixin, ListView):
def render_to_response(self, context, **response_kwargs): def render_to_response(self, context, **response_kwargs):
if not self.queryset: if not self.queryset:
return HttpResponseRedirect(reverse('hosting:create_ssh_key')) return HttpResponseRedirect(reverse('hosting:choice_ssh_keys'))
return super(SSHKeyListView, self).render_to_response(context, **response_kwargs) return super(SSHKeyListView, self).render_to_response(context, **response_kwargs)
class SSHKeyChoiceView(LoginRequiredMixin, View):
template_name = "hosting/choice_ssh_keys.html"
login_url = reverse_lazy('hosting:login')
def get(self, request, *args, **kwargs):
context = {}
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
name = generate_ssh_key_name()
private_key, public_key = UserHostingKey.generate_keys()
content = ContentFile(private_key)
ssh_key = UserHostingKey.objects.create(
user=request.user, public_key=public_key, name=name)
filename = name + '_' + str(uuid.uuid4())[:8] + '_private.pem'
ssh_key.private_key.save(filename, content)
return redirect(reverse_lazy('hosting:ssh_keys'), foo='bar')
class SSHKeyCreateView(LoginRequiredMixin, FormView): class SSHKeyCreateView(LoginRequiredMixin, FormView):
form_class = UserHostingKeyForm form_class = UserHostingKeyForm
model = UserHostingKey model = UserHostingKey
@ -383,6 +412,11 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView):
def form_valid(self, form): def form_valid(self, form):
form.save() form.save()
if 'dcl-generated-key-' in form.instance.name:
content = ContentFile(form.cleaned_data.get('private_key'))
filename = form.cleaned_data.get(
'name') + '_' + str(uuid.uuid4())[:8] + '_private.pem'
form.instance.private_key.save(filename, content)
context = self.get_context_data() context = self.get_context_data()
next_url = self.request.session.get( next_url = self.request.session.get(
@ -407,10 +441,11 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView):
manager = OpenNebulaManager() manager = OpenNebulaManager()
# Get user ssh key # Get user ssh key
public_key = form.cleaned_data.get('public_key', '').decode('utf-8') public_key = str(form.cleaned_data.get('public_key', ''))
# Add ssh key to user # Add ssh key to user
try: try:
manager.add_public_key(user=owner, public_key=public_key, merge=True) manager.add_public_key(
user=owner, public_key=public_key, merge=True)
except ConnectionError: except ConnectionError:
pass pass
except WrongNameError: except WrongNameError:
@ -421,6 +456,9 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
print(self.request.POST.dict()) print(self.request.POST.dict())
form = self.get_form() form = self.get_form()
required = 'add_ssh' in self.request.POST
form.fields['name'].required = required
form.fields['public_key'].required = required
if form.is_valid(): if form.is_valid():
return self.form_valid(form) return self.form_valid(form)
else: else:
@ -563,7 +601,7 @@ class PaymentVMView(LoginRequiredMixin, FormView):
# Create a Hosting Bill # Create a Hosting Bill
HostingBill.create( HostingBill.create(
customer=customer, billing_address=billing_address) customer=customer, billing_address=billing_address)
# Create Billing Address for User if he does not have one # Create Billing Address for User if he does not have one
if not customer.user.billing_addresses.count(): if not customer.user.billing_addresses.count():
@ -600,7 +638,9 @@ class PaymentVMView(LoginRequiredMixin, FormView):
email = BaseEmail(**email_data) email = BaseEmail(**email_data)
email.send() 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: else:
return self.form_invalid(form) return self.form_invalid(form)
@ -619,6 +659,10 @@ class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin, Detai
owner = self.request.user owner = self.request.user
manager = OpenNebulaManager(email=owner.email, manager = OpenNebulaManager(email=owner.email,
password=owner.password) password=owner.password)
if self.request.GET.get('page', '') == 'payment':
context['page_header_text'] = _('Confirm Order')
else:
context['page_header_text'] = _('Invoice')
try: try:
vm = manager.get_vm(obj.vm_id) vm = manager.get_vm(obj.vm_id)
context['vm'] = VirtualMachineSerializer(vm).data context['vm'] = VirtualMachineSerializer(vm).data