Merge branch 'develop' of github.com:ungleich/dynamicweb into develop
This commit is contained in:
commit
f2ee18deba
37 changed files with 2809 additions and 828 deletions
|
@ -7,3 +7,8 @@
|
||||||
* [datacenterlight] Fixed login redirecting to blank page after logout
|
* [datacenterlight] Fixed login redirecting to blank page after logout
|
||||||
1.0.3: 2017-06-02
|
1.0.3: 2017-06-02
|
||||||
* [datacenterlight] Hotfix, remove footer on mobile devices
|
* [datacenterlight] Hotfix, remove footer on mobile devices
|
||||||
|
|
||||||
|
next
|
||||||
|
* [opennebula_api] Improve testing, add ssh key functions
|
||||||
|
* [opennebula_api] Remove template views
|
||||||
|
* [datacenterlight] Allow user to have multiple ssh keys
|
||||||
|
|
Binary file not shown.
|
@ -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-04-11 22:34-0500\n"
|
"POT-Creation-Date: 2017-05-26 13:35+0000\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,88 +18,137 @@ 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/alplora/index.html:13
|
#: alplora/templates/alplora/contact.html:6
|
||||||
|
msgid "New message"
|
||||||
|
msgstr "Neue Nachricht"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact.html:13
|
||||||
|
msgid "Name:"
|
||||||
|
msgstr "Name:"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact.html:15
|
||||||
|
msgid "What is your name ?"
|
||||||
|
msgstr "Was ist Dein Name?"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact.html:19
|
||||||
|
msgid "From:"
|
||||||
|
msgstr "Von:"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact.html:21
|
||||||
|
msgid "You email"
|
||||||
|
msgstr "Deine Email"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact.html:25
|
||||||
|
msgid "Message:"
|
||||||
|
msgstr "Nachricht:"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact.html:27
|
||||||
|
msgid "Leave us your message"
|
||||||
|
msgstr "Schreibe hier Deine Nachricht"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact.html:32
|
||||||
|
msgid "Close"
|
||||||
|
msgstr "schliessen"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact.html:33
|
||||||
|
msgid "Send message"
|
||||||
|
msgstr "Nachricht senden"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact_success.html:6
|
||||||
|
msgid "Message Sent"
|
||||||
|
msgstr "Nachricht gesendet"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/contact_success.html:9
|
||||||
|
msgid "Thank you, we will contact you as soon as possible"
|
||||||
|
msgstr "Dankeschön! Wir melden uns sobald wie möglich!"
|
||||||
|
|
||||||
|
#: alplora/templates/alplora/index.html:13
|
||||||
msgid "Find your animal anywhere, anytime"
|
msgid "Find your animal anywhere, anytime"
|
||||||
msgstr "Finde deine Tiere"
|
msgstr "Finde deine Tiere"
|
||||||
|
|
||||||
#: templates/alplora/index.html:100 templates/alplora/index.html.py:513
|
#: alplora/templates/alplora/index.html:99
|
||||||
|
#: alplora/templates/alplora/index.html:463
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Über"
|
msgstr "Über"
|
||||||
|
|
||||||
#: templates/alplora/index.html:103 templates/alplora/index.html.py:249
|
#: alplora/templates/alplora/index.html:102
|
||||||
#: templates/alplora/index.html:519
|
#: alplora/templates/alplora/index.html:248
|
||||||
|
#: alplora/templates/alplora/index.html:469
|
||||||
msgid "Why Alplora?"
|
msgid "Why Alplora?"
|
||||||
msgstr "Warum Alplora?"
|
msgstr "Warum Alplora?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:106 templates/alplora/index.html.py:516
|
#: alplora/templates/alplora/index.html:105
|
||||||
|
#: alplora/templates/alplora/index.html:466
|
||||||
msgid "Usecase"
|
msgid "Usecase"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/alplora/index.html:109 templates/alplora/index.html.py:359
|
#: alplora/templates/alplora/index.html:108
|
||||||
|
#: alplora/templates/alplora/index.html:358
|
||||||
msgid "Testimonials"
|
msgid "Testimonials"
|
||||||
msgstr "Referenzen"
|
msgstr "Referenzen"
|
||||||
|
|
||||||
#: templates/alplora/index.html:112 templates/alplora/index.html.py:422
|
#: alplora/templates/alplora/index.html:111
|
||||||
#: templates/alplora/index.html:527
|
#: alplora/templates/alplora/index.html:423
|
||||||
|
#: alplora/templates/alplora/index.html:477
|
||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Kontakt"
|
msgstr "Kontakt"
|
||||||
|
|
||||||
#: templates/alplora/index.html:115
|
#: alplora/templates/alplora/index.html:114
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr "Login"
|
msgstr "Login"
|
||||||
|
|
||||||
#: templates/alplora/index.html:138
|
#: alplora/templates/alplora/index.html:137
|
||||||
msgid "Find your herd anytime, anywhere"
|
msgid "Find your herd anytime, anywhere"
|
||||||
msgstr "Finde deine Herde jederzeit und überall"
|
msgstr "Finde deine Herde jederzeit und überall"
|
||||||
|
|
||||||
#: templates/alplora/index.html:139
|
#: alplora/templates/alplora/index.html:138
|
||||||
msgid "Perfect fit for Swiss Alps"
|
msgid "Perfect fit for Swiss Alps"
|
||||||
msgstr "Perfekt für die Schweizer Alpen"
|
msgstr "Perfekt für die Schweizer Alpen"
|
||||||
|
|
||||||
#: templates/alplora/index.html:164
|
#: alplora/templates/alplora/index.html:163
|
||||||
msgid "What is Alplora?"
|
msgid "What is Alplora?"
|
||||||
msgstr "Was ist Alplora?"
|
msgstr "Was ist Alplora?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:165
|
#: alplora/templates/alplora/index.html:164
|
||||||
msgid ""
|
msgid ""
|
||||||
"Alplora is an animal tracker made for outdoor grazing animals in Swiss Alps."
|
"Alplora is an animal tracker made for outdoor grazing animals in Swiss Alps."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Alplora ist ein Sender, der speziell für Weidetiere in den Schweizer Alpen "
|
"Alplora ist ein Sender, der speziell für Weidetiere in den Schweizer Alpen "
|
||||||
"entwickelt wurde."
|
"entwickelt wurde."
|
||||||
|
|
||||||
#: templates/alplora/index.html:166
|
#: alplora/templates/alplora/index.html:165
|
||||||
msgid "Alplora is just like a cattle bell, but much better."
|
msgid "Alplora is just like a cattle bell, but much better."
|
||||||
msgstr "Alplora ist wie eine Kuhglocke, nur viel besser."
|
msgstr "Alplora ist wie eine Kuhglocke, nur viel besser."
|
||||||
|
|
||||||
#: templates/alplora/index.html:175
|
#: alplora/templates/alplora/index.html:174
|
||||||
msgid "LOST"
|
msgid "LOST"
|
||||||
msgstr "VERLOREN"
|
msgstr "VERLOREN"
|
||||||
|
|
||||||
#: templates/alplora/index.html:177
|
#: alplora/templates/alplora/index.html:176
|
||||||
msgid "When an animal gets separated from the herd and is lost."
|
msgid "When an animal gets separated from the herd and is lost."
|
||||||
msgstr "Wenn ein Tier sich von der Herde absondert und verloren geht."
|
msgstr "Wenn ein Tier sich von der Herde absondert und verloren geht."
|
||||||
|
|
||||||
#: templates/alplora/index.html:185
|
#: alplora/templates/alplora/index.html:184
|
||||||
msgid "WOLF"
|
msgid "WOLF"
|
||||||
msgstr "WOLF"
|
msgstr "WOLF"
|
||||||
|
|
||||||
#: templates/alplora/index.html:187
|
#: alplora/templates/alplora/index.html:186
|
||||||
msgid "When a wolf gets close to the herd."
|
msgid "When a wolf gets close to the herd."
|
||||||
msgstr "Wenn ein Wolf sich der Herde nähert."
|
msgstr "Wenn ein Wolf sich der Herde nähert."
|
||||||
|
|
||||||
#: templates/alplora/index.html:194
|
#: alplora/templates/alplora/index.html:193
|
||||||
msgid "INJURED"
|
msgid "INJURED"
|
||||||
msgstr "VERLETZT"
|
msgstr "VERLETZT"
|
||||||
|
|
||||||
#: templates/alplora/index.html:196
|
#: alplora/templates/alplora/index.html:195
|
||||||
msgid "When one of the animals is hurt."
|
msgid "When one of the animals is hurt."
|
||||||
msgstr "Wenn eins der Tiere verletzt ist."
|
msgstr "Wenn eins der Tiere verletzt ist."
|
||||||
|
|
||||||
#: templates/alplora/index.html:206
|
#: alplora/templates/alplora/index.html:205
|
||||||
msgid "How does Alplora track my animals?"
|
msgid "How does Alplora track my animals?"
|
||||||
msgstr "Wie kann Alplora meine Tiere verfolgen und ausfindig machen ?"
|
msgstr "Wie kann Alplora meine Tiere verfolgen und ausfindig machen ?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:207
|
#: alplora/templates/alplora/index.html:206
|
||||||
msgid ""
|
msgid ""
|
||||||
"Each animal will be wearing a small tracker,<P></P>and the tracker will be "
|
"Each animal will be wearing a small tracker,<P></P>and the tracker will be "
|
||||||
"sending a signal every 30 to 60 minutes."
|
"sending a signal every 30 to 60 minutes."
|
||||||
|
@ -107,33 +156,33 @@ msgstr ""
|
||||||
"Jedes Tier wird einen kleinen Sender tragen, <P></P> welcher alle 30 bis 60 "
|
"Jedes Tier wird einen kleinen Sender tragen, <P></P> welcher alle 30 bis 60 "
|
||||||
"Minuten ein Signal senden wird."
|
"Minuten ein Signal senden wird."
|
||||||
|
|
||||||
#: templates/alplora/index.html:216
|
#: alplora/templates/alplora/index.html:215
|
||||||
msgid "Access app"
|
msgid "Access app"
|
||||||
msgstr "Zugang zur App"
|
msgstr "Zugang zur App"
|
||||||
|
|
||||||
#: templates/alplora/index.html:218
|
#: alplora/templates/alplora/index.html:217
|
||||||
msgid ""
|
msgid ""
|
||||||
"You can see the animal locations on a map by logging into our Alplora app."
|
"You can see the animal locations on a map by logging into our Alplora app."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Du kannst den Standort deiner Tiere jederzeit auf einer Karte verfolgen, "
|
"Du kannst den Standort deiner Tiere jederzeit auf einer Karte verfolgen, "
|
||||||
"indem du dich in unsere Alplora App einloggst."
|
"indem du dich in unsere Alplora App einloggst."
|
||||||
|
|
||||||
#: templates/alplora/index.html:226
|
#: alplora/templates/alplora/index.html:225
|
||||||
msgid "Get an alarm"
|
msgid "Get an alarm"
|
||||||
msgstr "Erhalte ein Warnsignal"
|
msgstr "Erhalte ein Warnsignal"
|
||||||
|
|
||||||
#: templates/alplora/index.html:228
|
#: alplora/templates/alplora/index.html:227
|
||||||
msgid ""
|
msgid ""
|
||||||
"When certain signals for danger are detected, Alplora sends an alarm to you."
|
"When certain signals for danger are detected, Alplora sends an alarm to you."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Wenn Anzeichen von Gefahr bestehen, sendet dir die Alplora App einen "
|
"Wenn Anzeichen von Gefahr bestehen, sendet dir die Alplora App einen "
|
||||||
"Warnsignal."
|
"Warnsignal."
|
||||||
|
|
||||||
#: templates/alplora/index.html:236
|
#: alplora/templates/alplora/index.html:235
|
||||||
msgid "Find your animal"
|
msgid "Find your animal"
|
||||||
msgstr "Finde deine Tiere"
|
msgstr "Finde deine Tiere"
|
||||||
|
|
||||||
#: templates/alplora/index.html:239
|
#: alplora/templates/alplora/index.html:238
|
||||||
msgid ""
|
msgid ""
|
||||||
"You can locate the animal in trouble on the realtime map and can take "
|
"You can locate the animal in trouble on the realtime map and can take "
|
||||||
"actions for keeping the animal safe."
|
"actions for keeping the animal safe."
|
||||||
|
@ -141,11 +190,11 @@ msgstr ""
|
||||||
"Du kannst dein Tier in Notsituationen auf einer Echtzeit-Karte lokalisieren "
|
"Du kannst dein Tier in Notsituationen auf einer Echtzeit-Karte lokalisieren "
|
||||||
"und hast die Möglichkeit es in Sicherheit zu bringen."
|
"und hast die Möglichkeit es in Sicherheit zu bringen."
|
||||||
|
|
||||||
#: templates/alplora/index.html:256
|
#: alplora/templates/alplora/index.html:255
|
||||||
msgid "Perfect fit for Swiss mountains"
|
msgid "Perfect fit for Swiss mountains"
|
||||||
msgstr "Perfekt für die Schweizer Alpen"
|
msgstr "Perfekt für die Schweizer Alpen"
|
||||||
|
|
||||||
#: templates/alplora/index.html:258
|
#: alplora/templates/alplora/index.html:257
|
||||||
msgid ""
|
msgid ""
|
||||||
"Alplora is made and tested for Swiss Alps. It is a perfect fit for Swiss "
|
"Alplora is made and tested for Swiss Alps. It is a perfect fit for Swiss "
|
||||||
"environment."
|
"environment."
|
||||||
|
@ -153,11 +202,11 @@ msgstr ""
|
||||||
"Alplora wurde speziell für die Schweizer Alpen entwickelt und vor Ort "
|
"Alplora wurde speziell für die Schweizer Alpen entwickelt und vor Ort "
|
||||||
"getestet. Das Produkt passt perfekt in die Schweiz!"
|
"getestet. Das Produkt passt perfekt in die Schweiz!"
|
||||||
|
|
||||||
#: templates/alplora/index.html:264
|
#: alplora/templates/alplora/index.html:263
|
||||||
msgid "Energy efficient"
|
msgid "Energy efficient"
|
||||||
msgstr "Energieeffizient"
|
msgstr "Energieeffizient"
|
||||||
|
|
||||||
#: templates/alplora/index.html:266
|
#: alplora/templates/alplora/index.html:265
|
||||||
msgid ""
|
msgid ""
|
||||||
"Alplora uses the latest wireless technology, our batteries last the whole "
|
"Alplora uses the latest wireless technology, our batteries last the whole "
|
||||||
"alp season."
|
"alp season."
|
||||||
|
@ -165,11 +214,11 @@ msgstr ""
|
||||||
"Alplora arbeitet mit den neuesten Technologien, so dass der Akku die gesamte "
|
"Alplora arbeitet mit den neuesten Technologien, so dass der Akku die gesamte "
|
||||||
"Alpsaison überdauert."
|
"Alpsaison überdauert."
|
||||||
|
|
||||||
#: templates/alplora/index.html:272
|
#: alplora/templates/alplora/index.html:271
|
||||||
msgid "Made with love"
|
msgid "Made with love"
|
||||||
msgstr "Mit Liebe gemacht"
|
msgstr "Mit Liebe gemacht"
|
||||||
|
|
||||||
#: templates/alplora/index.html:274
|
#: alplora/templates/alplora/index.html:273
|
||||||
msgid ""
|
msgid ""
|
||||||
"With a lot of love and respect for Swiss agriculture and nature, Alplora is "
|
"With a lot of love and respect for Swiss agriculture and nature, Alplora is "
|
||||||
"made by a Swiss company."
|
"made by a Swiss company."
|
||||||
|
@ -177,61 +226,61 @@ msgstr ""
|
||||||
"Alplora wurde mit viel Liebe und Respekt für die Schweizer Natur und "
|
"Alplora wurde mit viel Liebe und Respekt für die Schweizer Natur und "
|
||||||
"Landwirtschaft von einer Schweizer Firma entwickelt."
|
"Landwirtschaft von einer Schweizer Firma entwickelt."
|
||||||
|
|
||||||
#: templates/alplora/index.html:286
|
#: alplora/templates/alplora/index.html:285
|
||||||
msgid "Who needs Alplora?"
|
msgid "Who needs Alplora?"
|
||||||
msgstr "Wer benötigt Alplora?"
|
msgstr "Wer benötigt Alplora?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:302
|
#: alplora/templates/alplora/index.html:301
|
||||||
msgid " Are your animals..."
|
msgid " Are your animals..."
|
||||||
msgstr "Sind deine Tiere..."
|
msgstr "Sind deine Tiere..."
|
||||||
|
|
||||||
#: templates/alplora/index.html:305
|
#: alplora/templates/alplora/index.html:304
|
||||||
msgid "sheep, goats, cows or llamas living freely in the Alps?"
|
msgid "sheep, goats, cows or llamas living freely in the Alps?"
|
||||||
msgstr "Schafe, Ziegen, Kühe oder Lamas, die frei in den Alpen leben?"
|
msgstr "Schafe, Ziegen, Kühe oder Lamas, die frei in den Alpen leben?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:307
|
#: alplora/templates/alplora/index.html:306
|
||||||
msgid "wearing bells?"
|
msgid "wearing bells?"
|
||||||
msgstr "solche, die Glocken tragen?"
|
msgstr "solche, die Glocken tragen?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:309
|
#: alplora/templates/alplora/index.html:308
|
||||||
msgid ""
|
msgid ""
|
||||||
"sometimes getting confused and going too far away from where they are "
|
"sometimes getting confused and going too far away from where they are "
|
||||||
"supposed to be?"
|
"supposed to be?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"manchmal verwirrt und entfernen sich zu weit von ihrem vorgesehenen Standort?"
|
"manchmal verwirrt und entfernen sich zu weit von ihrem vorgesehenen Standort?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:333
|
#: alplora/templates/alplora/index.html:332
|
||||||
msgid "Do you..."
|
msgid "Do you..."
|
||||||
msgstr "Möchtest du..."
|
msgstr "Möchtest du..."
|
||||||
|
|
||||||
#: templates/alplora/index.html:336
|
#: alplora/templates/alplora/index.html:335
|
||||||
msgid "have animals which are staying outdoor during some time of the year?"
|
msgid "have animals which are staying outdoor during some time of the year?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"deine Tiere, die eine längere Zeit im Jahr unbeobachtet Draussen verbringen, "
|
"deine Tiere, die eine längere Zeit im Jahr unbeobachtet Draussen verbringen, "
|
||||||
"schützen und überwachen können?"
|
"schützen und überwachen können?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:338
|
#: alplora/templates/alplora/index.html:337
|
||||||
msgid "want to get an alarm when your animal is hurt, or in danger?"
|
msgid "want to get an alarm when your animal is hurt, or in danger?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"alarmiert werden, wenn sich eines deiner Tiere verletzt oder in Gefahr "
|
"alarmiert werden, wenn sich eines deiner Tiere verletzt oder in Gefahr "
|
||||||
"befindet ?"
|
"befindet ?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:340
|
#: alplora/templates/alplora/index.html:339
|
||||||
msgid "want to see where your animals are on your cell phone map?"
|
msgid "want to see where your animals are on your cell phone map?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"mit deinem Smartphone auf einer Karte sehen können, wo sich deine Tiere "
|
"mit deinem Smartphone auf einer Karte sehen können, wo sich deine Tiere "
|
||||||
"befinden? "
|
"befinden? "
|
||||||
|
|
||||||
#: templates/alplora/index.html:342
|
#: alplora/templates/alplora/index.html:341
|
||||||
msgid "want to make sure 24/7 that your animals are safe?"
|
msgid "want to make sure 24/7 that your animals are safe?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"sicherstellen, dass sich deine Tiere rund um die Uhr in Sicherheit befinden?"
|
"sicherstellen, dass sich deine Tiere rund um die Uhr in Sicherheit befinden?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:360
|
#: alplora/templates/alplora/index.html:359
|
||||||
msgid "What our customers say"
|
msgid "What our customers say"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/alplora/index.html:380
|
#: alplora/templates/alplora/index.html:379
|
||||||
msgid ""
|
msgid ""
|
||||||
"“Alplora is an innovation in looking after my cows. I can check where my "
|
"“Alplora is an innovation in looking after my cows. I can check where my "
|
||||||
"cows have been in the higher mountain all day while doing other works at the "
|
"cows have been in the higher mountain all day while doing other works at the "
|
||||||
|
@ -243,11 +292,11 @@ msgstr ""
|
||||||
"selben Zeit andereDinge auf dem Hof unten im Dorf erledigen. Dank Alplora "
|
"selben Zeit andereDinge auf dem Hof unten im Dorf erledigen. Dank Alplora "
|
||||||
"kann ich meinen Kühenmehr Sicherheit gewährleisten."
|
"kann ich meinen Kühenmehr Sicherheit gewährleisten."
|
||||||
|
|
||||||
#: templates/alplora/index.html:383
|
#: alplora/templates/alplora/index.html:382
|
||||||
msgid "Farmer in canton Glarus"
|
msgid "Farmer in canton Glarus"
|
||||||
msgstr "Bauern im Kanton Glarus"
|
msgstr "Bauern im Kanton Glarus"
|
||||||
|
|
||||||
#: templates/alplora/index.html:389
|
#: alplora/templates/alplora/index.html:388
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"Alplora is exactly what I was waiting for. I have lost my sheep almost "
|
"\"Alplora is exactly what I was waiting for. I have lost my sheep almost "
|
||||||
"every year. Finally I have a way when I want to locate them.\""
|
"every year. Finally I have a way when I want to locate them.\""
|
||||||
|
@ -256,11 +305,11 @@ msgstr ""
|
||||||
"Schafe fastjedes Jahr aus den Augen verloren. Nun habe ich endlich die "
|
"Schafe fastjedes Jahr aus den Augen verloren. Nun habe ich endlich die "
|
||||||
"Möglichkeit, sie zulokalisieren.\""
|
"Möglichkeit, sie zulokalisieren.\""
|
||||||
|
|
||||||
#: templates/alplora/index.html:392
|
#: alplora/templates/alplora/index.html:391
|
||||||
msgid "Owner of 50 sheep "
|
msgid "Owner of 50 sheep "
|
||||||
msgstr "Besitzerin von 50 Schafen"
|
msgstr "Besitzerin von 50 Schafen"
|
||||||
|
|
||||||
#: templates/alplora/index.html:398
|
#: alplora/templates/alplora/index.html:397
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"I have a farm down all the way down in the village and y goats are always "
|
"\"I have a farm down all the way down in the village and y goats are always "
|
||||||
"freely grazing in the Alps. There are times that I am worried about them but "
|
"freely grazing in the Alps. There are times that I am worried about them but "
|
||||||
|
@ -274,74 +323,30 @@ msgstr ""
|
||||||
"noch um meineanderen Tiere kümmern muss. Mit Alplora kann ich nun ohne "
|
"noch um meineanderen Tiere kümmern muss. Mit Alplora kann ich nun ohne "
|
||||||
"Probleme beides tun.\""
|
"Probleme beides tun.\""
|
||||||
|
|
||||||
#: templates/alplora/index.html:402
|
#: alplora/templates/alplora/index.html:401
|
||||||
msgid "Farmer at Berner Oberland"
|
msgid "Farmer at Berner Oberland"
|
||||||
msgstr "Bauer aus dem Berner Oberland"
|
msgstr "Bauer aus dem Berner Oberland"
|
||||||
|
|
||||||
#: templates/alplora/index.html:419
|
#: alplora/templates/alplora/index.html:418
|
||||||
msgid "How do I get Alplora?"
|
msgid "How do I get Alplora?"
|
||||||
msgstr "Wie kriege ich Zugriff zu Alplora?"
|
msgstr "Wie kriege ich Zugriff zu Alplora?"
|
||||||
|
|
||||||
#: templates/alplora/index.html:420
|
#: alplora/templates/alplora/index.html:419
|
||||||
msgid "Click the button below and leave us your contact."
|
msgid "Click the button below and leave us your contact."
|
||||||
msgstr "Klicke unten auf Kontakt und hinterlasse uns deine Angaben."
|
msgstr "Klicke unten auf Kontakt und hinterlasse uns deine Angaben."
|
||||||
|
|
||||||
#: templates/alplora/index.html:420
|
#: alplora/templates/alplora/index.html:419
|
||||||
msgid "Team Alplora will contact you and visit you with a tracking device."
|
msgid "Team Alplora will contact you and visit you with a tracking device."
|
||||||
msgstr "Das Alpora Team wird sich mit Dir schnellstens in Verbindung setzen."
|
msgstr "Das Alpora Team wird sich mit Dir schnellstens in Verbindung setzen."
|
||||||
|
|
||||||
#: templates/alplora/index.html:437
|
#: alplora/templates/alplora/index.html:459
|
||||||
msgid "New message"
|
|
||||||
msgstr "Neue Nachricht"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:445
|
|
||||||
msgid "Name:"
|
|
||||||
msgstr "Name:"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:446
|
|
||||||
msgid "What is your name ?"
|
|
||||||
msgstr "Was ist Dein Name?"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:449
|
|
||||||
msgid "From:"
|
|
||||||
msgstr "Von:"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:450
|
|
||||||
msgid "You email"
|
|
||||||
msgstr "Deine Email"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:454
|
|
||||||
msgid "Message:"
|
|
||||||
msgstr "Nachricht:"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:455
|
|
||||||
msgid "Leave us your message"
|
|
||||||
msgstr "Schreibe hier Deine Nachricht"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:460
|
|
||||||
msgid "Close"
|
|
||||||
msgstr "schliessen"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:461
|
|
||||||
msgid "Send message"
|
|
||||||
msgstr "Nachricht senden"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:474
|
|
||||||
msgid "Message Sent"
|
|
||||||
msgstr "Nachricht gesendet"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:477
|
|
||||||
msgid "Thank you, we will contact you as soon as possible"
|
|
||||||
msgstr "Dankeschön! Wir melden uns sobald wie möglich!"
|
|
||||||
|
|
||||||
#: templates/alplora/index.html:509
|
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "Startseite"
|
msgstr "Startseite"
|
||||||
|
|
||||||
#: templates/alplora/index.html:522
|
#: alplora/templates/alplora/index.html:472
|
||||||
msgid "Testimonials "
|
msgid "Testimonials "
|
||||||
msgstr "Referenzen"
|
msgstr "Referenzen"
|
||||||
|
|
||||||
#: views.py:14
|
#: alplora/views.py:24
|
||||||
msgid "Message Successfully Sent"
|
msgid "Message Successfully Sent"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
Binary file not shown.
|
@ -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-05-23 17:26-0500\n"
|
"POT-Creation-Date: 2017-05-27 10:13-0500\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,41 +18,51 @@ 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:21
|
#: datacenterlight/templates/datacenterlight/beta_access.html:13
|
||||||
msgid "Request Beta Access"
|
msgid "Enter name"
|
||||||
msgstr "Beantrage Beta-Zugang"
|
msgstr "Name"
|
||||||
|
|
||||||
#: templates/datacenterlight/beta_success.html:9
|
#: datacenterlight/templates/datacenterlight/beta_access.html:17
|
||||||
#, fuzzy
|
msgid "Enter email"
|
||||||
#| msgid "Request Beta Access"
|
msgstr "E-Mail-Adresse"
|
||||||
|
|
||||||
|
#: datacenterlight/templates/datacenterlight/beta_access.html:21
|
||||||
|
msgid "Request Newsletter"
|
||||||
|
msgstr "Newsletter abonnieren"
|
||||||
|
|
||||||
|
#: datacenterlight/templates/datacenterlight/beta_success.html:9
|
||||||
msgid "Request Sent"
|
msgid "Request Sent"
|
||||||
msgstr "Anfrage verschickt"
|
msgstr "Anfrage verschickt"
|
||||||
|
|
||||||
#: templates/datacenterlight/beta_success.html:12
|
#: datacenterlight/templates/datacenterlight/beta_success.html:12
|
||||||
msgid "Thank you, we will contact you as soon as possible"
|
msgid ""
|
||||||
msgstr "Vielen Dank, wir werden Sie sobald als möglich kontaktieren."
|
"Thank you for your subscription! You will receive a confirmation mail from "
|
||||||
|
"our team"
|
||||||
|
msgstr ""
|
||||||
|
"Vielen dank für Ihre Anmeldung. Sie erhalten in kürze eine Bestätigungsmail "
|
||||||
|
"von unserem Team"
|
||||||
|
|
||||||
#: templates/datacenterlight/emails/request_access_confirmation.html:99
|
#: datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html:99
|
||||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:99
|
#: datacenterlight/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
|
#: datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html:104
|
||||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:104
|
#: datacenterlight/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
|
#: datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html:105
|
||||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:105
|
#: datacenterlight/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
|
#: datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html:106
|
||||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:106
|
#: datacenterlight/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."
|
||||||
|
@ -60,81 +70,92 @@ 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
|
#: datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html:107
|
||||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:107
|
#: datacenterlight/templates/datacenterlight/emails/request_access_confirmation.txt:107
|
||||||
msgid "Thank you!"
|
msgid "Thank you!"
|
||||||
msgstr "Vielen Dank!"
|
msgstr "Vielen Dank!"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:62
|
#: templates/datacenterlight/index.html:62
|
||||||
|
#: templates/datacenterlight/index.html:142
|
||||||
|
#: templates/datacenterlight/index.html:328
|
||||||
#: templates/datacenterlight/pricing.html:62
|
#: templates/datacenterlight/pricing.html:62
|
||||||
|
#: templates/datacenterlight/pricing.html:185
|
||||||
|
#: datacenterlight/templates/datacenterlight/index.html:62
|
||||||
|
#: datacenterlight/templates/datacenterlight/pricing.html:62
|
||||||
msgid "What is it"
|
msgid "What is it"
|
||||||
msgstr "Was ist es?"
|
msgstr "Was ist es?"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:65
|
#: datacenterlight/templates/datacenterlight/index.html:65
|
||||||
#: templates/datacenterlight/index.html:171
|
#: datacenterlight/templates/datacenterlight/index.html:171
|
||||||
#: templates/datacenterlight/index.html:331
|
#: datacenterlight/templates/datacenterlight/index.html:331
|
||||||
#: templates/datacenterlight/pricing.html:65
|
#: datacenterlight/templates/datacenterlight/pricing.html:65
|
||||||
#: templates/datacenterlight/pricing.html:188
|
#: datacenterlight/templates/datacenterlight/pricing.html:190
|
||||||
msgid "Scale out"
|
msgid "Scale out"
|
||||||
msgstr "Skalierung"
|
msgstr "Skalierung"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:68
|
#: datacenterlight/templates/datacenterlight/index.html:68
|
||||||
#: templates/datacenterlight/index.html:197
|
#: datacenterlight/templates/datacenterlight/index.html:197
|
||||||
#: templates/datacenterlight/index.html:334
|
#: datacenterlight/templates/datacenterlight/index.html:334
|
||||||
#: templates/datacenterlight/pricing.html:68
|
#: datacenterlight/templates/datacenterlight/pricing.html:68
|
||||||
#: templates/datacenterlight/pricing.html:191
|
#: datacenterlight/templates/datacenterlight/pricing.html:193
|
||||||
msgid "Reliable and light"
|
msgid "Reliable and light"
|
||||||
msgstr "Zuverlässig und leicht"
|
msgstr "Zuverlässig und leicht"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:71
|
#: templates/datacenterlight/index.html:71
|
||||||
#: templates/datacenterlight/pricing.html:71
|
#: templates/datacenterlight/pricing.html:71
|
||||||
|
msgid "Order VM"
|
||||||
|
msgstr "VM bestellen"
|
||||||
|
|
||||||
|
#: datacenterlight/templates/datacenterlight/index.html:71
|
||||||
|
#: datacenterlight/templates/datacenterlight/pricing.html:71
|
||||||
msgid "Buy VM"
|
msgid "Buy VM"
|
||||||
msgstr "VM Kaufen"
|
msgstr "VM Kaufen"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:74
|
#: datacenterlight/templates/datacenterlight/index.html:74
|
||||||
#: templates/datacenterlight/index.html:341
|
#: datacenterlight/templates/datacenterlight/index.html:341
|
||||||
#: templates/datacenterlight/pricing.html:74
|
#: datacenterlight/templates/datacenterlight/pricing.html:74
|
||||||
#: templates/datacenterlight/pricing.html:198
|
#: datacenterlight/templates/datacenterlight/pricing.html:200
|
||||||
msgid "Contact"
|
msgid "Contact"
|
||||||
msgstr "Kontakt"
|
msgstr "Kontakt"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:109
|
#: datacenterlight/templates/datacenterlight/index.html:109
|
||||||
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:113
|
#: datacenterlight/templates/datacenterlight/index.html:113
|
||||||
msgid "What is it?"
|
msgid "What is it?"
|
||||||
msgstr "Was ist es?"
|
msgstr "Was ist es?"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:116
|
#: datacenterlight/templates/datacenterlight/index.html:116
|
||||||
msgid "I want it!"
|
msgid "I want it!"
|
||||||
msgstr "Das will ich haben!"
|
msgstr "Das will ich haben!"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:142
|
#: templates/datacenterlight/index.html:147
|
||||||
#: templates/datacenterlight/index.html:328
|
#: datacenterlight/templates/datacenterlight/index.html:142
|
||||||
#: templates/datacenterlight/pricing.html:185
|
#: datacenterlight/templates/datacenterlight/index.html:328
|
||||||
|
#: datacenterlight/templates/datacenterlight/pricing.html:187
|
||||||
msgid "How it works"
|
msgid "How it works"
|
||||||
msgstr "Wie es funktioniert"
|
msgstr "Wie es funktioniert"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:147
|
#: datacenterlight/templates/datacenterlight/index.html:147
|
||||||
msgid "Reuse existing factory halls intead of building an expensive building."
|
msgid "Reuse existing factory halls intead of building an expensive building."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Nachhaltigkeit: Wiederverwendung ehemaliger Fabrikhallen an Stelle der "
|
"Nachhaltigkeit: Wiederverwendung ehemaliger Fabrikhallen an Stelle der "
|
||||||
"Errichtung eines neuen Gebäudes"
|
"Errichtung eines neuen Gebäudes"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:150
|
#: datacenterlight/templates/datacenterlight/index.html:150
|
||||||
msgid "Being creative, using modern and alternative design for a datacenter."
|
msgid "Being creative, using modern and alternative design for a datacenter."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Kreativität: Verwendung eines modernen und alternativen Designs für unser "
|
"Kreativität: Verwendung eines modernen und alternativen Designs für unser "
|
||||||
"Datencenter"
|
"Datencenter"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:152
|
#: datacenterlight/templates/datacenterlight/index.html:152
|
||||||
msgid "Being open: Using FOSS exclusively, we can save money for licenses."
|
msgid "Being open: Using FOSS exclusively, we can save money for licenses."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Offene Verfahrensweise: Die Benutzung eines eigenen Frameworks, FOSS, "
|
"Offene Verfahrensweise: Die Benutzung eines eigenen Frameworks, FOSS, "
|
||||||
"erspart Lizenzgebühren"
|
"erspart Lizenzgebühren"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:174
|
#: datacenterlight/templates/datacenterlight/index.html:174
|
||||||
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 "
|
||||||
|
@ -144,7 +165,7 @@ msgstr ""
|
||||||
"erschwingliche Systeme. Bei grösserer Auslastung werden mehr Standard "
|
"erschwingliche Systeme. Bei grösserer Auslastung werden mehr Standard "
|
||||||
"komponenten hinzugekauft und skalieren so das Datencenter."
|
"komponenten hinzugekauft und skalieren so das Datencenter."
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:200
|
#: datacenterlight/templates/datacenterlight/index.html:200
|
||||||
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 "
|
||||||
|
@ -154,76 +175,111 @@ 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:218
|
#: datacenterlight/templates/datacenterlight/index.html:218
|
||||||
#: templates/datacenterlight/pricing.html:101
|
#: datacenterlight/templates/datacenterlight/pricing.html:101
|
||||||
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 Sie signifikant abnehmen"
|
msgstr "Wir sorgen dafür, dass die Kosten für Sie signifikant abnehmen"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:219
|
#: datacenterlight/templates/datacenterlight/index.html:219
|
||||||
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:220
|
#: datacenterlight/templates/datacenterlight/index.html:220
|
||||||
msgid "More Info"
|
msgid "More Info"
|
||||||
msgstr "Weitere Informationen"
|
msgstr "Weitere Informationen"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:227
|
#: datacenterlight/templates/datacenterlight/index.html:227
|
||||||
#: templates/datacenterlight/pricing.html:114
|
#: datacenterlight/templates/datacenterlight/pricing.html:114
|
||||||
msgid "VM hosting"
|
msgid "VM hosting"
|
||||||
msgstr ""
|
msgstr "VM Hosting"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:234
|
#: datacenterlight/templates/datacenterlight/index.html:234
|
||||||
msgid "Based in Switzerland"
|
msgid "Based in Switzerland"
|
||||||
msgstr "Standort des Datacenters ist in der Schweiz"
|
msgstr "Standort des Datacenters ist in der Schweiz"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:243
|
#: templates/datacenterlight/index.html:243
|
||||||
msgid "15 GB Storage (SSD)"
|
#, fuzzy
|
||||||
msgstr "15 GB Storage (SSD)"
|
#| msgid "10 GB Storage (SSD)"
|
||||||
|
msgid "10 GB Storage (SSD)"
|
||||||
|
msgstr "10 GB Storage (SSD)"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:246
|
#: datacenterlight/templates/datacenterlight/index.html:246
|
||||||
#: templates/datacenterlight/pricing.html:156
|
#: datacenterlight/templates/datacenterlight/pricing.html:156
|
||||||
msgid "Order Now!"
|
msgid "Order Now!"
|
||||||
msgstr "Bestelle jetzt!"
|
msgstr "Bestelle jetzt!"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:262
|
#: datacenterlight/templates/datacenterlight/index.html:262
|
||||||
msgid "Want to know more? Subscribe to our newsletter!"
|
msgid "Want to know more? Subscribe to our newsletter!"
|
||||||
msgstr "Willst du mehr wissen? Abonniere unseren Newsletter!"
|
msgstr "Willst du mehr wissen? Abonniere unseren Newsletter!"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:289
|
#: datacenterlight/templates/datacenterlight/index.html:289
|
||||||
msgid "Switzerland "
|
msgid "Switzerland "
|
||||||
msgstr "Schweiz"
|
msgstr "Schweiz"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:306
|
#: datacenterlight/templates/datacenterlight/index.html:306
|
||||||
msgid "Questions?"
|
msgid "Questions?"
|
||||||
msgstr "Fragen?"
|
msgstr "Fragen?"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:306
|
#: datacenterlight/templates/datacenterlight/index.html:306
|
||||||
msgid "Contact us!"
|
msgid "Contact us!"
|
||||||
msgstr "Kontaktiere uns!"
|
msgstr "Kontaktiere uns!"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:324
|
#: datacenterlight/templates/datacenterlight/index.html:324
|
||||||
#: templates/datacenterlight/pricing.html:181
|
#: datacenterlight/templates/datacenterlight/pricing.html:183
|
||||||
msgid "Home"
|
msgid "Home"
|
||||||
msgstr "Home"
|
msgstr "Home"
|
||||||
|
|
||||||
#: templates/datacenterlight/index.html:337
|
#: datacenterlight/templates/datacenterlight/index.html:337
|
||||||
#: templates/datacenterlight/pricing.html:194
|
#: datacenterlight/templates/datacenterlight/pricing.html:196
|
||||||
msgid "Pricing"
|
msgid "Pricing"
|
||||||
msgstr "Preise"
|
msgstr "Preise"
|
||||||
|
|
||||||
#: templates/datacenterlight/pricing.html:122
|
#: datacenterlight/templates/datacenterlight/pricing.html:122
|
||||||
#, fuzzy
|
|
||||||
#| msgid "Based in Switzerland"
|
|
||||||
msgid "Hosted in Switzerland"
|
msgid "Hosted in Switzerland"
|
||||||
msgstr "Standort des Datacenters ist in der Schweiz"
|
msgstr "Standort des Datacenters ist in der Schweiz"
|
||||||
|
|
||||||
#: templates/datacenterlight/pricing.html:136
|
#: templates/datacenterlight/pricing.html:139
|
||||||
|
#: datacenterlight/templates/datacenterlight/pricing.html:139
|
||||||
msgid "GB Storage (SSD)"
|
msgid "GB Storage (SSD)"
|
||||||
msgstr "GB Storage (SSD)"
|
msgstr "GB Storage (SSD)"
|
||||||
|
|
||||||
#: templates/datacenterlight/pricing.html:163
|
#: datacenterlight/templates/datacenterlight/pricing.html:163
|
||||||
msgid "Simple and affordable: Try our virtual machine with featherlight price."
|
msgid "Simple and affordable: Try our virtual machine with featherlight price."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Simpel und bezahlbar: Testen Sie unsere virtuelen Machinen mit "
|
||||||
|
"federleichten Preisen"
|
||||||
|
|
||||||
|
#: datacenterlight/templates/datacenterlight/pricing.html:166
|
||||||
|
msgid "Our VMs are hosted in Glarus, Switzerland."
|
||||||
|
msgstr "Standort des Datacenters ist in der Schweiz"
|
||||||
|
|
||||||
|
#: datacenterlight/templates/datacenterlight/pricing.html:168
|
||||||
|
msgid ""
|
||||||
|
" WARNING: We are currently running in BETA mode. We "
|
||||||
|
"hope you won't encounter any hiccups, but if you do, please let us know at "
|
||||||
|
"support@datacenterlight.ch"
|
||||||
|
msgstr ""
|
||||||
|
" Achtung: Wir befinden uns zurzeit im Beta-Release. Wir hoffen, "
|
||||||
|
"dass Sie davon nichts mitbekommen, falls doch melden "
|
||||||
|
"Sie sich bitte via support@datacenterlight.ch"
|
||||||
|
|
||||||
|
|
||||||
|
#~ msgid "Request Beta Access"
|
||||||
|
#~ msgstr "Beantrage Beta-Zugang"
|
||||||
|
|
||||||
|
#~ msgid "Thank you, we will contact you as soon as possible"
|
||||||
|
#~ msgstr "Vielen Dank, wir werden Sie sobald als möglich kontaktieren."
|
||||||
|
|
||||||
|
#: templates/datacenterlight/pricing.html:166
|
||||||
|
msgid ""
|
||||||
|
"Our VMs are hosted in Glarus, Switzerland, and our website is currently "
|
||||||
|
"running in BETA mode. If you want more information that you did not find on "
|
||||||
|
"our website, or if your order is more detailed, or if you encounter any "
|
||||||
|
"technical hiccups, please contact us at support@datacenterlight.ch, our team "
|
||||||
|
"will get in touch with you asap."
|
||||||
|
msgstr "Unsere VMs werden in der Schweiz im Kanton Glarus gehostet und befinden sich zur Zeit noch in der BETA-Phase. Möchtest du mehr über uns erfahren und hast auf unserer Website nicht genügend Informationen gefunden? Möchtest eine detailliertere Bestellung aufgeben? Bist du auf technische Probleme gestossen, die du uns mitteilen möchtest? Dann zögere nicht und kontaktiere uns unter support@datacenterlight.ch. Unser Team wird sich umgehend um dein Anliegen kümmern!"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#~ msgid "Buy Now!"
|
#~ msgid "Buy Now!"
|
||||||
#~ msgstr "Kaufe jetzt!"
|
#~ msgstr "Kaufe jetzt!"
|
||||||
|
@ -231,9 +287,6 @@ msgstr ""
|
||||||
#~ msgid "I want to try!"
|
#~ msgid "I want to try!"
|
||||||
#~ msgstr "Das möchte ich haben"
|
#~ msgstr "Das möchte ich haben"
|
||||||
|
|
||||||
#~ msgid "How it works:"
|
|
||||||
#~ msgstr "Warum können wir diese Leistung so günstig anbieten:"
|
|
||||||
|
|
||||||
#~ msgid "Email address"
|
#~ msgid "Email address"
|
||||||
#~ msgstr "E-Mail Adresse"
|
#~ msgstr "E-Mail Adresse"
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,7 @@ h6 {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
.navbar-right {
|
.navbar-right {
|
||||||
margin-right: 0px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
.navbar-default .btn-link {
|
.navbar-default .btn-link {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
@ -144,6 +144,52 @@ h6 {
|
||||||
.navbar-default .btn-link:hover {
|
.navbar-default .btn-link:hover {
|
||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
}
|
}
|
||||||
|
.nav-language{
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.nav-language .select-language{
|
||||||
|
padding: 15px 10px;
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
.navbar-transparent .nav-language .select-language{
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-language .select-language span{
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-right: 5px;
|
||||||
|
|
||||||
|
}
|
||||||
|
.nav-language .drop-language{
|
||||||
|
position: absolute;
|
||||||
|
top: 45px;
|
||||||
|
left: -8px;
|
||||||
|
background: #fff;
|
||||||
|
width: 100px;
|
||||||
|
height: 40px;
|
||||||
|
padding: 9px 10px;
|
||||||
|
-webkit-box-shadow: -8px 13px 31px -8px rgba(77,77,77,1);
|
||||||
|
-moz-box-shadow: -8px 13px 31px -8px rgba(77,77,77,1);
|
||||||
|
box-shadow: -8px 13px 31px -8px rgba(77,77,77,1);
|
||||||
|
display: none;
|
||||||
|
z-index: 100;
|
||||||
|
/* margin-left: 10px; */
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.nav-language .drop-language a{
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.navbar-transparent .nav-language .drop-language{
|
||||||
|
background: transparent;
|
||||||
|
border: 1px solid #fff;
|
||||||
|
}
|
||||||
|
.navbar-transparent .nav-language .drop-language a{
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.nav-language:hover .drop-language{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
.intro-header {
|
.intro-header {
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
@ -250,7 +296,7 @@ h6 {
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
background: rgba(90, 116, 175, 0.7);
|
background: rgba(90, 116, 175, 0.8);
|
||||||
}
|
}
|
||||||
.intro-pricing .intro-message .section-heading{
|
.intro-pricing .intro-message .section-heading{
|
||||||
font-size: 45px;
|
font-size: 45px;
|
||||||
|
@ -532,8 +578,8 @@ h6 {
|
||||||
}
|
}
|
||||||
.price-calc-section .text .section-heading{
|
.price-calc-section .text .section-heading{
|
||||||
font-family: 'Montserrat-Bold';
|
font-family: 'Montserrat-Bold';
|
||||||
font-size: 50px;
|
font-size: 48px;
|
||||||
line-height: 50px;
|
line-height: 48px;
|
||||||
padding-bottom: 25px;
|
padding-bottom: 25px;
|
||||||
color: #3a3a3a;
|
color: #3a3a3a;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
|
@ -601,6 +647,13 @@ h6 {
|
||||||
.price-calc-section .card .description input{
|
.price-calc-section .card .description input{
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
width: 70px;
|
||||||
|
}
|
||||||
|
.price-calc-section .card .description #coreValue{
|
||||||
|
width: 50px;
|
||||||
|
}
|
||||||
|
.price-calc-section .card .description #ramValue{
|
||||||
|
width: 50px;
|
||||||
}
|
}
|
||||||
.price-calc-section .card .description i{
|
.price-calc-section .card .description i{
|
||||||
color: #29427A;
|
color: #29427A;
|
||||||
|
@ -670,6 +723,14 @@ h6 {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
.intro-pricing .intro-message .section-heading {
|
||||||
|
font-size: 35px;
|
||||||
|
width: 80%;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.intro-pricing .intro-message {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
ul.intro-social-buttons > li:last-child {
|
ul.intro-social-buttons > li:last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
@ -693,6 +754,23 @@ h6 {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
color: #777;
|
color: #777;
|
||||||
}
|
}
|
||||||
|
.nav-language:hover{
|
||||||
|
height: 80px;
|
||||||
|
}
|
||||||
|
.navbar-transparent .nav-language .select-language {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
.navbar-transparent .nav-language .drop-language a {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
.navbar-transparent .nav-language .drop-language {
|
||||||
|
background: #fff;
|
||||||
|
/* border: 1px solid #fff; */
|
||||||
|
z-index: 100000;
|
||||||
|
left: 9px;
|
||||||
|
border: 1px solid rgba(119, 119, 119, 0.4);
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
.split-section {
|
.split-section {
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
}
|
}
|
||||||
|
@ -736,6 +814,34 @@ h6 {
|
||||||
transform: translate(-50%, 0);
|
transform: translate(-50%, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.price-calc-section{
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 60px 10px !important;
|
||||||
|
}
|
||||||
|
.price-calc-section .card {
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
.price-calc-section .text {
|
||||||
|
width: 80%;
|
||||||
|
text-align: center;
|
||||||
|
margin: 0 auto;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
.price-calc-section .text .section-heading {
|
||||||
|
font-family: 'Montserrat-Bold';
|
||||||
|
font-size: 35px;
|
||||||
|
line-height: 35px;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.price-calc-section .text .section-heading::before {
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
}
|
||||||
|
.price-calc-section .text .description {
|
||||||
|
font-size: 18px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media(max-width:540px) {
|
@media(max-width:540px) {
|
||||||
|
@ -752,6 +858,14 @@ h6 {
|
||||||
.intro-message > h1 {
|
.intro-message > h1 {
|
||||||
font-size: 2em;
|
font-size: 2em;
|
||||||
}
|
}
|
||||||
|
.price-calc-section .text .section-heading {
|
||||||
|
font-size: 24px;
|
||||||
|
line-height: 25px;
|
||||||
|
}
|
||||||
|
.price-calc-section .card .description span {
|
||||||
|
font-size: 17px;
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,15 +10,15 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="inputs">
|
<div class="inputs">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="text" name="name" class="form-control" id="name" placeholder="Enter name">
|
<input type="text" name="name" class="form-control" id="name" placeholder="{% trans 'Enter name' %}">
|
||||||
<span style="color: white">{{ form.name.errors|striptags}}</span>
|
<span style="color: white">{{ form.name.errors|striptags}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<input type="email" name="email" class="form-control" id="email" placeholder="Enter email">
|
<input type="email" name="email" class="form-control" id="email" placeholder="{% trans 'Enter email' %}">
|
||||||
<span style="color: white">{{ form.email.errors|striptags}}</span>
|
<span style="color: white">{{ form.email.errors|striptags}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn btn-default btn-transparent btn-lg">{% trans "Request Beta Access" %}</button>
|
<button type="submit" class="btn btn-default btn-transparent btn-lg">{% trans "Request Newsletter" %}</button>
|
||||||
</form>
|
</form>
|
||||||
<script>
|
<script>
|
||||||
$('#beta_access').ajaxForm({
|
$('#beta_access').ajaxForm({
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<h4 class="modal-title">{% trans "Request Sent" %}</h4>
|
<h4 class="modal-title">{% trans "Request Sent" %}</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p>{% trans "Thank you, we will contact you as soon as possible" %}</p>
|
<p>{% 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>
|
||||||
|
|
|
@ -68,13 +68,13 @@
|
||||||
<a class="url" href="javascript:void(0)" data-url="#our">{% trans "Reliable and light" %}</a>
|
<a class="url" href="javascript:void(0)" data-url="#our">{% trans "Reliable and light" %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="url" href="javascript:void(0)" data-url="#price" >{% trans "Buy VM" %}</a>
|
<a class="url" href="javascript:void(0)" data-url="#price" >{% trans "Order VM" %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="url" href="javascript:void(0)" data-url="#contact" >{% trans "Contact" %}</a>
|
<a class="url" href="javascript:void(0)" data-url="#contact" >{% trans "Contact" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<select class="selectpicker" data-width="fit" onchange="location = this.value;" style="margin-top:10px;">
|
<!-- <select class="selectpicker" data-width="fit" onchange="location = this.value;" style="margin-top:10px;">
|
||||||
{% if LANGUAGE_CODE == 'en-us'%}
|
{% if LANGUAGE_CODE == 'en-us'%}
|
||||||
<option selected="selected" value="{{base_url}}/en-us/datacenterlight/">English</option>
|
<option selected="selected" value="{{base_url}}/en-us/datacenterlight/">English</option>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -86,7 +86,25 @@
|
||||||
<option value="{{base_url}}/de/datacenterlight/">Deutsch</option>
|
<option value="{{base_url}}/de/datacenterlight/">Deutsch</option>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</select>
|
</select> -->
|
||||||
|
<li class="nav-language">
|
||||||
|
<div class="select-language">
|
||||||
|
{% if LANGUAGE_CODE == 'en-us'%}
|
||||||
|
<span>English</span>
|
||||||
|
{% else %}
|
||||||
|
<span>Deutsch</span>
|
||||||
|
{% endif %}
|
||||||
|
<i class="fa fa-globe" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<div class="drop-language">
|
||||||
|
{% if LANGUAGE_CODE == 'en-us'%}
|
||||||
|
<a class="url" href="{{base_url}}/de/datacenterlight" >Deutsch</a>
|
||||||
|
{% else %}
|
||||||
|
<a class="url" href="{{base_url}}/en-us/datacenterlight" >English</a>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
@ -110,7 +128,7 @@
|
||||||
<hr class="intro-divider">
|
<hr class="intro-divider">
|
||||||
<ul class="list-inline intro-social-buttons">
|
<ul class="list-inline intro-social-buttons">
|
||||||
<li>
|
<li>
|
||||||
<a href="#how" class="btn btn-default btn-lg btn-transparent"><i class="#Services"></i> <span class="network-name">{% trans "What is it?" %}</span></a>
|
<a class="btn btn-default btn-lg btn-transparent url" href="javascript:void(0)" data-url="#how" ><i class="#Services"></i> <span class="network-name">{% trans "What is it?" %}</span></a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="btn btn-primary btn-lg page-scroll url" href="javascript:void(0)" data-url="#request" ><span class="network-name">{% trans "I want it!" %}</span></a>
|
<a class="btn btn-primary btn-lg page-scroll url" href="javascript:void(0)" data-url="#request" ><span class="network-name">{% trans "I want it!" %}</span></a>
|
||||||
|
@ -139,7 +157,7 @@
|
||||||
<div class="col-xs-12 col-sm-6 col-md-6">
|
<div class="col-xs-12 col-sm-6 col-md-6">
|
||||||
<div class="split-text">
|
<div class="split-text">
|
||||||
<div class="split-title">
|
<div class="split-title">
|
||||||
<h2>{% trans "How it works" %}</h2>
|
<h2>{% trans "What is it" %}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="split-description">
|
<div class="split-description">
|
||||||
<ul class="fa-ul">
|
<ul class="fa-ul">
|
||||||
|
@ -324,7 +342,7 @@
|
||||||
</li>
|
</li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="#about">{% trans "How it works" %}</a></li>
|
<a href="#about">{% trans "What is it" %}</a></li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="#about">{% trans "Scale out" %}</a></li>
|
<a href="#about">{% trans "Scale out" %}</a></li>
|
||||||
|
|
|
@ -74,19 +74,24 @@
|
||||||
<a class="url" href="javascript:void(0)" data-url="#contact" >{% trans "Contact" %}</a>
|
<a class="url" href="javascript:void(0)" data-url="#contact" >{% trans "Contact" %}</a>
|
||||||
</li> -->
|
</li> -->
|
||||||
|
|
||||||
<select class="selectpicker" data-width="fit" onchange="location = this.value;" style="margin-top:10px;">
|
<li class="nav-language">
|
||||||
|
<div class="select-language">
|
||||||
{% if LANGUAGE_CODE == 'en-us'%}
|
{% if LANGUAGE_CODE == 'en-us'%}
|
||||||
<option selected="selected" value="{{base_url}}/en-us/datacenterlight/">English</option>
|
<span>English</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<option value="{{base_url}}/en-us/datacenterlight/">English</option>
|
<span>Deutsch</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if LANGUAGE_CODE == 'de'%}
|
<i class="fa fa-globe" aria-hidden="true"></i>
|
||||||
<option selected="selected" value="{{base_url}}/de/datacenterlight/">Deutsch</option>
|
</div>
|
||||||
|
<div class="drop-language">
|
||||||
|
{% if LANGUAGE_CODE == 'en-us'%}
|
||||||
|
<a class="url" href="{{base_url}}/de/datacenterlight/pricing" >Deutsch</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<option value="{{base_url}}/de/datacenterlight/">Deutsch</option>
|
<a class="url" href="{{base_url}}/en-us/datacenterlight/pricing" >English</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</select>
|
</div>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
@ -163,7 +168,7 @@
|
||||||
<h2 class="section-heading">{% trans "Simple and affordable: Try our virtual machine with featherlight price." %}</h2>
|
<h2 class="section-heading">{% trans "Simple and affordable: Try our virtual machine with featherlight price." %}</h2>
|
||||||
|
|
||||||
<div class="description">
|
<div class="description">
|
||||||
<p>Our VMs are hosted in Glarus, Switzerland. WARNING: We are currently running in BETA mode, especially our website We hope you will not encounter any hiccups, but if you, please let us know at support@datacenterlight.ch</p>
|
<p>{% trans "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 our website, or if your order is more detailed, or if you encounter any technical hiccups, please contact us at support@datacenterlight.ch, our team will get in touch with you asap." %}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -182,7 +187,7 @@
|
||||||
</li>
|
</li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="#about">{% trans "How it works" %}</a></li>
|
<a href="#about">{% trans "What is it" %}</a></li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="#about">{% trans "Scale out" %}</a></li>
|
<a href="#about">{% trans "Scale out" %}</a></li>
|
||||||
|
|
|
@ -241,3 +241,5 @@ class IndexView(CreateView):
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
@ -4,6 +4,7 @@ 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
|
||||||
|
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from utils.stripe_utils import StripeUtils
|
from utils.stripe_utils import StripeUtils
|
||||||
|
|
||||||
|
@ -57,21 +58,19 @@ class HostingUserSignupForm(forms.ModelForm):
|
||||||
|
|
||||||
|
|
||||||
class UserHostingKeyForm(forms.ModelForm):
|
class UserHostingKeyForm(forms.ModelForm):
|
||||||
private_key = forms.CharField(widget=forms.PasswordInput(), required=False)
|
private_key = forms.CharField(widget=forms.HiddenInput(), required=False)
|
||||||
public_key = forms.CharField(widget=forms.PasswordInput(), required=False)
|
public_key = forms.CharField(widget=forms.Textarea(), required=False,
|
||||||
user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(), required=False)
|
help_text=_('Paste here your public key'))
|
||||||
name = forms.CharField(required=False)
|
user = forms.models.ModelChoiceField(queryset=CustomUser.objects.all(),
|
||||||
|
required=False, widget=forms.HiddenInput())
|
||||||
|
name = forms.CharField(required=True)
|
||||||
|
|
||||||
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.initial['user'].initial = self.request.user.id
|
|
||||||
# print(self.fields)
|
|
||||||
|
|
||||||
def clean_name(self):
|
def clean_name(self):
|
||||||
return "dcl-priv-key-%s" % (
|
return self.data.get('name')
|
||||||
''.join(random.choice(string.ascii_lowercase) for i in range(7))
|
|
||||||
)
|
|
||||||
|
|
||||||
def clean_user(self):
|
def clean_user(self):
|
||||||
return self.request.user
|
return self.request.user
|
||||||
|
@ -90,4 +89,4 @@ class UserHostingKeyForm(forms.ModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UserHostingKey
|
model = UserHostingKey
|
||||||
fields = ['user', 'public_key', 'name']
|
fields = ['user', 'name', 'public_key']
|
||||||
|
|
Binary file not shown.
|
@ -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: 2016-07-17 11:34-0500\n"
|
"POT-Creation-Date: 2017-06-01 21:03+0000\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,342 +18,456 @@ 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/emails/password_reset_email.html:2
|
#: hosting/forms.py:63
|
||||||
#: templates/emails/password_reset_email.txt:2
|
msgid "Paste here your public key"
|
||||||
|
msgstr "Fügen Sie Ihren public key ein"
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:68
|
||||||
|
#: hosting/templates/hosting/base_short.html:139
|
||||||
|
msgid "My Virtual Machines"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:73
|
||||||
|
#: hosting/templates/hosting/base_short.html:145
|
||||||
|
#: hosting/templates/hosting/orders.html:12
|
||||||
|
msgid "My Orders"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:78
|
||||||
|
#: hosting/templates/hosting/base_short.html:152
|
||||||
|
msgid "Keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:83
|
||||||
|
#: hosting/templates/hosting/base_short.html:158
|
||||||
|
msgid "Notifications "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:90
|
||||||
|
msgid "Logout"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:95
|
||||||
|
msgid "How it works"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:98
|
||||||
|
msgid "Your infrastructure"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:101
|
||||||
|
msgid "Our inftrastructure"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:104
|
||||||
|
msgid "Pricing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:107
|
||||||
|
msgid "Contact"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:110
|
||||||
|
#: hosting/templates/hosting/login.html:32
|
||||||
|
#: hosting/templates/hosting/login.html:41
|
||||||
|
#: hosting/templates/hosting/reset_password.html:31
|
||||||
|
#: hosting/templates/hosting/signup.html:30
|
||||||
|
msgid "Login"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/base_short.html:134
|
||||||
|
msgid "Home"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:11
|
||||||
|
#: hosting/templates/hosting/order_detail.html:10
|
||||||
|
msgid "Invoice"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:11
|
||||||
|
#: hosting/templates/hosting/order_detail.html:10
|
||||||
|
msgid "Order #"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:25
|
||||||
|
msgid "ungleich GmbH"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:26
|
||||||
|
msgid "buchhaltung@ungleich.ch"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:27
|
||||||
|
msgid "Hauptstrasse 14"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:28
|
||||||
|
msgid "CH-8775 Luchsingen"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:29
|
||||||
|
msgid "Mwst-Nummer: CHE-109.549.333 MWST"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:60
|
||||||
|
msgid "Total:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:68
|
||||||
|
#, python-format
|
||||||
|
msgid "Alles Preise in CHF mit 8%% Mehrwertsteuer."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:69
|
||||||
|
msgid "Betrag zahlbar innerhalb von 30 Tagen ab Rechnungseingang."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:70
|
||||||
|
msgid "Kontoverbindung:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:73
|
||||||
|
msgid "IBAN:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:76
|
||||||
|
msgid "BIC:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:81
|
||||||
|
msgid "CH02 0900 0000 6071 8848 8"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bill_detail.html:84
|
||||||
|
msgid "POFICHBEXXX"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bills.html:12
|
||||||
|
msgid "Customers"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bills.html:16
|
||||||
|
#: hosting/templates/hosting/virtual_machine_key.html:42
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bills.html:17
|
||||||
|
msgid "Email"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bills.html:28
|
||||||
|
msgid "View Bill"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bills.html:41
|
||||||
|
#: hosting/templates/hosting/orders.html:83
|
||||||
|
#: hosting/templates/hosting/virtual_machines.html:70
|
||||||
|
msgid "previous"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/bills.html:47
|
||||||
|
#: hosting/templates/hosting/orders.html:89
|
||||||
|
#: hosting/templates/hosting/virtual_machines.html:76
|
||||||
|
msgid "next"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/confirm_reset_password.html:19
|
||||||
|
msgid "Set your new password"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/confirm_reset_password.html:28
|
||||||
|
#: hosting/templates/hosting/reset_password.html:22
|
||||||
|
msgid "Reset"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/confirm_reset_password.html:32
|
||||||
|
#: hosting/templates/hosting/reset_password.html:28
|
||||||
|
#: hosting/templates/hosting/signup.html:27
|
||||||
|
msgid "Already have an account ?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/confirm_reset_password.html:32
|
||||||
|
msgid "Log in"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/create_virtual_machine.html:19
|
||||||
|
msgid "New Virtual Machine"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/create_virtual_machine.html:45
|
||||||
|
msgid "Start VM"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/emails/password_reset_email.html:2
|
||||||
|
#: hosting/templates/hosting/emails/password_reset_email.txt:2
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"You're receiving this email because you requested a password reset for your "
|
"You're receiving this email because you requested a password reset for your "
|
||||||
"user account at %(site_name)s."
|
"user account at %(site_name)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/emails/password_reset_email.html:4
|
#: hosting/templates/hosting/emails/password_reset_email.html:4
|
||||||
#: templates/emails/password_reset_email.txt:4
|
#: hosting/templates/hosting/emails/password_reset_email.txt:4
|
||||||
msgid "Please go to the following page and choose a new password:"
|
msgid "Please go to the following page and choose a new password:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/emails/password_reset_email.html:9
|
#: hosting/templates/hosting/emails/password_reset_email.html:9
|
||||||
#: templates/emails/password_reset_email.txt:9
|
#: hosting/templates/hosting/emails/password_reset_email.txt:9
|
||||||
msgid "Thanks for using our site!"
|
msgid "Thanks for using our site!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/emails/password_reset_email.html:11
|
#: hosting/templates/hosting/emails/password_reset_email.html:11
|
||||||
#: templates/emails/password_reset_email.txt:11
|
#: hosting/templates/hosting/emails/password_reset_email.txt:11
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "The %(site_name)s team"
|
msgid "The %(site_name)s team"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:67
|
#: hosting/templates/hosting/login.html:10
|
||||||
msgid "My Virtual Machines"
|
#: hosting/templates/hosting/reset_password.html:10
|
||||||
|
#: hosting/templates/hosting/signup.html:9
|
||||||
|
msgid "Your VM hosted in Switzerland"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:72 templates/hosting/orders.html.py:12
|
#: hosting/templates/hosting/login.html:26
|
||||||
msgid "My Orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:77
|
|
||||||
msgid "Notifications "
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:84
|
|
||||||
msgid "Logout"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:89 templates/hosting/base_short.html:131
|
|
||||||
msgid "How it works"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:92 templates/hosting/base_short.html:134
|
|
||||||
msgid "Your infrastructure"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:95 templates/hosting/base_short.html:137
|
|
||||||
msgid "Our inftrastructure"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:98 templates/hosting/base_short.html:140
|
|
||||||
msgid "Pricing"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:101 templates/hosting/base_short.html:144
|
|
||||||
msgid "Contact"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:104 templates/hosting/login.html.py:29
|
|
||||||
#: templates/hosting/login.html:38 templates/hosting/reset_password.html:24
|
|
||||||
#: templates/hosting/signup.html:24
|
|
||||||
msgid "Login"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/base_short.html:127
|
|
||||||
msgid "Home"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/confirm_reset_password.html:19
|
|
||||||
msgid "Set your new password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/confirm_reset_password.html:28
|
|
||||||
#: templates/hosting/reset_password.html:20
|
|
||||||
msgid "Reset"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/confirm_reset_password.html:32
|
|
||||||
#: templates/hosting/reset_password.html:24 templates/hosting/signup.html:24
|
|
||||||
msgid "Already have an account ?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/confirm_reset_password.html:32
|
|
||||||
msgid "Log in"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/login.html:22
|
|
||||||
msgid "You haven been logged out"
|
msgid "You haven been logged out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/login.html:42
|
#: hosting/templates/hosting/login.html:49
|
||||||
msgid "Don't have an account yet ? "
|
msgid "Don't have an account yet ? "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/login.html:42 templates/hosting/signup.html.py:11
|
#: hosting/templates/hosting/login.html:52
|
||||||
#: templates/hosting/signup.html:20
|
#: hosting/templates/hosting/signup.html:13
|
||||||
|
#: hosting/templates/hosting/signup.html:21
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/login.html:44
|
#: hosting/templates/hosting/login.html:54
|
||||||
msgid "Forgot your password ? "
|
msgid "Forgot your password ? "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/notifications.html:9
|
#: hosting/templates/hosting/notifications.html:9
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/notifications.html:16
|
#: hosting/templates/hosting/notifications.html:16
|
||||||
msgid "Unread"
|
msgid "Unread"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/notifications.html:26
|
#: hosting/templates/hosting/notifications.html:26
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/notifications.html:38
|
#: hosting/templates/hosting/notifications.html:38
|
||||||
msgid "Unread notifications"
|
msgid "Unread notifications"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/notifications.html:48
|
#: hosting/templates/hosting/notifications.html:48
|
||||||
msgid "Mark as read"
|
msgid "Mark as read"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/notifications.html:59
|
#: hosting/templates/hosting/notifications.html:59
|
||||||
msgid "All notifications"
|
msgid "All notifications"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:10
|
#: hosting/templates/hosting/order_detail.html:16
|
||||||
msgid "Invoice"
|
#: hosting/templates/hosting/order_detail.html:24
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:10
|
|
||||||
msgid "Order #"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:16
|
|
||||||
#: templates/hosting/order_detail.html:24
|
|
||||||
msgid "Billed To:"
|
msgid "Billed To:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:26
|
#: hosting/templates/hosting/order_detail.html:26
|
||||||
msgid "Status:"
|
msgid "Status:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:38
|
#: hosting/templates/hosting/order_detail.html:38
|
||||||
msgid "Payment Method:"
|
msgid "Payment Method:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:49
|
#: hosting/templates/hosting/order_detail.html:49
|
||||||
msgid "Order summary"
|
msgid "Order summary"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:52
|
#: hosting/templates/hosting/order_detail.html:52
|
||||||
msgid "Type"
|
#: hosting/templates/hosting/virtual_machine_detail.html:75
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:54
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:96
|
|
||||||
msgid "Configuration"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:56
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:75
|
|
||||||
msgid "Cores"
|
msgid "Cores"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:58
|
#: hosting/templates/hosting/order_detail.html:54
|
||||||
#: templates/hosting/virtual_machine_detail.html:81
|
#: hosting/templates/hosting/virtual_machine_detail.html:81
|
||||||
msgid "Memory"
|
msgid "Memory"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:60
|
#: hosting/templates/hosting/order_detail.html:56
|
||||||
msgid "Disk space"
|
msgid "Disk space"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:62
|
#: hosting/templates/hosting/order_detail.html:58
|
||||||
msgid "Total"
|
msgid "Total"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/order_detail.html:68
|
#: hosting/templates/hosting/order_detail.html:64
|
||||||
msgid "Finish Configuration"
|
msgid "Finish Configuration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:17
|
#: hosting/templates/hosting/orders.html:17
|
||||||
#: templates/hosting/virtual_machine_detail.html:121
|
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:18
|
#: hosting/templates/hosting/orders.html:18
|
||||||
#: templates/hosting/virtual_machine_detail.html:122
|
|
||||||
#: templates/hosting/virtual_machines.html:15
|
|
||||||
msgid "Amount"
|
msgid "Amount"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:19
|
#: hosting/templates/hosting/orders.html:19
|
||||||
#: templates/hosting/virtual_machine_detail.html:36
|
#: hosting/templates/hosting/virtual_machine_detail.html:30
|
||||||
#: templates/hosting/virtual_machine_detail.html:123
|
#: hosting/templates/hosting/virtual_machine_key.html:44
|
||||||
#: templates/hosting/virtual_machines.html:16
|
#: hosting/templates/hosting/virtual_machines.html:31
|
||||||
msgid "Status"
|
msgid "Status"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:30
|
#: hosting/templates/hosting/orders.html:30
|
||||||
#: templates/hosting/virtual_machine_detail.html:134
|
|
||||||
msgid "Approved"
|
msgid "Approved"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:32
|
#: hosting/templates/hosting/orders.html:32
|
||||||
#: templates/hosting/virtual_machine_detail.html:136
|
|
||||||
msgid "Declined"
|
msgid "Declined"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:37
|
#: hosting/templates/hosting/orders.html:37
|
||||||
#: templates/hosting/virtual_machine_detail.html:140
|
#: hosting/templates/hosting/virtual_machines.html:58
|
||||||
#: templates/hosting/virtual_machines.html:38
|
|
||||||
msgid "View Detail"
|
msgid "View Detail"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:41
|
#: hosting/templates/hosting/orders.html:41
|
||||||
msgid "Cancel Order"
|
msgid "Cancel Order"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:56
|
#: hosting/templates/hosting/orders.html:56
|
||||||
msgid "Do You want do delete your order?"
|
msgid "Do You want do delete your order?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:64
|
#: hosting/templates/hosting/orders.html:64
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:66
|
#: hosting/templates/hosting/orders.html:66
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/orders.html:83 templates/hosting/virtual_machines.html:49
|
#: hosting/templates/hosting/reset_password.html:14
|
||||||
msgid "previous"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/orders.html:89 templates/hosting/virtual_machines.html:55
|
|
||||||
msgid "next"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/reset_password.html:11
|
|
||||||
msgid "Reset your password"
|
msgid "Reset your password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:19
|
#: hosting/templates/hosting/virtual_machine_detail.html:19
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:25
|
#: hosting/templates/hosting/virtual_machine_detail.html:25
|
||||||
msgid "Billing"
|
msgid "Billing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:31
|
#: hosting/templates/hosting/virtual_machine_detail.html:60
|
||||||
msgid "Orders"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:60
|
|
||||||
msgid "Ip not assigned yet"
|
msgid "Ip not assigned yet"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:87
|
#: hosting/templates/hosting/virtual_machine_detail.html:87
|
||||||
msgid "Disk"
|
msgid "Disk"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:106
|
#: hosting/templates/hosting/virtual_machine_detail.html:96
|
||||||
|
msgid "Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/virtual_machine_detail.html:106
|
||||||
msgid "Current pricing"
|
msgid "Current pricing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:152
|
#: hosting/templates/hosting/virtual_machine_detail.html:115
|
||||||
msgid "Current status"
|
msgid "Current status"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:172
|
#: hosting/templates/hosting/virtual_machine_detail.html:140
|
||||||
msgid "Cancel Virtual Machine"
|
msgid "Terminate Virtual Machine"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:181
|
#: hosting/templates/hosting/virtual_machine_detail.html:161
|
||||||
msgid "Cancel your Virtual Machine"
|
msgid "Terminate your Virtual Machine"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:184
|
#: hosting/templates/hosting/virtual_machine_detail.html:164
|
||||||
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 ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:184
|
#: hosting/templates/hosting/virtual_machine_detail.html:164
|
||||||
msgid "plan?"
|
msgid "plan?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_detail.html:187
|
#: hosting/templates/hosting/virtual_machine_detail.html:167
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_key.html:10
|
#: hosting/templates/hosting/virtual_machine_key.html:11
|
||||||
msgid "SSH Private Key"
|
msgid "Access Key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_key.html:15
|
#: hosting/templates/hosting/virtual_machine_key.html:25
|
||||||
#: templates/hosting/virtual_machine_key.html:29
|
msgid "Upload your own key. "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/virtual_machine_key.html:29
|
||||||
|
msgid "Or generate a new key pair."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/virtual_machine_key.html:31
|
||||||
|
msgid "Generate Key Pair"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/virtual_machine_key.html:43
|
||||||
|
msgid "Created at"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/virtual_machine_key.html:66
|
||||||
|
#: hosting/templates/hosting/virtual_machine_key.html:79
|
||||||
msgid "Warning!"
|
msgid "Warning!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_key.html:15
|
#: hosting/templates/hosting/virtual_machine_key.html:66
|
||||||
msgid ""
|
msgid "You can download your SSH private key once. Don't lost your key"
|
||||||
"You can view your SSH private key once. Copy it or if it wasn't downloaded "
|
|
||||||
"automatically, just click on Download to start it."
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_key.html:24
|
#: hosting/templates/hosting/virtual_machine_key.html:74
|
||||||
msgid "Copy to Clipboard"
|
msgid "Copy to Clipboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_key.html:25
|
#: hosting/templates/hosting/virtual_machine_key.html:75
|
||||||
msgid "Download"
|
msgid "Download"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_key.html:29
|
#: hosting/templates/hosting/virtual_machine_key.html:79
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your SSH private key was already generated and downloaded, if you lost it, "
|
"Your SSH private key was already generated and downloaded, if you lost it, "
|
||||||
"contact us. "
|
"contact us. "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machine_key.html:32
|
#: hosting/templates/hosting/virtual_machine_key.html:82
|
||||||
msgid "Go to my Virtual Machine Dashboard"
|
msgid "Generate my key"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machines.html:9
|
#: hosting/templates/hosting/virtual_machines.html:9
|
||||||
msgid "Virtual Machines"
|
msgid "Virtual Machines"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machines.html:13
|
#: hosting/templates/hosting/virtual_machines.html:22
|
||||||
|
msgid "Create VM"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/virtual_machines.html:28
|
||||||
msgid "ID"
|
msgid "ID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/hosting/virtual_machines.html:14
|
#: hosting/templates/hosting/virtual_machines.html:29
|
||||||
msgid "Location"
|
msgid "Ipv4"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: hosting/templates/hosting/virtual_machines.html:30
|
||||||
|
msgid "Ipv6"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
.dashboard-container {
|
.dashboard-container {
|
||||||
padding-top:5%; padding-bottom: 11%;
|
padding-top:70px; padding-bottom: 11%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.borderless td {
|
.borderless td {
|
||||||
|
|
|
@ -82,24 +82,25 @@ h6 {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #f8f8f8;
|
color: #f8f8f8;
|
||||||
position: relative;
|
position: relative;
|
||||||
padding-bottom: 25%;
|
|
||||||
padding-top: 10%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.intro-login {
|
.intro-login {
|
||||||
background: url(../img/login-bg.jpg) no-repeat center center;
|
background: url(../img/intro-bg.jpg) no-repeat center center;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.intro-signup {
|
.intro-signup {
|
||||||
background: url(../img/signup-bg.png) no-repeat center center;
|
background: url(../img/intro-bg.jpg) no-repeat center center;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.intro-reset-password {
|
.intro-reset-password {
|
||||||
background: url(../img/signup-bg.png) no-repeat center center;
|
background: url(../img/intro-bg.jpg) no-repeat center center;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
@ -193,6 +194,128 @@ h6 {
|
||||||
float: right;
|
float: right;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
/*------Auth section---------*/
|
||||||
|
.auth-container{
|
||||||
|
height: 100vh;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.auth-bg{
|
||||||
|
background: url(../img/auth-bg.jpg);
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center center;
|
||||||
|
background-size: cover;
|
||||||
|
background-attachment: fixed;
|
||||||
|
|
||||||
|
}
|
||||||
|
.auth-bg::before{
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background: rgba(75, 75, 101, 0.55);
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.auth-container .container{
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
.auth-container .auth-content{
|
||||||
|
width: 80%;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 390px;
|
||||||
|
margin-top: 60px;
|
||||||
|
|
||||||
|
}
|
||||||
|
.auth-container .auth-title{
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
.auth-container .auth-title h2{
|
||||||
|
color: #fff;
|
||||||
|
font-family: 'Montserrat-Bold';
|
||||||
|
font-size: 44px;
|
||||||
|
text-align: center;
|
||||||
|
width: 425px;
|
||||||
|
margin: 0 auto;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.auth-container .auth-title h2::after{
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: -20px;
|
||||||
|
background: #fff;
|
||||||
|
height: 7px;
|
||||||
|
width: 70px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box{
|
||||||
|
background: #fff;
|
||||||
|
padding: 0;
|
||||||
|
padding-bottom: 30px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
|
||||||
|
border-radius: 4px;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box .section-heading{
|
||||||
|
color: #5a5a5a;
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
text-align: center;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 3px;
|
||||||
|
font-size: 20px;
|
||||||
|
border-radius: 3px 3px 0px 0px;
|
||||||
|
margin: 0 auto;
|
||||||
|
font-family: 'Montserrat-Medium';
|
||||||
|
}
|
||||||
|
.auth-box .form{
|
||||||
|
padding: 20px;
|
||||||
|
width: 80%;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.auth-box .form .red{
|
||||||
|
color: #ea3a3a;
|
||||||
|
}
|
||||||
|
.auth-box .form .btn{
|
||||||
|
box-shadow: 0 0px 9px rgba(0,0,0,0.19), 0 3px 5px rgba(0,0,0,0.23);
|
||||||
|
letter-spacing: 3px;
|
||||||
|
font-size: 17px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
.auth-box .form .form-control{
|
||||||
|
height: 44px;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
.auth-box .auth-footer {
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
.auth-box .auth-footer .text{
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
.auth-box .auth-footer .links a{
|
||||||
|
color: #1e94cc;
|
||||||
|
}
|
||||||
|
.auth-box .auth-footer .links a:hover{
|
||||||
|
color: #1e94cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-box.sign-up{
|
||||||
|
padding-bottom: 5px;
|
||||||
|
}
|
||||||
|
.auth-box.sign-up .form{
|
||||||
|
padding: 15px 20px 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 1199px) {
|
@media (max-width: 1199px) {
|
||||||
ul.banner-social-buttons {
|
ul.banner-social-buttons {
|
||||||
|
@ -218,7 +341,17 @@ h6 {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@media (max-width: 540px) {
|
||||||
|
.auth-container .auth-title h2{
|
||||||
|
font-size: 32px;
|
||||||
|
width: 90%;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
.auth-box .form {
|
||||||
|
padding: 15px;
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
}
|
||||||
footer {
|
footer {
|
||||||
padding: 2%;
|
padding: 2%;
|
||||||
background-color: #f8f8f8;
|
background-color: #f8f8f8;
|
||||||
|
@ -251,3 +384,4 @@ a.unlink {
|
||||||
a.unlink:hover {
|
a.unlink:hover {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.order-detail-container {padding-top:5%; padding-bottom: 11%;}
|
.order-detail-container {padding-top: 70px; padding-bottom: 11%;}
|
||||||
|
|
||||||
.order-detail-container .invoice-title h2, .invoice-title h3 {
|
.order-detail-container .invoice-title h2, .invoice-title h3 {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.orders-container {padding-top:5%; padding-bottom: 11%;}
|
.orders-container {padding-top:70px; padding-bottom: 11%;}
|
||||||
|
|
||||||
.orders-container .table > tbody > tr > td {
|
.orders-container .table > tbody > tr > td {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
.payment-container {padding-top:5%; padding-bottom: 11%;}
|
.payment-container {padding-top:70px; padding-bottom: 11%;}
|
||||||
.creditcard-box .panel-title {display: inline;font-weight: bold; font-size:17px;}
|
.creditcard-box .panel-title {display: inline;font-weight: bold; font-size:17px;}
|
||||||
.creditcard-box .checkbox.pull-right { margin: 0; }
|
.creditcard-box .checkbox.pull-right { margin: 0; }
|
||||||
.creditcard-box .pl-ziro { padding-left: 0px; }
|
.creditcard-box .pl-ziro { padding-left: 0px; }
|
||||||
|
|
BIN
hosting/static/hosting/img/auth-bg.jpg
Normal file
BIN
hosting/static/hosting/img/auth-bg.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 685 KiB |
|
@ -44,6 +44,7 @@
|
||||||
|
|
||||||
|
|
||||||
<!-- Navigation -->
|
<!-- Navigation -->
|
||||||
|
{% if request.user.is_authenticated %}
|
||||||
<nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation">
|
<nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation">
|
||||||
<div class="container topnav">
|
<div class="container topnav">
|
||||||
<!-- Brand and toggle get grouped for better mobile display -->
|
<!-- Brand and toggle get grouped for better mobile display -->
|
||||||
|
@ -61,7 +62,7 @@
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
|
|
||||||
|
|
||||||
{% if request.user.is_authenticated %}
|
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'hosting:virtual_machines' %}">
|
<a href="{% url 'hosting:virtual_machines' %}">
|
||||||
<i class="fa fa-server" aria-hidden="true"></i> {% trans "My Virtual Machines"%}
|
<i class="fa fa-server" aria-hidden="true"></i> {% trans "My Virtual Machines"%}
|
||||||
|
@ -72,11 +73,7 @@
|
||||||
<i class="fa fa-credit-card"></i> {% trans "My Orders"%}
|
<i class="fa fa-credit-card"></i> {% trans "My Orders"%}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="{% url 'hosting:key_pair' %}">
|
|
||||||
<i class="fa fa-key" aria-hidden="true"></i> {% trans "Keys"%}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'hosting:notifications' %}">
|
<a href="{% url 'hosting:notifications' %}">
|
||||||
<i class="fa fa-bell"></i> {% trans "Notifications "%}
|
<i class="fa fa-bell"></i> {% trans "Notifications "%}
|
||||||
|
@ -87,9 +84,14 @@
|
||||||
<i class="glyphicon glyphicon-user"></i> {{request.user.name}} <span class="caret"></span></a>
|
<i class="glyphicon glyphicon-user"></i> {{request.user.name}} <span class="caret"></span></a>
|
||||||
<ul id="g-account-menu" class="dropdown-menu" role="menu">
|
<ul id="g-account-menu" class="dropdown-menu" role="menu">
|
||||||
<li><a href="{% url 'hosting:logout' %}"><i class="glyphicon glyphicon-lock"></i>{% trans "Logout"%} </a></li>
|
<li><a href="{% url 'hosting:logout' %}"><i class="glyphicon glyphicon-lock"></i>{% trans "Logout"%} </a></li>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'hosting:key_pair' %}">
|
||||||
|
<i class="fa fa-key"></i> {% trans "Keys"%}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
{% else %}
|
<!--
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.session.hosting_url}}#how">{% trans "How it works"%}</a>
|
<a href="{{ request.session.hosting_url}}#how">{% trans "How it works"%}</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -107,8 +109,7 @@
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'hosting:login' %}?next={{request.current_path}}">{% trans "Login"%}</a>
|
<a href="{% url 'hosting:login' %}?next={{request.current_path}}">{% trans "Login"%}</a>
|
||||||
</li>
|
</li> -->
|
||||||
{% endif %}
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!-- /.navbar-collapse -->
|
<!-- /.navbar-collapse -->
|
||||||
|
@ -116,6 +117,7 @@
|
||||||
<!-- /.container -->
|
<!-- /.container -->
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<a name="about"></a>
|
<a name="about"></a>
|
||||||
|
@ -123,6 +125,7 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
<!-- Footer -->
|
<!-- Footer -->
|
||||||
|
{% if request.user.is_authenticated %}
|
||||||
<footer class="navbar-fixed-bottom">
|
<footer class="navbar-fixed-bottom">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -133,20 +136,28 @@
|
||||||
</li>
|
</li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.session.hosting_url}}#how">{% trans "How it works"%}</a>
|
<a href="{% url 'hosting:virtual_machines' %}">
|
||||||
<li class="footer-menu-divider">⋅</li>
|
{% trans "My Virtual Machines"%}
|
||||||
<li>
|
</a>
|
||||||
<a href="{{ request.session.hosting_url }}#your">{% trans "Your infrastructure"%}</a></li>
|
|
||||||
<li>⋅</li>
|
|
||||||
<li>
|
|
||||||
<a href="{{ request.session.hosting_url }}#our">{% trans "Our inftrastructure"%}</a></li>
|
|
||||||
<li class="footer-menu-divider">⋅</li>
|
|
||||||
<li>
|
|
||||||
<a href="{{ request.session.hosting_url }}#services">{% trans "Pricing"%}</a>
|
|
||||||
</li>
|
</li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.session.hosting_url }}#contact">{% trans "Contact"%}</a>
|
<a href="{% url 'hosting:orders' %}">
|
||||||
|
{% trans "My Orders"%}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>⋅</li>
|
||||||
|
<li>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'hosting:key_pair' %}">
|
||||||
|
{% trans "Keys"%}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="footer-menu-divider">⋅</li>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'hosting:notifications' %}">
|
||||||
|
{% trans "Notifications "%}
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -155,7 +166,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
{% endif %}
|
||||||
<!-- jQuery -->
|
<!-- jQuery -->
|
||||||
<script src="{% static 'hosting/js/jquery.js' %}"></script>
|
<script src="{% static 'hosting/js/jquery.js' %}"></script>
|
||||||
<script type="text/javascript" src="//cdn.jsdelivr.net/jquery.validation/1.13.1/jquery.validate.min.js"></script>
|
<script type="text/javascript" src="//cdn.jsdelivr.net/jquery.validation/1.13.1/jquery.validate.min.js"></script>
|
||||||
|
|
|
@ -3,12 +3,16 @@
|
||||||
{% load staticfiles bootstrap3%}
|
{% load staticfiles bootstrap3%}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="intro-auth intro-login">
|
<div class="auth-container">
|
||||||
|
<div class="auth-bg"></div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="col-md-4 col-md-offset-4">
|
<div class="auth-title">
|
||||||
|
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||||
|
</div>
|
||||||
|
<div class="auth-content">
|
||||||
|
|
||||||
{% if messages %}
|
{% if messages %}
|
||||||
<ul class="list-unstyled">
|
<ul class="list-unstyled" style="color: #fff">
|
||||||
{% for message in messages %}
|
{% for message in messages %}
|
||||||
<li>{{ message }}</li>
|
<li>{{ message }}</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -24,30 +28,32 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
<div class="intro-message auth-box">
|
||||||
<div class="intro-message">
|
|
||||||
<h2 class="section-heading">{% trans "Login"%}</h2>
|
<h2 class="section-heading">{% trans "Login"%}</h2>
|
||||||
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidated>
|
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidated>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% for field in form %}
|
{% for field in form %}
|
||||||
{% bootstrap_field field show_label=False type='fields'%}
|
{% bootstrap_field field show_label=False type='fields'%}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<p>{{form.non_field_errors|striptags}}</p>
|
<p class="red">{{form.non_field_errors|striptags}}</p>
|
||||||
{% buttons %}
|
{% buttons %}
|
||||||
<button type="submit" class="btn btn-default">
|
<button type="submit" class="btn btn-block btn-success">
|
||||||
{% trans "Login"%}
|
{% trans "Login"%}
|
||||||
</button>
|
</button>
|
||||||
{% endbuttons %}
|
{% endbuttons %}
|
||||||
|
|
||||||
<input type='hidden' name='next' value='{{request.GET.next}}'/>
|
<input type='hidden' name='next' value='{{request.GET.next}}'/>
|
||||||
</form>
|
</form>
|
||||||
<span>{% trans "Don't have an account yet ? "%}<a class="unlink" href="{% url 'hosting:signup' %}">{% trans "Sign up"%}</a></span>
|
<div class="auth-footer">
|
||||||
<br/>
|
<div class="text">
|
||||||
<span> <a class="unlink" href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ? "%}</a></span>
|
<span>{% trans "Don't have an account yet ? "%}</span>
|
||||||
|
</div>
|
||||||
<ul class="list-inline intro-social-buttons">
|
<div class="links">
|
||||||
|
<a class="unlink" href="{% url 'hosting:signup' %}">{% trans "Sign up"%}</a>
|
||||||
</ul>
|
<span class="text"> or </span>
|
||||||
|
<a class="unlink" href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ? "%}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,27 +3,34 @@
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="intro-auth intro-reset-password">
|
<div class="auth-container">
|
||||||
|
<div class="auth-bg"></div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="col-md-4"> </div>
|
<div class="auth-title">
|
||||||
<div class="col-md-4">
|
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||||
<div class="intro-message">
|
</div>
|
||||||
|
<div class="auth-content">
|
||||||
|
<div class="intro-message auth-box sign-up">
|
||||||
<h2 class="section-heading">{% trans "Reset your password"%}</h2>
|
<h2 class="section-heading">{% trans "Reset your password"%}</h2>
|
||||||
|
|
||||||
<form action="{% url 'hosting:reset_password' %}" method="post" class="form" novalidate>
|
<form action="{% url 'hosting:reset_password' %}" method="post" class="form" novalidate>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% for field in form %}
|
{% for field in form %}
|
||||||
{% bootstrap_field field show_label=False %}
|
{% bootstrap_field field show_label=False %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% buttons %}
|
{% buttons %}
|
||||||
<button type="submit" class="btn btn-default">
|
<button type="submit" class="btn btn-block btn-success">
|
||||||
{% trans "Reset"%}
|
{% trans "Reset"%}
|
||||||
</button>
|
</button>
|
||||||
{% endbuttons %}
|
{% endbuttons %}
|
||||||
</form>
|
</form>
|
||||||
<span>{% trans "Already have an account ?"%} <a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%} </a></span>
|
<div class="auth-footer">
|
||||||
<ul class="list-inline intro-social-buttons">
|
<div class="text">
|
||||||
</ul>
|
<span>{% trans "Already have an account ?"%}</span>
|
||||||
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -2,27 +2,34 @@
|
||||||
{% load staticfiles bootstrap3 i18n %}
|
{% load staticfiles bootstrap3 i18n %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="intro-auth intro-signup">
|
<div class="auth-container">
|
||||||
|
<div class="auth-bg"></div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="col-md-4 col-sm-4 col-xs-4"> </div>
|
<div class="auth-title">
|
||||||
<div class="col-md-4 col-sm-6 col-xs-6">
|
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||||
<div class="intro-message">
|
</div>
|
||||||
|
<div class="auth-content">
|
||||||
|
<div class="intro-message auth-box sign-up">
|
||||||
<h2 class="section-heading">{% trans "Sign up"%}</h2>
|
<h2 class="section-heading">{% trans "Sign up"%}</h2>
|
||||||
|
|
||||||
<form action="{% url 'hosting:signup' %}" method="post" class="form" novalidate>
|
<form action="{% url 'hosting:signup' %}" method="post" class="form" novalidate>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% for field in form %}
|
{% for field in form %}
|
||||||
{% bootstrap_field field show_label=False %}
|
{% bootstrap_field field show_label=False %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% buttons %}
|
{% buttons %}
|
||||||
<button type="submit" class="btn btn-default">
|
<button type="submit" class="btn btn-block btn-info">
|
||||||
{% trans "Sign up"%}
|
{% trans "Sign up"%}
|
||||||
</button>
|
</button>
|
||||||
{% endbuttons %}
|
{% endbuttons %}
|
||||||
</form>
|
</form>
|
||||||
<span>{% trans "Already have an account ?"%} <a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a></span>
|
<div class="auth-footer">
|
||||||
<ul class="list-inline intro-social-buttons">
|
<div class="text">
|
||||||
</ul>
|
<span>{% trans "Already have an account ?"%}</span>
|
||||||
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-9 col-md-offset-2">
|
<div class="col-md-9 col-md-offset-2">
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<form method="POST" action="" >
|
<form method="POST" action="" novalidate>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<h3><i class="fa fa-key" aria-hidden="true"></i>{% trans "Access Key"%} </h3>
|
<h3><i class="fa fa-key" aria-hidden="true"></i>{% trans "Access Key"%} </h3>
|
||||||
{% if messages %}
|
{% if messages %}
|
||||||
|
@ -16,27 +16,24 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<hr/>
|
{% for field in form %}
|
||||||
{% if not user_key %}
|
|
||||||
<h3>
|
{% bootstrap_field field %}
|
||||||
|
{% endfor %}
|
||||||
|
{% buttons %}
|
||||||
|
<button type="submit" class="btn btn-success">
|
||||||
{% trans "Upload your own key. "%}
|
{% trans "Upload your own key. "%}
|
||||||
</h3>
|
</button>
|
||||||
<div class="form-group">
|
<br />
|
||||||
<label for="comment">Paste here your public key</label>
|
<br />
|
||||||
<textarea class="form-control" rows="6" name="public_key"></textarea>
|
{% trans "Or generate a new key pair."%} <br />
|
||||||
</div>
|
<br />
|
||||||
<div class="form-group">
|
|
||||||
<button class="btn btn-success">{% trans "Upload Key"%} </a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h3>
|
|
||||||
{% trans "Or generate a new key pair."%}
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
<div class="form-group">
|
|
||||||
<button class="btn btn-success">{% trans "Generate Key Pair"%} </a>
|
<button class="btn btn-success">{% trans "Generate Key Pair"%} </a>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{% endbuttons %}
|
||||||
|
<div class="form-group">
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
|
||||||
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5>
|
<h5> Use your created key to access to the machine. If you lost it, contact us. </h5>
|
||||||
<table class="table borderless table-hover">
|
<table class="table borderless table-hover">
|
||||||
<br/>
|
<br/>
|
||||||
|
@ -49,6 +46,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
{% for user_key in keys %}
|
||||||
<tr>
|
<tr>
|
||||||
<td scope="row">{{user_key.name}}</td>
|
<td scope="row">{{user_key.name}}</td>
|
||||||
<td>{{user_key.created_at}}</td>
|
<td>{{user_key.created_at}}</td>
|
||||||
|
@ -57,9 +55,9 @@
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{% endif %}
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
{% if private_key %}
|
{% if private_key %}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
# Create your tests here.
|
# Create your tests here.
|
||||||
|
|
||||||
|
test_user_can_add_key()
|
||||||
|
|
|
@ -301,16 +301,12 @@ class GenerateVMSSHKeysView(LoginRequiredMixin, FormView):
|
||||||
self
|
self
|
||||||
).get_context_data(**kwargs)
|
).get_context_data(**kwargs)
|
||||||
|
|
||||||
try:
|
user_keys = UserHostingKey.objects.filter(
|
||||||
user_key = UserHostingKey.objects.get(
|
|
||||||
user=self.request.user
|
user=self.request.user
|
||||||
)
|
)
|
||||||
|
|
||||||
except UserHostingKey.DoesNotExist:
|
|
||||||
user_key = None
|
|
||||||
|
|
||||||
context.update({
|
context.update({
|
||||||
'user_key': user_key
|
'keys': user_keys
|
||||||
})
|
})
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
@ -351,24 +347,14 @@ class GenerateVMSSHKeysView(LoginRequiredMixin, FormView):
|
||||||
opennebula_user = user_pool.get_by_name(owner.email)
|
opennebula_user = user_pool.get_by_name(owner.email)
|
||||||
|
|
||||||
# Get user ssh key
|
# Get user ssh key
|
||||||
user_key = UserHostingKey.objects.get(user=owner)
|
public_key = form.cleaned_data.get('public_key')
|
||||||
# Add ssh key to user
|
# Add ssh key to user
|
||||||
manager.oneadmin_client.call('user.update', opennebula_user.id,
|
manager.oneadmin_client.call('user.update', opennebula_user.id,
|
||||||
'<CONTEXT><SSH_PUBLIC_KEY>{ssh_key}</SSH_PUBLIC_KEY></CONTEXT>'.format(ssh_key=user_key.public_key))
|
'<CONTEXT><SSH_PUBLIC_KEY>{key}</SSH_PUBLIC_KEY></CONTEXT>'.format(key=public_key))
|
||||||
|
|
||||||
return render(self.request, self.template_name, context)
|
return render(self.request, self.template_name, context)
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
|
|
||||||
try:
|
|
||||||
UserHostingKey.objects.get(
|
|
||||||
user=self.request.user
|
|
||||||
)
|
|
||||||
return HttpResponseRedirect(reverse('hosting:key_pair'))
|
|
||||||
|
|
||||||
except UserHostingKey.DoesNotExist:
|
|
||||||
pass
|
|
||||||
|
|
||||||
form = self.get_form()
|
form = self.get_form()
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
return self.form_valid(form)
|
return self.form_valid(form)
|
||||||
|
@ -421,11 +407,7 @@ class PaymentVMView(LoginRequiredMixin, FormView):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
try:
|
if not UserHostingKey.objects.filter( user=self.request.user).exists():
|
||||||
UserHostingKey.objects.get(
|
|
||||||
user=self.request.user
|
|
||||||
)
|
|
||||||
except UserHostingKey.DoesNotExist:
|
|
||||||
messages.success(
|
messages.success(
|
||||||
request,
|
request,
|
||||||
'In order to create a VM, you create/upload your SSH KEY first.'
|
'In order to create a VM, you create/upload your SSH KEY first.'
|
||||||
|
@ -487,13 +469,15 @@ class PaymentVMView(LoginRequiredMixin, FormView):
|
||||||
manager = OpenNebulaManager(email=owner.email,
|
manager = OpenNebulaManager(email=owner.email,
|
||||||
password=owner.password)
|
password=owner.password)
|
||||||
# Get user ssh key
|
# Get user ssh key
|
||||||
try:
|
if not UserHostingKey.objects.filter( user=self.request.user).exists():
|
||||||
user_key = UserHostingKey.objects.get(
|
context.update({
|
||||||
user=self.request.user
|
'sshError': 'error',
|
||||||
)
|
'form': form
|
||||||
|
})
|
||||||
except UserHostingKey.DoesNotExist:
|
return render(request, self.template_name, context)
|
||||||
pass
|
# For now just get first one
|
||||||
|
user_key = UserHostingKey.objects.filter(
|
||||||
|
user=self.request.user).first()
|
||||||
|
|
||||||
# Create a vm using logged user
|
# Create a vm using logged user
|
||||||
vm_id = manager.create_vm(
|
vm_id = manager.create_vm(
|
||||||
|
@ -639,11 +623,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
|
||||||
try:
|
if not UserHostingKey.objects.filter( user=self.request.user).exists():
|
||||||
UserHostingKey.objects.get(
|
|
||||||
user=self.request.user
|
|
||||||
)
|
|
||||||
except UserHostingKey.DoesNotExist:
|
|
||||||
messages.success(
|
messages.success(
|
||||||
request,
|
request,
|
||||||
'In order to create a VM, you need to create/upload your SSH KEY first.'
|
'In order to create a VM, you need to create/upload your SSH KEY first.'
|
||||||
|
|
9
opennebula_api/exceptions.py
Normal file
9
opennebula_api/exceptions.py
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
class KeyExistsError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class UserExistsError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class UserCredentialError(Exception):
|
||||||
|
pass
|
|
@ -2,12 +2,15 @@ import oca
|
||||||
import socket
|
import socket
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from oca.pool import WrongNameError
|
||||||
|
from oca.exceptions import OpenNebulaException
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
|
|
||||||
from oca.pool import WrongNameError
|
from utils.models import CustomUser
|
||||||
from oca.exceptions import OpenNebulaException
|
from .exceptions import KeyExistsError, UserExistsError, UserCredentialError
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,10 +38,33 @@ class OpenNebulaManager():
|
||||||
)
|
)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
def _get_client(self, user):
|
||||||
|
"""Get a opennebula client object for a CustomUser object
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user (CustomUser): dynamicweb CustomUser object
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
oca.Client: Opennebula client object
|
||||||
|
|
||||||
|
Raise:
|
||||||
|
ConnectionError: If the connection to the opennebula server can't be
|
||||||
|
established
|
||||||
|
"""
|
||||||
|
return oca.Client("{0}:{1}".format(
|
||||||
|
user.email,
|
||||||
|
user.password),
|
||||||
|
"{protocol}://{domain}:{port}{endpoint}".format(
|
||||||
|
protocol=settings.OPENNEBULA_PROTOCOL,
|
||||||
|
domain=settings.OPENNEBULA_DOMAIN,
|
||||||
|
port=settings.OPENNEBULA_PORT,
|
||||||
|
endpoint=settings.OPENNEBULA_ENDPOINT
|
||||||
|
))
|
||||||
|
|
||||||
def _get_opennebula_client(self, username, password):
|
def _get_opennebula_client(self, username, password):
|
||||||
return oca.Client("{0}:{1}".format(
|
return oca.Client("{0}:{1}".format(
|
||||||
username,
|
username,
|
||||||
|
|
||||||
password),
|
password),
|
||||||
"{protocol}://{domain}:{port}{endpoint}".format(
|
"{protocol}://{domain}:{port}{endpoint}".format(
|
||||||
protocol=settings.OPENNEBULA_PROTOCOL,
|
protocol=settings.OPENNEBULA_PROTOCOL,
|
||||||
|
@ -47,6 +73,69 @@ class OpenNebulaManager():
|
||||||
endpoint=settings.OPENNEBULA_ENDPOINT
|
endpoint=settings.OPENNEBULA_ENDPOINT
|
||||||
))
|
))
|
||||||
|
|
||||||
|
def _get_user(self, user):
|
||||||
|
"""Get the corresponding opennebula user for a CustomUser object
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user (CustomUser): dynamicweb CustomUser object
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
oca.User: Opennebula user object
|
||||||
|
|
||||||
|
Raise:
|
||||||
|
WrongNameError: If no openebula user with this credentials exists
|
||||||
|
ConnectionError: If the connection to the opennebula server can't be
|
||||||
|
established
|
||||||
|
"""
|
||||||
|
user_pool = self._get_user_pool()
|
||||||
|
return user_pool.get_by_name(user.email)
|
||||||
|
|
||||||
|
def create_user(self, user: CustomUser):
|
||||||
|
"""Create a new opennebula user or a corresponding CustomUser object
|
||||||
|
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user (CustomUser): dynamicweb CustomUser object
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
int: Return the opennebula user id
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ConnectionError: If the connection to the opennebula server can't be
|
||||||
|
established
|
||||||
|
UserExistsError: If a user with this credeintals already exits on the
|
||||||
|
server
|
||||||
|
UserCredentialError: If a user with this email exists but the
|
||||||
|
password is worng
|
||||||
|
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
self._get_user(user)
|
||||||
|
try:
|
||||||
|
self._get_client(self, user)
|
||||||
|
logger.debug('User already exists')
|
||||||
|
raise UserExistsError()
|
||||||
|
except OpenNebulaException as err:
|
||||||
|
logger.error('OpenNebulaException error: {0}'.format(err))
|
||||||
|
logger.debug('User exists but password is wrong')
|
||||||
|
raise UserCredentialError()
|
||||||
|
|
||||||
|
except WrongNameError:
|
||||||
|
user_id = self.oneadmin_client.call(oca.User.METHODS['allocate'],
|
||||||
|
user.email, user.password, 'core')
|
||||||
|
logger.debug('Created a user for CustomObject: {user} with user id = {u_id}',
|
||||||
|
user=user,
|
||||||
|
u_id=user_id
|
||||||
|
)
|
||||||
|
return user_id
|
||||||
|
except ConnectionRefusedError:
|
||||||
|
logger.error('Could not connect to host: {host} via protocol {protocol}'.format(
|
||||||
|
host=settings.OPENNEBULA_DOMAIN,
|
||||||
|
protocol=settings.OPENNEBULA_PROTOCOL)
|
||||||
|
)
|
||||||
|
raise ConnectionRefusedError
|
||||||
|
|
||||||
|
|
||||||
def _get_or_create_user(self, email, password):
|
def _get_or_create_user(self, email, password):
|
||||||
try:
|
try:
|
||||||
user_pool = self._get_user_pool()
|
user_pool = self._get_user_pool()
|
||||||
|
@ -77,7 +166,7 @@ class OpenNebulaManager():
|
||||||
host=settings.OPENNEBULA_DOMAIN,
|
host=settings.OPENNEBULA_DOMAIN,
|
||||||
protocol=settings.OPENNEBULA_PROTOCOL)
|
protocol=settings.OPENNEBULA_PROTOCOL)
|
||||||
)
|
)
|
||||||
raise ConnectionRefusedError
|
raise
|
||||||
return user_pool
|
return user_pool
|
||||||
|
|
||||||
def _get_vm_pool(self):
|
def _get_vm_pool(self):
|
||||||
|
@ -171,7 +260,6 @@ class OpenNebulaManager():
|
||||||
<DEV_PREFIX>vd</DEV_PREFIX>
|
<DEV_PREFIX>vd</DEV_PREFIX>
|
||||||
<IMAGE_ID>{image_id}</IMAGE_ID>
|
<IMAGE_ID>{image_id}</IMAGE_ID>
|
||||||
</DISK>
|
</DISK>
|
||||||
</TEMPLATE>
|
|
||||||
""".format(size=1024 * int(specs['disk_size']),
|
""".format(size=1024 * int(specs['disk_size']),
|
||||||
image_id=image_id)
|
image_id=image_id)
|
||||||
|
|
||||||
|
@ -193,10 +281,18 @@ class OpenNebulaManager():
|
||||||
<IMAGE>{image}</IMAGE>
|
<IMAGE>{image}</IMAGE>
|
||||||
<IMAGE_UNAME>{image_uname}</IMAGE_UNAME>
|
<IMAGE_UNAME>{image_uname}</IMAGE_UNAME>
|
||||||
</DISK>
|
</DISK>
|
||||||
</TEMPLATE>
|
|
||||||
""".format(size=1024 * int(specs['disk_size']),
|
""".format(size=1024 * int(specs['disk_size']),
|
||||||
image=image,
|
image=image,
|
||||||
image_uname=image_uname)
|
image_uname=image_uname)
|
||||||
|
|
||||||
|
|
||||||
|
if ssh_key:
|
||||||
|
vm_specs += """<CONTEXT>
|
||||||
|
<SSH_PUBLIC_KEY>{ssh}</SSH_PUBLIC_KEY>
|
||||||
|
<NETWORK>YES</NETWORK>
|
||||||
|
</CONTEXT>
|
||||||
|
</TEMPLATE>
|
||||||
|
""".format(ssh=public_key)
|
||||||
vm_id = self.client.call(oca.VmTemplate.METHODS['instantiate'],
|
vm_id = self.client.call(oca.VmTemplate.METHODS['instantiate'],
|
||||||
template.id,
|
template.id,
|
||||||
'',
|
'',
|
||||||
|
@ -204,25 +300,6 @@ class OpenNebulaManager():
|
||||||
vm_specs,
|
vm_specs,
|
||||||
False)
|
False)
|
||||||
|
|
||||||
self.oneadmin_client.call(
|
|
||||||
'vm.update',
|
|
||||||
vm_id,
|
|
||||||
"""<CONTEXT>
|
|
||||||
<SSH_PUBLIC_KEY>{ssh}</SSH_PUBLIC_KEY>
|
|
||||||
</CONTEXT>
|
|
||||||
""".format(ssh=ssh_key)
|
|
||||||
)
|
|
||||||
try:
|
|
||||||
self.oneadmin_client.call(
|
|
||||||
oca.VirtualMachine.METHODS['chown'],
|
|
||||||
vm_id,
|
|
||||||
self.opennebula_user.id,
|
|
||||||
self.opennebula_user.group_ids[0]
|
|
||||||
)
|
|
||||||
except AttributeError:
|
|
||||||
logger.info(
|
|
||||||
'Could not change owner for vm with id: {}.'.format(vm_id))
|
|
||||||
|
|
||||||
self.oneadmin_client.call(
|
self.oneadmin_client.call(
|
||||||
oca.VirtualMachine.METHODS['action'],
|
oca.VirtualMachine.METHODS['action'],
|
||||||
'release',
|
'release',
|
||||||
|
@ -350,3 +427,85 @@ class OpenNebulaManager():
|
||||||
self.opennebula_user.id,
|
self.opennebula_user.id,
|
||||||
new_password
|
new_password
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def add_public_key(self, user, public_key='', merge=False):
|
||||||
|
"""
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user (CustomUser): Dynamicweb user
|
||||||
|
public_key (string): Public key to add to the user
|
||||||
|
merge (bool): Optional if True the new public key replaces the old
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
KeyExistsError: If replace is False and the user already has a
|
||||||
|
public key
|
||||||
|
WrongNameError: If no openebula user with this credentials exists
|
||||||
|
ConnectionError: If the connection to the opennebula server can't be
|
||||||
|
established
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True if public_key was added
|
||||||
|
|
||||||
|
"""
|
||||||
|
# TODO: Check if we can remove this first try because we basically just
|
||||||
|
# raise the possible Errors
|
||||||
|
try:
|
||||||
|
open_user = self._get_user(user)
|
||||||
|
try:
|
||||||
|
old_key = open_user.template.ssh_public_key
|
||||||
|
if not merge:
|
||||||
|
raise KeyExistsError()
|
||||||
|
public_key += '\n{key}'.format(key=old_key)
|
||||||
|
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
self.oneadmin_client.call('user.update', open_user.id,
|
||||||
|
'<CONTEXT><SSH_PUBLIC_KEY>{key}</SSH_PUBLIC_KEY></CONTEXT>'.format(key=public_key))
|
||||||
|
return True
|
||||||
|
except WrongNameError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
except ConnectionError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
def remove_public_key(self, user, public_key=''):
|
||||||
|
"""
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user (CustomUser): Dynamicweb user
|
||||||
|
public_key (string): Public key to be removed to the user
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
KeyDoesNotExistsError: If replace is False and the user already has a
|
||||||
|
public key
|
||||||
|
WrongNameError: If no openebula user with this credentials exists
|
||||||
|
ConnectionError: If the connection to the opennebula server can't be
|
||||||
|
established
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True if public_key was removed
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
open_user = self._get_user(user)
|
||||||
|
try:
|
||||||
|
old_key = open_user.template.ssh_public_key
|
||||||
|
if public_key not in old_key:
|
||||||
|
raise KeyDoesNotExistsError()
|
||||||
|
if '\n{}'.format(public_key) in old_key:
|
||||||
|
public_key = old_key.replace('\n{}'.format(public_key), '')
|
||||||
|
else:
|
||||||
|
public_key = old_key.replace(public_key, '')
|
||||||
|
|
||||||
|
except AttributeError:
|
||||||
|
raise KeyDoesNotExistsError()
|
||||||
|
|
||||||
|
self.oneadmin_client.call('user.update', open_user.id,
|
||||||
|
'<CONTEXT><SSH_PUBLIC_KEY>{key}</SSH_PUBLIC_KEY></CONTEXT>'.format(key=public_key))
|
||||||
|
return True
|
||||||
|
except WrongNameError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
except ConnectionError:
|
||||||
|
raise
|
||||||
|
|
|
@ -11,36 +11,10 @@ from .models import OpenNebulaManager
|
||||||
class VirtualMachineTemplateSerializer(serializers.Serializer):
|
class VirtualMachineTemplateSerializer(serializers.Serializer):
|
||||||
"""Serializer to map the virtual machine template instance into JSON format."""
|
"""Serializer to map the virtual machine template instance into JSON format."""
|
||||||
id = serializers.IntegerField(read_only=True)
|
id = serializers.IntegerField(read_only=True)
|
||||||
set_name = serializers.CharField(read_only=True, label='Name')
|
|
||||||
name = serializers.SerializerMethodField()
|
name = serializers.SerializerMethodField()
|
||||||
cores = serializers.SerializerMethodField()
|
cores = serializers.SerializerMethodField()
|
||||||
disk = serializers.IntegerField(write_only=True)
|
|
||||||
disk_size = serializers.SerializerMethodField()
|
disk_size = serializers.SerializerMethodField()
|
||||||
set_memory = serializers.IntegerField(write_only=True, label='Memory')
|
|
||||||
memory = serializers.SerializerMethodField()
|
memory = serializers.SerializerMethodField()
|
||||||
price = serializers.SerializerMethodField()
|
|
||||||
|
|
||||||
def create(self, validated_data):
|
|
||||||
data = validated_data
|
|
||||||
template = data.pop('template')
|
|
||||||
|
|
||||||
cores = template.pop('vcpu')
|
|
||||||
name = data.pop('name')
|
|
||||||
disk_size = data.pop('disk')
|
|
||||||
memory = template.pop('memory')
|
|
||||||
manager = OpenNebulaManager()
|
|
||||||
|
|
||||||
try:
|
|
||||||
opennebula_id = manager.create_template(name=name, cores=cores,
|
|
||||||
memory=memory,
|
|
||||||
disk_size=disk_size,
|
|
||||||
core_price=core_price,
|
|
||||||
disk_size_price=disk_size_price,
|
|
||||||
memory_price=memory_price)
|
|
||||||
except OpenNebulaException as err:
|
|
||||||
raise serializers.ValidationError("OpenNebulaException occured. {0}".format(err))
|
|
||||||
|
|
||||||
return manager.get_template(template_id=opennebula_id)
|
|
||||||
|
|
||||||
def get_cores(self, obj):
|
def get_cores(self, obj):
|
||||||
if hasattr(obj.template, 'vcpu'):
|
if hasattr(obj.template, 'vcpu'):
|
||||||
|
@ -58,28 +32,18 @@ class VirtualMachineTemplateSerializer(serializers.Serializer):
|
||||||
except:
|
except:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def get_price(self, obj):
|
|
||||||
template = obj.template
|
|
||||||
price = float(template.cpu) * 5.0
|
|
||||||
price += (int(template.memory)/1024 * 2.0)
|
|
||||||
try:
|
|
||||||
for disk in template.disks:
|
|
||||||
price += int(disk.size)/1024 * 0.6
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
return price
|
|
||||||
|
|
||||||
def get_memory(self, obj):
|
def get_memory(self, obj):
|
||||||
return int(obj.template.memory)/1024
|
return int(obj.template.memory)/1024
|
||||||
|
|
||||||
def get_name(self, obj):
|
def get_name(self, obj):
|
||||||
return obj.name.strip('public-')
|
return obj.name.strip('public-')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class VirtualMachineSerializer(serializers.Serializer):
|
class VirtualMachineSerializer(serializers.Serializer):
|
||||||
"""Serializer to map the virtual machine instance into JSON format."""
|
"""Serializer to map the virtual machine instance into JSON format."""
|
||||||
|
|
||||||
name = serializers.CharField(read_only=True)
|
name = serializers.SerializerMethodField()
|
||||||
cores = serializers.IntegerField(source='template.vcpu')
|
cores = serializers.IntegerField(source='template.vcpu')
|
||||||
disk = serializers.IntegerField(write_only=True)
|
disk = serializers.IntegerField(write_only=True)
|
||||||
set_memory = serializers.IntegerField(write_only=True, label='Memory')
|
set_memory = serializers.IntegerField(write_only=True, label='Memory')
|
||||||
|
@ -164,6 +128,8 @@ class VirtualMachineSerializer(serializers.Serializer):
|
||||||
nic = obj.template.nics[0]
|
nic = obj.template.nics[0]
|
||||||
return nic.ip6_global
|
return nic.ip6_global
|
||||||
|
|
||||||
|
def get_name(self, obj):
|
||||||
|
return obj.name.strip('public-')
|
||||||
|
|
||||||
def hexstr2int(string):
|
def hexstr2int(string):
|
||||||
return int(string.replace(':', ''), 16)
|
return int(string.replace(':', ''), 16)
|
||||||
|
|
|
@ -1,35 +1,54 @@
|
||||||
|
import socket
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from .models import VirtualMachine, VirtualMachineTemplate, OpenNebulaManager
|
|
||||||
|
from .models import OpenNebulaManager
|
||||||
|
from .serializers import VirtualMachineSerializer
|
||||||
|
from utils.models import CustomUser
|
||||||
|
|
||||||
class OpenNebulaManagerTestCases(TestCase):
|
class OpenNebulaManagerTestCases(TestCase):
|
||||||
"""This class defines the test suite for the opennebula manager model."""
|
"""This class defines the test suite for the opennebula manager model."""
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Define the test client and other test variables."""
|
"""Define the test client and other test variables."""
|
||||||
self.cores = 1
|
|
||||||
self.memory = 1
|
|
||||||
self.disk_size = 10.0
|
|
||||||
|
|
||||||
self.email = 'test@test.com'
|
|
||||||
self.password = 'testtest'
|
|
||||||
|
|
||||||
self.manager = OpenNebulaManager(email=None, password=None, create_user=False)
|
|
||||||
|
|
||||||
|
|
||||||
def test_model_can_connect_to_server(self):
|
self.email = '{}@ungleich.ch'.format(''.join(random.choices(string.ascii_uppercase, k=10)))
|
||||||
"""Test the opennebula manager model can connect to a server."""
|
self.password = ''.join(random.choices(string.ascii_uppercase + string.digits, k=20))
|
||||||
|
|
||||||
|
self.user = CustomUser.objects.create(name='test', email=self.email,
|
||||||
|
password=self.password)
|
||||||
|
|
||||||
|
self.vm_specs = {}
|
||||||
|
self.vm_specs['cpu'] = 1
|
||||||
|
self.vm_specs['memory'] = 2
|
||||||
|
self.vm_specs['disk_size'] = 10
|
||||||
|
|
||||||
|
self.manager = OpenNebulaManager()
|
||||||
|
|
||||||
|
|
||||||
|
def test_connect_to_server(self):
|
||||||
|
"""Test the opennebula manager can connect to a server."""
|
||||||
try:
|
try:
|
||||||
user_pool = self.manager._get_user_pool()
|
ver = self.manager.oneadmin_client.version()
|
||||||
except:
|
except:
|
||||||
user_pool = None
|
ver = None
|
||||||
self.assertFalse(user_pool is None)
|
self.assertTrue(ver is not None)
|
||||||
|
|
||||||
def test_model_can_create_user(self):
|
def test_get_user(self):
|
||||||
"""Test the opennebula manager model can create a new user."""
|
"""Test the opennebula manager can get a existing user."""
|
||||||
|
self.manager.create_user(self.user)
|
||||||
|
user = self.manager._get_user(self.user)
|
||||||
|
name = user.name
|
||||||
|
self.assertNotEqual(name, None)
|
||||||
|
|
||||||
|
def test_create_and_delete_user(self):
|
||||||
|
"""Test the opennebula manager can create and delete a new user."""
|
||||||
old_count = len(self.manager._get_user_pool())
|
old_count = len(self.manager._get_user_pool())
|
||||||
self.manager = OpenNebulaManager(email=self.email,
|
self.manager = OpenNebulaManager(email=self.email,
|
||||||
password=self.password,
|
password=self.password)
|
||||||
create_user=True)
|
|
||||||
user_pool = self.manager._get_user_pool()
|
user_pool = self.manager._get_user_pool()
|
||||||
new_count = len(user_pool)
|
new_count = len(user_pool)
|
||||||
# Remove the user afterwards
|
# Remove the user afterwards
|
||||||
|
@ -38,96 +57,85 @@ class OpenNebulaManagerTestCases(TestCase):
|
||||||
|
|
||||||
self.assertNotEqual(old_count, new_count)
|
self.assertNotEqual(old_count, new_count)
|
||||||
|
|
||||||
|
def test_user_can_login(self):
|
||||||
|
""" Test the manager can login to a new created user"""
|
||||||
|
self.manager.create_user(self.user)
|
||||||
|
user = self.manager._get_user(self.user)
|
||||||
|
client = self.manager._get_client(self.user)
|
||||||
|
version = client.version()
|
||||||
|
|
||||||
class VirtualMachineTemplateTestCase(TestCase):
|
# Cleanup
|
||||||
"""This class defines the test suite for the virtualmachine template model."""
|
user.delete()
|
||||||
|
self.assertNotEqual(version, None)
|
||||||
|
|
||||||
|
def test_add_public_key_to_user(self):
|
||||||
|
""" Test the manager can add a new public key to an user """
|
||||||
|
self.manager.create_user(self.user)
|
||||||
|
user = self.manager._get_user(self.user)
|
||||||
|
public_key = 'test'
|
||||||
|
self.manager.add_public_key(self.user, public_key)
|
||||||
|
# Fetch new user information from opennebula
|
||||||
|
user.info()
|
||||||
|
user_public_key = user.template.ssh_public_key
|
||||||
|
# Cleanup
|
||||||
|
user.delete()
|
||||||
|
|
||||||
|
self.assertEqual(user_public_key, public_key)
|
||||||
|
|
||||||
|
def test_append_public_key_to_user(self):
|
||||||
|
""" Test the manager can append a new public key to an user """
|
||||||
|
self.manager.create_user(self.user)
|
||||||
|
user = self.manager._get_user(self.user)
|
||||||
|
public_key = 'test'
|
||||||
|
self.manager.add_public_key(self.user, public_key)
|
||||||
|
# Fetch new user information from opennebula
|
||||||
|
user.info()
|
||||||
|
old_public_key = user.template.ssh_public_key
|
||||||
|
self.manager.add_public_key(self.user, public_key, merge=True)
|
||||||
|
user.info()
|
||||||
|
new_public_key = user.template.ssh_public_key
|
||||||
|
# Cleanup
|
||||||
|
user.delete()
|
||||||
|
|
||||||
|
self.assertEqual(new_public_key, '{}\n{}'.format(old_public_key,
|
||||||
|
public_key))
|
||||||
|
|
||||||
|
def test_remove_public_key_to_user(self):
|
||||||
|
""" Test the manager can remove a public key from an user """
|
||||||
|
self.manager.create_user(self.user)
|
||||||
|
user = self.manager._get_user(self.user)
|
||||||
|
public_key = 'test'
|
||||||
|
self.manager.add_public_key(self.user, public_key)
|
||||||
|
self.manager.add_public_key(self.user, public_key, merge=True)
|
||||||
|
user.info()
|
||||||
|
old_public_key = user.template.ssh_public_key
|
||||||
|
self.manager.remove_public_key(self.user, public_key)
|
||||||
|
user.info()
|
||||||
|
new_public_key = user.template.ssh_public_key
|
||||||
|
# Cleanup
|
||||||
|
user.delete()
|
||||||
|
|
||||||
|
self.assertEqual(new_public_key,
|
||||||
|
old_public_key.replace('{}\n'.format(public_key), '', 1))
|
||||||
|
|
||||||
|
|
||||||
|
def test_requires_ssh_key_for_new_vm(self):
|
||||||
|
"""Test the opennebula manager requires the user to have a ssh key when
|
||||||
|
creating a new vm"""
|
||||||
|
|
||||||
|
|
||||||
|
class VirtualMachineSerializerTestCase(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Define the test client and other test variables."""
|
"""Define the test client and other test variables."""
|
||||||
self.template_name = "Standard"
|
self.manager = OpenNebulaManager(email=None, password=None)
|
||||||
self.base_price = 0.0
|
|
||||||
self.core_price = 5.0
|
|
||||||
self.memory_price = 2.0
|
|
||||||
self.disk_size_price = 0.6
|
|
||||||
|
|
||||||
self.cores = 1
|
|
||||||
self.memory = 1
|
|
||||||
self.disk_size = 10.0
|
|
||||||
|
|
||||||
self.manager = OpenNebulaManager(email=None, password=None, create_user=False)
|
|
||||||
self.opennebula_id = self.manager.create_template(name=self.template_name,
|
|
||||||
cores=self.cores,
|
|
||||||
memory=self.memory,
|
|
||||||
disk_size=self.disk_size)
|
|
||||||
|
|
||||||
self.template = VirtualMachineTemplate(opennebula_id=self.opennebula_id,
|
|
||||||
base_price=self.base_price,
|
|
||||||
memory_price=self.memory_price,
|
|
||||||
core_price=self.core_price,
|
|
||||||
disk_size_price=self.disk_size_price)
|
|
||||||
|
|
||||||
|
|
||||||
def test_model_can_create_a_virtualmachine_template(self):
|
def test_serializer_strips_of_public(self):
|
||||||
"""Test the virtualmachine template model can create a template."""
|
""" Test the serialized virtual machine object contains no 'public-'."""
|
||||||
old_count = VirtualMachineTemplate.objects.count()
|
|
||||||
self.template.save()
|
|
||||||
new_count = VirtualMachineTemplate.objects.count()
|
|
||||||
# Remove the template afterwards
|
|
||||||
template = self.manager._get_template(self.template.opennebula_id)
|
|
||||||
template.delete()
|
|
||||||
self.assertNotEqual(old_count, new_count)
|
|
||||||
|
|
||||||
def test_model_can_calculate_price(self):
|
for vm in self.manager.get_vms():
|
||||||
price = self.cores * self.core_price
|
serialized = VirtualMachineSerializer(vm)
|
||||||
price += self.memory * self.memory_price
|
self.assertEqual(serialized.data.get('name'), vm.name.strip('public-'))
|
||||||
price += self.disk_size * self.disk_size_price
|
break
|
||||||
self.assertEqual(price, self.template.calculate_price())
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class VirtualMachineTestCase(TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
"""Define the test client and other test variables."""
|
|
||||||
self.template_name = "Standard"
|
|
||||||
self.base_price = 0.0
|
|
||||||
self.core_price = 5.0
|
|
||||||
self.memory_price = 2.0
|
|
||||||
self.disk_size_price = 0.6
|
|
||||||
|
|
||||||
self.cores = 1
|
|
||||||
self.memory = 1
|
|
||||||
self.disk_size = 10.0
|
|
||||||
self.manager = OpenNebulaManager(email=None, password=None, create_user=False)
|
|
||||||
self.opennebula_id = self.manager.create_template(name=self.template_name,
|
|
||||||
cores=self.cores,
|
|
||||||
memory=self.memory,
|
|
||||||
disk_size=self.disk_size)
|
|
||||||
|
|
||||||
self.template = VirtualMachineTemplate(opennebula_id=self.opennebula_id,
|
|
||||||
base_price=self.base_price,
|
|
||||||
memory_price=self.memory_price,
|
|
||||||
core_price=self.core_price,
|
|
||||||
disk_size_price=self.disk_size_price)
|
|
||||||
self.template_id = self.template.opennebula_id()
|
|
||||||
self.opennebula_id = self.manager.create_virtualmachine(template_id=self.template_id)
|
|
||||||
|
|
||||||
self.virtualmachine = VirtualMachine(opennebula_id=self.opennebula_id,
|
|
||||||
template=self.template)
|
|
||||||
|
|
||||||
def test_model_can_create_a_virtualmachine(self):
|
|
||||||
"""Test the virtualmachine model can create a virtualmachine."""
|
|
||||||
old_count = VirtualMachine.objects.count()
|
|
||||||
self.virtualmachine.save()
|
|
||||||
new_count = VirtualMachine.objects.count()
|
|
||||||
self.assertNotEqual(old_count, new_count)
|
|
||||||
|
|
||||||
def test_model_can_create_a_virtualmachine_for_user(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def test_model_can_delete_a_virtualmachine(self):
|
|
||||||
"""Test the virtualmachine model can delete a virtualmachine."""
|
|
||||||
self.virtualmachine.save()
|
|
||||||
old_count = VirtualMachine.objects.count()
|
|
||||||
VirtualMachine.objects.first().delete()
|
|
||||||
new_count = VirtualMachine.objects.count()
|
|
||||||
self.assertNotEqual(old_count, new_count)
|
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
from django.conf.urls import url, include
|
from django.conf.urls import url, include
|
||||||
from rest_framework.urlpatterns import format_suffix_patterns
|
from rest_framework.urlpatterns import format_suffix_patterns
|
||||||
from .views import TemplateCreateView, TemplateDetailsView,\
|
from .views import VmCreateView, VmDetailsView
|
||||||
VmCreateView, VmDetailsView
|
|
||||||
|
|
||||||
urlpatterns = {
|
urlpatterns = {
|
||||||
url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')),
|
url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')),
|
||||||
|
|
||||||
url(r'^templates/$', TemplateCreateView.as_view(), name="template_create"),
|
|
||||||
url(r'^templates/(?P<pk>[0-9]+)/$', TemplateDetailsView.as_view(),
|
|
||||||
name="templates_details"),
|
|
||||||
|
|
||||||
url(r'^vms/$', VmCreateView.as_view(), name="vm_create"),
|
url(r'^vms/$', VmCreateView.as_view(), name="vm_create"),
|
||||||
url(r'^vms/(?P<pk>[0-9]+)/$', VmDetailsView.as_view(),
|
url(r'^vms/(?P<pk>[0-9]+)/$', VmDetailsView.as_view(),
|
||||||
name="vm_details"),
|
name="vm_details"),
|
||||||
|
|
|
@ -20,38 +20,6 @@ class ServiceUnavailable(APIException):
|
||||||
default_code = 'service_unavailable'
|
default_code = 'service_unavailable'
|
||||||
|
|
||||||
|
|
||||||
class TemplateCreateView(generics.ListCreateAPIView):
|
|
||||||
"""This class handles the GET and POST requests."""
|
|
||||||
|
|
||||||
serializer_class = VirtualMachineTemplateSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticated, permissions.IsAdminUser)
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
manager = OpenNebulaManager()
|
|
||||||
return manager.get_templates()
|
|
||||||
|
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
|
||||||
"""Save the post data when creating a new template."""
|
|
||||||
serializer.save()
|
|
||||||
|
|
||||||
class TemplateDetailsView(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
"""This class handles the http GET, PUT and DELETE requests."""
|
|
||||||
|
|
||||||
serializer_class = VirtualMachineTemplateSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticated)
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
manager = OpenNebulaManager()
|
|
||||||
# We may have ConnectionRefusedError if we don't have a
|
|
||||||
# connection to OpenNebula. For now, we raise ServiceUnavailable
|
|
||||||
try:
|
|
||||||
templates = manager.get_templates()
|
|
||||||
except ConnectionRefusedError:
|
|
||||||
raise ServiceUnavailable
|
|
||||||
|
|
||||||
return templates
|
|
||||||
|
|
||||||
class VmCreateView(generics.ListCreateAPIView):
|
class VmCreateView(generics.ListCreateAPIView):
|
||||||
"""This class handles the GET and POST requests."""
|
"""This class handles the GET and POST requests."""
|
||||||
serializer_class = VirtualMachineSerializer
|
serializer_class = VirtualMachineSerializer
|
||||||
|
|
Binary file not shown.
|
@ -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: 2016-07-11 22:04-0500\n"
|
"POT-Creation-Date: 2017-05-26 13:35+0000\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,109 +18,110 @@ 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/ungleich_page/includes/_about.html:8
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:8
|
||||||
msgid "ABOUT"
|
msgid "ABOUT"
|
||||||
msgstr "Über ungleich"
|
msgstr "Über ungleich"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:9
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:9
|
||||||
msgid "The timeline of ungleich"
|
msgid "The timeline of ungleich"
|
||||||
msgstr "Die Chronik von ungleich"
|
msgstr "Die Chronik von ungleich"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:24
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:24
|
||||||
msgid "The first incarnation of ungleich"
|
msgid "The first incarnation of ungleich"
|
||||||
msgstr "Die erste Inkarnation von ungleich"
|
msgstr "Die erste Inkarnation von ungleich"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:25
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:25
|
||||||
msgid "in Germany"
|
msgid "in Germany"
|
||||||
msgstr "in Deutschland"
|
msgstr "in Deutschland"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:37
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:37
|
||||||
msgid "ungleich founded"
|
msgid "ungleich founded"
|
||||||
msgstr "ungleich gegründet"
|
msgstr "ungleich gegründet"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:38
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:38
|
||||||
msgid "in Switzerland"
|
msgid "in Switzerland"
|
||||||
msgstr "in der Schweiz"
|
msgstr "in der Schweiz"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:51
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:51
|
||||||
msgid "ungleich present at various conferences"
|
msgid "ungleich present at various conferences"
|
||||||
msgstr "ungleich präsent an mehreren Konferenzen"
|
msgstr "ungleich präsent an mehreren Konferenzen"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:65
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:65
|
||||||
msgid "ungleich introduces HA-Hosting"
|
msgid "ungleich introduces HA-Hosting"
|
||||||
msgstr "ungleich führt HA-Hosting ein"
|
msgstr "ungleich führt HA-Hosting ein"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:66
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:66
|
||||||
msgid "and introduces affordable 24X7 support."
|
msgid "and introduces affordable 24X7 support."
|
||||||
msgstr "und führt kostengünstigen 24X7 Support ein."
|
msgstr "und führt kostengünstigen 24X7 Support ein."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:67
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:67
|
||||||
msgid "ungleich launches"
|
msgid "ungleich launches"
|
||||||
msgstr "ungleich lanciert"
|
msgstr "ungleich lanciert"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:68
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:68
|
||||||
msgid "Digital Glarus project"
|
msgid "Digital Glarus project"
|
||||||
msgstr "Digital Glarus Projekt"
|
msgstr "Digital Glarus Projekt"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:74
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:74
|
||||||
msgid "and"
|
msgid "and"
|
||||||
msgstr "und"
|
msgstr "und"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_about.html:74
|
#: ungleich_page/templates/ungleich_page/includes/_about.html:74
|
||||||
msgid "the story continues!"
|
msgid "the story continues!"
|
||||||
msgstr "Die Geschichte geht weiter!"
|
msgstr "Die Geschichte geht weiter!"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_contact_us.html:15
|
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:15
|
||||||
#: templates/ungleich_page/includes/_contact_us.html:28 views.py:36
|
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:28
|
||||||
|
#: ungleich_page/views.py:36
|
||||||
msgid "Contact Us"
|
msgid "Contact Us"
|
||||||
msgstr "Kontaktieren Sie uns"
|
msgstr "Kontaktieren Sie uns"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_contact_us.html:18
|
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:18
|
||||||
msgid "Join us at"
|
msgid "Join us at"
|
||||||
msgstr "Schliessen Sie sich uns an"
|
msgstr "Schliessen Sie sich uns an"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_contact_us.html:19
|
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:19
|
||||||
msgid "Digital Glarus"
|
msgid "Digital Glarus"
|
||||||
msgstr "Digital Glarus"
|
msgstr "Digital Glarus"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_contact_us.html:20
|
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:20
|
||||||
msgid "a great co-working space in the middle of Alps!"
|
msgid "a great co-working space in the middle of Alps!"
|
||||||
msgstr "ein wunderschöner Co-Working Space mitten in den Alpen"
|
msgstr "ein wunderschöner Co-Working Space mitten in den Alpen"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_contact_us.html:21
|
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:21
|
||||||
msgid "You can contact us at"
|
msgid "You can contact us at"
|
||||||
msgstr "Sie können uns kontaktieren unter"
|
msgstr "Sie können uns kontaktieren unter"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_contact_us.html:26
|
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:26
|
||||||
msgid "or"
|
msgid "or"
|
||||||
msgstr "oder"
|
msgstr "oder"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_contact_us.html:60
|
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:60
|
||||||
msgid "Submit"
|
msgid "Submit"
|
||||||
msgstr "Absenden"
|
msgstr "Absenden"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_footer.html:8
|
#: ungleich_page/templates/ungleich_page/includes/_footer.html:8
|
||||||
msgid "Copyright © ungleich GmbH "
|
msgid "Copyright © ungleich GmbH "
|
||||||
msgstr "Copyright © ungleich GmbH"
|
msgstr "Copyright © ungleich GmbH"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_footer.html:22
|
#: ungleich_page/templates/ungleich_page/includes/_footer.html:22
|
||||||
msgid "ungleich Home"
|
msgid "ungleich Home"
|
||||||
msgstr "ungleich Home"
|
msgstr "ungleich Home"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_header.html:11
|
#: ungleich_page/templates/ungleich_page/includes/_header.html:11
|
||||||
msgid "We Design, Configure & Maintain <br> Your Linux Infrastructure "
|
msgid "We Design, Configure & Maintain <br> Your Linux Infrastructure "
|
||||||
msgstr "Wir designen, erstellen und warten Ihre Linux-Infrastruktur"
|
msgstr "Wir designen, erstellen und warten Ihre Linux-Infrastruktur"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_portfolio.html:8
|
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:8
|
||||||
#: templates/ungleich_page/includes/_portfolio.html:9
|
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:9
|
||||||
msgid "Hosting Products "
|
msgid "Hosting Products "
|
||||||
msgstr "Hosting Produkte"
|
msgstr "Hosting Produkte"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_portfolio.html:16
|
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:16
|
||||||
msgid "HA Hosting"
|
msgid "HA Hosting"
|
||||||
msgstr "HA Hosting"
|
msgstr "HA Hosting"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_portfolio.html:18
|
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:18
|
||||||
msgid ""
|
msgid ""
|
||||||
"We offer high availablity hosting (HA) in Germany and in Switzerland. Our "
|
"We offer high availablity hosting (HA) in Germany and in Switzerland. Our "
|
||||||
"infrastructure is powered by Free and Open Source Software like OpenNebula, "
|
"infrastructure is powered by Free and Open Source Software like OpenNebula, "
|
||||||
|
@ -130,22 +131,22 @@ msgstr ""
|
||||||
"Schweiz. Unsere Infrastruktur ist unterstützt durch Free and Open Source "
|
"Schweiz. Unsere Infrastruktur ist unterstützt durch Free and Open Source "
|
||||||
"Software wie OpenNebula."
|
"Software wie OpenNebula."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_portfolio.html:24
|
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:24
|
||||||
msgid "Rails Hosting"
|
msgid "Rails Hosting"
|
||||||
msgstr "Rails Hosting"
|
msgstr "Rails Hosting"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_portfolio.html:26
|
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:26
|
||||||
msgid ""
|
msgid ""
|
||||||
"Ready to go live with your Ruby on Rails application? We offer you ready-to-"
|
"Ready to go live with your Ruby on Rails application? We offer you ready-to-"
|
||||||
"deploy virtual machines or configure your existing infrastructure for Ruby "
|
"deploy virtual machines or configure your existing infrastructure for Ruby "
|
||||||
"on Rails."
|
"on Rails."
|
||||||
msgstr "Sind bereit mit ihrem Ruby on Rails Applikation live zu gehen?"
|
msgstr "Sind bereit mit ihrem Ruby on Rails Applikation live zu gehen?"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_portfolio.html:32
|
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:32
|
||||||
msgid " Configuration as a Service"
|
msgid " Configuration as a Service"
|
||||||
msgstr "Konfiguration als Service"
|
msgstr "Konfiguration als Service"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_portfolio.html:34
|
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:34
|
||||||
msgid ""
|
msgid ""
|
||||||
"You are in need for a configuration?<br>With ungleich you have found an "
|
"You are in need for a configuration?<br>With ungleich you have found an "
|
||||||
"experienced team that configure your systems to provide service like DNS, E-"
|
"experienced team that configure your systems to provide service like DNS, E-"
|
||||||
|
@ -155,27 +156,27 @@ msgstr ""
|
||||||
"gefunden, dass ihnen die Konfiguration von DNS, E-Mail, Datenbanken oder "
|
"gefunden, dass ihnen die Konfiguration von DNS, E-Mail, Datenbanken oder "
|
||||||
"Webservern für ihr System anbietet"
|
"Webservern für ihr System anbietet"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:8
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:8
|
||||||
msgid "our services"
|
msgid "our services"
|
||||||
msgstr "Unsere Dienstleistungen"
|
msgstr "Unsere Dienstleistungen"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:10
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:10
|
||||||
msgid "We support our clients in all areas of Unix infrastructure."
|
msgid "We support our clients in all areas of Unix infrastructure."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Wir unterstützen unsere Klienten in allen Bereichen der Unix Infrastruktur."
|
"Wir unterstützen unsere Klienten in allen Bereichen der Unix Infrastruktur."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:11
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:11
|
||||||
msgid ""
|
msgid ""
|
||||||
"Our top notch configuration management is refreshingly simple and reliable."
|
"Our top notch configuration management is refreshingly simple and reliable."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Unser erstklassiges Konfigurationsmanagement ist erfrischend einfach und "
|
"Unser erstklassiges Konfigurationsmanagement ist erfrischend einfach und "
|
||||||
"zuverlässig."
|
"zuverlässig."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:20
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:20
|
||||||
msgid "Hosting"
|
msgid "Hosting"
|
||||||
msgstr "Hosting"
|
msgstr "Hosting"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:22
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:22
|
||||||
msgid ""
|
msgid ""
|
||||||
"Ruby on Rails. Java hosting, Django hosting, we make it everything run "
|
"Ruby on Rails. Java hosting, Django hosting, we make it everything run "
|
||||||
"smooth and safe."
|
"smooth and safe."
|
||||||
|
@ -183,11 +184,11 @@ msgstr ""
|
||||||
"Ruby on Rails. Java hosting, Django hosting, wir garantieren einen "
|
"Ruby on Rails. Java hosting, Django hosting, wir garantieren einen "
|
||||||
"reibungslosen Ablauf"
|
"reibungslosen Ablauf"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:30
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:30
|
||||||
msgid "Configuration as a Service"
|
msgid "Configuration as a Service"
|
||||||
msgstr "Konfiguration als Service"
|
msgstr "Konfiguration als Service"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:32
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:32
|
||||||
msgid ""
|
msgid ""
|
||||||
"Ruby on Rails, Django, Java, Webserver, Mailserver, any infrastructure that "
|
"Ruby on Rails, Django, Java, Webserver, Mailserver, any infrastructure that "
|
||||||
"needs to configured, we provide comprehensive solutions. Amazon, rackspace "
|
"needs to configured, we provide comprehensive solutions. Amazon, rackspace "
|
||||||
|
@ -197,11 +198,11 @@ msgstr ""
|
||||||
"welche eine Konfiguration braucht, wir offerieren umfassende Lösungen, "
|
"welche eine Konfiguration braucht, wir offerieren umfassende Lösungen, "
|
||||||
"Amazon, Rackspace oder Bare Metal Servers, wir konfigurieren alles."
|
"Amazon, Rackspace oder Bare Metal Servers, wir konfigurieren alles."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:40
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:40
|
||||||
msgid "Linux System Engineering"
|
msgid "Linux System Engineering"
|
||||||
msgstr "Linux System Engineering"
|
msgstr "Linux System Engineering"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_services.html:43
|
#: ungleich_page/templates/ungleich_page/includes/_services.html:43
|
||||||
msgid ""
|
msgid ""
|
||||||
"Let your developers develop! We take care of your system administration. "
|
"Let your developers develop! We take care of your system administration. "
|
||||||
"Gentoo, Archlinux, Debian, Ubuntu, and many more."
|
"Gentoo, Archlinux, Debian, Ubuntu, and many more."
|
||||||
|
@ -209,15 +210,15 @@ msgstr ""
|
||||||
"Lassen sie ihre Entwickler entwickeln! Wir kümmern uns um ihre "
|
"Lassen sie ihre Entwickler entwickeln! Wir kümmern uns um ihre "
|
||||||
"Systemadministration. Gentoo, Archlinux, Debian, Ubuntu und viele mehr."
|
"Systemadministration. Gentoo, Archlinux, Debian, Ubuntu und viele mehr."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_team.html:8
|
#: ungleich_page/templates/ungleich_page/includes/_team.html:8
|
||||||
msgid "Why ungleich?*"
|
msgid "Why ungleich?*"
|
||||||
msgstr "Warum ungleich?"
|
msgstr "Warum ungleich?"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_team.html:9
|
#: ungleich_page/templates/ungleich_page/includes/_team.html:9
|
||||||
msgid "What our customers say"
|
msgid "What our customers say"
|
||||||
msgstr "Was unsere Kunden sagen"
|
msgstr "Was unsere Kunden sagen"
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_team.html:29
|
#: ungleich_page/templates/ungleich_page/includes/_team.html:29
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
"\t\t\t \"ungleich helped us getting started with our internal\n"
|
"\t\t\t \"ungleich helped us getting started with our internal\n"
|
||||||
|
@ -233,9 +234,20 @@ msgid ""
|
||||||
"\t\t\t engineers to work more efficiently and comfortable\n"
|
"\t\t\t engineers to work more efficiently and comfortable\n"
|
||||||
"\t\t\t than before.\"\n"
|
"\t\t\t than before.\"\n"
|
||||||
"\t\t\t "
|
"\t\t\t "
|
||||||
msgstr "\n ungleich half uns mit unserer internen Infrastruktur, gehostet auf physikalischen Servern, in einer gemeinsamen Unterbringung in einem Datenzentrum in Zürich. Von der Planung des Netzwerk-Layouts und der Virtualisierung der Einrichtung, Offertanfragen und Sicherstellung eines sehr guten Angebots von einem Hardwarelieferanten bis hin zur Installisierung von einfachen Dienstleistungen, wie DNS, VPN und Firewalls durch den Gebrauch der Konfigurationsmanagement-Software cdist, wir konnten auf den Support von ungleich zählen. Am Ende haben wir eine hochverfügbare Infrastruktur-Einrichtung erhalten, welche es unseren Technikern ermöglicht effizienter und bequemer zu arbeiten als zuvor."
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
" ungleich half uns mit unserer internen Infrastruktur, gehostet auf "
|
||||||
|
"physikalischen Servern, in einer gemeinsamen Unterbringung in einem "
|
||||||
|
"Datenzentrum in Zürich. Von der Planung des Netzwerk-Layouts und der "
|
||||||
|
"Virtualisierung der Einrichtung, Offertanfragen und Sicherstellung eines "
|
||||||
|
"sehr guten Angebots von einem Hardwarelieferanten bis hin zur "
|
||||||
|
"Installisierung von einfachen Dienstleistungen, wie DNS, VPN und Firewalls "
|
||||||
|
"durch den Gebrauch der Konfigurationsmanagement-Software cdist, wir konnten "
|
||||||
|
"auf den Support von ungleich zählen. Am Ende haben wir eine hochverfügbare "
|
||||||
|
"Infrastruktur-Einrichtung erhalten, welche es unseren Technikern ermöglicht "
|
||||||
|
"effizienter und bequemer zu arbeiten als zuvor."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_team.html:51
|
#: ungleich_page/templates/ungleich_page/includes/_team.html:51
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
"\t\t\t \"Thanks to ungleich team, who has designed and\n"
|
"\t\t\t \"Thanks to ungleich team, who has designed and\n"
|
||||||
|
@ -245,9 +257,15 @@ msgid ""
|
||||||
"\t\t\t significantly not only in cost but also in time\n"
|
"\t\t\t significantly not only in cost but also in time\n"
|
||||||
"\t\t\t saving, which is crucial for IT companies like ours.\"\n"
|
"\t\t\t saving, which is crucial for IT companies like ours.\"\n"
|
||||||
"\t\t\t \t"
|
"\t\t\t \t"
|
||||||
msgstr "\n Vielen Dank an das ungleich Team, welches unsere Firmen-Linux-Infrastruktur konfiguriert hat, unsere Systeme sind sehr einfach zu verwalten. Ihr innovatives Konfigurationsmanagement-System cdist half uns signifikant nicht nur in der Kosteneinsparung aber auch zur Zeiteinsparung, was für IT-Firmen sehr wichtig ist."
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
" Vielen Dank an das ungleich Team, welches unsere Firmen-Linux-Infrastruktur "
|
||||||
|
"konfiguriert hat, unsere Systeme sind sehr einfach zu verwalten. Ihr "
|
||||||
|
"innovatives Konfigurationsmanagement-System cdist half uns signifikant nicht "
|
||||||
|
"nur in der Kosteneinsparung aber auch zur Zeiteinsparung, was für IT-Firmen "
|
||||||
|
"sehr wichtig ist."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_team.html:67
|
#: ungleich_page/templates/ungleich_page/includes/_team.html:67
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
"\t\t\t \"ungleich provided an excellent service in designing\n"
|
"\t\t\t \"ungleich provided an excellent service in designing\n"
|
||||||
|
@ -262,9 +280,19 @@ msgid ""
|
||||||
"\t\t\t recommend them to any companies with high demand in\n"
|
"\t\t\t recommend them to any companies with high demand in\n"
|
||||||
"\t\t\t solid infrastructures.\"\n"
|
"\t\t\t solid infrastructures.\"\n"
|
||||||
"\t\t\t "
|
"\t\t\t "
|
||||||
msgstr "\n ungleich bietete einen exzellenten Service bei der Gestaltung unserer System-Architektur und erstellte sichere und stabile Geräte. Für uns ist es wichtig eine dauerhafte Stabilität in unserem System zu haben und das Konfigurationsmanagement-System cdist ist sehr einfach zu bedienen für die Systemadministration. Wir hatten eine erfolgreiche Kollaboration mit ungleich während einer Zeit mit einer sehr hohen Arbeitsauslastung und ihre Projektführung war hochqualifiziert und sehr zuverlässig. Ich würde sie allen Firmen empfehlen, bei denen eine solide Infrastruktur stark gefragt ist."
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
" ungleich bietete einen exzellenten Service bei der Gestaltung unserer "
|
||||||
|
"System-Architektur und erstellte sichere und stabile Geräte. Für uns ist es "
|
||||||
|
"wichtig eine dauerhafte Stabilität in unserem System zu haben und das "
|
||||||
|
"Konfigurationsmanagement-System cdist ist sehr einfach zu bedienen für die "
|
||||||
|
"Systemadministration. Wir hatten eine erfolgreiche Kollaboration mit "
|
||||||
|
"ungleich während einer Zeit mit einer sehr hohen Arbeitsauslastung und ihre "
|
||||||
|
"Projektführung war hochqualifiziert und sehr zuverlässig. Ich würde sie "
|
||||||
|
"allen Firmen empfehlen, bei denen eine solide Infrastruktur stark gefragt "
|
||||||
|
"ist."
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_team.html:82
|
#: ungleich_page/templates/ungleich_page/includes/_team.html:82
|
||||||
msgid ""
|
msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
"\t\t\t <strong>- Sebastian Plattner,</strong>\n"
|
"\t\t\t <strong>- Sebastian Plattner,</strong>\n"
|
||||||
|
@ -272,47 +300,47 @@ msgid ""
|
||||||
"\t\t\t "
|
"\t\t\t "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: templates/ungleich_page/includes/_team.html:95
|
#: ungleich_page/templates/ungleich_page/includes/_team.html:95
|
||||||
msgid "*ungleich means not equal to (≠) U+2260."
|
msgid "*ungleich means not equal to (≠) U+2260."
|
||||||
msgstr "*ungleich bedeutet nicht gleich wie (≠) U+2260."
|
msgstr "*ungleich bedeutet nicht gleich wie (≠) U+2260."
|
||||||
|
|
||||||
#: templates/ungleich_page/landing.html:85
|
#: ungleich_page/templates/ungleich_page/landing.html:85
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "our services"
|
#| msgid "our services"
|
||||||
msgid "Services"
|
msgid "Services"
|
||||||
msgstr "Unsere Dienstleistungen"
|
msgstr "Unsere Dienstleistungen"
|
||||||
|
|
||||||
#: templates/ungleich_page/landing.html:90
|
#: ungleich_page/templates/ungleich_page/landing.html:90
|
||||||
msgid "products"
|
msgid "products"
|
||||||
msgstr "PRODUKTE"
|
msgstr "PRODUKTE"
|
||||||
|
|
||||||
#: templates/ungleich_page/landing.html:93
|
#: ungleich_page/templates/ungleich_page/landing.html:93
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Über"
|
msgstr "Über"
|
||||||
|
|
||||||
#: templates/ungleich_page/landing.html:96
|
#: ungleich_page/templates/ungleich_page/landing.html:96
|
||||||
msgid "WHY UNGLEICH?"
|
msgid "WHY UNGLEICH?"
|
||||||
msgstr "WARUM UNGLEICH?"
|
msgstr "WARUM UNGLEICH?"
|
||||||
|
|
||||||
#: templates/ungleich_page/landing.html:99
|
#: ungleich_page/templates/ungleich_page/landing.html:99
|
||||||
msgid "BLOG"
|
msgid "BLOG"
|
||||||
msgstr "BLOG"
|
msgstr "BLOG"
|
||||||
|
|
||||||
#: templates/ungleich_page/landing.html:102
|
#: ungleich_page/templates/ungleich_page/landing.html:102
|
||||||
msgid "CONTACT"
|
msgid "CONTACT"
|
||||||
msgstr "KONTAKT"
|
msgstr "KONTAKT"
|
||||||
|
|
||||||
#: urls.py:8
|
#: ungleich_page/urls.py:8
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#| msgid "Contact Us"
|
#| msgid "Contact Us"
|
||||||
msgid "contact/$"
|
msgid "contact/$"
|
||||||
msgstr "Kontaktieren Sie uns"
|
msgstr "Kontaktieren Sie uns"
|
||||||
|
|
||||||
#: views.py:26
|
#: ungleich_page/views.py:26
|
||||||
msgid "Message Successfully Sent"
|
msgid "Message Successfully Sent"
|
||||||
msgstr "Nachricht erfolgreich versendet"
|
msgstr "Nachricht erfolgreich versendet"
|
||||||
|
|
||||||
#: views.py:37
|
#: ungleich_page/views.py:37
|
||||||
msgid "If you have any question, just send us an email."
|
msgid "If you have any question, just send us an email."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Wenn Sie irgendwelche Fragen haben, schicken Sie uns einfach eine E-Mail."
|
"Wenn Sie irgendwelche Fragen haben, schicken Sie uns einfach eine E-Mail."
|
||||||
|
|
Loading…
Reference in a new issue