Merge branch 'master' into task/3672/cleaning_existing_tests
43
Changelog
|
@ -1,3 +1,43 @@
|
|||
1.2.9: 2017-11-13
|
||||
* #3848: [ungleich] Optimize ungleich.ch landing page
|
||||
* #3360: [ungleich] Ungleich.ch landing page animation fix
|
||||
* #3421: [hosting] Signup form placeholder translations
|
||||
* #3856: [ungleich] Glasfaser text modified
|
||||
* bugfix: [blog] Redirect user to ungleich home on ungleich logo click
|
||||
* #3858: [dcl] Change "affordable vm ..." text to "Ready in 30 seconds ..."
|
||||
1.2.8: 2017-10-21
|
||||
* Remove ALLOWED_HOST alplora.ch
|
||||
* Add ALLOWED_HOST hack4glarus.ch
|
||||
* Fetch page_title and meta_description dynamically in glasfaser CMS template
|
||||
1.2.7: 2017-10-20
|
||||
* Bugfix: [dcl, hosting] Fix Stripe js error in confirm payment page
|
||||
* #3847: [ungleich] change text 'hosting products' -> 'our products'
|
||||
* #3829: [dcl] Handle landing login fail in payment page itself
|
||||
* #3794: [dcl, hosting] Update email styles
|
||||
* #3828: [dcl, hosting] invoice period set to show monthly subscription
|
||||
* #3838: [hosting] restyle signup/login/password reset/password pages
|
||||
* Bugfix: [dg] Remove validate email link in the registration email
|
||||
* Feature: [ungleich_page] Add new glasfaser CMS template
|
||||
1.2.6: 2017-10-10
|
||||
* Bugfix: [dcl] Refactor and optimize images, links in glasfaser page
|
||||
* Bugfix: [dcl] Fix email not being sent issue
|
||||
1.2.5: 2017-10-10
|
||||
* #3785: [hosting] update 'my bills' page design
|
||||
* Bugfix: [hosting] card details input form alignment fix
|
||||
* #3823: [hosting] favicon link fixed
|
||||
* #3844: [dcl] Add Glasfaser page for advertisement
|
||||
1.2.4: 2017-10-02
|
||||
* #3780: [hosting] Store VM details locally
|
||||
* #3764: [hosting] Show cancelled VMs' invoices
|
||||
* #3736: [dcl] Refactor the place where we compute the VM price
|
||||
* #3730: [dcl] Refactor price parameter passed in the DCL flow
|
||||
* #3807: [dcl] Remove PricingView as it is no more used
|
||||
* #3813: [hosting] JS error in create ssh key page
|
||||
* #3756: [dcl] Update landing calculator and billing info page
|
||||
* Bugfix: Fix PR 493 bug that creates a new StripeCustomer for each buying of VM with the same email id
|
||||
* #3835: [all] Forbidden (403) CSRF verification failed issue.
|
||||
* Bugfix: [hosting] Dashboard strictly available after login
|
||||
* #3808: [dcl] Order confirmation page redesign
|
||||
1.2.3: 2017-09-25
|
||||
* #3484: [dcl, hosting] Refactored account activation, password reset, VM order and cancellation email
|
||||
* #3731: [dcl, hosting] Added cdist ssh key handler
|
||||
|
@ -179,6 +219,3 @@
|
|||
* [datacenterlight] Fix initially shown price
|
||||
1.0.0: 2017-05-25
|
||||
* Initial stable release
|
||||
|
||||
Next:
|
||||
[datacenterlight] Fixed credit card input issue
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-05-30 13:47+0000\n"
|
||||
"POT-Creation-Date: 2017-10-10 21:35+0530\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,137 +18,99 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: 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"
|
||||
msgstr "Finde deine Tiere"
|
||||
|
||||
#: alplora/templates/alplora/index.html:99
|
||||
#: alplora/templates/alplora/index.html:463
|
||||
msgid "About"
|
||||
msgstr "Über"
|
||||
|
||||
#: alplora/templates/alplora/index.html:102
|
||||
#: alplora/templates/alplora/index.html:248
|
||||
#: alplora/templates/alplora/index.html:469
|
||||
msgid "Why Alplora?"
|
||||
msgstr "Warum Alplora?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:105
|
||||
#: alplora/templates/alplora/index.html:466
|
||||
msgid "Usecase"
|
||||
msgstr ""
|
||||
|
||||
#: alplora/templates/alplora/index.html:108
|
||||
#: alplora/templates/alplora/index.html:358
|
||||
msgid "Testimonials"
|
||||
msgstr "Referenzen"
|
||||
|
||||
#: alplora/templates/alplora/index.html:111
|
||||
#: alplora/templates/alplora/index.html:423
|
||||
#: alplora/templates/alplora/index.html:477
|
||||
msgid "Contact"
|
||||
msgstr "Kontakt"
|
||||
|
||||
#: alplora/templates/alplora/index.html:114
|
||||
msgid "Login"
|
||||
msgstr "Login"
|
||||
|
||||
#: alplora/templates/alplora/index.html:137
|
||||
msgid "Find your herd anytime, anywhere"
|
||||
msgstr "Finde deine Herde jederzeit und überall"
|
||||
|
||||
#: alplora/templates/alplora/index.html:138
|
||||
msgid "Perfect fit for Swiss Alps"
|
||||
msgstr "Perfekt für die Schweizer Alpen"
|
||||
|
||||
#: alplora/templates/alplora/index.html:163
|
||||
msgid "What is Alplora?"
|
||||
msgstr "Was ist Alplora?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:164
|
||||
msgid ""
|
||||
"Alplora is an animal tracker made for outdoor grazing animals in Swiss Alps."
|
||||
msgstr ""
|
||||
"Alplora ist ein Sender, der speziell für Weidetiere in den Schweizer Alpen "
|
||||
"entwickelt wurde."
|
||||
|
||||
#: alplora/templates/alplora/index.html:165
|
||||
msgid "Alplora is just like a cattle bell, but much better."
|
||||
msgstr "Alplora ist wie eine Kuhglocke, nur viel besser."
|
||||
|
||||
#: alplora/templates/alplora/index.html:174
|
||||
msgid "LOST"
|
||||
msgstr "VERLOREN"
|
||||
|
||||
#: alplora/templates/alplora/index.html:176
|
||||
msgid "When an animal gets separated from the herd and is lost."
|
||||
msgstr "Wenn ein Tier sich von der Herde absondert und verloren geht."
|
||||
|
||||
#: alplora/templates/alplora/index.html:184
|
||||
msgid "WOLF"
|
||||
msgstr "WOLF"
|
||||
|
||||
#: alplora/templates/alplora/index.html:186
|
||||
msgid "When a wolf gets close to the herd."
|
||||
msgstr "Wenn ein Wolf sich der Herde nähert."
|
||||
|
||||
#: alplora/templates/alplora/index.html:193
|
||||
msgid "INJURED"
|
||||
msgstr "VERLETZT"
|
||||
|
||||
#: alplora/templates/alplora/index.html:195
|
||||
msgid "When one of the animals is hurt."
|
||||
msgstr "Wenn eins der Tiere verletzt ist."
|
||||
|
||||
#: alplora/templates/alplora/index.html:205
|
||||
msgid "How does Alplora track my animals?"
|
||||
msgstr "Wie kann Alplora meine Tiere verfolgen und ausfindig machen ?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:206
|
||||
msgid ""
|
||||
"Each animal will be wearing a small tracker,<P></P>and the tracker will be "
|
||||
"sending a signal every 30 to 60 minutes."
|
||||
|
@ -156,33 +118,27 @@ msgstr ""
|
|||
"Jedes Tier wird einen kleinen Sender tragen, <P></P> welcher alle 30 bis 60 "
|
||||
"Minuten ein Signal senden wird."
|
||||
|
||||
#: alplora/templates/alplora/index.html:215
|
||||
msgid "Access app"
|
||||
msgstr "Zugang zur App"
|
||||
|
||||
#: alplora/templates/alplora/index.html:217
|
||||
msgid ""
|
||||
"You can see the animal locations on a map by logging into our Alplora app."
|
||||
msgstr ""
|
||||
"Du kannst den Standort deiner Tiere jederzeit auf einer Karte verfolgen, "
|
||||
"indem du dich in unsere Alplora App einloggst."
|
||||
|
||||
#: alplora/templates/alplora/index.html:225
|
||||
msgid "Get an alarm"
|
||||
msgstr "Erhalte ein Warnsignal"
|
||||
|
||||
#: alplora/templates/alplora/index.html:227
|
||||
msgid ""
|
||||
"When certain signals for danger are detected, Alplora sends an alarm to you."
|
||||
msgstr ""
|
||||
"Wenn Anzeichen von Gefahr bestehen, sendet dir die Alplora App einen "
|
||||
"Warnsignal."
|
||||
|
||||
#: alplora/templates/alplora/index.html:235
|
||||
msgid "Find your animal"
|
||||
msgstr "Finde deine Tiere"
|
||||
|
||||
#: alplora/templates/alplora/index.html:238
|
||||
msgid ""
|
||||
"You can locate the animal in trouble on the realtime map and can take "
|
||||
"actions for keeping the animal safe."
|
||||
|
@ -190,11 +146,9 @@ msgstr ""
|
|||
"Du kannst dein Tier in Notsituationen auf einer Echtzeit-Karte lokalisieren "
|
||||
"und hast die Möglichkeit es in Sicherheit zu bringen."
|
||||
|
||||
#: alplora/templates/alplora/index.html:255
|
||||
msgid "Perfect fit for Swiss mountains"
|
||||
msgstr "Perfekt für die Schweizer Alpen"
|
||||
|
||||
#: alplora/templates/alplora/index.html:257
|
||||
msgid ""
|
||||
"Alplora is made and tested for Swiss Alps. It is a perfect fit for Swiss "
|
||||
"environment."
|
||||
|
@ -202,11 +156,9 @@ msgstr ""
|
|||
"Alplora wurde speziell für die Schweizer Alpen entwickelt und vor Ort "
|
||||
"getestet. Das Produkt passt perfekt in die Schweiz!"
|
||||
|
||||
#: alplora/templates/alplora/index.html:263
|
||||
msgid "Energy efficient"
|
||||
msgstr "Energieeffizient"
|
||||
|
||||
#: alplora/templates/alplora/index.html:265
|
||||
msgid ""
|
||||
"Alplora uses the latest wireless technology, our batteries last the whole "
|
||||
"alp season."
|
||||
|
@ -214,11 +166,9 @@ msgstr ""
|
|||
"Alplora arbeitet mit den neuesten Technologien, so dass der Akku die gesamte "
|
||||
"Alpsaison überdauert."
|
||||
|
||||
#: alplora/templates/alplora/index.html:271
|
||||
msgid "Made with love"
|
||||
msgstr "Mit Liebe gemacht"
|
||||
|
||||
#: alplora/templates/alplora/index.html:273
|
||||
msgid ""
|
||||
"With a lot of love and respect for Swiss agriculture and nature, Alplora is "
|
||||
"made by a Swiss company."
|
||||
|
@ -226,61 +176,49 @@ msgstr ""
|
|||
"Alplora wurde mit viel Liebe und Respekt für die Schweizer Natur und "
|
||||
"Landwirtschaft von einer Schweizer Firma entwickelt."
|
||||
|
||||
#: alplora/templates/alplora/index.html:285
|
||||
msgid "Who needs Alplora?"
|
||||
msgstr "Wer benötigt Alplora?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:301
|
||||
msgid " Are your animals..."
|
||||
msgstr "Sind deine Tiere..."
|
||||
|
||||
#: alplora/templates/alplora/index.html:304
|
||||
msgid "sheep, goats, cows or llamas living freely in the Alps?"
|
||||
msgstr "Schafe, Ziegen, Kühe oder Lamas, die frei in den Alpen leben?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:306
|
||||
msgid "wearing bells?"
|
||||
msgstr "solche, die Glocken tragen?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:308
|
||||
msgid ""
|
||||
"sometimes getting confused and going too far away from where they are "
|
||||
"supposed to be?"
|
||||
msgstr ""
|
||||
"manchmal verwirrt und entfernen sich zu weit von ihrem vorgesehenen Standort?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:332
|
||||
msgid "Do you..."
|
||||
msgstr "Möchtest du..."
|
||||
|
||||
#: alplora/templates/alplora/index.html:335
|
||||
msgid "have animals which are staying outdoor during some time of the year?"
|
||||
msgstr ""
|
||||
"deine Tiere, die eine längere Zeit im Jahr unbeobachtet Draussen verbringen, "
|
||||
"schützen und überwachen können?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:337
|
||||
msgid "want to get an alarm when your animal is hurt, or in danger?"
|
||||
msgstr ""
|
||||
"alarmiert werden, wenn sich eines deiner Tiere verletzt oder in Gefahr "
|
||||
"befindet ?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:339
|
||||
msgid "want to see where your animals are on your cell phone map?"
|
||||
msgstr ""
|
||||
"mit deinem Smartphone auf einer Karte sehen können, wo sich deine Tiere "
|
||||
"befinden? "
|
||||
|
||||
#: alplora/templates/alplora/index.html:341
|
||||
msgid "want to make sure 24/7 that your animals are safe?"
|
||||
msgstr ""
|
||||
"sicherstellen, dass sich deine Tiere rund um die Uhr in Sicherheit befinden?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:359
|
||||
msgid "What our customers say"
|
||||
msgstr ""
|
||||
|
||||
#: alplora/templates/alplora/index.html:379
|
||||
msgid ""
|
||||
"“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 "
|
||||
|
@ -292,11 +230,9 @@ msgstr ""
|
|||
"selben Zeit andereDinge auf dem Hof unten im Dorf erledigen. Dank Alplora "
|
||||
"kann ich meinen Kühenmehr Sicherheit gewährleisten."
|
||||
|
||||
#: alplora/templates/alplora/index.html:382
|
||||
msgid "Farmer in canton Glarus"
|
||||
msgstr "Bauern im Kanton Glarus"
|
||||
|
||||
#: alplora/templates/alplora/index.html:388
|
||||
msgid ""
|
||||
"\"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.\""
|
||||
|
@ -305,11 +241,9 @@ msgstr ""
|
|||
"Schafe fastjedes Jahr aus den Augen verloren. Nun habe ich endlich die "
|
||||
"Möglichkeit, sie zulokalisieren.\""
|
||||
|
||||
#: alplora/templates/alplora/index.html:391
|
||||
msgid "Owner of 50 sheep "
|
||||
msgstr "Besitzerin von 50 Schafen"
|
||||
|
||||
#: alplora/templates/alplora/index.html:397
|
||||
msgid ""
|
||||
"\"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 "
|
||||
|
@ -323,30 +257,23 @@ msgstr ""
|
|||
"noch um meineanderen Tiere kümmern muss. Mit Alplora kann ich nun ohne "
|
||||
"Probleme beides tun.\""
|
||||
|
||||
#: alplora/templates/alplora/index.html:401
|
||||
msgid "Farmer at Berner Oberland"
|
||||
msgstr "Bauer aus dem Berner Oberland"
|
||||
|
||||
#: alplora/templates/alplora/index.html:418
|
||||
msgid "How do I get Alplora?"
|
||||
msgstr "Wie kriege ich Zugriff zu Alplora?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:419
|
||||
msgid "Click the button below and leave us your contact."
|
||||
msgstr "Klicke unten auf Kontakt und hinterlasse uns deine Angaben."
|
||||
|
||||
#: alplora/templates/alplora/index.html:419
|
||||
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."
|
||||
|
||||
#: alplora/templates/alplora/index.html:459
|
||||
msgid "Home"
|
||||
msgstr "Startseite"
|
||||
|
||||
#: alplora/templates/alplora/index.html:472
|
||||
msgid "Testimonials "
|
||||
msgstr "Referenzen"
|
||||
|
||||
#: alplora/views.py:24
|
||||
msgid "Message Successfully Sent"
|
||||
msgstr ""
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-09-16 14:09+0000\n"
|
||||
"POT-Creation-Date: 2017-11-13 17:59+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -65,24 +65,6 @@ msgstr "Bitte gib einen Wert von 10 bis 200 ein."
|
|||
msgid "GB Storage (SSD)"
|
||||
msgstr "GB Storage (SSD)"
|
||||
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "Your Name"
|
||||
msgstr "Dein Name"
|
||||
|
||||
msgid "Please enter your name."
|
||||
msgstr "Bitte gib Deinen Namen ein."
|
||||
|
||||
msgid "Email"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
msgid "Your Email"
|
||||
msgstr "Deine E-Mail"
|
||||
|
||||
msgid "Please enter a valid email address."
|
||||
msgstr "Bitte gib eine gültige E-Mailadresse ein."
|
||||
|
||||
msgid "Continue"
|
||||
msgstr "Weiter"
|
||||
|
||||
|
@ -95,6 +77,18 @@ msgstr "Vielen Dank für Deine Nachricht."
|
|||
msgid "Get in touch with us!"
|
||||
msgstr "Sende uns eine Nachricht."
|
||||
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "Please enter your name."
|
||||
msgstr "Bitte gib Deinen Namen ein."
|
||||
|
||||
msgid "Email"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
msgid "Please enter a valid email address."
|
||||
msgstr "Bitte gib eine gültige E-Mailadresse ein."
|
||||
|
||||
msgid "Message"
|
||||
msgstr "Nachricht"
|
||||
|
||||
|
@ -132,36 +126,57 @@ msgstr ""
|
|||
msgid "Thank you!"
|
||||
msgstr "Vielen Dank!"
|
||||
|
||||
msgid "Account Activation"
|
||||
msgstr "Account Aktivierung"
|
||||
msgid "Data Center Light Account Activation"
|
||||
msgstr "Data Center Light Account Aktivierung"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
"You can activate your Data Center Light account by <a href=\"%(base_url)s"
|
||||
"%(activation_link)s\">clicking here</a>.<br/>\n"
|
||||
"You can also copy and paste the following link into the address bar of your "
|
||||
"browser<br/>\n"
|
||||
"to activate your Data Center Light account.<br/>\n"
|
||||
"%(base_url)s%(activation_link)s\n"
|
||||
"You can activate your Data Center Light account by clicking <a href="
|
||||
"\"%(base_url)s%(activation_link)s\" style=\"text-decoration: none; color: "
|
||||
"#4382c8; font-weight: 400;\">here</a>."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"<a href=\"%(base_url)s%(activation_link)s\">Klicke hier</a> um deinen Data "
|
||||
"Center Light Account zu aktivieren oder kopiere den folgenden Link in die "
|
||||
"Adressleiste deines Browsers.<br/>\n"
|
||||
"%(base_url)s%(activation_link)s\n"
|
||||
"Klicke <a href=\"%(base_url)s%(activation_link)s\"style=\"text-decoration: "
|
||||
"none; color: #4382c8; font-weight: 400;\">here</a> um deinen Data Center "
|
||||
"Light Account zu aktivieren."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can activate your Data Center Light account by clicking here.\n"
|
||||
"You can also copy and paste the following link into the address bar of your "
|
||||
"browser\n"
|
||||
"to activate your Data Center Light account.\n"
|
||||
"%(base_url)s%(activation_link)s\n"
|
||||
msgstr ""
|
||||
"Klicke hier, um deinen Data Center Light Account zu aktivieren oder kopiere "
|
||||
"den folgenden Link in die Adressleiste deines Browsers.\n"
|
||||
"%(base_url)s%(activation_link)s\n"
|
||||
"browser to activate your Data Center Light account."
|
||||
msgstr "Kopiere den folgenden Link in die Adressleiste deines Browsers."
|
||||
|
||||
msgid "Your account details are as follows"
|
||||
msgstr "Deine Account Details sind unten aufgelistet"
|
||||
|
||||
msgid "Username"
|
||||
msgstr "Username"
|
||||
|
||||
msgid "Your email address"
|
||||
msgstr "Deine E-Mail-Adresse"
|
||||
|
||||
msgid "Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
msgid "You can reset your password here"
|
||||
msgstr "Du kannst dein Passwort hier zurück setzen"
|
||||
|
||||
msgid ""
|
||||
"You can copy and paste the following link into the address bar of your "
|
||||
"browser to activate your Data Center Light account."
|
||||
msgstr "Kopiere den folgenden Link in die Adressleiste deines Browsers."
|
||||
|
||||
msgid "Welcome to Data Center Light!"
|
||||
msgstr "Willkommen beim Data Center Light!"
|
||||
|
||||
msgid ""
|
||||
"Thanks for joining us! We provide the most affordable virtual machines from "
|
||||
"the heart of Switzerland."
|
||||
msgstr "Bei uns findest Du die günstiges VMs aus der Schweiz."
|
||||
|
||||
msgid "Try now, order a VM. VM price starts from only 15CHF per month."
|
||||
msgstr "Unser Angebot beginnt bei 15 CHF pro Monat. Probier's jetzt aus!"
|
||||
|
||||
msgid "ORDER VM"
|
||||
msgstr "VM BESTELLEN"
|
||||
|
||||
msgid "Home"
|
||||
msgstr "Home"
|
||||
|
@ -255,8 +270,12 @@ msgstr ""
|
|||
"Einfach und bezahlbar: Teste nun unsere virtuellen Maschinen mit "
|
||||
"federleichten Preisen."
|
||||
|
||||
msgid "Affordable VM hosting based in Switzerland"
|
||||
msgstr "Bezahlbares VM Hosting in der Schweiz"
|
||||
msgid ""
|
||||
"Ready in 30 seconds.<br/>Experience the unbeatable speed from Data Center "
|
||||
"Light."
|
||||
msgstr ""
|
||||
"Fertig in 30 Sekunden.<br/>Erlebe die unschlagbare Geschwindigkeit von Data "
|
||||
"Center Light."
|
||||
|
||||
msgid "Contact us"
|
||||
msgstr "Kontaktiere uns"
|
||||
|
@ -264,6 +283,45 @@ msgstr "Kontaktiere uns"
|
|||
msgid "Switzerland "
|
||||
msgstr "Schweiz "
|
||||
|
||||
msgid "Welcome back"
|
||||
msgstr "Willkommen zurück"
|
||||
|
||||
msgid ""
|
||||
"Review your billing address and card details and proceed to make payment."
|
||||
msgstr ""
|
||||
"Überprüfe die Rechnungsadresse und Kreditkartendaten und fahre mit der "
|
||||
"Zahlung fort."
|
||||
|
||||
msgid "Log in"
|
||||
msgstr "Anmelden"
|
||||
|
||||
msgid ""
|
||||
"Already signed up?<br>By logging in you can retrieve saved billing "
|
||||
"information."
|
||||
msgstr ""
|
||||
"Bereits eingeloggt? Nach der Anmeldung kannst Du gespeicherte "
|
||||
"Rechnungsinformationen abrufen."
|
||||
|
||||
msgid "LOGIN"
|
||||
msgstr "ANMELDEN"
|
||||
|
||||
msgid "Don't have an account yet?"
|
||||
msgstr "Besitzt du kein Benutzerkonto?"
|
||||
|
||||
msgid "You can sign up by filling in the information below."
|
||||
msgstr ""
|
||||
"Du kannst Dich anmelden, indem Du die die untenstehenden Informationen "
|
||||
"ausfüllst."
|
||||
|
||||
msgid "Forgot password?"
|
||||
msgstr "Passwort vergessen?"
|
||||
|
||||
msgid "Sign up"
|
||||
msgstr "Registrieren"
|
||||
|
||||
msgid "Billing Address"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
msgid "Your Order"
|
||||
msgstr "Deine Bestellung"
|
||||
|
||||
|
@ -288,23 +346,15 @@ msgstr "inkl. Mehrwertsteuer"
|
|||
msgid "Month"
|
||||
msgstr "Monat"
|
||||
|
||||
msgid "Billing Address"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
msgid "Credit Card"
|
||||
msgstr "Kreditkarte"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" Please fill in your credit card information "
|
||||
"below. We are using <a\n"
|
||||
" href=\"https://stripe.com\" target="
|
||||
"\"_blank\">Stripe</a> for payment and do not store\n"
|
||||
" your information in our database.\n"
|
||||
" "
|
||||
"Please fill in your credit card information below. We are using <a href="
|
||||
"\"https://stripe.com\" target=\"_blank\">Stripe</a> for payment and do not "
|
||||
"store your information in our database."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Bitte füll Deine Kreditkarteninformationen unten aus. Wir nutzen <a href="
|
||||
"Bitte fülle Deine Kreditkarteninformationen unten aus. Wir nutzen <a href="
|
||||
"\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und "
|
||||
"speichern keine Informationen in unserer Datenbank."
|
||||
|
||||
|
@ -315,9 +365,6 @@ msgstr ""
|
|||
"Es wird noch keine Bezahlung vorgenommen. Die Bezahlung wird erst ausgelöst, "
|
||||
"nachdem Du die Bestellung auf der nächsten Seite bestätigt hast."
|
||||
|
||||
msgid "Submit"
|
||||
msgstr "Absenden"
|
||||
|
||||
msgid "Card Number"
|
||||
msgstr "Kreditkartennummer"
|
||||
|
||||
|
@ -330,30 +377,19 @@ msgstr ""
|
|||
msgid "Card Type"
|
||||
msgstr "Kartentyp"
|
||||
|
||||
msgid ""
|
||||
"You are not making any payment yet. After placing your order, you will be "
|
||||
"taken to the Submit Payment Page."
|
||||
msgstr ""
|
||||
"Es wird noch keine Bezahlung vorgenommen. Die Bezahlung wird erst ausgelöst, "
|
||||
"nachdem Du die Bestellung auf der nächsten Seite bestätigt hast."
|
||||
|
||||
msgid "Processing"
|
||||
msgstr "Weiter"
|
||||
|
||||
msgid "Enter your credit card number"
|
||||
msgstr "Deine Kreditkartennummer"
|
||||
|
||||
msgid "Confirm Order"
|
||||
msgstr "Bestellung Bestätigen"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
msgid "Billed To:"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
msgid "Payment Method:"
|
||||
msgstr "Bezahlmethode"
|
||||
|
||||
msgid "ending in"
|
||||
msgstr "endend in"
|
||||
|
||||
msgid "Order summary"
|
||||
msgstr "Bestellungsübersicht"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"By clicking \"Place order\" this plan will charge your credit card account "
|
||||
|
@ -365,27 +401,6 @@ msgstr ""
|
|||
msgid "Place order"
|
||||
msgstr "Bestellen"
|
||||
|
||||
msgid "We are cutting down the costs significantly!"
|
||||
msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen"
|
||||
|
||||
msgid "Order Now!"
|
||||
msgstr "Bestelle jetzt!"
|
||||
|
||||
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 "Thank you for order! Our team will contact you via email"
|
||||
msgstr ""
|
||||
"Vielen Dank für die Bestellung. Unser Team setzt sich sobald wie möglich mit "
|
||||
|
@ -479,11 +494,91 @@ msgstr "Ungültige RAM-Grösse"
|
|||
msgid "Invalid storage size"
|
||||
msgstr "Ungültige Speicher-Grösse"
|
||||
|
||||
msgid "is not a proper name"
|
||||
msgstr "ist kein gültiger Name"
|
||||
msgid "Confirm Order"
|
||||
msgstr "Bestellung Bestätigen"
|
||||
|
||||
msgid "is not a proper email"
|
||||
msgstr "ist keine gültige E-Mailadresse"
|
||||
msgid "Error."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"There was a payment related error. On close of this popup, you will be "
|
||||
"redirected back to the payment page."
|
||||
msgstr ""
|
||||
"Es ist ein Fehler bei der Zahlung betreten. Du wirst nach dem Schliessen vom "
|
||||
"Popup zur Bezahlseite weitergeleitet."
|
||||
|
||||
msgid "Thank you for the order."
|
||||
msgstr "Danke für Deine Bestellung."
|
||||
|
||||
msgid ""
|
||||
"Your VM will be up and running in a few moments. We will send you a "
|
||||
"confirmation email as soon as it is ready."
|
||||
msgstr ""
|
||||
"Deine VM ist gleich bereit. Wir senden Dir eine Bestätigungsemail, sobald Du "
|
||||
"auf sie zugreifen kannst."
|
||||
|
||||
#~ msgid "Affordable VM hosting based in Switzerland"
|
||||
#~ msgstr "Bezahlbares VM Hosting in der Schweiz"
|
||||
|
||||
#~ msgid "Processing..."
|
||||
#~ msgstr "Abarbeitung..."
|
||||
|
||||
#~ msgid "Hold tight, we are processing your request"
|
||||
#~ msgstr "Bitte warten - wir verbeiten Deine Anfrage gerade"
|
||||
|
||||
#~ msgid "Some problem encountered. Please try again later."
|
||||
#~ msgstr "Ein Problem ist aufgetreten. Bitte versuche es später noch einmal."
|
||||
|
||||
#~ msgid "Submit"
|
||||
#~ msgstr "Absenden"
|
||||
|
||||
#~ msgid "Date"
|
||||
#~ msgstr "Datum"
|
||||
|
||||
#~ msgid "Billed To:"
|
||||
#~ msgstr "Rechnungsadresse"
|
||||
|
||||
#~ msgid "Payment Method:"
|
||||
#~ msgstr "Bezahlmethode"
|
||||
|
||||
#~ msgid "ending in"
|
||||
#~ msgstr "endend in"
|
||||
|
||||
#~ msgid "Order summary"
|
||||
#~ msgstr "Bestellungsübersicht"
|
||||
|
||||
#~ msgid "We are cutting down the costs significantly!"
|
||||
#~ msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen"
|
||||
|
||||
#~ msgid "Order Now!"
|
||||
#~ msgstr "Bestelle jetzt!"
|
||||
|
||||
#~ 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 "is not a proper name"
|
||||
#~ msgstr "ist kein gültiger Name"
|
||||
|
||||
#~ msgid "is not a proper email"
|
||||
#~ msgstr "ist keine gültige E-Mailadresse"
|
||||
|
||||
#~ msgid "Your Name"
|
||||
#~ msgstr "Dein Name"
|
||||
|
||||
#~ msgid "Your Email"
|
||||
#~ msgstr "Deine E-Mail"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
|
|
|
@ -182,7 +182,11 @@ button, input, optgroup, select, textarea {
|
|||
|
||||
.navbar-brand {
|
||||
padding: 10px 15px;
|
||||
cursor: pointer;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.navbar-brand {
|
||||
padding: 10px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-right {
|
||||
|
@ -276,7 +280,7 @@ button, input, optgroup, select, textarea {
|
|||
display: block;
|
||||
} */
|
||||
.intro-header {
|
||||
height: 100vh;
|
||||
min-height: 100vh;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
background: url(../img/configure.jpg) no-repeat center center;
|
||||
|
@ -715,9 +719,10 @@ button, input, optgroup, select, textarea {
|
|||
font-size: 65px;
|
||||
margin: 0;
|
||||
position: relative;
|
||||
/* color: #eee;
|
||||
/* color: #eee;
|
||||
padding-bottom: 25px;
|
||||
text-align: right; */
|
||||
/* color: #fff; */
|
||||
}
|
||||
|
||||
.contact-form .form-group {
|
||||
|
@ -1501,6 +1506,8 @@ tech-sub-sec h2 {
|
|||
font-size: 14px;
|
||||
font-weight: 300;
|
||||
letter-spacing: 2px;
|
||||
line-height: 24px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.content-section-a {
|
||||
|
@ -1541,7 +1548,7 @@ tech-sub-sec h2 {
|
|||
}
|
||||
|
||||
footer {
|
||||
padding: 50px 0;
|
||||
padding: 50px 20px;
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
|
||||
|
|
BIN
datacenterlight/static/datacenterlight/img/logo_black.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 58 KiB |
|
@ -155,9 +155,7 @@
|
|||
function _calcPricing() {
|
||||
var total = (cardPricing['cpu'].value * 5) + (2 * cardPricing['ram'].value) + (0.6 * cardPricing['storage'].value);
|
||||
total = parseFloat(total.toFixed(2));
|
||||
|
||||
$("#total").text(total);
|
||||
$('input[name=total]').val(total);
|
||||
}
|
||||
|
||||
function form_success() {
|
||||
|
|
|
@ -5,6 +5,7 @@ from celery.utils.log import get_task_logger
|
|||
from celery import current_task
|
||||
from django.conf import settings
|
||||
from django.core.mail import EmailMessage
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils import translation
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
@ -13,7 +14,7 @@ from hosting.models import HostingOrder, HostingBill
|
|||
from membership.models import StripeCustomer, CustomUser
|
||||
from opennebula_api.models import OpenNebulaManager
|
||||
from opennebula_api.serializers import VirtualMachineSerializer
|
||||
from utils.hosting_utils import get_all_public_keys
|
||||
from utils.hosting_utils import get_all_public_keys, get_or_create_vm_detail
|
||||
from utils.forms import UserBillingAddressForm
|
||||
from utils.mailer import BaseEmail
|
||||
from utils.models import BillingAddress
|
||||
|
@ -50,14 +51,20 @@ def retry_task(task, exception=None):
|
|||
@app.task(bind=True, max_retries=settings.CELERY_MAX_RETRIES)
|
||||
def create_vm_task(self, vm_template_id, user, specs, template,
|
||||
stripe_customer_id, billing_address_data,
|
||||
billing_address_id,
|
||||
charge, cc_details):
|
||||
logger.debug("Running create_vm_task on {}".format(current_task.request.hostname))
|
||||
stripe_subscription_id, cc_details):
|
||||
logger.debug(
|
||||
"Running create_vm_task on {}".format(current_task.request.hostname))
|
||||
vm_id = None
|
||||
try:
|
||||
final_price = specs.get('price')
|
||||
billing_address = BillingAddress.objects.filter(
|
||||
id=billing_address_id).first()
|
||||
billing_address = BillingAddress(
|
||||
cardholder_name=billing_address_data['cardholder_name'],
|
||||
street_address=billing_address_data['street_address'],
|
||||
city=billing_address_data['city'],
|
||||
postal_code=billing_address_data['postal_code'],
|
||||
country=billing_address_data['country']
|
||||
)
|
||||
billing_address.save()
|
||||
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
||||
|
||||
if 'pass' in user:
|
||||
|
@ -110,8 +117,7 @@ def create_vm_task(self, vm_template_id, user, specs, template,
|
|||
billing_address_user_form.save()
|
||||
|
||||
# Associate an order with a stripe subscription
|
||||
charge_object = DictDotLookup(charge)
|
||||
order.set_subscription_id(charge_object, cc_details)
|
||||
order.set_subscription_id(stripe_subscription_id, cc_details)
|
||||
|
||||
# If the Stripe payment succeeds, set order status approved
|
||||
order.set_approved()
|
||||
|
@ -126,9 +132,9 @@ def create_vm_task(self, vm_template_id, user, specs, template,
|
|||
'storage': specs.get('disk_size'),
|
||||
'price': specs.get('price'),
|
||||
'template': template.get('name'),
|
||||
'vm.name': vm['name'],
|
||||
'vm.id': vm['vm_id'],
|
||||
'order.id': order.id
|
||||
'vm_name': vm.get('name'),
|
||||
'vm_id': vm['vm_id'],
|
||||
'order_id': order.id
|
||||
}
|
||||
email_data = {
|
||||
'subject': settings.DCL_TEXT + " Order from %s" % context['email'],
|
||||
|
@ -144,18 +150,20 @@ def create_vm_task(self, vm_template_id, user, specs, template,
|
|||
if 'pass' in user:
|
||||
lang = 'en-us'
|
||||
if user.get('language') is not None:
|
||||
logger.debug("Language is set to {}".format(user.get('language')))
|
||||
logger.debug(
|
||||
"Language is set to {}".format(user.get('language')))
|
||||
lang = user.get('language')
|
||||
translation.activate(lang)
|
||||
# Send notification to the user as soon as VM has been booked
|
||||
context = {
|
||||
'vm': vm,
|
||||
'order': order,
|
||||
'base_url': "{0}://{1}".format(user.get('request_scheme'),
|
||||
user.get('request_host')),
|
||||
'order_url': reverse('hosting:orders',
|
||||
kwargs={'pk': order.id}),
|
||||
'page_header': _(
|
||||
'Your New VM %(vm_name)s at Data Center Light') % {
|
||||
'vm_name': vm.get('name')}
|
||||
'vm_name': vm.get('name')},
|
||||
'vm_name': vm.get('name')
|
||||
}
|
||||
email_data = {
|
||||
'subject': context.get('page_header'),
|
||||
|
@ -174,13 +182,15 @@ def create_vm_task(self, vm_template_id, user, specs, template,
|
|||
logger.debug("New VM ID is {vm_id}".format(vm_id=vm_id))
|
||||
if new_host is not None:
|
||||
custom_user = CustomUser.objects.get(email=user.get('email'))
|
||||
get_or_create_vm_detail(custom_user, manager, vm_id)
|
||||
if custom_user is not None:
|
||||
public_keys = get_all_public_keys(custom_user)
|
||||
keys = [{'value': key, 'state': True} for key in
|
||||
public_keys]
|
||||
if len(keys) > 0:
|
||||
logger.debug(
|
||||
"Calling configure on {host} for {num_keys} keys".format(
|
||||
"Calling configure on {host} for "
|
||||
"{num_keys} keys".format(
|
||||
host=new_host, num_keys=len(keys)))
|
||||
# Let's delay the task by 75 seconds to be sure
|
||||
# that we run the cdist configure after the host
|
||||
|
@ -209,32 +219,3 @@ def create_vm_task(self, vm_template_id, user, specs, template,
|
|||
return
|
||||
|
||||
return vm_id
|
||||
|
||||
|
||||
class DictDotLookup(object):
|
||||
"""
|
||||
Creates objects that behave much like a dictionaries, but allow nested
|
||||
key access using object '.' (dot) lookups.
|
||||
"""
|
||||
|
||||
def __init__(self, d):
|
||||
for k in d:
|
||||
if isinstance(d[k], dict):
|
||||
self.__dict__[k] = DictDotLookup(d[k])
|
||||
elif isinstance(d[k], (list, tuple)):
|
||||
l = []
|
||||
for v in d[k]:
|
||||
if isinstance(v, dict):
|
||||
l.append(DictDotLookup(v))
|
||||
else:
|
||||
l.append(v)
|
||||
self.__dict__[k] = l
|
||||
else:
|
||||
self.__dict__[k] = d[k]
|
||||
|
||||
def __getitem__(self, name):
|
||||
if name in self.__dict__:
|
||||
return self.__dict__[name]
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.__dict__.keys())
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
<!-- Custom Fonts -->
|
||||
<!--Import Google Icon Font-->
|
||||
<link href="//fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||
<link href="//fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||
<link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
|
||||
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon" />
|
||||
|
@ -26,6 +26,8 @@
|
|||
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
|
||||
{% block css_extra %}
|
||||
{% endblock css_extra %}
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
|
@ -42,7 +44,9 @@
|
|||
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
{% include "datacenterlight/includes/_navbar.html" %}
|
||||
{% block navbar %}
|
||||
{% include "datacenterlight/includes/_navbar.html" %}
|
||||
{% endblock navbar %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
|
|
@ -77,47 +77,9 @@
|
|||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<input type="hidden" name="total">
|
||||
<!--<div class="description check-ip">
|
||||
<input type="checkbox" name="ipv6"> Ipv6 Only<br>
|
||||
</div>-->
|
||||
<div class="form-group">
|
||||
<div class="description input justify-center">
|
||||
<label for="name" class="control-label">{% trans "Name"%}</label>
|
||||
<input type="text" name="name" class="form-control" placeholder="{% trans 'Your Name'%}"
|
||||
data-minlength="3" data-error="{% trans 'Please enter your name.' %}" required>
|
||||
</div>
|
||||
<div class="help-block with-errors">
|
||||
{% for message in messages %}
|
||||
{% if 'name' in message.tags %}
|
||||
<ul class="list-unstyled">
|
||||
<li>
|
||||
{{ message|safe }}
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="description input justify-center">
|
||||
<label for="email" class="control-label">{% trans "Email"%}</label>
|
||||
<input name="email" type="email" pattern="^[^@\s]+@([^@\s]+\.)+[^@\s]+$" class="form-control"
|
||||
placeholder="{% trans 'Your Email' %}"
|
||||
data-error="{% trans 'Please enter a valid email address.' %}" required>
|
||||
</div>
|
||||
<div class="help-block with-errors">
|
||||
{% for message in messages %}
|
||||
{% if 'email' in message.tags %}
|
||||
<ul class="list-unstyled">
|
||||
<li>
|
||||
{{ message|safe }}
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="submit" class="btn btn-primary disabled" value="{% trans 'Continue' %}"></input>
|
||||
</form>
|
||||
|
|
|
@ -1,14 +1,58 @@
|
|||
{% extends "datacenterlight/emails/base_email_datacenterlight.html" %}
|
||||
{% load static from staticfiles %}
|
||||
{% load i18n %}
|
||||
{% block email_head %}
|
||||
{{dcl_text}} {% trans 'Account Activation' %}
|
||||
{% endblock %}
|
||||
{% block email_body %}
|
||||
{% blocktrans %}
|
||||
You can activate your Data Center Light account by <a href="{{base_url}}{{activation_link}}">clicking here</a>.<br/>
|
||||
You can also copy and paste the following link into the address bar of your browser<br/>
|
||||
to activate your Data Center Light account.<br/>
|
||||
{{base_url}}{{activation_link}}
|
||||
{% endblocktrans %}
|
||||
{% endblock %}
|
||||
{% load static i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% trans "Data Center Light Account Activation" %}</title>
|
||||
<link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400">
|
||||
</head>
|
||||
|
||||
<body style="margin: 0; padding: 20px 0;">
|
||||
<table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;">
|
||||
<tr>
|
||||
<td>
|
||||
<img src="{{ base_url }}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 15px;">
|
||||
<h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Data Center Light Account Activation" %}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 25px; font-size: 16px;">
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;">
|
||||
{% blocktrans %}You can activate your Data Center Light account by clicking <a href="{{base_url}}{{activation_link}}" style="text-decoration: none; color: #4382c8; font-weight: 400;">here</a>.{% endblocktrans %}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;">
|
||||
{% blocktrans %}You can also copy and paste the following link into the address bar of your browser to activate your Data Center Light account.{% endblocktrans %}
|
||||
</p>
|
||||
<p style="color: #4382c8; line-height: 1.4; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{{base_url}}{{activation_link}}
|
||||
</p>
|
||||
<p>
|
||||
{% if account_details %}
|
||||
{% url 'hosting:reset_password' as reset_password_url %}
|
||||
{% trans "Your account details are as follows" %}:
|
||||
|
||||
{% trans "Username" %} : {% trans "Your email address" %}
|
||||
{% trans "Password" %} : {{account_details}}
|
||||
|
||||
{% trans "You can reset your password here" %}:
|
||||
{{base_url}}{{reset_password_url}}
|
||||
{% endif %}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 40px; padding-bottom: 25px;">
|
||||
<h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
|
@ -1,10 +1,20 @@
|
|||
{% extends "datacenterlight/emails/base_email_datacenterlight.txt" %}
|
||||
{% load i18n %}
|
||||
{% block email_head %}{{dcl_text}} {% trans 'Account Activation' %}{% endblock %}
|
||||
{% block email_body %}
|
||||
{% blocktrans %}You can activate your Data Center Light account by clicking here.
|
||||
You can also copy and paste the following link into the address bar of your browser
|
||||
to activate your Data Center Light account.
|
||||
|
||||
{% trans "Data Center Light Account Activation" %}
|
||||
|
||||
{% blocktrans %}You can copy and paste the following link into the address bar of your browser to activate your Data Center Light account.{% endblocktrans %}
|
||||
|
||||
{{base_url}}{{activation_link}}
|
||||
{% endblocktrans %}
|
||||
{% endblock %}
|
||||
|
||||
{% if account_details %}
|
||||
{% url 'hosting:reset_password' as reset_password_url %}
|
||||
{% trans "Your account details are as follows" %}:
|
||||
|
||||
{% trans "Username" %} : {% trans "Your email address" %}
|
||||
{% trans "Password" %} : {{account_details}}
|
||||
|
||||
{% trans "You can reset your password here" %}:
|
||||
{{base_url}}{{reset_password_url}}
|
||||
{% endif %}
|
||||
|
||||
{% trans "Your Data Center Light Team" %}
|
|
@ -0,0 +1,48 @@
|
|||
{% load static i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% trans "Welcome to Data Center Light!" %}</title>
|
||||
<link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400">
|
||||
</head>
|
||||
|
||||
<body style="margin: 0; padding: 20px 0;">
|
||||
<table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;">
|
||||
<tr>
|
||||
<td>
|
||||
<img src="{{ base_url }}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 15px;">
|
||||
<h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Welcome to Data Center Light!" %}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 25px; font-size: 16px;">
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}Thanks for joining us! We provide the most affordable virtual machines from the heart of Switzerland.{% endblocktrans %}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}Try now, order a VM. VM price starts from only 15CHF per month.{% endblocktrans %}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 30px;">
|
||||
<a class="btn" href="{{ base_url }}{% url 'hosting:create_virtual_machine' %}" style="font-family: Lato, Arial, sans-serif; text-decoration: none; background-color: #1596da; color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px; letter-spacing: 0.5px; border-radius: 3px; display: inline-block;">{% trans "ORDER VM" %}</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 40px; padding-bottom: 25px;">
|
||||
<h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,10 @@
|
|||
{% load i18n %}
|
||||
|
||||
{% trans "Welcome to Data Center Light!" %}
|
||||
|
||||
{% blocktrans %}Thanks for joining us! We provide the most affordable virtual machines from the heart of Switzerland.{% endblocktrans %}
|
||||
{% blocktrans %}Try now, order a VM. VM price starts from only 15CHF per month.{% endblocktrans %}
|
||||
|
||||
{{ base_url }}{% url 'hosting:create_virtual_machine' %}
|
||||
|
||||
{% trans "Your Data Center Light Team" %}
|
|
@ -1,38 +1,39 @@
|
|||
{% load staticfiles i18n%}
|
||||
{% load staticfiles i18n%}
|
||||
{% get_current_language as LANGUAGE_CODE %}
|
||||
<footer>
|
||||
<div class="container">
|
||||
<ul class="list-inline">
|
||||
{% if request.resolver_match.url_name != "index" %}
|
||||
<li>
|
||||
<a href="{% url 'datacenterlight:index' %}">{% trans "Home" %}</a>
|
||||
</li>
|
||||
<li class="footer-menu-divider">⋅</li>
|
||||
{% endif %}
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#how">{% trans "Highlights" %}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#your">{% trans "Scale out" %}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#our">{% trans "Reliable and light" %}</a>
|
||||
</li>
|
||||
{% if request.resolver_match.url_name != "index" %}
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#price">{% trans "Pricing" %}</a>
|
||||
</li>
|
||||
<li class="footer-menu-divider">⋅</li>
|
||||
{% else %}
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#price">{% trans "Order VM" %}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#contact">{% trans "Contact" %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
|
||||
</div>
|
||||
</footer>
|
||||
<footer>
|
||||
<div class="container">
|
||||
<ul class="list-inline">
|
||||
{% if request.resolver_match.url_name != "index" %}
|
||||
<li>
|
||||
<a href="{% url 'datacenterlight:index' %}">{% trans "Home" %}</a>
|
||||
</li>
|
||||
<li class="footer-menu-divider">⋅</li>
|
||||
{% endif %}
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#how">{% trans "Highlights" %}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#your">{% trans "Scale out" %}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#our">{% trans "Reliable and light" %}</a>
|
||||
</li>
|
||||
{% if request.resolver_match.url_name != "index" %}
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#price">{% trans "Pricing" %}</a>
|
||||
</li>
|
||||
<li class="footer-menu-divider">⋅</li>
|
||||
{% else %}
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#price">{% trans "Order VM" %}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li>
|
||||
<a class="url-init" href="{% url 'datacenterlight:index' %}#contact">{% trans "Contact" %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<hr class="intro-divider">
|
||||
<ul class="list-inline intro-social-buttons">
|
||||
<li>
|
||||
<a class="btn btn-default btn-lg btn-transparent url" href="#how"><i class="#Services"></i> <span class="network-name">{% trans "Highlights" %}</span></a>
|
||||
<a class="btn btn-default btn-lg btn-transparent url" href="#how"><span class="network-name">{% trans "Highlights" %}</span></a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="btn btn-primary btn-lg page-scroll url" href="#price"><span class="network-name">{% trans "I want it!" %}</span></a>
|
||||
|
@ -130,7 +130,7 @@
|
|||
<div class="row text-center">
|
||||
<div class="col-xs-12 col-md-6 text">
|
||||
<h2 class="section-heading">{% trans "Simple and affordable: Try our virtual machine with featherlight price." %}</h2>
|
||||
<p class="lead new-lead">{% trans "Affordable VM hosting based in Switzerland" %}</p>
|
||||
<p class="lead new-lead">{% blocktrans %}Ready in 30 seconds.<br/>Experience the unbeatable speed from Data Center Light.{% endblocktrans %}</p>
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-md-6 hero-feature">
|
||||
|
|
|
@ -1,190 +1,175 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3 i18n %}
|
||||
|
||||
{% block css_extra %}
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paymentfont/1.1.2/css/paymentfont.min.css"/>
|
||||
{% endblock css_extra %}
|
||||
|
||||
{% block navbar %}
|
||||
{% include "datacenterlight/includes/_navbar.html" %}
|
||||
{% endblock navbar %}
|
||||
|
||||
{% block content %}
|
||||
<!-- Credit card form -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paymentfont/1.1.2/css/paymentfont.min.css"/>
|
||||
<div class="dcl-order-container">
|
||||
<div class="payment-container">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-order-sec">
|
||||
<h3><strong>{%trans "Your Order" %}</strong></h3>
|
||||
<div class="col-xs-6 col-sm-12 col-md-12 col-lg-12 dcl-order-table-header">
|
||||
<div class="col-xs-12 col-sm-2 col-md-1 col-lg-1 tbl-header">
|
||||
{%trans "Cores" %}
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-3 col-md-4 col-lg-4 tbl-header">
|
||||
{%trans "Memory" %}
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 tbl-header">
|
||||
{%trans "Disk space" %}
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 tbl-header">
|
||||
{%trans "Configuration" %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-6 col-sm-12 col-md-12 col-lg-12 dcl-order-table-content">
|
||||
<div class="col-xs-12 col-sm-2 col-md-1 col-lg-1 tbl-content">
|
||||
{{request.session.specs.cpu|floatformat}}
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-3 col-md-4 col-lg-4 tbl-content">
|
||||
{{request.session.specs.memory|floatformat}} GB
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 tbl-content">
|
||||
{{request.session.specs.disk_size|floatformat}} GB
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 tbl-content">
|
||||
{{request.session.template.name}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-order-table-total">
|
||||
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 tbl-tot tbl-no-padding">
|
||||
{%trans "Total" %} <span>{%trans "including VAT" %}</span>
|
||||
</div>
|
||||
<div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 tbl-no-padding">
|
||||
<div class="col-xs-12 col-sm-4 col-md-4 col-lg-4"></div>
|
||||
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 tbl-total">{{request.session.specs.price}}
|
||||
CHF<span class="dcl-price-month">/{% trans "Month" %}</span>
|
||||
<div class="dcl-payment-grid">
|
||||
<div class="dcl-payment-box">
|
||||
<div class="dcl-payment-section">
|
||||
{% if request.user.is_authenticated %}
|
||||
<div class="dcl-payment-user">
|
||||
<h4>{% trans "Welcome back" %} {{request.user.name}}!</h4>
|
||||
<p>{% trans "Review your billing address and card details and proceed to make payment." %}</p>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<h3>{%trans "Log in" %}</h3>
|
||||
<hr class="top-hr">
|
||||
<p style="margin-bottom: 20px;">{% blocktrans %}Already signed up?<br>By logging in you can retrieve saved billing information.{% endblocktrans %}</p>
|
||||
<form role="form" id="login-form" method="post" action="" novalidate>
|
||||
{% for field in login_form %}
|
||||
{% csrf_token %}
|
||||
{% bootstrap_field field show_label=False type='fields'%}
|
||||
{% endfor %}
|
||||
<p class="text-danger">{{login_form.non_field_errors|striptags}}</p>
|
||||
<input type='hidden' name='next' value='{{request.path}}'/>
|
||||
<div class="form-group text-right">
|
||||
<button type="submit" class="btn btn-wide btn-vm-contact" name="login_form">{% trans "LOGIN" %}</button>
|
||||
</div>
|
||||
</form>
|
||||
<p>
|
||||
{% trans "Don't have an account yet?" %}<br>
|
||||
{% trans "You can sign up by filling in the information below." %}<br>
|
||||
<a href="{% url 'hosting:reset_password' %}">{% trans "Forgot password?" %}</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-billing-sec">
|
||||
<div class="col-xs-12 col-sm-5 col-md-6 billing dcl-billing">
|
||||
<h3><b>{%trans "Billing Address"%}</b></h3>
|
||||
<hr>
|
||||
<div class="dcl-payment-box">
|
||||
<div class="dcl-payment-section">
|
||||
{% if not request.user.is_authenticated %}
|
||||
<h3><b>{%trans "Sign up"%}</b></h3>
|
||||
{% else %}
|
||||
<h3><b>{%trans "Billing Address"%}</b></h3>
|
||||
{% endif %}
|
||||
<hr class="top-hr">
|
||||
{% for message in messages %}
|
||||
{% if 'duplicate_email' in message.tags %}
|
||||
<p class="text-danger">{{message}}</p>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<form role="form" id="billing-form" method="post" action="" novalidate>
|
||||
{% for field in form %}
|
||||
{% csrf_token %}
|
||||
{% for field in billing_address_form %}
|
||||
{% bootstrap_field field show_label=False type='fields'%}
|
||||
{% endfor %}
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-7 col-md-6 creditcard-box dcl-creditcard">
|
||||
</div>
|
||||
<div class="dcl-payment-box">
|
||||
<div class="dcl-payment-section">
|
||||
<h3>{%trans "Your Order" %}</h3>
|
||||
<hr class="top-hr">
|
||||
<div class="dcl-payment-order">
|
||||
<p>{% trans "Cores"%} <strong class="pull-right">{{request.session.specs.cpu|floatformat}}</strong></p>
|
||||
<hr>
|
||||
<p>{% trans "Memory"%} <strong class="pull-right">{{request.session.specs.memory|floatformat}} GB</strong></p>
|
||||
<hr>
|
||||
<p>{% trans "Disk space"%} <strong class="pull-right">{{request.session.specs.disk_size|floatformat}} GB</strong></p>
|
||||
<hr>
|
||||
<p>{% trans "Configuration"%} <strong class="pull-right">{{request.session.template.name}}</strong></p>
|
||||
<hr>
|
||||
<p class="last-p"><strong>{%trans "Total" %}</strong> <small>({%trans "including VAT" %})</small> <strong class="pull-right">{{request.session.specs.price}} CHF/{% trans "Month" %}</strong></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dcl-payment-box">
|
||||
<div class="dcl-payment-section">
|
||||
<h3><b>{%trans "Credit Card"%}</b></h3>
|
||||
<hr>
|
||||
<hr class="top-hr">
|
||||
<p>
|
||||
{% blocktrans %}Please fill in your credit card information below. We are using <a href="https://stripe.com" target="_blank">Stripe</a> for payment and do not store your information in our database.{% endblocktrans %}
|
||||
</p>
|
||||
<div>
|
||||
<div>
|
||||
<p>
|
||||
{% blocktrans %}
|
||||
Please fill in your credit card information below. We are using <a
|
||||
href="https://stripe.com" target="_blank">Stripe</a> for payment and do not store
|
||||
your information in our database.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
</div>
|
||||
<br>
|
||||
<div>
|
||||
{% if credit_card_data.last4 %}
|
||||
{% if credit_card_data.last4 %}
|
||||
<form role="form" id="payment-form-with-creditcard" novalidate>
|
||||
<h5 class="billing-head">Credit Card</h5>
|
||||
<h5 class="membership-lead">Last 4: *****{{credit_card_data.last4}}</h5>
|
||||
<h5 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h5>
|
||||
<input type="hidden" name="credit_card_needed" value="false"/>
|
||||
</form>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
{% if not messages and not form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-addtional-margin">
|
||||
{% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %}
|
||||
</p>
|
||||
{% endif %}
|
||||
<div id='payment_error'>
|
||||
{% for message in messages %}
|
||||
{% if 'failed_payment' or 'make_charge_error' in message.tags %}
|
||||
<ul class="list-unstyled"><li>
|
||||
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
|
||||
</li></ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% for error in form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-error">
|
||||
{{ error|escape }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<button id="payment_button_with_creditcard" class="btn btn-success stripe-payment-btn"
|
||||
type="submit">
|
||||
{%trans "Submit" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{% if not messages and not form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-addtional-margin">
|
||||
{% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %}
|
||||
</p>
|
||||
{% endif %}
|
||||
<div id='payment_error'>
|
||||
{% for message in messages %}
|
||||
{% if 'failed_payment' or 'make_charge_error' in message.tags %}
|
||||
<ul class="list-unstyled">
|
||||
<li>
|
||||
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% for error in form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-error">
|
||||
{{ error|escape }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% else %}
|
||||
<div class="text-right">
|
||||
<button id="payment_button_with_creditcard" class="btn btn-vm-contact" type="submit">{%trans "SUBMIT" %}</button>
|
||||
</div>
|
||||
{% else %}
|
||||
<form action="" id="payment-form-new" method="POST">
|
||||
<input type="hidden" name="token"/>
|
||||
<div class="group">
|
||||
<div class="col-xs-12 col-sm-12 col-md-10 col-lg-9 credit-card-goup">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 card-element card-number-element">
|
||||
<div class="credit-card-goup">
|
||||
<div class="card-element card-number-element">
|
||||
<label>{%trans "Card Number" %}</label>
|
||||
<div id="card-number-element" class="field my-input"></div>
|
||||
</div>
|
||||
<div class="col-xs-5 col-sm-3 col-md-3 col-lg-3 card-element card-expiry-element">
|
||||
<label>{%trans "Expiry Date" %}</label>
|
||||
<div id="card-expiry-element" class="field my-input"></div>
|
||||
<div class="row">
|
||||
<div class="col-xs-5 card-element card-expiry-element">
|
||||
<label>{%trans "Expiry Date" %}</label>
|
||||
<div id="card-expiry-element" class="field my-input"></div>
|
||||
</div>
|
||||
<div class="col-xs-3 col-xs-offset-4 card-element card-cvc-element">
|
||||
<label>{%trans "CVC" %}</label>
|
||||
<div id="card-cvc-element" class="field my-input"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-2 col-md-6 col-lg-7 hide-mobile"></div>
|
||||
<div class="col-xs-3 col-sm-3 col-md-3 col-lg-2 card-element card-cvc-element">
|
||||
<label>{%trans "CVC" %}</label>
|
||||
<div id="card-cvc-element" class="field my-input"></div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 card-element brand">
|
||||
<div class="card-element brand">
|
||||
<label>{%trans "Card Type" %}</label>
|
||||
<i class="pf pf-credit-card" id="brand-icon"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="card-errors" role="alert"></div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
{% if not messages and not form.non_field_errors %}
|
||||
<p class="card-warning-content">
|
||||
{% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %}
|
||||
</p>
|
||||
<div id="card-errors"></div>
|
||||
{% if not messages and not form.non_field_errors %}
|
||||
<p class="card-warning-content">
|
||||
{% trans "You are not making any payment yet. After placing your order, you will be taken to the Submit Payment Page." %}
|
||||
</p>
|
||||
{% endif %}
|
||||
<div id='payment_error'>
|
||||
{% for message in messages %}
|
||||
{% if 'failed_payment' in message.tags or 'make_charge_error' in message.tags or 'error' in message.tags %}
|
||||
<ul class="list-unstyled">
|
||||
<li><p class="card-warning-content card-warning-error">{{ message|safe }}</p></li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
<div id='payment_error'>
|
||||
{% for message in messages %}
|
||||
{% if 'failed_payment' or 'make_charge_error' in message.tags %}
|
||||
<ul class="list-unstyled"><li>
|
||||
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
|
||||
</li></ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% for error in form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-error">
|
||||
{{ error|escape }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<button class="btn btn-success stripe-payment-btn" type="submit">{%trans "Submit" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="text-right">
|
||||
<button class="btn btn-vm-contact btn-wide" type="submit">{%trans "SUBMIT" %}</button>
|
||||
</div>
|
||||
|
||||
<div class="row" style="display:none;">
|
||||
<div class="col-xs-12">
|
||||
<p class="payment-errors"></p>
|
||||
</div>
|
||||
<div style="display:none;">
|
||||
<p class="payment-errors"></p>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,106 +1,24 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3 %}
|
||||
{% extends "hosting/order_detail.html" %}
|
||||
{% load i18n %}
|
||||
{% load custom_tags %}
|
||||
|
||||
{% block navbar %}
|
||||
{% include "datacenterlight/includes/_navbar.html" %}
|
||||
{% endblock navbar %}
|
||||
|
||||
{% block content %}
|
||||
{% block submit_btn %}
|
||||
<form id="virtual_machine_create_form" action="" method="POST">
|
||||
{% csrf_token %}
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
<div class="dcl-place-order-text">{% blocktrans with vm_price=request.session.specs.price %}By clicking "Place order" this plan will charge your credit card account with the fee of {{ vm_price }}CHF/month{% endblocktrans %}.</div>
|
||||
</div>
|
||||
<div class="col-sm-4 order-confirm-btn text-right">
|
||||
<button class="btn choice-btn" id="btn-create-vm"
|
||||
data-toggle="modal" data-target="#createvm-modal">
|
||||
{% trans "Place order" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock submit_btn %}
|
||||
|
||||
<div class="order-detail-container">
|
||||
{% if messages %}
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-8 col-md-offset-2">
|
||||
<br/>
|
||||
<div class="alert alert-warning">
|
||||
{% for message in messages %}
|
||||
<span>{{ message }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if not error %}
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-8 col-md-offset-2">
|
||||
<div class="invoice-title">
|
||||
<h2>{% trans "Confirm Order"%}</h2>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-sm-6 pull-right order-confirm-date">
|
||||
<address>
|
||||
<strong>{% trans "Date"%}:</strong><br>
|
||||
<span id="order-created_at">{% now "Y-m-d H:i" %}</span><br><br>
|
||||
</address>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-6">
|
||||
<address>
|
||||
<h3><b>{% trans "Billed To:"%}</b></h3>
|
||||
{% with request.session.billing_address_data as billing_address %}
|
||||
{{billing_address|get_value_from_dict:'cardholder_name'}}<br> {{billing_address|get_value_from_dict:'street_address'}}, {{billing_address|get_value_from_dict:'postal_code'}}<br>
|
||||
{{billing_address|get_value_from_dict:'city'}}, {{billing_address|get_value_from_dict:'country'}}.
|
||||
{% endwith %}
|
||||
</address>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-6">
|
||||
<address>
|
||||
<strong>{% trans "Payment Method:"%}</strong><br>
|
||||
{{cc_brand}} {% trans "ending in" %} **** {{cc_last4}}<br>
|
||||
{{request.session.user.email}}
|
||||
</address>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2">
|
||||
<h3><b>{% trans "Order summary"%}</b></h3>
|
||||
<hr>
|
||||
<div class="content">
|
||||
{% with request.session.specs as vm %}
|
||||
<p><b>{% trans "Cores"%}</b> <span class="pull-right">{{vm.cpu}}</span></p>
|
||||
<hr>
|
||||
<p><b>{% trans "Memory"%}</b> <span class="pull-right">{{vm.memory}} GB</span></p>
|
||||
<hr>
|
||||
<p><b>{% trans "Disk space"%}</b> <span class="pull-right">{{vm.disk_size}} GB</span></p>
|
||||
<hr>
|
||||
<p><b>{% trans "Configuration"%}</b> <span class="pull-right">{{request.session.template.name}}</span></p>
|
||||
<hr>
|
||||
<h4>{% trans "Total"%}<p class="pull-right"><b>{{vm.price}} CHF</b><span class="dcl-price-month"> /{% trans "Month" %}</span></p></h4>
|
||||
{% endwith %}
|
||||
</div>
|
||||
<br/>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
<p class="dcl-place-order-text">{% blocktrans with vm_price=request.session.specs.price %}By clicking "Place order" this plan will charge your credit card account with the fee of {{ vm_price }}CHF/month{% endblocktrans %}.</p>
|
||||
</div>
|
||||
<div class="col-sm-4 content">
|
||||
<a href="{{next_url}}" ><button class="btn btn-info pull-right">{% trans "Place order"%}</button></a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
window.onload = function () {
|
||||
var locale_date = moment.utc(document.getElementById("order-created_at").textContent,'YYYY-MM-DD HH:mm').toDate();
|
||||
locale_date = moment(locale_date).format("YYYY-MM-DD h:mm:ss a");
|
||||
document.getElementById('order-created_at').innerHTML = locale_date;
|
||||
|
||||
};
|
||||
|
||||
</script>
|
||||
{%endblock%}
|
||||
|
|
|
@ -1,96 +0,0 @@
|
|||
{% extends "datacenterlight/base.html" %}
|
||||
{% load staticfiles i18n%}
|
||||
{% get_current_language as LANGUAGE_CODE %}
|
||||
|
||||
{% block content %}
|
||||
<div class="intro-pricing">
|
||||
|
||||
<div class="intro-message">
|
||||
<h2 class="section-heading">{% trans "We are cutting down the costs significantly!" %}</h2>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="price-calc-section">
|
||||
<div class="card">
|
||||
<img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt="">
|
||||
<div class="caption">
|
||||
<form method="POST" action="">
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="title">
|
||||
<h3>{% trans "VM hosting" %} </h3>
|
||||
</div>
|
||||
<div class="price">
|
||||
<span id="total">15</span>
|
||||
<span>CHF</span>
|
||||
<div class="price-text">
|
||||
<p>{% trans "VAT included" %}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="descriptions">
|
||||
<div class="description">
|
||||
<p>{% trans "Hosted in Switzerland" %}</p>
|
||||
</div>
|
||||
<div class="description">
|
||||
<i class="fa fa-minus-circle left" data-minus="cpu" aria-hidden="true"></i>
|
||||
<input class="input-price" type="number" min="1" max="42" id="coreValue" name="cpu">
|
||||
<span> Core</span>
|
||||
<i class="fa fa-plus-circle right" data-plus="cpu" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div class="description">
|
||||
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
|
||||
<input id="ramValue" class="input-price" type="number" min="2" max="200" name="ram">
|
||||
<span> GB RAM</span>
|
||||
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
|
||||
</div>
|
||||
<div class="description">
|
||||
<i class="fa fa-minus-circle left" data-minus="storage" aria-hidden="true"></i>
|
||||
<input id="storageValue" class="input-price" type="number" min="10" max="500" step="10" name="storage">
|
||||
<span>{% trans "GB Storage (SSD)" %}</span>
|
||||
<i class="fa fa-plus-circle right" data-plus="storage" aria-hidden="true"></i>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="description select-configuration input">
|
||||
<label for="name">OS</label>
|
||||
<select name="config" id="">
|
||||
{% for template in templates %}
|
||||
<option value="{{template.id}}">{{template.name}} </option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<input type="hidden" name="total">
|
||||
|
||||
<!-- <div class="description input">
|
||||
<label for="name">Name</label>
|
||||
<input type="text" name="name" placeholder="Your Name">
|
||||
</div>
|
||||
<div class="description input">
|
||||
<label for="email">Email</label>
|
||||
<input type="email" name="email" placeholder="Your Email">
|
||||
</div> -->
|
||||
|
||||
<!--<div class="description check-ip">
|
||||
<input type="checkbox" name="ipv6"> Ipv6 Only<br>
|
||||
</div>-->
|
||||
</div>
|
||||
<input type="submit" class="btn btn-primary" value="{% trans 'Order Now!' %}"></input>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text">
|
||||
<h2 class="section-heading">{% trans "Simple and affordable: Try our virtual machine with featherlight price." %}</h2>
|
||||
|
||||
<div class="description">
|
||||
<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>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
|
|
@ -12,7 +12,7 @@ from datacenterlight.models import VMTemplate
|
|||
from datacenterlight.tasks import create_vm_task
|
||||
from membership.models import StripeCustomer
|
||||
from opennebula_api.serializers import VMTemplateSerializer
|
||||
from utils.models import BillingAddress
|
||||
from utils.hosting_utils import get_vm_price
|
||||
from utils.stripe_utils import StripeUtils
|
||||
|
||||
|
||||
|
@ -74,32 +74,22 @@ class CeleryTaskTestCase(TestCase):
|
|||
stripe_customer.stripe_id,
|
||||
self.token)
|
||||
card_details_dict = card_details.get('response_object')
|
||||
billing_address = BillingAddress(
|
||||
cardholder_name=self.customer_name,
|
||||
postal_code='1232',
|
||||
country='CH',
|
||||
street_address='Monty\'s Street',
|
||||
city='Hollywood')
|
||||
billing_address.save()
|
||||
billing_address_data = {'cardholder_name': self.customer_name,
|
||||
'postal_code': '1231',
|
||||
'country': 'CH',
|
||||
'token': self.token,
|
||||
'street_address': 'Monty\'s Street',
|
||||
'city': 'Hollywood'}
|
||||
|
||||
billing_address_id = billing_address.id
|
||||
vm_template_id = template_data.get('id', 1)
|
||||
|
||||
cpu = specs.get('cpu')
|
||||
memory = specs.get('memory')
|
||||
disk_size = specs.get('disk_size')
|
||||
amount_to_be_charged = (cpu * 5) + (memory * 2) + (disk_size * 0.6)
|
||||
plan_name = "{cpu} Cores, {memory} GB RAM, {disk_size} GB SSD".format(
|
||||
cpu=cpu,
|
||||
memory=memory,
|
||||
disk_size=disk_size)
|
||||
|
||||
amount_to_be_charged = get_vm_price(cpu=cpu, memory=memory,
|
||||
disk_size=disk_size)
|
||||
plan_name = StripeUtils.get_stripe_plan_name(cpu=cpu,
|
||||
memory=memory,
|
||||
disk_size=disk_size)
|
||||
stripe_plan_id = StripeUtils.get_stripe_plan_id(cpu=cpu,
|
||||
ram=memory,
|
||||
ssd=disk_size,
|
||||
|
@ -125,8 +115,7 @@ class CeleryTaskTestCase(TestCase):
|
|||
template_data,
|
||||
stripe_customer.id,
|
||||
billing_address_data,
|
||||
billing_address_id,
|
||||
stripe_subscription_obj,
|
||||
stripe_subscription_obj.id,
|
||||
card_details_dict)
|
||||
new_vm_id = 0
|
||||
res = None
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from .views import IndexView, BetaProgramView, LandingProgramView, \
|
||||
BetaAccessView, PricingView, SuccessView, \
|
||||
PaymentOrderView, OrderConfirmationView, \
|
||||
from .views import (
|
||||
IndexView, BetaProgramView, LandingProgramView, BetaAccessView,
|
||||
SuccessView, PaymentOrderView, OrderConfirmationView,
|
||||
WhyDataCenterLightView, ContactUsView
|
||||
)
|
||||
|
||||
from django.views.generic import TemplateView
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', IndexView.as_view(), name='index'),
|
||||
|
@ -15,11 +19,14 @@ urlpatterns = [
|
|||
name='whydatacenterlight'),
|
||||
url(r'^beta-program/?$', BetaProgramView.as_view(), name='beta'),
|
||||
url(r'^landing/?$', LandingProgramView.as_view(), name='landing'),
|
||||
url(r'^pricing/?$', PricingView.as_view(), name='pricing'),
|
||||
url(r'^payment/?$', PaymentOrderView.as_view(), name='payment'),
|
||||
url(r'^order-confirmation/?$', OrderConfirmationView.as_view(),
|
||||
name='order_confirmation'),
|
||||
url(r'^order-success/?$', SuccessView.as_view(), name='order_success'),
|
||||
url(r'^beta_access?$', BetaAccessView.as_view(), name='beta_access'),
|
||||
url(r'^contact/?$', ContactUsView.as_view(), name='contact_us'),
|
||||
|
||||
url(r'glasfaser/?$',
|
||||
TemplateView.as_view(template_name='ungleich_page/glasfaser.html'),
|
||||
name='glasfaser'),
|
||||
]
|
||||
|
|
|
@ -1,28 +1,35 @@
|
|||
import logging
|
||||
import json
|
||||
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth import login, authenticate
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import redirect
|
||||
from django.http import HttpResponseRedirect, HttpResponse
|
||||
from django.shortcuts import render
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.utils.translation import get_language, ugettext_lazy as _
|
||||
from django.views.decorators.cache import cache_control
|
||||
from django.views.generic import FormView, CreateView, TemplateView, DetailView
|
||||
|
||||
from datacenterlight.tasks import create_vm_task
|
||||
from hosting.models import HostingOrder
|
||||
from hosting.forms import HostingUserLoginForm
|
||||
from membership.models import CustomUser, StripeCustomer
|
||||
from opennebula_api.models import OpenNebulaManager
|
||||
from opennebula_api.serializers import VirtualMachineTemplateSerializer, \
|
||||
VMTemplateSerializer
|
||||
from utils.forms import BillingAddressForm
|
||||
from opennebula_api.serializers import VMTemplateSerializer
|
||||
from utils.forms import (
|
||||
BillingAddressForm, BillingAddressFormSignup
|
||||
)
|
||||
from utils.hosting_utils import get_vm_price
|
||||
from utils.mailer import BaseEmail
|
||||
from utils.stripe_utils import StripeUtils
|
||||
from utils.tasks import send_plain_email_task
|
||||
from .forms import BetaAccessForm, ContactForm
|
||||
from .models import BetaAccess, BetaAccessVMType, BetaAccessVM, VMTemplate
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ContactUsView(FormView):
|
||||
template_name = "datacenterlight/contact_form.html"
|
||||
|
@ -42,13 +49,17 @@ class ContactUsView(FormView):
|
|||
|
||||
def form_valid(self, form):
|
||||
form.save()
|
||||
from_emails = {
|
||||
'glasfaser': 'glasfaser@ungleich.ch'
|
||||
}
|
||||
from_page = self.request.POST.get('from_page')
|
||||
email_data = {
|
||||
'subject': "{dcl_text} Message from {sender}".format(
|
||||
dcl_text=settings.DCL_TEXT,
|
||||
sender=form.cleaned_data.get('email')
|
||||
),
|
||||
'from_email': settings.DCL_SUPPORT_FROM_ADDRESS,
|
||||
'to': ['info@ungleich.ch'],
|
||||
'to': [from_emails.get(from_page, 'info@ungleich.ch')],
|
||||
'body': "\n".join(
|
||||
["%s=%s" % (k, v) for (k, v) in form.cleaned_data.items()]),
|
||||
'reply_to': [form.cleaned_data.get('email')],
|
||||
|
@ -88,56 +99,6 @@ class SuccessView(TemplateView):
|
|||
return render(request, self.template_name)
|
||||
|
||||
|
||||
class PricingView(TemplateView):
|
||||
template_name = "datacenterlight/pricing.html"
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
try:
|
||||
manager = OpenNebulaManager()
|
||||
templates = manager.get_templates()
|
||||
|
||||
context = {
|
||||
'templates': VirtualMachineTemplateSerializer(templates,
|
||||
many=True).data,
|
||||
}
|
||||
except:
|
||||
messages.error(request,
|
||||
'We have a temporary problem to connect to our backend. \
|
||||
Please try again in a few minutes'
|
||||
)
|
||||
context = {
|
||||
'error': 'connection'
|
||||
}
|
||||
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
def post(self, request):
|
||||
|
||||
cores = request.POST.get('cpu')
|
||||
memory = request.POST.get('ram')
|
||||
storage = request.POST.get('storage')
|
||||
price = request.POST.get('total')
|
||||
|
||||
template_id = int(request.POST.get('config'))
|
||||
manager = OpenNebulaManager()
|
||||
template = manager.get_template(template_id)
|
||||
|
||||
request.session['template'] = VirtualMachineTemplateSerializer(
|
||||
template).data
|
||||
|
||||
if not request.user.is_authenticated():
|
||||
request.session['next'] = reverse('hosting:payment')
|
||||
|
||||
request.session['specs'] = {
|
||||
'cpu': cores,
|
||||
'memory': memory,
|
||||
'disk_size': storage,
|
||||
'price': price,
|
||||
}
|
||||
|
||||
return redirect(reverse('hosting:payment'))
|
||||
|
||||
|
||||
class BetaAccessView(FormView):
|
||||
template_name = "datacenterlight/beta_access.html"
|
||||
form_class = BetaAccessForm
|
||||
|
@ -274,17 +235,11 @@ class IndexView(CreateView):
|
|||
memory_field = forms.IntegerField(validators=[self.validate_memory])
|
||||
storage = request.POST.get('storage')
|
||||
storage_field = forms.IntegerField(validators=[self.validate_storage])
|
||||
price = request.POST.get('total')
|
||||
template_id = int(request.POST.get('config'))
|
||||
template = VMTemplate.objects.filter(
|
||||
opennebula_vm_template_id=template_id).first()
|
||||
template_data = VMTemplateSerializer(template).data
|
||||
|
||||
name = request.POST.get('name')
|
||||
email = request.POST.get('email')
|
||||
name_field = forms.CharField()
|
||||
email_field = forms.EmailField()
|
||||
|
||||
try:
|
||||
cores = cores_field.clean(cores)
|
||||
except ValidationError as err:
|
||||
|
@ -311,40 +266,16 @@ class IndexView(CreateView):
|
|||
extra_tags='storage')
|
||||
return HttpResponseRedirect(
|
||||
reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
try:
|
||||
name = name_field.clean(name)
|
||||
except ValidationError as err:
|
||||
msg = '{} {}.'.format(name, _('is not a proper name'))
|
||||
messages.add_message(self.request, messages.ERROR, msg,
|
||||
extra_tags='name')
|
||||
return HttpResponseRedirect(
|
||||
reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
try:
|
||||
email = email_field.clean(email)
|
||||
except ValidationError as err:
|
||||
msg = '{} {}.'.format(email, _('is not a proper email'))
|
||||
messages.add_message(self.request, messages.ERROR, msg,
|
||||
extra_tags='email')
|
||||
return HttpResponseRedirect(
|
||||
reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
amount_to_be_charged = get_vm_price(cpu=cores, memory=memory,
|
||||
disk_size=storage)
|
||||
specs = {
|
||||
'cpu': cores,
|
||||
'memory': memory,
|
||||
'disk_size': storage,
|
||||
'price': price
|
||||
'price': amount_to_be_charged
|
||||
}
|
||||
|
||||
this_user = {
|
||||
'name': name,
|
||||
'email': email
|
||||
}
|
||||
|
||||
request.session['specs'] = specs
|
||||
request.session['template'] = template_data
|
||||
request.session['user'] = this_user
|
||||
return HttpResponseRedirect(reverse('datacenterlight:payment'))
|
||||
|
||||
def get_success_url(self):
|
||||
|
@ -407,73 +338,155 @@ class WhyDataCenterLightView(IndexView):
|
|||
|
||||
class PaymentOrderView(FormView):
|
||||
template_name = 'datacenterlight/landing_payment.html'
|
||||
form_class = BillingAddressForm
|
||||
|
||||
def get_form_kwargs(self):
|
||||
form_kwargs = super(PaymentOrderView, self).get_form_kwargs()
|
||||
billing_address_data = self.request.session.get('billing_address_data')
|
||||
if billing_address_data:
|
||||
form_kwargs.update({
|
||||
'initial': {
|
||||
'cardholder_name': billing_address_data['cardholder_name'],
|
||||
'street_address': billing_address_data['street_address'],
|
||||
'city': billing_address_data['city'],
|
||||
'postal_code': billing_address_data['postal_code'],
|
||||
'country': billing_address_data['country'],
|
||||
}
|
||||
})
|
||||
return form_kwargs
|
||||
def get_form_class(self):
|
||||
if self.request.user.is_authenticated():
|
||||
return BillingAddressForm
|
||||
else:
|
||||
return BillingAddressFormSignup
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(PaymentOrderView, self).get_context_data(**kwargs)
|
||||
if 'billing_address_data' in self.request.session:
|
||||
billing_address_data = self.request.session['billing_address_data']
|
||||
else:
|
||||
billing_address_data = {}
|
||||
|
||||
if self.request.user.is_authenticated():
|
||||
if billing_address_data:
|
||||
billing_address_form = BillingAddressForm(
|
||||
initial=billing_address_data
|
||||
)
|
||||
else:
|
||||
billing_address_form = BillingAddressForm(
|
||||
instance=self.request.user.billing_addresses.first()
|
||||
)
|
||||
# Get user last order
|
||||
last_hosting_order = HostingOrder.objects.filter(
|
||||
customer__user=self.request.user
|
||||
).last()
|
||||
|
||||
# If user has already an hosting order, get the credit card
|
||||
# data from it
|
||||
if last_hosting_order:
|
||||
credit_card_data = last_hosting_order.get_cc_data()
|
||||
if credit_card_data:
|
||||
context['credit_card_data'] = credit_card_data
|
||||
else:
|
||||
context['credit_card_data'] = None
|
||||
else:
|
||||
billing_address_form = BillingAddressFormSignup(
|
||||
initial=billing_address_data
|
||||
)
|
||||
|
||||
context.update({
|
||||
'stripe_key': settings.STRIPE_API_PUBLIC_KEY,
|
||||
'site_url': reverse('datacenterlight:index')
|
||||
'site_url': reverse('datacenterlight:index'),
|
||||
'login_form': HostingUserLoginForm(prefix='login_form'),
|
||||
'billing_address_form': billing_address_form
|
||||
})
|
||||
return context
|
||||
|
||||
@cache_control(no_cache=True, must_revalidate=True, no_store=True)
|
||||
def get(self, request, *args, **kwargs):
|
||||
if 'specs' not in request.session or 'user' not in request.session:
|
||||
# user is no longer added to session on the index page
|
||||
if 'specs' not in request.session:
|
||||
return HttpResponseRedirect(reverse('datacenterlight:index'))
|
||||
return self.render_to_response(self.get_context_data())
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
form = self.get_form()
|
||||
if form.is_valid():
|
||||
# Get billing address data
|
||||
billing_address_data = form.cleaned_data
|
||||
token = form.cleaned_data.get('token')
|
||||
user = request.session.get('user')
|
||||
try:
|
||||
CustomUser.objects.get(email=user.get('email'))
|
||||
except CustomUser.DoesNotExist:
|
||||
password = CustomUser.get_random_password()
|
||||
# Register the user, and do not send emails
|
||||
CustomUser.register(user.get('name'),
|
||||
password,
|
||||
user.get('email'),
|
||||
app='dcl',
|
||||
base_url=None, send_email=False)
|
||||
if 'login_form' in request.POST:
|
||||
login_form = HostingUserLoginForm(data=request.POST,
|
||||
prefix='login_form')
|
||||
if login_form.is_valid():
|
||||
email = login_form.cleaned_data.get('email')
|
||||
password = login_form.cleaned_data.get('password')
|
||||
auth_user = authenticate(email=email, password=password)
|
||||
if auth_user:
|
||||
login(self.request, auth_user)
|
||||
return HttpResponseRedirect(
|
||||
reverse('datacenterlight:payment')
|
||||
)
|
||||
else:
|
||||
context = self.get_context_data()
|
||||
context['login_form'] = login_form
|
||||
return self.render_to_response(context)
|
||||
if request.user.is_authenticated():
|
||||
address_form = BillingAddressForm(
|
||||
data=request.POST,
|
||||
)
|
||||
else:
|
||||
address_form = BillingAddressFormSignup(
|
||||
data=request.POST,
|
||||
)
|
||||
if address_form.is_valid():
|
||||
token = address_form.cleaned_data.get('token')
|
||||
if request.user.is_authenticated():
|
||||
this_user = {
|
||||
'email': request.user.email,
|
||||
'name': request.user.name
|
||||
}
|
||||
customer = StripeCustomer.get_or_create(
|
||||
email=this_user.get('email'),
|
||||
token=token)
|
||||
else:
|
||||
user_email = address_form.cleaned_data.get('email')
|
||||
user_name = address_form.cleaned_data.get('name')
|
||||
this_user = {
|
||||
'email': user_email,
|
||||
'name': user_name
|
||||
}
|
||||
try:
|
||||
custom_user = CustomUser.objects.get(email=user_email)
|
||||
customer = StripeCustomer.objects.filter(
|
||||
user_id=custom_user.id).first()
|
||||
if customer is None:
|
||||
logger.debug(
|
||||
("User {email} is already registered with us."
|
||||
"But, StripeCustomer does not exist for {email}."
|
||||
"Hence, creating a new StripeCustomer.").format(
|
||||
email=user_email
|
||||
)
|
||||
)
|
||||
customer = StripeCustomer.create_stripe_api_customer(
|
||||
email=user_email,
|
||||
token=token,
|
||||
customer_name=user_name)
|
||||
except CustomUser.DoesNotExist:
|
||||
logger.debug(
|
||||
("StripeCustomer does not exist for {email}."
|
||||
"Hence, creating a new StripeCustomer.").format(
|
||||
email=user_email
|
||||
)
|
||||
)
|
||||
customer = StripeCustomer.create_stripe_api_customer(
|
||||
email=user_email,
|
||||
token=token,
|
||||
customer_name=user_name)
|
||||
|
||||
request.session['billing_address_data'] = address_form.cleaned_data
|
||||
request.session['user'] = this_user
|
||||
# Get or create stripe customer
|
||||
customer = StripeCustomer.get_or_create(email=user.get('email'),
|
||||
token=token)
|
||||
if not customer:
|
||||
form.add_error("__all__", "Invalid credit card")
|
||||
address_form.add_error(
|
||||
"__all__", "Invalid credit card"
|
||||
)
|
||||
return self.render_to_response(
|
||||
self.get_context_data(form=form))
|
||||
|
||||
# Create Billing Address
|
||||
billing_address = form.save()
|
||||
request.session['billing_address_data'] = billing_address_data
|
||||
request.session['billing_address'] = billing_address.id
|
||||
self.get_context_data(
|
||||
billing_address_form=address_form
|
||||
)
|
||||
)
|
||||
request.session['token'] = token
|
||||
request.session['customer'] = customer.id
|
||||
if type(customer) is StripeCustomer:
|
||||
request.session['customer'] = customer.stripe_id
|
||||
else:
|
||||
request.session['customer'] = customer
|
||||
return HttpResponseRedirect(
|
||||
reverse('datacenterlight:order_confirmation'))
|
||||
else:
|
||||
return self.form_invalid(form)
|
||||
context = self.get_context_data()
|
||||
context['billing_address_form'] = address_form
|
||||
return self.render_to_response(context)
|
||||
|
||||
|
||||
class OrderConfirmationView(DetailView):
|
||||
|
@ -488,10 +501,9 @@ class OrderConfirmationView(DetailView):
|
|||
return HttpResponseRedirect(reverse('datacenterlight:index'))
|
||||
if 'token' not in request.session:
|
||||
return HttpResponseRedirect(reverse('datacenterlight:payment'))
|
||||
stripe_customer_id = request.session.get('customer')
|
||||
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
||||
stripe_api_cus_id = request.session.get('customer')
|
||||
stripe_utils = StripeUtils()
|
||||
card_details = stripe_utils.get_card_details(customer.stripe_id,
|
||||
card_details = stripe_utils.get_card_details(stripe_api_cus_id,
|
||||
request.session.get(
|
||||
'token'))
|
||||
if not card_details.get('response_object'):
|
||||
|
@ -503,7 +515,10 @@ class OrderConfirmationView(DetailView):
|
|||
context = {
|
||||
'site_url': reverse('datacenterlight:index'),
|
||||
'cc_last4': card_details.get('response_object').get('last4'),
|
||||
'cc_brand': card_details.get('response_object').get('brand')
|
||||
'cc_brand': card_details.get('response_object').get('brand'),
|
||||
'vm': request.session.get('specs'),
|
||||
'page_header_text': _('Confirm Order'),
|
||||
'billing_address_data': request.session.get('billing_address_data')
|
||||
}
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
|
@ -511,33 +526,37 @@ class OrderConfirmationView(DetailView):
|
|||
template = request.session.get('template')
|
||||
specs = request.session.get('specs')
|
||||
user = request.session.get('user')
|
||||
stripe_customer_id = request.session.get('customer')
|
||||
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
||||
billing_address_data = request.session.get('billing_address_data')
|
||||
billing_address_id = request.session.get('billing_address')
|
||||
stripe_api_cus_id = request.session.get('customer')
|
||||
vm_template_id = template.get('id', 1)
|
||||
|
||||
# Make stripe charge to a customer
|
||||
stripe_utils = StripeUtils()
|
||||
card_details = stripe_utils.get_card_details(customer.stripe_id,
|
||||
card_details = stripe_utils.get_card_details(stripe_api_cus_id,
|
||||
request.session.get(
|
||||
'token'))
|
||||
if not card_details.get('response_object'):
|
||||
msg = card_details.get('error')
|
||||
messages.add_message(self.request, messages.ERROR, msg,
|
||||
extra_tags='failed_payment')
|
||||
return HttpResponseRedirect(
|
||||
reverse('datacenterlight:payment') + '#payment_error')
|
||||
response = {
|
||||
'status': False,
|
||||
'redirect': "{url}#{section}".format(
|
||||
url=reverse('datacenterlight:payment'),
|
||||
section='payment_error'),
|
||||
'msg_title': str(_('Error.')),
|
||||
'msg_body': str(
|
||||
_('There was a payment related error.'
|
||||
' On close of this popup, you will be redirected back to'
|
||||
' the payment page.'))
|
||||
}
|
||||
return HttpResponse(json.dumps(response),
|
||||
content_type="application/json")
|
||||
card_details_dict = card_details.get('response_object')
|
||||
cpu = specs.get('cpu')
|
||||
memory = specs.get('memory')
|
||||
disk_size = specs.get('disk_size')
|
||||
amount_to_be_charged = (cpu * 5) + (memory * 2) + (disk_size * 0.6)
|
||||
plan_name = "{cpu} Cores, {memory} GB RAM, {disk_size} GB SSD".format(
|
||||
cpu=cpu,
|
||||
memory=memory,
|
||||
disk_size=disk_size)
|
||||
|
||||
amount_to_be_charged = specs.get('price')
|
||||
plan_name = StripeUtils.get_stripe_plan_name(cpu=cpu,
|
||||
memory=memory,
|
||||
disk_size=disk_size)
|
||||
stripe_plan_id = StripeUtils.get_stripe_plan_id(cpu=cpu,
|
||||
ram=memory,
|
||||
ssd=disk_size,
|
||||
|
@ -548,21 +567,103 @@ class OrderConfirmationView(DetailView):
|
|||
name=plan_name,
|
||||
stripe_plan_id=stripe_plan_id)
|
||||
subscription_result = stripe_utils.subscribe_customer_to_plan(
|
||||
customer.stripe_id,
|
||||
stripe_api_cus_id,
|
||||
[{"plan": stripe_plan.get(
|
||||
'response_object').stripe_plan_id}])
|
||||
stripe_subscription_obj = subscription_result.get('response_object')
|
||||
# Check if the subscription was approved and is active
|
||||
if stripe_subscription_obj is None or \
|
||||
stripe_subscription_obj.status != 'active':
|
||||
if (stripe_subscription_obj is None
|
||||
or stripe_subscription_obj.status != 'active'):
|
||||
msg = subscription_result.get('error')
|
||||
messages.add_message(self.request, messages.ERROR, msg,
|
||||
extra_tags='failed_payment')
|
||||
return HttpResponseRedirect(
|
||||
reverse('datacenterlight:payment') + '#payment_error')
|
||||
response = {
|
||||
'status': False,
|
||||
'redirect': "{url}#{section}".format(
|
||||
url=reverse('datacenterlight:payment'),
|
||||
section='payment_error'),
|
||||
'msg_title': str(_('Error.')),
|
||||
'msg_body': str(
|
||||
_('There was a payment related error.'
|
||||
' On close of this popup, you will be redirected back to'
|
||||
' the payment page.'))
|
||||
}
|
||||
return HttpResponse(json.dumps(response),
|
||||
content_type="application/json")
|
||||
|
||||
# Create user if the user is not logged in and if he is not already
|
||||
# registered
|
||||
if not request.user.is_authenticated():
|
||||
try:
|
||||
custom_user = CustomUser.objects.get(
|
||||
email=user.get('email'))
|
||||
stripe_customer = StripeCustomer.objects.filter(
|
||||
user_id=custom_user.id).first()
|
||||
if stripe_customer is None:
|
||||
stripe_customer = StripeCustomer.objects.create(
|
||||
user=custom_user, stripe_id=stripe_api_cus_id
|
||||
)
|
||||
stripe_customer_id = stripe_customer.id
|
||||
except CustomUser.DoesNotExist:
|
||||
logger.debug(
|
||||
"Customer {} does not exist.".format(user.get('email')))
|
||||
password = CustomUser.get_random_password()
|
||||
base_url = "{0}://{1}".format(self.request.scheme,
|
||||
self.request.get_host())
|
||||
custom_user = CustomUser.register(
|
||||
user.get('name'), password,
|
||||
user.get('email'),
|
||||
app='dcl', base_url=base_url, send_email=True,
|
||||
account_details=password
|
||||
)
|
||||
logger.debug("Created user {}.".format(user.get('email')))
|
||||
stripe_customer = StripeCustomer.objects. \
|
||||
create(user=custom_user, stripe_id=stripe_api_cus_id)
|
||||
stripe_customer_id = stripe_customer.id
|
||||
new_user = authenticate(username=custom_user.email,
|
||||
password=password)
|
||||
login(request, new_user)
|
||||
else:
|
||||
# We assume that if the user is here, his/her StripeCustomer
|
||||
# object already exists
|
||||
stripe_customer_id = request.user.stripecustomer.id
|
||||
custom_user = request.user
|
||||
|
||||
# Save billing address
|
||||
billing_address_data = request.session.get('billing_address_data')
|
||||
logger.debug('billing_address_data is {}'.format(billing_address_data))
|
||||
billing_address_data.update({
|
||||
'user': custom_user.id
|
||||
})
|
||||
user = {
|
||||
'name': custom_user.name,
|
||||
'email': custom_user.email,
|
||||
'pass': custom_user.password,
|
||||
'request_scheme': request.scheme,
|
||||
'request_host': request.get_host(),
|
||||
'language': get_language(),
|
||||
}
|
||||
|
||||
create_vm_task.delay(vm_template_id, user, specs, template,
|
||||
stripe_customer_id, billing_address_data,
|
||||
billing_address_id,
|
||||
stripe_subscription_obj, card_details_dict)
|
||||
request.session['order_confirmation'] = True
|
||||
return HttpResponseRedirect(reverse('datacenterlight:order_success'))
|
||||
stripe_subscription_obj.id, card_details_dict)
|
||||
for session_var in ['specs', 'template', 'billing_address',
|
||||
'billing_address_data',
|
||||
'token', 'customer']:
|
||||
if session_var in request.session:
|
||||
del request.session[session_var]
|
||||
|
||||
response = {
|
||||
'status': True,
|
||||
'redirect': reverse(
|
||||
'hosting:virtual_machines') if request.user.is_authenticated() else reverse(
|
||||
'datacenterlight:index'),
|
||||
'msg_title': str(_('Thank you for the order.')),
|
||||
'msg_body': str(
|
||||
_('Your VM will be up and running in a few moments.'
|
||||
' We will send you a confirmation email as soon as'
|
||||
' it is ready.'))
|
||||
}
|
||||
|
||||
return HttpResponse(json.dumps(response),
|
||||
content_type="application/json")
|
||||
|
|
|
@ -161,6 +161,8 @@ MIDDLEWARE_CLASSES = (
|
|||
'cms.middleware.language.LanguageCookieMiddleware',
|
||||
)
|
||||
|
||||
CSRF_FAILURE_VIEW = 'hosting.views.forbidden_view'
|
||||
|
||||
ROOT_URLCONF = 'dynamicweb.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
|
@ -216,6 +218,7 @@ CMS_TEMPLATES = (
|
|||
('page.html', gettext('Page')),
|
||||
# dcl
|
||||
('datacenterlight/cms_page.html', gettext('Data Center Light')),
|
||||
('ungleich_page/glasfaser_cms_page.html', gettext('Glasfaser')),
|
||||
)
|
||||
|
||||
DATABASES = {
|
||||
|
@ -345,8 +348,6 @@ MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')
|
|||
MEDIA_URL = APP_ROOT_ENDPOINT + 'media/'
|
||||
FILE_UPLOAD_PERMISSIONS = 0o644
|
||||
|
||||
META_SITE_PROTOCOL = 'http'
|
||||
META_USE_SITES = True
|
||||
MIGRATION_MODULES = {
|
||||
'cms': 'cms.migrations',
|
||||
# 'filer': 'filer.migrations_django',
|
||||
|
@ -357,9 +358,6 @@ MIGRATION_MODULES = {
|
|||
'djangocms_link': 'djangocms_link.migrations_django',
|
||||
'djangocms_teaser': 'djangocms_teaser.migrations_django',
|
||||
'djangocms_column': 'djangocms_column.migrations_django',
|
||||
'djangocms_flash': 'djangocms_flash.migrations_django',
|
||||
'djangocms_googlemap': 'djangocms_googlemap.migrations_django',
|
||||
'djangocms_inherit': 'djangocms_inherit.migrations_django',
|
||||
'djangocms_style': 'djangocms_style.migrations_django',
|
||||
'cmsplugin_filer_image': 'cmsplugin_filer_image.migrations_django',
|
||||
'cmsplugin_filer_file': 'cmsplugin_filer_file.migrations_django',
|
||||
|
@ -493,11 +491,10 @@ AUTH_USER_MODEL = 'membership.CustomUser'
|
|||
STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services"
|
||||
|
||||
# EMAIL MESSAGES
|
||||
REGISTRATION_MESSAGE = {'subject': "Validation mail",
|
||||
'message': 'Thank You for registering for account on Digital Glarus.\n'
|
||||
'Please verify Your account under following link '
|
||||
'http://{host}/en-us/digitalglarus/login/validate/{slug}',
|
||||
}
|
||||
REGISTRATION_MESSAGE = {
|
||||
'subject': "Digital Glarus registration",
|
||||
'message': 'Thank You for registering for account on Digital Glarus.'
|
||||
}
|
||||
STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY')
|
||||
STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY')
|
||||
STRIPE_API_PRIVATE_KEY_TEST = env('STRIPE_API_PRIVATE_KEY_TEST')
|
||||
|
|
|
@ -31,5 +31,5 @@ ALLOWED_HOSTS = [
|
|||
".ipv6onlyhosting.com",
|
||||
".ipv6onlyhosting.net",
|
||||
".digitalglarus.ch",
|
||||
".alplora.ch"
|
||||
".hack4glarus.ch"
|
||||
]
|
||||
|
|
|
@ -5,7 +5,9 @@ from django.conf.urls.static import static
|
|||
from django.views import i18n, static as static_view
|
||||
|
||||
from django.conf import settings
|
||||
from hosting.views import RailsHostingView, DjangoHostingView, NodeJSHostingView
|
||||
from hosting.views import (
|
||||
RailsHostingView, DjangoHostingView, NodeJSHostingView
|
||||
)
|
||||
from membership import urls as membership_urls
|
||||
from ungleich_page.views import LandingView
|
||||
from django.views.generic import RedirectView
|
||||
|
|
|
@ -29,6 +29,8 @@ class HostingUserLoginForm(forms.Form):
|
|||
def clean(self):
|
||||
email = self.cleaned_data.get('email')
|
||||
password = self.cleaned_data.get('password')
|
||||
if self.errors:
|
||||
return self.cleaned_data
|
||||
is_auth = authenticate(email=email, password=password)
|
||||
if not is_auth:
|
||||
raise forms.ValidationError(
|
||||
|
@ -48,15 +50,17 @@ class HostingUserLoginForm(forms.Form):
|
|||
|
||||
|
||||
class HostingUserSignupForm(forms.ModelForm):
|
||||
confirm_password = forms.CharField(widget=forms.PasswordInput())
|
||||
password = forms.CharField(widget=forms.PasswordInput())
|
||||
confirm_password = forms.CharField(label=_("Confirm Password"),
|
||||
widget=forms.PasswordInput())
|
||||
password = forms.CharField(label=_("Password"),
|
||||
widget=forms.PasswordInput())
|
||||
|
||||
class Meta:
|
||||
model = CustomUser
|
||||
fields = ['name', 'email', 'password']
|
||||
widgets = {
|
||||
'name': forms.TextInput(
|
||||
attrs={'placeholder': 'Enter your name or company name'}),
|
||||
attrs={'placeholder': _('Enter your name or company name')}),
|
||||
}
|
||||
|
||||
def clean_confirm_password(self):
|
||||
|
@ -104,7 +108,7 @@ class UserHostingKeyForm(forms.ModelForm):
|
|||
public_key=openssh_pubkey_str).first().name
|
||||
KEY_EXISTS_MESSAGE = _(
|
||||
"This key exists already with the name \"%(name)s\"") % {
|
||||
'name': key_name}
|
||||
'name': key_name}
|
||||
raise forms.ValidationError(KEY_EXISTS_MESSAGE)
|
||||
|
||||
with tempfile.NamedTemporaryFile(delete=True) as tmp_public_key_file:
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-09-24 12:34+0000\n"
|
||||
"POT-Creation-Date: 2017-10-26 03:21+0530\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -27,6 +27,15 @@ msgstr "Dein Account wurde noch nicht aktiviert."
|
|||
msgid "User does not exist"
|
||||
msgstr "Der Benutzer existiert nicht"
|
||||
|
||||
msgid "Confirm Password"
|
||||
msgstr "Passwort Bestätigung"
|
||||
|
||||
msgid "Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
msgid "Enter your name or company name"
|
||||
msgstr "Gib Deinen Namen oder den Name Deines Unternehmens ein"
|
||||
|
||||
msgid "Paste here your public key"
|
||||
msgstr "Füge Deinen Public Key ein"
|
||||
|
||||
|
@ -155,9 +164,6 @@ msgstr "Ich möchte einen existierenden SSH-Key nutzen"
|
|||
msgid "Upload"
|
||||
msgstr "Hochladen"
|
||||
|
||||
msgid "Your VM hosted in Switzerland"
|
||||
msgstr "Deine VM in der Schweiz"
|
||||
|
||||
msgid "Set your new password"
|
||||
msgstr "Setze Dein neues Passwort"
|
||||
|
||||
|
@ -173,6 +179,9 @@ msgstr "Anmelden"
|
|||
msgid "Create VM"
|
||||
msgstr "VM erstellen"
|
||||
|
||||
msgid "Affordable VM hosting based in Switzerland"
|
||||
msgstr "Bezahlbares VM Hosting in der Schweiz"
|
||||
|
||||
msgid "My Dashboard"
|
||||
msgstr "Mein Dashboard"
|
||||
|
||||
|
@ -192,102 +201,79 @@ msgid "Support / Contact"
|
|||
msgstr "Support / Kontakt"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You have ordered a new virtual machine!\n"
|
||||
"<br/>\n"
|
||||
"Your order of [%(vm_name)s] has been charged.<br/><br/>\n"
|
||||
"You can view your invoice by clicking the button below.<br/><br/>\n"
|
||||
msgstr ""
|
||||
"Du hast eine neue virtuelle Maschine bestellt!<br/>\n"
|
||||
"Deine Bestellung von [%(vm_name)s] wurde erhoben.<br/><br/>\n"
|
||||
"Um die Rechnung zu sehen, klicke auf den Button unten.<br/><br/>\n"
|
||||
msgid "Your New VM %(vm_name)s"
|
||||
msgstr "Deine Neue VM %(vm_name)s"
|
||||
|
||||
msgid "View Invoice"
|
||||
msgstr "Zur Rechnung"
|
||||
msgid "You have ordered a new virtual machine!"
|
||||
msgstr "Du hast eine neue virtuelle Maschine bestellt!"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You have ordered a new virtual machine!\n"
|
||||
"Your order of [%(vm_name)s] has been charged.\n"
|
||||
"You can view your invoice here.\n"
|
||||
msgstr ""
|
||||
"Du hast eine neue virtuelle Maschine bestellt!\n"
|
||||
"Deine Bestellung von [%(vm_name)s] wurde erhoben.\n"
|
||||
"Um die Rechnung zu sehen, klicke hier.\n"
|
||||
msgid "Your order of <strong>%(vm_name)s</strong> has been charged."
|
||||
msgstr "Deine Bestellung von <strong>%(vm_name)s</strong> wurde erhoben."
|
||||
|
||||
msgid "You can view your VM detail by clicking the button below."
|
||||
msgstr "Um die Rechnung zu sehen, klicke auf den Button unten."
|
||||
|
||||
msgid "View Detail"
|
||||
msgstr "Details anzeigen"
|
||||
|
||||
msgid "Your Data Center Light Team"
|
||||
msgstr "Dein Data Center Light Team"
|
||||
|
||||
#, python-format
|
||||
msgid "Your order of %(vm_name)s has been charged."
|
||||
msgstr "Deine Bestellung von %(vm_name)s wurde erhoben."
|
||||
|
||||
msgid "You can view your VM detail by following the link below."
|
||||
msgstr "Um die Rechnung zu sehen, klicke auf den Link unten."
|
||||
|
||||
msgid "Password Reset"
|
||||
msgstr "Passwort zurücksetzen"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
"You're receiving this email because you requested a password reset for your "
|
||||
"user account at %(site_name)s.<br/>\n"
|
||||
"Please go to the following page and choose a new password: %(base_url)s"
|
||||
"%(password_reset_url)s<br/>\n"
|
||||
"If you didn't request a new password, ignore this e-mail.<br/>\n"
|
||||
"Thank you!\n"
|
||||
msgid "We received a request to reset your password."
|
||||
msgstr "Wir haben eine Anfrage erhalten, um Dein Passwort zurückzusetzen."
|
||||
|
||||
msgid "If you didn't make this request you can safely ignore this email."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Du erhälst diese E-Mail da Du Dein Passwort für Deinen Account bei "
|
||||
"%(site_name)s zurücksetzen möchtest.<br/>\n"
|
||||
"Bitte folge diesem Link und wähle ein neues Passwort: %(base_url)s"
|
||||
"%(password_reset_url)s Solltest Du kein neues Passwort angefordert haben, "
|
||||
"dann ignoriere diese E-Mail.<br/>\n"
|
||||
"Dankeschön!\n"
|
||||
"Falls Du kein neues Passwort angefragt hast, kannst Du diese E-mail "
|
||||
"ignorieren."
|
||||
|
||||
msgid "Otherwise, click here to reset your password."
|
||||
msgstr "Andernfalls klicke hier, um Dein Passwort zurückzusetzen."
|
||||
|
||||
msgid "Thank you!"
|
||||
msgstr "Dankeschön!"
|
||||
|
||||
msgid "Virtual Machine Cancellation"
|
||||
msgstr "VM Kündigung"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You're receiving this email because you requested a password reset for your "
|
||||
"user account at %(site_name)s.\n"
|
||||
"Please go to the following page and choose a new password: %(base_url)s"
|
||||
"%(password_reset_url)s\n"
|
||||
"If you didn't request a new password, ignore this e-mail.\n"
|
||||
"Thank you!\n"
|
||||
"You are receiving this email because your virutal machine <strong>"
|
||||
"%(vm_name)s</strong> has been cancelled."
|
||||
msgstr ""
|
||||
"Du erhälst diese E-Mail da Du Dein Passwort für Deinen Account bei "
|
||||
"%(site_name)s zurücksetzen möchtest.\n"
|
||||
"Bitte folge diesem Link und wähle ein neues Passwort: %(base_url)s"
|
||||
"%(password_reset_url)s Solltest Du kein neues Passwort angefordert haben, "
|
||||
"dann ignoriere diese E-Mail.\n"
|
||||
"Dankeschön!\n"
|
||||
"Du erhälst diese E-Mail, da deine virtuelle Maschine <strong>%(vm_name)s</"
|
||||
"strong> gekündigt wurde."
|
||||
|
||||
msgid "You can always order a new VM by clicking the button below."
|
||||
msgstr ""
|
||||
"Du kannst einfach eine neue VM bestellen, indem Du den Knopf weiter unten "
|
||||
"drückst."
|
||||
|
||||
msgid "CREATE VM"
|
||||
msgstr "NEUE VM"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You're receiving this mail because your virtual machine [%(vm_name)s] has "
|
||||
"been cancelled.<br/>\n"
|
||||
"You can see your order status by clicking [my VM page] below.<br/>\n"
|
||||
"If you want to order a new virtual machine, you can do it by clicking <a "
|
||||
"href=\"%(base_url)s%(my_virtual_machines_url)s\">this link</a>.<br/>\n"
|
||||
"You are receiving this email because your virutal machine %(vm_name)s has "
|
||||
"been cancelled."
|
||||
msgstr ""
|
||||
"Du erhälst diese E-Mail, Da Deine virtuelle Maschine [%(vm_name)s] gekündigt "
|
||||
"wurde.<br/>\n"
|
||||
"Um Deinen Auftragsstatus zu sehen, klicke auf die [my VM page] unten.<br/>\n"
|
||||
"Falls Du eine neue virtuelle Maschine bestellen möchtest, kannst Du dies "
|
||||
"tun, indem Du <a href=\"%(base_url)s%(my_virtual_machines_url)s\">diesen "
|
||||
"Link klickst</a>.<br/>\n"
|
||||
"Du erhälst diese E-Mail, da deine virtuelle Maschine %(vm_name)s gekündigt "
|
||||
"wurde."
|
||||
|
||||
msgid "My VM page"
|
||||
msgid "You can always order a new VM by following the link below."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You're receiving this mail because your virtual machine [%(vm_name)s] has "
|
||||
"been cancelled.\n"
|
||||
"You can see your order status by clicking here\n"
|
||||
"%(base_url)s%(vm_order_url)s\n"
|
||||
"If you want to order a new virtual machine, you can do it by clicking this "
|
||||
"link.\n"
|
||||
"%(base_url)s%(my_virtual_machines_url)s\n"
|
||||
msgstr ""
|
||||
"Du erhälst diese E-Mail, da Deine virtuelle Maschine [%(vm_name)s] gekündigt "
|
||||
"wurde.\n"
|
||||
"Um Deinen Auftragsstatus zu sehen, klicke hier.\n"
|
||||
"%(base_url)s%(vm_order_url)s\n"
|
||||
"Falls Du eine neue virtuelle Maschine bestellen möchtest, kannst Du dies "
|
||||
"tun, indem Du diesen Link klickst.\n"
|
||||
"%(base_url)s%(my_virtual_machines_url)s\n"
|
||||
|
||||
msgid "Toggle navigation"
|
||||
msgstr "Umschalten"
|
||||
|
||||
|
@ -297,13 +283,16 @@ msgstr "Dashboard"
|
|||
msgid "Logout"
|
||||
msgstr "Abmelden"
|
||||
|
||||
msgid "Don't have an account yet ? "
|
||||
msgid "Log in"
|
||||
msgstr "Anmelden"
|
||||
|
||||
msgid "Don't have an account yet ?"
|
||||
msgstr "Besitzt du kein Benutzerkonto?"
|
||||
|
||||
msgid "Sign up"
|
||||
msgstr "Registrieren"
|
||||
|
||||
msgid "Forgot your password ? "
|
||||
msgid "Forgot your password ?"
|
||||
msgstr "Passwort vergessen?"
|
||||
|
||||
msgid "Resend activation link"
|
||||
|
@ -331,12 +320,15 @@ msgstr "Alle Benachrichtigungen"
|
|||
msgid "%(page_header_text)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invoice Date"
|
||||
msgstr "Rechnung Datum"
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
|
||||
msgid "Terminated"
|
||||
msgstr "Beendet"
|
||||
|
||||
msgid "Approved"
|
||||
msgstr "Akzeptiert"
|
||||
|
||||
|
@ -352,12 +344,18 @@ msgstr "Bezahlmethode"
|
|||
msgid "ending in"
|
||||
msgstr "endend in"
|
||||
|
||||
msgid "Credit Card"
|
||||
msgstr "Kreditkarte"
|
||||
|
||||
msgid "Order summary"
|
||||
msgstr "Bestellungsübersicht"
|
||||
|
||||
msgid "Product"
|
||||
msgstr "Produkt"
|
||||
|
||||
msgid "Period"
|
||||
msgstr "Periode"
|
||||
|
||||
msgid "Cores"
|
||||
msgstr "Prozessorkerne"
|
||||
|
||||
|
@ -390,15 +388,18 @@ msgstr "Abarbeitung..."
|
|||
msgid "Hold tight, we are processing your request"
|
||||
msgstr "Bitte warten - wir bearbeiten Deine Anfrage gerade"
|
||||
|
||||
msgid "OK"
|
||||
msgstr ""
|
||||
|
||||
msgid "Close"
|
||||
msgstr "Schliessen"
|
||||
|
||||
msgid "Some problem encountered. Please try again later."
|
||||
msgstr "Ein Problem ist aufgetreten. Bitte versuche es später noch einmal."
|
||||
|
||||
msgid "Order Nr."
|
||||
msgstr "Bestellung Nr."
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Betrag"
|
||||
|
||||
|
@ -423,19 +424,11 @@ msgstr "inkl. Mehrwertsteuer"
|
|||
msgid "Billing Address"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
msgid "Credit Card"
|
||||
msgstr "Kreditkarte"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" Please fill in your credit card information "
|
||||
"below. We are using <a\n"
|
||||
" href=\"https://stripe.com\" target="
|
||||
"\"_blank\">Stripe</a> for payment and do not store\n"
|
||||
" your information in our database.\n"
|
||||
" "
|
||||
"Please fill in your credit card information below. We are using <a href="
|
||||
"\"https://stripe.com\" target=\"_blank\">Stripe</a> for payment and do not "
|
||||
"store your information in our database."
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Bitte füll Deine Kreditkarteninformationen unten aus. Wir nutzen <a href="
|
||||
"\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und "
|
||||
"speichern keine Informationen in unserer Datenbank."
|
||||
|
@ -447,8 +440,8 @@ msgstr ""
|
|||
"Es wird noch keine Bezahlung vorgenommen. Die Bezahlung wird erst ausgelöst, "
|
||||
"nachdem Du die Bestellung auf der nächsten Seite bestätigt hast."
|
||||
|
||||
msgid "Submit"
|
||||
msgstr "Absenden"
|
||||
msgid "SUBMIT"
|
||||
msgstr "ABSENDEN"
|
||||
|
||||
msgid "Card Number"
|
||||
msgstr "Kreditkartennummer"
|
||||
|
@ -468,7 +461,10 @@ msgstr "Weiter"
|
|||
msgid "Enter your credit card number"
|
||||
msgstr "Deine Kreditkartennummer"
|
||||
|
||||
msgid "Reset your password"
|
||||
msgid "Submit"
|
||||
msgstr "Absenden"
|
||||
|
||||
msgid "Password reset"
|
||||
msgstr "Passwort zurücksetzen"
|
||||
|
||||
msgid "UPDATE"
|
||||
|
@ -599,16 +595,13 @@ msgstr "Deine Virtuelle Maschine beenden"
|
|||
msgid "Do you want to cancel your Virtual Machine"
|
||||
msgstr "Bist Du sicher, dass Du Deine virtuelle Maschine beenden willst"
|
||||
|
||||
msgid "OK"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Your Virtual Machine <strong>%(machine_name)s</strong> is successfully "
|
||||
"terminated!"
|
||||
msgstr ""
|
||||
"Deine Virtuelle Machine (VM) <strong>%(machine_name)s</strong> wurde erfolgreich "
|
||||
"beendet!"
|
||||
"Deine Virtuelle Machine (VM) <strong>%(machine_name)s</strong> wurde "
|
||||
"erfolgreich beendet!"
|
||||
|
||||
msgid "Virtual Machines"
|
||||
msgstr "Virtuelle Maschinen"
|
||||
|
@ -616,14 +609,15 @@ msgstr "Virtuelle Maschinen"
|
|||
msgid "To create a new virtual machine, click \"Create VM\""
|
||||
msgstr "Um eine neue VM zu erzeugen, klicke \"Neue VM erzeugen\""
|
||||
|
||||
msgid "CREATE VM"
|
||||
msgstr "NEUE VM"
|
||||
|
||||
msgid "View Detail"
|
||||
msgstr "Details anzeigen"
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To access your VM, <a href=\"%(create_ssh_url)s\">add your SSH key here</a>"
|
||||
msgstr ""
|
||||
"Um auf Deine VM zuzugreifen, <a href=\"%(create_ssh_url)s\">füge Deinen SSH-"
|
||||
"Key hinzu</a>"
|
||||
|
||||
msgid "login"
|
||||
msgstr "Einloggen"
|
||||
msgstr "anmelden"
|
||||
|
||||
msgid ""
|
||||
"Thank you for signing up. We have sent an email to you. Please follow the "
|
||||
|
@ -646,6 +640,9 @@ msgstr "Dein Account wurde aktiviert."
|
|||
msgid "You can now"
|
||||
msgstr "Du kannst dich nun"
|
||||
|
||||
msgid "Welcome to Data Center Light!"
|
||||
msgstr "Willkommen beim Data Center Light!"
|
||||
|
||||
msgid "Sorry. Your request is invalid."
|
||||
msgstr "Entschuldigung, deine Anfrage ist ungültig."
|
||||
|
||||
|
@ -673,6 +670,16 @@ msgid "In order to create a VM, you need to create/upload your SSH KEY first."
|
|||
msgstr ""
|
||||
"Um eine VM zu erstellen musst du zuerst einen SSH-Key erstellen / hochladen."
|
||||
|
||||
msgid "Error."
|
||||
msgstr "Fehler"
|
||||
|
||||
msgid ""
|
||||
"There was a payment related error. On close of this popup, you will be "
|
||||
"redirected back to the payment page."
|
||||
msgstr ""
|
||||
"Es ist ein Fehler bei der Zahlung betreten. Du wirst nach dem Schliessen vom "
|
||||
"Popup zur Bezahlseite weitergeleitet"
|
||||
|
||||
msgid "Thank you for the order."
|
||||
msgstr "Danke für Deine Bestellung."
|
||||
|
||||
|
@ -697,17 +704,32 @@ msgid ""
|
|||
"contact Data Center Light Support."
|
||||
msgstr "Kontaktiere den Data Center Light Support."
|
||||
|
||||
msgid "Terminated"
|
||||
msgstr "Beendet"
|
||||
msgid ""
|
||||
"We could not find the requested VM. Please contact Data Center Light Support."
|
||||
msgstr ""
|
||||
"Wir konnten die gesucht VM nicht finden. Kontaktiere den Data Center Light "
|
||||
"Support."
|
||||
|
||||
msgid "Error terminating VM"
|
||||
msgstr "Fehler beenden VM"
|
||||
|
||||
msgid "Virtual Machine Cancellation"
|
||||
msgstr "VM Kündigung"
|
||||
#, python-format
|
||||
msgid "Virtual Machine %(vm_name)s Cancelled"
|
||||
msgstr "Virtuelle Maschine %(vm_name)s Kündigung"
|
||||
|
||||
#~ msgid "Close"
|
||||
#~ msgstr "Schliessen"
|
||||
msgid "There was an error processing your request. Please try again."
|
||||
msgstr ""
|
||||
"Es gab einen Fehler bei der Bearbeitung Deine Anfrage. Bitte versuche es "
|
||||
"noch einmal."
|
||||
|
||||
#~ msgid "Reset your password"
|
||||
#~ msgstr "Passwort zurücksetzen"
|
||||
|
||||
#~ msgid "My VM page"
|
||||
#~ msgstr "Meine VM page"
|
||||
|
||||
#~ msgid "Invoice Date"
|
||||
#~ msgstr "Rechnung Datum"
|
||||
|
||||
#~ msgid "VM %(VM_ID)s terminated successfully"
|
||||
#~ msgstr "VM %(VM_ID)s erfolgreich beendet"
|
||||
|
@ -733,12 +755,27 @@ msgstr "VM Kündigung"
|
|||
#~ msgid "Start VM"
|
||||
#~ msgstr "VM jetzt starten"
|
||||
|
||||
#~ msgid "View Invoice"
|
||||
#~ msgstr "Zur Rechnung"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You're receiving this mail because your virtual machine [%(vm_name)s] has "
|
||||
#~ "been cancelled.<br/>\n"
|
||||
#~ "You can see your order status by clicking [my VM page] below.<br/>\n"
|
||||
#~ "If you want to order a new virtual machine, you can do it by clicking <a "
|
||||
#~ "href=\"%(base_url)s%(my_virtual_machines_url)s\">this link</a>.<br/>\n"
|
||||
#~ msgstr ""
|
||||
#~ "Du erhälst diese E-Mail, da deine virtuelle Maschine [%(vm_name)s] "
|
||||
#~ "gekündigt wurde.<br/>\n"
|
||||
#~ "Um deinen Auftragsstatus zu sehen, klicke auf die [my VM page] unten.<br/"
|
||||
#~ ">\n"
|
||||
#~ "Falls du eine neue virtuelle Maschine bestellen möchtest, kannst du dies "
|
||||
#~ "tun, indem du <a href=\"%(base_url)s%(my_virtual_machines_url)s\">diesen "
|
||||
#~ "Link klickst</a>.<br/>\n"
|
||||
|
||||
#~ msgid "Finish Configuration"
|
||||
#~ msgstr "Konfiguration beenden"
|
||||
|
||||
#~ msgid "Your New VM %(vm_name)s at Data Center Light"
|
||||
#~ msgstr "Deine neue VM %(vm_name)s bei Data Center Light"
|
||||
|
||||
#~ msgid "My Virtual Machines"
|
||||
#~ msgstr "Meine virtuellen Maschinen"
|
||||
|
||||
|
@ -796,9 +833,6 @@ msgstr "VM Kündigung"
|
|||
#~ msgid "Keys"
|
||||
#~ msgstr "Keys"
|
||||
|
||||
#~ msgid "Log in"
|
||||
#~ msgstr "Anmelden"
|
||||
|
||||
#~ msgid "You haven been logged out"
|
||||
#~ msgstr "Du wurdest abgemeldet"
|
||||
|
||||
|
@ -842,5 +876,5 @@ msgstr "VM Kündigung"
|
|||
#~ "Your SSH private key was already generated and downloaded, if you lost "
|
||||
#~ "it, contact us. "
|
||||
#~ msgstr ""
|
||||
#~ "Dein privater SSH Key wurde bereits generiert und heruntergeladen. "
|
||||
#~ "Falls Du ihn verloren hast, kontaktiere uns."
|
||||
#~ "Dein privater SSH Key wurde bereits generiert und heruntergeladen. Falls "
|
||||
#~ "Du ihn verloren hast, kontaktiere uns."
|
||||
|
|
34
hosting/migrations/0043_vmdetail.py
Normal file
|
@ -0,0 +1,34 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-09-24 18:12
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('hosting', '0042_hostingorder_subscription_id'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='VMDetail',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('vm_id', models.IntegerField(default=0)),
|
||||
('disk_size', models.FloatField(default=0.0)),
|
||||
('cores', models.FloatField(default=0.0)),
|
||||
('memory', models.FloatField(default=0.0)),
|
||||
('configuration', models.CharField(default='', max_length=25)),
|
||||
('ipv4', models.TextField(default='')),
|
||||
('ipv6', models.TextField(default='')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('terminated_at', models.DateTimeField(null=True)),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
]
|
|
@ -1,7 +1,9 @@
|
|||
import os
|
||||
import logging
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
from django.utils.functional import cached_property
|
||||
from Crypto.PublicKey import RSA
|
||||
from membership.models import StripeCustomer, CustomUser
|
||||
|
@ -88,19 +90,19 @@ class HostingOrder(AssignPermissionsMixin, models.Model):
|
|||
self.cc_brand = stripe_charge.source.brand
|
||||
self.save()
|
||||
|
||||
def set_subscription_id(self, subscription_object, cc_details):
|
||||
def set_subscription_id(self, subscription_id, cc_details):
|
||||
"""
|
||||
When creating a Stripe subscription, we have subscription id.
|
||||
We store this in the subscription_id field.
|
||||
This method sets the subscription id from subscription_object
|
||||
and also the last4 and credit card brands used for this order.
|
||||
This method sets the subscription id
|
||||
and the last4 and credit card brands used for this order.
|
||||
|
||||
:param subscription_object: Stripe's subscription object
|
||||
:param subscription_id: Stripe's subscription id
|
||||
:param cc_details: A dict containing card details
|
||||
{last4, brand}
|
||||
:return:
|
||||
"""
|
||||
self.subscription_id = subscription_object.id
|
||||
self.subscription_id = subscription_id
|
||||
self.last4 = cc_details.get('last4')
|
||||
self.cc_brand = cc_details.get('brand')
|
||||
self.save()
|
||||
|
@ -159,3 +161,22 @@ class HostingBill(AssignPermissionsMixin, models.Model):
|
|||
instance = cls.objects.create(customer=customer,
|
||||
billing_address=billing_address)
|
||||
return instance
|
||||
|
||||
|
||||
class VMDetail(models.Model):
|
||||
user = models.ForeignKey(CustomUser)
|
||||
vm_id = models.IntegerField(default=0)
|
||||
disk_size = models.FloatField(default=0.0)
|
||||
cores = models.FloatField(default=0.0)
|
||||
memory = models.FloatField(default=0.0)
|
||||
configuration = models.CharField(default='', max_length=25)
|
||||
ipv4 = models.TextField(default='')
|
||||
ipv6 = models.TextField(default='')
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
terminated_at = models.DateTimeField(null=True)
|
||||
|
||||
def end_date(self):
|
||||
end_date = self.terminated_at if self.terminated_at else timezone.now()
|
||||
months = relativedelta(end_date, self.created_at).months or 1
|
||||
end_date = self.created_at + relativedelta(months=months, days=-1)
|
||||
return end_date
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
}
|
||||
|
||||
.content-dashboard{
|
||||
min-height: calc(100vh - 70px);
|
||||
min-height: calc(100vh - 60px);
|
||||
width: 80%;
|
||||
margin: 0 auto;
|
||||
max-width: 1120px;
|
||||
|
@ -66,7 +66,9 @@
|
|||
width: 280px;
|
||||
}
|
||||
.content-dashboard {
|
||||
width: 90%;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
.btn:focus, .btn:active:focus {
|
||||
|
@ -296,10 +298,6 @@
|
|||
max-width: 360px;
|
||||
}
|
||||
|
||||
.btn-wide {
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
.caps-link {
|
||||
font-weight: 600;
|
||||
color: #8da4c0;
|
||||
|
@ -376,3 +374,11 @@
|
|||
color: #999;
|
||||
fill: #999;
|
||||
}
|
||||
|
||||
.locale_date {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.locale_date.done{
|
||||
opacity: 1;
|
||||
}
|
|
@ -17,9 +17,11 @@ h3,
|
|||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
/*font-family: 'Lato-Regular', sans-serif;*/
|
||||
font-family: 'Lato', sans-serif;
|
||||
/*font-weight: 300;*/
|
||||
}
|
||||
|
||||
.allcaps {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.topnav {
|
||||
|
@ -31,6 +33,11 @@ h6 {
|
|||
.navbar-brand {
|
||||
padding: 10px 15px;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.navbar-brand {
|
||||
padding: 10px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-default {
|
||||
background: #fff;
|
||||
|
@ -46,7 +53,7 @@ h6 {
|
|||
.navbar-transparent {
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding: 20px;
|
||||
padding: 20px 0;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
|
@ -72,7 +79,6 @@ h6 {
|
|||
.navbar-transparent #logoWhite{
|
||||
display: block;
|
||||
width: 220px;
|
||||
/* color: #fff; */
|
||||
}
|
||||
|
||||
.navbar-right .highlights-dropdown .dropdown-menu {
|
||||
|
@ -92,16 +98,6 @@ h6 {
|
|||
border-color: #e7e7e7;
|
||||
box-shadow: -8px 14px 20px -5px rgba(77, 77, 77, 0.5);
|
||||
}
|
||||
/* .navbar-right .highlights-dropdown .dropdown-menu:before {
|
||||
content: '';
|
||||
display: block;
|
||||
height: 1px;
|
||||
background: #e7e7e7;
|
||||
position: absolute;
|
||||
top: -1px;
|
||||
left: -1px;
|
||||
right: -1px;
|
||||
} */
|
||||
}
|
||||
.navbar-right .highlights-dropdown .dropdown-menu > li > a{
|
||||
font-size: 13px;
|
||||
|
@ -274,16 +270,15 @@ h6 {
|
|||
|
||||
/*------Auth section---------*/
|
||||
.auth-container {
|
||||
min-height: calc(100vh - 120px);
|
||||
min-height: calc(100vh - 180px);
|
||||
position: relative;
|
||||
/* flex-grow: 1; */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.auth-bg {
|
||||
background: url(../img/auth-bg-sm.jpg);
|
||||
background: url(../img/pattern.jpg) no-repeat center center;
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
|
@ -293,7 +288,6 @@ h6 {
|
|||
background-position: center center;
|
||||
background-size: cover;
|
||||
background-attachment: fixed;
|
||||
|
||||
}
|
||||
|
||||
.auth-bg::before {
|
||||
|
@ -303,7 +297,7 @@ h6 {
|
|||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: rgba(75, 75, 101, 0.55);
|
||||
background: rgba(90, 116, 175, 0.7);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
|
@ -313,69 +307,38 @@ h6 {
|
|||
|
||||
.auth-container .auth-content {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
max-width: 390px;
|
||||
margin: 0 auto 15px;
|
||||
max-width: 400px;
|
||||
padding: 0 15px;
|
||||
}
|
||||
|
||||
.auth-container .auth-center {
|
||||
/* position: absolute; */
|
||||
/* left: 50%; */
|
||||
/* top: 50%; */
|
||||
/* transform: translate(-50%, -50%); */
|
||||
/* width: 100%; */
|
||||
}
|
||||
|
||||
.auth-container .auth-title {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
.auth-container .auth-title h2 {
|
||||
color: #fff;
|
||||
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-container .auth-content.wide {
|
||||
max-width: 480px;
|
||||
}
|
||||
|
||||
.auth-box {
|
||||
position: relative;
|
||||
background: #fff;
|
||||
padding: 0;
|
||||
padding-bottom: 30px;
|
||||
padding: 40px 20px 20px;
|
||||
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;
|
||||
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.09), 0 5px 5px rgba(0, 0, 0, 0.23);
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.auth-box .section-heading {
|
||||
color: #5a5a5a;
|
||||
padding-top: 30px;
|
||||
padding-bottom: 5px;
|
||||
font-weight: 300;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 3px;
|
||||
font-size: 20px;
|
||||
letter-spacing: 1px;
|
||||
font-size: 36px;
|
||||
border-radius: 3px 3px 0px 0px;
|
||||
margin: 0 auto;
|
||||
margin: 0 auto 10px;
|
||||
}
|
||||
|
||||
.auth-box .form {
|
||||
padding: 20px;
|
||||
width: 80%;
|
||||
margin: 0 auto;
|
||||
max-width: 360px;
|
||||
}
|
||||
|
||||
.auth-box .form .red {
|
||||
|
@ -383,27 +346,56 @@ h6 {
|
|||
}
|
||||
|
||||
.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;
|
||||
letter-spacing: 2px;
|
||||
font-size: 16px;
|
||||
padding: 6px 12px;
|
||||
min-width: 140px;
|
||||
margin-top: 15px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.auth-box .form .form-control {
|
||||
height: 44px;
|
||||
font-size: 16px;
|
||||
height: 48px;
|
||||
font-size: 14px;
|
||||
padding: 10px 17px;
|
||||
line-height: 30px;
|
||||
border-color: #aaa;
|
||||
}
|
||||
|
||||
.auth-box .form .form-control:focus,
|
||||
.auth-box .form .form-control:active {
|
||||
box-shadow: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.auth-box .form-control::-webkit-input-placeholder {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.auth-box .form-control:-moz-placeholder{
|
||||
/* Firefox 18- */
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.auth-box .form-control::-moz-placeholder{
|
||||
/* Firefox 19+ */
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.auth-box .form-control:-ms-input-placeholder {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.auth-box .auth-footer {
|
||||
text-align: center;
|
||||
padding: 10px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.auth-box .auth-footer .text {
|
||||
.auth-box .auth-footer {
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.auth-box .auth-footer .links a {
|
||||
.auth-box .auth-footer a {
|
||||
color: #1e94cc;
|
||||
}
|
||||
|
||||
|
@ -411,20 +403,11 @@ h6 {
|
|||
color: #1e94cc;
|
||||
}
|
||||
|
||||
.auth-box.sign-up {
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.auth-box.sign-up .form {
|
||||
padding: 15px 20px 0 20px;
|
||||
}
|
||||
|
||||
.sign-up-message {
|
||||
padding: 25px 30px 25px 30px;
|
||||
text-align: center;
|
||||
font-size: 18px;
|
||||
line-height: 30px;
|
||||
/*font-family: 'Lato' !important;*/
|
||||
font-weight: 300 !important;
|
||||
}
|
||||
|
||||
|
@ -458,16 +441,7 @@ h6 {
|
|||
}
|
||||
|
||||
.auth-box .form {
|
||||
padding: 15px 0px 0 0;
|
||||
}
|
||||
|
||||
.auth-box.sign-up .form {
|
||||
padding: 15px 0px 0 0;
|
||||
}
|
||||
|
||||
.auth-box .form .form-control {
|
||||
height: 44px;
|
||||
font-size: 13px;
|
||||
padding: 15px 0 15px 0;
|
||||
}
|
||||
|
||||
.auth-container .auth-title {
|
||||
|
@ -476,7 +450,7 @@ h6 {
|
|||
}
|
||||
|
||||
.auth-box .msg-list {
|
||||
padding: 15px 25px 5px;
|
||||
padding: 20px 25px 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
@ -493,19 +467,14 @@ h6 {
|
|||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
.auth-box .form {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
.auth-box .section-heading {
|
||||
font-size: 15px;
|
||||
font-size: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
footer {
|
||||
padding: 20px;
|
||||
padding: 20px 0;
|
||||
background-color: #f8f8f8;
|
||||
/* position: absolute */
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
|
@ -537,7 +506,6 @@ a.unlink:hover {
|
|||
|
||||
/***** DCL payment page **********/
|
||||
.dcl-order-container {
|
||||
/*font-family: Lato;*/
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
|
@ -580,9 +548,7 @@ a.unlink:hover {
|
|||
}
|
||||
|
||||
.dcl-place-order-text{
|
||||
/* font-size: 13px; */
|
||||
color: #808080;
|
||||
/* margin-bottom: 15px; */
|
||||
}
|
||||
|
||||
.dcl-order-table-total .tbl-total {
|
||||
|
@ -610,7 +576,6 @@ a.unlink:hover {
|
|||
}
|
||||
|
||||
.card-warning-content {
|
||||
/*font-family: Lato;*/
|
||||
font-weight: 300;
|
||||
border: 1px solid #a1a1a1;
|
||||
border-radius: 3px;
|
||||
|
@ -638,25 +603,12 @@ a.unlink:hover {
|
|||
right: 0;
|
||||
}
|
||||
|
||||
.brand {
|
||||
}
|
||||
|
||||
.brand #brand-icon {
|
||||
}
|
||||
|
||||
.card-number-element {
|
||||
}
|
||||
|
||||
.card-expiry-element {
|
||||
}
|
||||
|
||||
.card-cvc-element label {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.card-element {
|
||||
margin-bottom: 10px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.card-element label{
|
||||
|
@ -736,9 +688,6 @@ a.unlink:hover {
|
|||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.brand {
|
||||
}
|
||||
|
||||
.card-expiry-element {
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
@ -803,10 +752,23 @@ a.unlink:hover {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
.footer-light a:hover, .footer-light a:focus, .footer-light a:active {
|
||||
.footer-light {
|
||||
position: relative;
|
||||
}
|
||||
.footer-light footer {
|
||||
background: transparent;
|
||||
color: #eee;
|
||||
}
|
||||
.footer-light a,
|
||||
.footer-light .text-muted {
|
||||
color: #ddd;
|
||||
}
|
||||
.footer-light a:hover, .footer-light a:focus, .footer-light a:active {
|
||||
color: #fff;
|
||||
}
|
||||
.footer-vm p.copyright {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.visible-mobile {
|
||||
display: none !important;
|
||||
|
@ -857,6 +819,8 @@ a.list-group-item-danger:focus,
|
|||
background: rgba(235, 204, 209, 0.2);
|
||||
}
|
||||
.has-error .form-control,
|
||||
.has-error .form-control:focus,
|
||||
.has-error .form-control:active,
|
||||
.has-error .input-group-addon {
|
||||
color: #eb4d5c;
|
||||
border-color: #eb4d5c;
|
||||
|
@ -871,6 +835,13 @@ a.list-group-item-danger.active:focus {
|
|||
background-color: #eb4d5c;
|
||||
}
|
||||
|
||||
/* bootstrap input box-shadom disable */
|
||||
.has-error .form-control:focus,
|
||||
.has-error .form-control:active,
|
||||
.has-success .form-control:focus,
|
||||
.has-success .form-control:active {
|
||||
box-shadow: inset 0 0 1px rgba(0,0,0,0.25);
|
||||
}
|
||||
.checkmark {
|
||||
display: inline-block;
|
||||
}
|
||||
|
|
|
@ -22,7 +22,99 @@
|
|||
}
|
||||
|
||||
.summary-box .content {
|
||||
|
||||
padding-top: 15px;
|
||||
|
||||
}
|
||||
|
||||
/* landing page payment new style */
|
||||
.last-p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.dcl-payment-section {
|
||||
max-width: 391px;
|
||||
margin: 0 auto 30px;
|
||||
padding: 0 10px 30px;
|
||||
border-bottom: 1px solid #edebeb;
|
||||
height: 100%;
|
||||
}
|
||||
.dcl-payment-section hr{
|
||||
margin-top: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.dcl-payment-section .top-hr {
|
||||
margin-left: -10px;
|
||||
}
|
||||
.dcl-payment-section h3 {
|
||||
font-weight: 600;
|
||||
}
|
||||
.dcl-payment-section p {
|
||||
/*padding: 0 5px;*/
|
||||
font-weight: 400;
|
||||
}
|
||||
.dcl-payment-section .card-warning-content {
|
||||
padding: 8px 10px;
|
||||
font-weight: 300;
|
||||
}
|
||||
.dcl-payment-order strong{
|
||||
font-size: 17px;
|
||||
}
|
||||
.dcl-payment-order p {
|
||||
font-weight: 300;
|
||||
}
|
||||
.dcl-payment-section .form-group {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.dcl-payment-section .form-control {
|
||||
box-shadow: none;
|
||||
padding: 6px 12px;
|
||||
height: 32px;
|
||||
}
|
||||
.dcl-payment-user {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.dcl-payment-user h4 {
|
||||
font-weight: 600;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.dcl-payment-grid {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.dcl-payment-box {
|
||||
width: 50%;
|
||||
position: relative;
|
||||
padding: 0 30px;
|
||||
}
|
||||
.dcl-payment-box:nth-child(2) {
|
||||
order: 1;
|
||||
}
|
||||
.dcl-payment-box:nth-child(4) {
|
||||
order: 2;
|
||||
}
|
||||
.dcl-payment-section {
|
||||
padding: 15px 10px;
|
||||
margin-bottom: 0;
|
||||
border-bottom-width: 5px;
|
||||
}
|
||||
.dcl-payment-box:nth-child(2n) .dcl-payment-section {
|
||||
border-bottom: none;
|
||||
}
|
||||
.dcl-payment-box:nth-child(1):after,
|
||||
.dcl-payment-box:nth-child(2):after {
|
||||
content: ' ';
|
||||
display: block;
|
||||
background: #eee;
|
||||
width: 1px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
z-index: 2;
|
||||
top: 20px;
|
||||
bottom: 20px;
|
||||
}
|
||||
}
|
|
@ -618,9 +618,8 @@
|
|||
left: 8px;
|
||||
}
|
||||
.table-switch .last-td {
|
||||
position: absolute;
|
||||
bottom: 13px;
|
||||
right: 0;
|
||||
padding-top: 12px;
|
||||
text-align: right;
|
||||
}
|
||||
.table-switch tbody tr .xs-td-inline {
|
||||
text-align: right;
|
||||
|
|
BIN
hosting/static/hosting/img/pattern.jpg
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
hosting/static/hosting/img/pattern_original.jpg
Normal file
After Width: | Height: | Size: 181 KiB |
|
@ -49,7 +49,7 @@ $(document).ready(function () {
|
|||
|
||||
|
||||
var hasCreditcard = window.hasCreditcard || false;
|
||||
if (!hasCreditcard) {
|
||||
if (!hasCreditcard && window.stripeKey) {
|
||||
var stripe = Stripe(window.stripeKey);
|
||||
var element_style = {
|
||||
fonts: [{
|
||||
|
@ -88,31 +88,6 @@ $(document).ready(function () {
|
|||
}
|
||||
}
|
||||
};
|
||||
var credit_card_cvv_style = {
|
||||
base: {
|
||||
iconColor: '#666EE8',
|
||||
color: '#31325F',
|
||||
lineHeight: '25px',
|
||||
fontWeight: 300,
|
||||
fontFamily: "'lato-regular', sans-serif",
|
||||
fontSize: '14px',
|
||||
'::placeholder': {
|
||||
color: '#555'
|
||||
}
|
||||
},
|
||||
invalid: {
|
||||
iconColor: '#eb4d5c',
|
||||
color: '#eb4d5c',
|
||||
lineHeight: '25px',
|
||||
fontWeight: 300,
|
||||
fontFamily: "'lato-regular', sans-serif",
|
||||
fontSize: '14px',
|
||||
'::placeholder': {
|
||||
color: '#eb4d5c',
|
||||
fontWeight: 600
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var enter_ccard_text = "Enter your credit card number";
|
||||
if (typeof window.enter_your_card_text !== 'undefined') {
|
||||
|
@ -139,8 +114,6 @@ $(document).ready(function () {
|
|||
}
|
||||
});
|
||||
}
|
||||
console.log("has creditcard", hasCreditcard);
|
||||
// hasCreditcard= true;
|
||||
|
||||
var submit_form_btn = $('#payment_button_with_creditcard');
|
||||
submit_form_btn.on('click', submit_payment);
|
||||
|
@ -148,11 +121,7 @@ $(document).ready(function () {
|
|||
|
||||
function submit_payment(e) {
|
||||
e.preventDefault();
|
||||
console.log("creditcard sdasd");
|
||||
// if (hasCreditcard) {
|
||||
$('#billing-form').submit();
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -164,7 +133,6 @@ $(document).ready(function () {
|
|||
|
||||
function stripeTokenHandler(token) {
|
||||
// Insert the token ID into the form so it gets submitted to the server
|
||||
var form = document.getElementById('payment-form-new');
|
||||
$('#id_token').val(token.id);
|
||||
$('#billing-form').submit();
|
||||
}
|
||||
|
@ -227,13 +195,5 @@ $(document).ready(function () {
|
|||
$(element).closest('.form-group').append(error);
|
||||
}
|
||||
});
|
||||
// $form.find('[type=submit]').prop('disabled', true);
|
||||
// var readyInterval = setInterval(function() {
|
||||
// if (paymentFormReady()) {
|
||||
// $form.find('[type=submit]').prop('disabled', false);
|
||||
// clearInterval(readyInterval);
|
||||
// }
|
||||
// }, 250);
|
||||
|
||||
});
|
||||
|
||||
|
|
|
@ -86,23 +86,31 @@ $(document).ready(function() {
|
|||
url: create_vm_form.attr('action'),
|
||||
type: 'POST',
|
||||
data: create_vm_form.serialize(),
|
||||
init: function(){
|
||||
ok_btn = $('#createvm-modal-done-btn');
|
||||
close_btn = $('#createvm-modal-close-btn');
|
||||
ok_btn.addClass('btn btn-success btn-ok btn-wide hide');
|
||||
close_btn.addClass('btn btn-danger btn-ok btn-wide hide');
|
||||
},
|
||||
success: function (data) {
|
||||
fa_icon = $('.modal-icon > .fa');
|
||||
modal_btn = $('#createvm-modal-done-btn');
|
||||
$('#createvm-modal-title').text(data.msg_title);
|
||||
$('#createvm-modal-body').html(data.msg_body);
|
||||
modal_btn.attr('href', data.redirect)
|
||||
.removeClass('hide');
|
||||
if (data.status === true) {
|
||||
fa_icon = $('.modal-icon > .fa');
|
||||
fa_icon.attr('class', 'checkmark');
|
||||
// $('.modal-header > .close').removeClass('hidden');
|
||||
$('#createvm-modal-title').text(data.msg_title);
|
||||
$('#createvm-modal-body').text(data.msg_body);
|
||||
$('#createvm-modal-done-btn')
|
||||
.attr('href', data.redirect)
|
||||
.removeClass('hide');
|
||||
} else {
|
||||
fa_icon.attr('class', 'fa fa-close');
|
||||
modal_btn.attr('class', '').addClass('btn btn-danger btn-ok btn-wide');
|
||||
}
|
||||
},
|
||||
error: function (xmlhttprequest, textstatus, message) {
|
||||
fa_icon = $('.modal-icon > .fa');
|
||||
fa_icon.attr('class', 'fa fa-close');
|
||||
if (typeof(create_vm_error_message) !== 'undefined') {
|
||||
$('#createvm-modal-text').text(create_vm_error_message);
|
||||
$('#createvm-modal-body').text(create_vm_error_message);
|
||||
}
|
||||
$('#btn-create-vm').prop('disabled', false);
|
||||
$('#createvm-modal-close-btn').removeClass('hide');
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
|
||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,500,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
|
||||
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon" />
|
||||
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon" />
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
|
@ -54,19 +54,18 @@
|
|||
{% include "hosting/includes/_navbar_user.html" %}
|
||||
{% endblock navbar %}
|
||||
|
||||
|
||||
<div class="content-dashboard">
|
||||
<div class="{% if request.user.is_authenticated %}content-dashboard{% endif %}">
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
{% if request.user.is_authenticated %}
|
||||
<footer class="footer-vm">
|
||||
<div class="container">
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
|
||||
</div>
|
||||
</footer>
|
||||
<footer class="footer-vm">
|
||||
<div class="container">
|
||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
|
||||
</div>
|
||||
</footer>
|
||||
{% else %}
|
||||
<div class="footer-light">
|
||||
{% include "datacenterlight/includes/_footer.html" %}
|
||||
|
|
|
@ -47,20 +47,5 @@
|
|||
window.location.href = '{{next_url}}';
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
window.onload = function () {
|
||||
{% for user_key in keys %}
|
||||
var locale_date = moment.utc(document.getElementById("ssh-created_at-{{user_key.id}}").textContent,'YYYY-MM-DD HH:mm').toDate();
|
||||
locale_date = moment(locale_date).format("YYYY-MM-DD h:mm:ss a");
|
||||
document.getElementById('ssh-created_at-{{user_key.id}}').innerHTML = locale_date;
|
||||
{% endfor %}
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
{%endblock%}
|
||||
|
||||
|
|
|
@ -1,21 +1,17 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3%}
|
||||
{% load i18n %}
|
||||
{% load staticfiles bootstrap3 i18n %}
|
||||
|
||||
{% block navbar %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% endblock navbar %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center">
|
||||
<div class="auth-title">
|
||||
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||
</div>
|
||||
<div class="auth-content">
|
||||
<div class="intro-message auth-box sign-up">
|
||||
<h2 class="section-heading">{% trans "Set your new password"%}</h2>
|
||||
<div class="auth-box sign-up">
|
||||
<h1 class="section-heading">{% trans "Set your new password" %}</h1>
|
||||
{% if messages %}
|
||||
<ul class="list-unstyled msg-list">
|
||||
{% for message in messages %}
|
||||
|
@ -28,23 +24,18 @@
|
|||
{% for field in form %}
|
||||
{% bootstrap_field field show_label=False %}
|
||||
{% endfor %}
|
||||
{% buttons %}
|
||||
<button type="submit" class="btn btn-block btn-success">
|
||||
{% trans "Reset"%}
|
||||
<div class="text-center">
|
||||
<button type="submit" class="btn choice-btn">
|
||||
{% trans "Reset" %}
|
||||
</button>
|
||||
{% endbuttons %}
|
||||
</div>
|
||||
</form>
|
||||
<div class="auth-footer">
|
||||
<div class="text">
|
||||
<span>{% trans "Already have an account ?"%}</span>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a>
|
||||
</div>
|
||||
<span>{% trans "Already have an account ?" %}</span>
|
||||
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
<div class="col-sm-5">
|
||||
<div class="dashboard-container-head">
|
||||
<h3 class="dashboard-title-thin"><img src="{% static 'hosting/img/plusVM.svg' %}" class="un-icon" style="margin-top: -18px;width: 42px;height: 42px;"> {% trans "Create VM" %}</h3>
|
||||
<p style="padding-left: 16px;">{% trans "Affordable VM hosting based in Switzerland" %}</p>
|
||||
{% if messages %}
|
||||
<div class="alert alert-warning">
|
||||
{% for message in messages %}
|
||||
|
|
|
@ -1,14 +1,51 @@
|
|||
{% extends "datacenterlight/emails/base_email_datacenterlight.html" %}
|
||||
{% load i18n %}
|
||||
{% block email_head %}{{page_header}}{% endblock %}
|
||||
{% block email_body %}
|
||||
{% url 'hosting:orders' order.id as order_url %}
|
||||
{% blocktrans with vm.name as vm_name %}You have ordered a new virtual machine!
|
||||
<br/>
|
||||
Your order of [{{vm_name}}] has been charged.<br/><br/>
|
||||
You can view your invoice by clicking the button below.<br/><br/>
|
||||
{% endblocktrans %}
|
||||
<div class="button" style="border-collapse: collapse; font-family: 'Lato', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 30px 0;" align="center">
|
||||
<a href="{{ base_url }}{{order_url}}" style="border-radius: 5px; color: #ffffff; display: inline-block; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; font-weight: regular; line-height: 45px; text-align: center; text-decoration: none !important; width: 155px; -webkit-text-size-adjust: none; mso-hide: all; background: #ff6f6f;">{% trans 'View Invoice' %}</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% load static i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% blocktrans %}Your New VM {{vm_name}}{% endblocktrans %}</title>
|
||||
<link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400">
|
||||
</head>
|
||||
|
||||
<body style="margin: 0; padding: 20px 0;">
|
||||
<table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;">
|
||||
<tr>
|
||||
<td>
|
||||
<img src="{{ base_url }}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 15px;">
|
||||
<h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% blocktrans %}Your New VM {{ vm_name }}{% endblocktrans %}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 25px; font-size: 16px;">
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}You have ordered a new virtual machine!{% endblocktrans %}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}Your order of <strong>{{ vm_name }}</strong> has been charged.{% endblocktrans %}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}You can view your VM detail by clicking the button below.{% endblocktrans %}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 30px;">
|
||||
<a class="btn" href="{{ base_url }}{{ order_url }}" style="font-family: Lato, Arial, sans-serif; text-decoration: none; background-color: #1596da; color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px; letter-spacing: 0.5px; border-radius: 3px; display: inline-block; position: relative;">{% trans "View Detail" %}</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 40px; padding-bottom: 25px;">
|
||||
<h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,11 +1,11 @@
|
|||
{% extends "datacenterlight/emails/base_email_datacenterlight.txt" %}
|
||||
{% load i18n %}
|
||||
{% block email_head %}{{page_header}}{% endblock %}
|
||||
{% block email_body %}
|
||||
{% url 'hosting:orders' order.id as order_url %}
|
||||
{% blocktrans with vm.name as vm_name %}You have ordered a new virtual machine!
|
||||
Your order of [{{vm_name}}] has been charged.
|
||||
You can view your invoice here.
|
||||
{% endblocktrans %}
|
||||
{{ base_url }}{{order_url}}
|
||||
{% endblock %}
|
||||
|
||||
{% blocktrans %}Your New VM {{vm_name}}{% endblocktrans %}
|
||||
|
||||
{% blocktrans %}You have ordered a new virtual machine!{% endblocktrans %}
|
||||
{% blocktrans %}Your order of {{vm_name}} has been charged.{% endblocktrans %}
|
||||
{% blocktrans %}You can view your VM detail by following the link below.{% endblocktrans %}
|
||||
|
||||
{{ base_url }}{{ order_url }}
|
||||
|
||||
{% trans "Your Data Center Light Team" %}
|
|
@ -1,14 +1,52 @@
|
|||
{% extends "datacenterlight/emails/base_email_datacenterlight.html" %}
|
||||
{% load i18n %}
|
||||
{% block email_head %}
|
||||
{% trans 'Password Reset' %}
|
||||
{% endblock %}
|
||||
{% block email_body %}
|
||||
{% url 'hosting:reset_password_confirm' uidb64=uid token=token as password_reset_url %}
|
||||
{% blocktrans %}
|
||||
You're receiving this email because you requested a password reset for your user account at {{site_name}}.<br/>
|
||||
Please go to the following page and choose a new password: {{base_url}}{{ password_reset_url }}<br/>
|
||||
If you didn't request a new password, ignore this e-mail.<br/>
|
||||
Thank you!
|
||||
{% endblocktrans %}
|
||||
{% endblock %}
|
||||
{% load static i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% trans "Password Reset" %}</title>
|
||||
<link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400">
|
||||
</head>
|
||||
|
||||
<body style="margin: 0; padding: 20px 0;">
|
||||
<table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;">
|
||||
<tr>
|
||||
<td>
|
||||
<img src="{{base_url}}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 15px;">
|
||||
<h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Password Reset" %}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 25px; font-size: 16px;">
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;">
|
||||
{% trans "We received a request to reset your password." %}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;">
|
||||
{% trans "If you didn't make this request you can safely ignore this email." %}
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;">
|
||||
{% trans "Otherwise, click here to reset your password." %}
|
||||
</p>
|
||||
<p style="color: #4382c8; line-height: 1.4; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% url 'hosting:reset_password_confirm' uidb64=uid token=token as password_reset_url %}
|
||||
{{base_url}}{{ password_reset_url }}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 0; margin-top: 10px;">
|
||||
{% trans "Thank you!" %}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 40px; padding-bottom: 25px;">
|
||||
<h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,11 +1,14 @@
|
|||
{% extends "datacenterlight/emails/base_email_datacenterlight.txt" %}
|
||||
{% load i18n %}
|
||||
{% block email_head %}{% trans 'Password Reset' %}{% endblock %}
|
||||
{% block email_body %}
|
||||
|
||||
{% trans "Password Reset" %}
|
||||
|
||||
{% trans "We received a request to reset your password." %}
|
||||
{% trans "If you didn't make this request you can safely ignore this email." %}
|
||||
{% trans "Otherwise, click here to reset your password." %}
|
||||
|
||||
{% url 'hosting:reset_password_confirm' uidb64=uid token=token as password_reset_url %}
|
||||
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{site_name}}.
|
||||
Please go to the following page and choose a new password: {{base_url}}{{ password_reset_url }}
|
||||
If you didn't request a new password, ignore this e-mail.
|
||||
Thank you!
|
||||
{% endblocktrans %}
|
||||
{% endblock %}
|
||||
{{base_url}}{{ password_reset_url }}
|
||||
|
||||
{% trans "Thank you!" %}
|
||||
|
||||
{% trans "Your Data Center Light Team" %}
|
||||
|
|
|
@ -1,15 +1,49 @@
|
|||
{% extends "datacenterlight/emails/base_email_datacenterlight.html" %}
|
||||
{% load i18n %}
|
||||
{% block email_head %}{{page_header}}{% endblock %}
|
||||
{% block email_body %}
|
||||
{% url 'hosting:virtual_machines' as my_virtual_machines_url %}
|
||||
{% url 'hosting:orders' as vm_orders_url %}
|
||||
{% blocktrans with vm.name as vm_name %}You're receiving this mail because your virtual machine [{{vm_name}}] has been cancelled.<br/>
|
||||
You can see your order status by clicking [my VM page] below.<br/>
|
||||
If you want to order a new virtual machine, you can do it by clicking <a href="{{base_url}}{{my_virtual_machines_url}}">this link</a>.<br/>
|
||||
{% endblocktrans %}
|
||||
<div class="button" style="border-collapse: collapse; font-family: 'Lato', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 30px 0;" align="center">
|
||||
<a href="{{ base_url }}{{vm_orders_url}}" style="border-radius: 5px; color: #ffffff; display: inline-block; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; font-weight: regular; line-height: 45px; text-align: center; text-decoration: none !important; width: 155px; -webkit-text-size-adjust: none; mso-hide: all; background: #ff6f6f;">{% trans 'My VM page' %}</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% load static i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% trans "Virtual Machine Cancellation" %}</title>
|
||||
<link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400">
|
||||
</head>
|
||||
|
||||
<body style="margin: 0; padding: 20px 0;">
|
||||
<table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;">
|
||||
<tr>
|
||||
<td>
|
||||
<img src="{{ base_url }}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 15px;">
|
||||
<h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Virtual Machine Cancellation" %}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 25px; font-size: 16px;">
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}You are receiving this email because your virutal machine <strong>{{ vm_name }}</strong> has been cancelled.{% endblocktrans %}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}You can always order a new VM by clicking the button below.{% endblocktrans %}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 30px;">
|
||||
<a class="btn" href="{{ base_url }}{% url 'hosting:create_virtual_machine' %}" style="font-family: Lato, Arial, sans-serif; text-decoration: none; background-color: #1596da; color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px; letter-spacing: 0.5px; border-radius: 3px; display: inline-block; position: relative;">{% trans "CREATE VM" %}</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 40px; padding-bottom: 25px;">
|
||||
<h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
{% extends "datacenterlight/emails/base_email_datacenterlight.txt" %}
|
||||
{% load i18n %}
|
||||
{% block email_head %}{{page_header}}{% endblock %}
|
||||
{% block email_body %}
|
||||
{% url 'hosting:virtual_machines' as my_virtual_machines_url %}
|
||||
{% url 'hosting:orders' order.id as vm_order_url %}
|
||||
{% blocktrans with vm.name as vm_name %}You're receiving this mail because your virtual machine [{{vm_name}}] has been cancelled.
|
||||
You can see your order status by clicking here
|
||||
{{base_url}}{{vm_order_url}}
|
||||
If you want to order a new virtual machine, you can do it by clicking this link.
|
||||
{{base_url}}{{my_virtual_machines_url}}
|
||||
{% endblocktrans %}
|
||||
{% endblock %}
|
||||
|
||||
{% trans "Virtual Machine Cancellation" %}
|
||||
|
||||
{% blocktrans %}You are receiving this email because your virutal machine {{vm_name}} has been cancelled.{% endblocktrans %}
|
||||
{% blocktrans %}You can always order a new VM by following the link below.{% endblocktrans %}
|
||||
|
||||
{{ base_url }}{% url 'hosting:create_virtual_machine' %}
|
||||
|
||||
{% trans "Your Data Center Light Team" %}
|
7
hosting/templates/hosting/includes/_messages.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
{% if messages %}
|
||||
<ul class="list-unstyled msg-list">
|
||||
{% for message in messages %}
|
||||
<div class="alert {% if message.tags and message.tags == 'error' %} alert-danger {% else %} alert-{{message.tags}} {% endif %}">{{ message|safe }}</div>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
|
@ -1,11 +1,13 @@
|
|||
{% load static i18n %}
|
||||
|
||||
<nav class="navbar navbar-default topnav navbar-transparent" role="navigation">
|
||||
<div class="topnav">
|
||||
<!-- Brand and toggle get grouped for better mobile display -->
|
||||
<div class="navbar-header">
|
||||
<a id="logoWhite" class="navbar-brand topnav" href="{% url 'datacenterlight:index' %}"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
|
||||
<div class="container">
|
||||
<div class="topnav">
|
||||
<!-- Brand and toggle get grouped for better mobile display -->
|
||||
<div class="navbar-header">
|
||||
<a id="logoWhite" class="navbar-brand topnav" href="{% url 'datacenterlight:index' %}"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.container -->
|
||||
</div>
|
||||
<!-- /.container -->
|
||||
</nav>
|
|
@ -1,55 +1,43 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load i18n %}
|
||||
{% load staticfiles bootstrap3%}
|
||||
{% load i18n staticfiles bootstrap3%}
|
||||
|
||||
{% block navbar %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% endblock navbar %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center">
|
||||
<div class="auth-title">
|
||||
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||
</div>
|
||||
<div class="auth-content">
|
||||
<div class="intro-message auth-box">
|
||||
<h2 class="section-heading">{% trans "Login"%}</h2>
|
||||
{% if messages %}
|
||||
<ul class="list-unstyled msg-list">
|
||||
{% for message in messages %}
|
||||
<li>{{ message }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidated>
|
||||
{% csrf_token %}
|
||||
{% for field in form %}
|
||||
{% bootstrap_field field show_label=False type='fields'%}
|
||||
{% endfor %}
|
||||
<p class="red">{{form.non_field_errors|striptags}}</p>
|
||||
{% buttons %}
|
||||
<button type="submit" class="btn btn-block btn-success">
|
||||
{% trans "Login"%}
|
||||
</button>
|
||||
{% endbuttons %}
|
||||
<input type='hidden' name='next' value='{{request.GET.next}}'/>
|
||||
</form>
|
||||
<div class="auth-footer">
|
||||
<div class="text">
|
||||
<span>{% trans "Don't have an account yet ? "%}</span>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="unlink" href="{% url 'hosting:signup' %}">{% trans "Sign up"%}</a>
|
||||
<span class="text"> or </span>
|
||||
<a class="unlink" href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ? "%}</a>
|
||||
<span class="text"> or </span><br/>
|
||||
<a class="unlink" href="{% url 'hosting:resend_activation_link' %}">{% trans "Resend activation link"%}</a>
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center">
|
||||
<div class="auth-content">
|
||||
<div class="auth-box">
|
||||
<h1 class="section-heading allcaps">{% trans "Log in" %}</h1>
|
||||
{% include 'hosting/includes/_messages.html' %}
|
||||
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidated>
|
||||
{% csrf_token %}
|
||||
{% for field in form %}
|
||||
{% bootstrap_field field show_label=False type='fields'%}
|
||||
{% endfor %}
|
||||
<p class="red">{{form.non_field_errors|striptags}}</p>
|
||||
<div class="text-center">
|
||||
<button type="submit" class="btn choice-btn">
|
||||
{% trans "Log in" %}
|
||||
</button>
|
||||
</div>
|
||||
<input type='hidden' name='next' value='{{request.GET.next}}'/>
|
||||
</form>
|
||||
<div class="auth-footer">
|
||||
<div>
|
||||
{% trans "Don't have an account yet ?" %}
|
||||
<a class="" href="{% url 'hosting:signup' %}">{% trans "Sign up" %}</a>
|
||||
</div>
|
||||
<div>
|
||||
or <a href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ?" %}</a><br>
|
||||
or <a href="{% url 'hosting:resend_activation_link' %}">{% trans "Resend activation link" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -17,10 +17,12 @@
|
|||
<h1 class="dashboard-title-thin">
|
||||
<img src="{% static 'hosting/img/billing.svg' %}" class="un-icon">{% blocktrans with page_header_text=page_header_text|default:"Invoice" %}{{page_header_text}}{% endblocktrans %}
|
||||
</h1>
|
||||
<div class="dashboard-container-options">
|
||||
<button type="button" class="btn-plain btn-pdf" data-target="#order-detail{{order.pk}}"><img src="{% static 'hosting/img/icon-pdf.svg' %}" class="svg-img"></button>
|
||||
<button type="button" class="btn-plain btn-print"><img src="{% static 'hosting/img/icon-print.svg' %}" class="svg-img"></button>
|
||||
</div>
|
||||
{% if order %}
|
||||
<div class="dashboard-container-options">
|
||||
<button type="button" class="btn-plain btn-pdf" data-target="#order-detail{{order.pk}}"><img src="{% static 'hosting/img/icon-pdf.svg' %}" class="svg-img"></button>
|
||||
<button type="button" class="btn-plain btn-print"><img src="{% static 'hosting/img/icon-print.svg' %}" class="svg-img"></button>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="order-details">
|
||||
{% if order %}
|
||||
|
@ -29,12 +31,12 @@
|
|||
</p>
|
||||
{% endif %}
|
||||
<p>
|
||||
<strong>{% trans "Invoice Date" %}:</strong>
|
||||
<span id="order-created_at">
|
||||
<strong>{% trans "Date" %}:</strong>
|
||||
<span class="locale_date">
|
||||
{% if order %}
|
||||
{{order.created_at|date:'Y-m-d H:i'}}
|
||||
{{order.created_at|date:'Y-m-d h:i a'}}
|
||||
{% else %}
|
||||
{% now "Y-m-d H:i" %}
|
||||
{% now "Y-m-d h:i a" %}
|
||||
{% endif %}
|
||||
</span>
|
||||
</p>
|
||||
|
@ -42,7 +44,9 @@
|
|||
<p>
|
||||
<strong>{% trans "Status" %}: </strong>
|
||||
<strong>
|
||||
{% if order.status == 'Approved' %}
|
||||
{% if vm.terminated_at %}
|
||||
<span class="vm-color-failed">{% trans "Terminated" %}</span>
|
||||
{% elif order.status == 'Approved' %}
|
||||
<span class="vm-color-online">{% trans "Approved" %}</span>
|
||||
{% else %}
|
||||
<span class="vm-status-failed">{% trans "Declined" %}</span>
|
||||
|
@ -78,8 +82,7 @@
|
|||
{{order.last4}}<br>
|
||||
{{user.email}}
|
||||
{% else %}
|
||||
{{cc_brand|default:'Card'}} {% trans "ending in" %} ****
|
||||
{{cc_last4}}<br>
|
||||
{{cc_brand|default:_('Credit Card')}} {% trans "ending in" %} ****{{cc_last4}}<br>
|
||||
{% if request.user.is_authenticated %}
|
||||
{{request.user.email}}
|
||||
{% else %}
|
||||
|
@ -92,18 +95,25 @@
|
|||
<div>
|
||||
<h4>{% trans "Order summary" %}</h4>
|
||||
<p>
|
||||
<strong>{% trans "Product" %}:</strong> {{vm.name}}
|
||||
<strong>{% trans "Product" %}:</strong>
|
||||
{% if vm.name %}
|
||||
{{ vm.name }}
|
||||
{% else %}
|
||||
{{ request.session.template.name }}
|
||||
{% endif %}
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
{% comment %}
|
||||
{% if vm.created_at %}
|
||||
<p>
|
||||
<span>{% trans "Period" %}: </span>
|
||||
<span>
|
||||
<span class="locale_date" data-format="YYYY/MM/DD">{{ vm.created_at|date:'Y-m-d h:i a' }}</span> - <span class="locale_date" data-format="YYYY/MM/DD">{{ subscription_end_date|date:'Y-m-d h:i a' }}</span>
|
||||
</span>
|
||||
</p>
|
||||
{% endif %}
|
||||
<p>
|
||||
<span>{% trans "Period" %}</span>
|
||||
<span class="pull-right">{{}}</span>
|
||||
</p>
|
||||
{% endcomment %}
|
||||
<p>
|
||||
<span>{% trans "Cores" %}</span>
|
||||
<span>{% trans "Cores" %}: </span>
|
||||
{% if vm.cores %}
|
||||
<span class="pull-right">{{vm.cores|floatformat}}</span>
|
||||
{% else %}
|
||||
|
@ -111,11 +121,11 @@
|
|||
{% endif %}
|
||||
</p>
|
||||
<p>
|
||||
<span>{% trans "Memory" %}</span>
|
||||
<span>{% trans "Memory" %}: </span>
|
||||
<span class="pull-right">{{vm.memory}} GB</span>
|
||||
</p>
|
||||
<p>
|
||||
<span>{% trans "Disk space" %}</span>
|
||||
<span>{% trans "Disk space" %}: </span>
|
||||
<span class="pull-right">{{vm.disk_size}} GB</span>
|
||||
</p>
|
||||
<p>
|
||||
|
@ -130,19 +140,21 @@
|
|||
{% endif %}
|
||||
</div>
|
||||
{% if not order %}
|
||||
<form method="post" id="virtual_machine_create_form">
|
||||
{% csrf_token %}
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
<div class="dcl-place-order-text">{% blocktrans with vm_price=request.session.specs.price %}By clicking "Place order" this plan will charge your credit card account with the fee of {{ vm_price }}CHF/month{% endblocktrans %}.</div>
|
||||
{% block submit_btn %}
|
||||
<form method="post" id="virtual_machine_create_form">
|
||||
{% csrf_token %}
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
<div class="dcl-place-order-text">{% blocktrans with vm_price=request.session.specs.price %}By clicking "Place order" this plan will charge your credit card account with the fee of {{ vm_price }}CHF/month{% endblocktrans %}.</div>
|
||||
</div>
|
||||
<div class="col-sm-4 order-confirm-btn text-right">
|
||||
<button class="btn choice-btn" id="btn-create-vm" data-href="{% url 'hosting:order-confirmation' %}" data-toggle="modal" data-target="#createvm-modal">
|
||||
{% trans "Place order" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-4 order-confirm-btn text-right">
|
||||
<button class="btn choice-btn" id="btn-create-vm" data-href="{% url 'hosting:order-confirmation' %}" data-toggle="modal" data-target="#createvm-modal">
|
||||
{% trans "Place order" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</form>
|
||||
{% endblock submit_btn %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
@ -171,7 +183,7 @@
|
|||
{% trans "Hold tight, we are processing your request" %}
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a id="createvm-modal-done-btn" class="btn btn-danger btn-ok btn-wide hide" href="{% url 'hosting:virtual_machines' %}">{% trans "OK" %}</a>
|
||||
<a id="createvm-modal-done-btn" class="btn btn-success btn-ok btn-wide hide" href="{% url 'hosting:virtual_machines' %}">{% trans "OK" %}</a>
|
||||
<button id="createvm-modal-close-btn" type="button" class="btn btn-danger btn-ok btn-wide hide" data-dismiss="modal" aria-label="create-vm-close">{% trans "Close" %}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -184,19 +196,25 @@
|
|||
<script type="text/javascript">
|
||||
{% trans "Some problem encountered. Please try again later." as err_msg %}
|
||||
var create_vm_error_message = '{{err_msg|safe}}';
|
||||
|
||||
window.onload = function () {
|
||||
var locale_date = moment.utc(document.getElementById("order-created_at").textContent, 'YYYY-MM-DD HH:mm').toDate();
|
||||
locale_date = moment(locale_date).format("YYYY-MM-DD h:mm:ss a");
|
||||
document.getElementById('order-created_at').innerHTML = locale_date;
|
||||
|
||||
var locale_dates = document.getElementsByClassName("locale_date");
|
||||
var formats = ['YYYY-MM-DD hh:mm a']
|
||||
var i;
|
||||
for (i = 0; i < locale_dates.length; i++) {
|
||||
var oldDate = moment.utc(locale_dates[i].textContent, formats);
|
||||
var outputFormat = locale_dates[i].getAttribute('data-format') || oldDate._f;
|
||||
locale_dates[i].innerHTML = oldDate.local().format(outputFormat);
|
||||
locale_dates[i].className += ' done';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
{%endblock%}
|
||||
|
||||
{% block js_extra %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
|
||||
<script src="{% static 'hosting/js/html2pdf.js' %}"></script>
|
||||
<script src="{% static 'hosting/js/order.js' %}"></script>
|
||||
{% if order %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
|
||||
<script src="{% static 'hosting/js/html2pdf.js' %}"></script>
|
||||
<script src="{% static 'hosting/js/order.js' %}"></script>
|
||||
{% endif %}
|
||||
{% endblock js_extra %}
|
|
@ -1,6 +1,6 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3 %}
|
||||
{% load i18n %}
|
||||
{% load i18n l10n %}
|
||||
|
||||
{% block content %}
|
||||
<div class="dashboard-container">
|
||||
|
@ -22,7 +22,6 @@
|
|||
<th>{% trans "Order Nr." %}</th>
|
||||
<th>{% trans "Date" %}</th>
|
||||
<th>{% trans "Amount" %}</th>
|
||||
<th>{% trans "Status" %}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
@ -30,15 +29,8 @@
|
|||
{% for order in orders %}
|
||||
<tr>
|
||||
<td class="xs-td-inline" data-header="{% trans 'Order Nr.' %}">{{ order.id }}</td>
|
||||
<td class="xs-td-bighalf" data-header="{% trans 'Date' %}">{{ order.created_at | date:"M d, Y" }}</td>
|
||||
<td class="xs-td-smallhalf" data-header="{% trans 'Amount' %}">{{ order.price }}</td>
|
||||
<td data-header="{% trans 'Status' %}">
|
||||
{% if order.approved %}
|
||||
<span class="vm-status-active"><strong>{% trans "Approved" %}</strong></span>
|
||||
{% else %}
|
||||
<span class="vm-status-failed"><strong>{% trans "Declined" %}</strong></span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="xs-td-bighalf" data-header="{% trans 'Date' %}">{{ order.created_at | date:"M d, Y H:i" }}</td>
|
||||
<td class="xs-td-smallhalf" data-header="{% trans 'Amount' %}">{{ order.price|unlocalize }}</td>
|
||||
<td class="text-right last-td">
|
||||
<a class="btn btn-order-detail" href="{% url 'hosting:orders' order.pk %}">{% trans 'See Invoice' %}</a>
|
||||
</td>
|
||||
|
|
|
@ -69,83 +69,67 @@
|
|||
<h3><b>{%trans "Credit Card"%}</b></h3>
|
||||
<hr>
|
||||
<div>
|
||||
<div>
|
||||
<p>
|
||||
{% blocktrans %}
|
||||
Please fill in your credit card information below. We are using <a
|
||||
href="https://stripe.com" target="_blank">Stripe</a> for payment and do not store
|
||||
your information in our database.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
</div>
|
||||
<br>
|
||||
<p>
|
||||
{% blocktrans %}Please fill in your credit card information below. We are using <a href="https://stripe.com" target="_blank">Stripe</a> for payment and do not store your information in our database.{% endblocktrans %}
|
||||
</p>
|
||||
<div>
|
||||
{% if credit_card_data.last4 %}
|
||||
<form role="form" id="payment-form-with-creditcard" novalidate>
|
||||
<h5 class="billing-head">Credit Card</h5>
|
||||
<h5 class="membership-lead">Last 4: *****{{credit_card_data.last4}}</h5>
|
||||
<h5 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h5>
|
||||
<input type="hidden" name="credit_card_needed" value="false"/>
|
||||
</form>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
{% if not messages and not form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-addtional-margin">
|
||||
{% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %}
|
||||
</p>
|
||||
<form role="form" id="payment-form-with-creditcard" novalidate>
|
||||
<h5 class="billing-head">Credit Card</h5>
|
||||
<h5 class="membership-lead">Last 4: *****{{credit_card_data.last4}}</h5>
|
||||
<h5 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h5>
|
||||
<input type="hidden" name="credit_card_needed" value="false"/>
|
||||
</form>
|
||||
{% if not messages and not form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-addtional-margin">
|
||||
{% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %}
|
||||
</p>
|
||||
{% endif %}
|
||||
<div id='payment_error'>
|
||||
{% for message in messages %}
|
||||
{% if 'failed_payment' or 'make_charge_error' in message.tags %}
|
||||
<ul class="list-unstyled">
|
||||
<li>
|
||||
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
<div id='payment_error'>
|
||||
{% for message in messages %}
|
||||
{% if 'failed_payment' or 'make_charge_error' in message.tags %}
|
||||
<ul class="list-unstyled"><li>
|
||||
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
|
||||
</li></ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% for error in form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-error">
|
||||
{{ error|escape }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% for error in form.non_field_errors %}
|
||||
<p class="card-warning-content card-warning-error">
|
||||
{{ error|escape }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="text-right">
|
||||
<button id="payment_button_with_creditcard" class="btn btn-vm-contact" type="submit">{%trans "SUBMIT" %}</button>
|
||||
</div>
|
||||
{% else %}
|
||||
<form action="" id="payment-form-new" method="POST">
|
||||
<input type="hidden" name="token"/>
|
||||
<div class="group">
|
||||
<div class="credit-card-goup">
|
||||
<div class="card-element card-number-element">
|
||||
<label>{%trans "Card Number" %}</label>
|
||||
<div id="card-number-element" class="field my-input"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-5 card-element card-expiry-element">
|
||||
<label>{%trans "Expiry Date" %}</label>
|
||||
<div id="card-expiry-element" class="field my-input"></div>
|
||||
</div>
|
||||
<div class="col-xs-3 col-xs-offset-4 card-element card-cvc-element">
|
||||
<label>{%trans "CVC" %}</label>
|
||||
<div id="card-cvc-element" class="field my-input"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-element brand">
|
||||
<label>{%trans "Card Type" %}</label>
|
||||
<i class="pf pf-credit-card" id="brand-icon"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<button id="payment_button_with_creditcard" class="btn btn-success stripe-payment-btn"
|
||||
type="submit">
|
||||
{%trans "Submit" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% else %}
|
||||
<form action="" id="payment-form-new" method="POST">
|
||||
<input type="hidden" name="token"/>
|
||||
<div class="group">
|
||||
<div class="col-xs-12 col-sm-12 col-md-10 col-lg-9 credit-card-goup">
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 card-element card-number-element">
|
||||
<label>{%trans "Card Number" %}</label>
|
||||
<div id="card-number-element" class="field my-input"></div>
|
||||
</div>
|
||||
<div class="col-xs-5 col-sm-3 col-md-3 col-lg-3 card-element card-expiry-element">
|
||||
<label>{%trans "Expiry Date" %}</label>
|
||||
<div id="card-expiry-element" class="field my-input"></div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-2 col-md-6 col-lg-7 hide-mobile"></div>
|
||||
<div class="col-xs-3 col-sm-3 col-md-3 col-lg-2 card-element card-cvc-element">
|
||||
<label>{%trans "CVC" %}</label>
|
||||
<div id="card-cvc-element" class="field my-input"></div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 card-element brand">
|
||||
<label>{%trans "Card Type" %}</label>
|
||||
<i class="pf pf-credit-card" id="brand-icon"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="card-errors" role="alert"></div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div id="card-errors"></div>
|
||||
{% if not messages and not form.non_field_errors %}
|
||||
<p class="card-warning-content">
|
||||
{% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %}
|
||||
|
@ -154,9 +138,11 @@
|
|||
<div id='payment_error'>
|
||||
{% for message in messages %}
|
||||
{% if 'failed_payment' or 'make_charge_error' in message.tags %}
|
||||
<ul class="list-unstyled"><li>
|
||||
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
|
||||
</li></ul>
|
||||
<ul class="list-unstyled">
|
||||
<li>
|
||||
<p class="card-warning-content card-warning-error">{{ message|safe }}</p>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
|
@ -166,22 +152,15 @@
|
|||
</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<button class="btn btn-success stripe-payment-btn" type="submit">{%trans "Submit" %}
|
||||
</button>
|
||||
<div class="text-right">
|
||||
<button class="btn btn-vm-contact btn-wide" type="submit">{%trans "SUBMIT" %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" style="display:none;">
|
||||
<div class="col-xs-12">
|
||||
<div style="display:none;">
|
||||
<p class="payment-errors"></p>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,36 +1,40 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3%}
|
||||
{% load i18n %}
|
||||
{% load staticfiles bootstrap3 i18n %}
|
||||
|
||||
{% block navbar %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% endblock navbar %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center">
|
||||
<div class="auth-title">
|
||||
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||
</div>
|
||||
<div class="auth-content">
|
||||
<div class="intro-message auth-box sign-up">
|
||||
<h2 class="section-heading">{% trans "Resend activation link"%}</h2>
|
||||
<div class="auth-content wide">
|
||||
<div class="auth-box sign-up">
|
||||
<h1 class="section-heading">{% trans "Resend activation link" %}</h1>
|
||||
{% include 'hosting/includes/_messages.html' %}
|
||||
<form action="{% url 'hosting:resend_activation_link' %}" method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{% for field in form %}
|
||||
{% bootstrap_field field show_label=False %}
|
||||
{% endfor %}
|
||||
{% buttons %}
|
||||
<button type="submit" class="btn btn-block btn-success">
|
||||
<div class="text-center">
|
||||
<button type="submit" class="btn choice-btn">
|
||||
{% trans "Submit"%}
|
||||
</button>
|
||||
{% endbuttons %}
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="auth-footer">
|
||||
<div>
|
||||
{% trans "Don't have an account yet ?" %}
|
||||
<a class="" href="{% url 'hosting:signup' %}">{% trans "Sign up" %}</a>
|
||||
</div>
|
||||
<div>
|
||||
or <a href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ?" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,43 +1,37 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3%}
|
||||
{% load i18n %}
|
||||
{% load i18n staticfiles bootstrap3%}
|
||||
|
||||
{% block navbar %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% endblock navbar %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center">
|
||||
<div class="auth-title">
|
||||
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||
</div>
|
||||
<div class="auth-content">
|
||||
<div class="intro-message auth-box sign-up">
|
||||
<h2 class="section-heading">{% trans "Reset your password"%}</h2>
|
||||
<div class="auth-box sign-up">
|
||||
<h1 class="section-heading">{% trans "Password reset" %}</h1>
|
||||
{% include 'hosting/includes/_messages.html' %}
|
||||
<form action="{% url 'hosting:reset_password' %}" method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{% for field in form %}
|
||||
{% bootstrap_field field show_label=False %}
|
||||
{% endfor %}
|
||||
{% buttons %}
|
||||
<button type="submit" class="btn btn-block btn-success">
|
||||
{% trans "Reset"%}
|
||||
<div class="text-center">
|
||||
<button type="submit" class="btn choice-btn">
|
||||
{% trans "Reset" %}
|
||||
</button>
|
||||
{% endbuttons %}
|
||||
</div>
|
||||
</form>
|
||||
<div class="auth-footer">
|
||||
<div class="text">
|
||||
<span>{% trans "Already have an account ?"%}</span>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a>
|
||||
<div>
|
||||
<span>{% trans "Already have an account ?" %}</span>
|
||||
<a href="{% url 'hosting:login' %}">{% trans "Login" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -2,40 +2,36 @@
|
|||
{% load staticfiles bootstrap3 i18n %}
|
||||
|
||||
{% block navbar %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
{% endblock navbar %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container auth-signup">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center ">
|
||||
<div class="auth-title">
|
||||
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||
</div>
|
||||
<div class="auth-content">
|
||||
<div class="intro-message auth-box sign-up">
|
||||
<h2 class="section-heading">{% trans "Sign up"%}</h2>
|
||||
<form action="{% url 'hosting:signup' %}" method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{% for field in form %}
|
||||
{% bootstrap_field field show_label=False %}
|
||||
{% endfor %}
|
||||
{% buttons %}
|
||||
<button type="submit" class="btn btn-block btn-info">
|
||||
{% trans "Sign up"%}
|
||||
</button>
|
||||
{% endbuttons %}
|
||||
</form>
|
||||
<div class="auth-footer">
|
||||
<div class="text">
|
||||
<span>{% trans "Already have an account ?"%}</span>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a>
|
||||
<div class="auth-container auth-signup">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center ">
|
||||
<div class="auth-content">
|
||||
<div class="auth-box sign-up">
|
||||
<h1 class="section-heading allcaps">{% trans "Sign up" %}</h1>
|
||||
{% include 'hosting/includes/_messages.html' %}
|
||||
<form action="{% url 'hosting:signup' %}" method="post" class="form" novalidate>
|
||||
{% csrf_token %}
|
||||
{% for field in form %}
|
||||
{% bootstrap_field field show_label=False %}
|
||||
{% endfor %}
|
||||
<div class="text-center">
|
||||
<button type="submit" class="btn choice-btn">
|
||||
{% trans "Sign up" %}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="auth-footer">
|
||||
<div>
|
||||
<span>{% trans "Already have an account ?" %}</span>
|
||||
<a href="{% url 'hosting:login' %}">{% trans "Login" %}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -6,20 +6,17 @@
|
|||
{% endblock navbar %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center">
|
||||
<div class="auth-title">
|
||||
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
|
||||
</div>
|
||||
<div class="auth-content">
|
||||
<div class="auth-container">
|
||||
<div class="auth-bg"></div>
|
||||
<div class="auth-center">
|
||||
<div class="auth-content wide">
|
||||
<div class="intro-message auth-box sign-up">
|
||||
<h2 class="section-heading">{{section_title}}</h2>
|
||||
<h2 class="section-heading">{{section_title}}</h2>
|
||||
<div class="sign-up-message">
|
||||
{{message}}
|
||||
{{message}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -101,21 +101,5 @@
|
|||
window.location.href = '{{next_url}}';
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
window.onload = function () {
|
||||
{% for user_key in keys %}
|
||||
var locale_date = moment.utc(document.getElementById("ssh-created_at-{{user_key.id}}").textContent,'YYYY-MM-DD HH:mm').toDate();
|
||||
locale_date = moment(locale_date).format("YYYY-MM-DD h:mm:ss a");
|
||||
document.getElementById('ssh-created_at-{{user_key.id}}').innerHTML = locale_date;
|
||||
|
||||
{% endfor %}
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
{%endblock%}
|
||||
|
||||
|
|
|
@ -13,7 +13,12 @@
|
|||
{% endif %}
|
||||
{% if not error %}
|
||||
<div class="dashboard-subtitle">
|
||||
<p>{% trans 'To create a new virtual machine, click "Create VM"' %}</p>
|
||||
<p>{% trans 'To create a new virtual machine, click "Create VM"' %}
|
||||
{% if show_create_ssh_key_msg %}
|
||||
{% url 'hosting:create_ssh_key' as create_ssh_url %}
|
||||
<br/>{% blocktrans %}To access your VM, <a href="{{create_ssh_url}}">add your SSH key here</a>{% endblocktrans %}
|
||||
{% endif %}
|
||||
</p>
|
||||
<div class="text-right">
|
||||
<a class="btn btn-vm" href="{% url 'hosting:create_virtual_machine' %}"><span class="css-plus"></span> <span>{% trans "CREATE VM" %}</span></a>
|
||||
</div>
|
||||
|
|
|
@ -10,6 +10,7 @@ from .views import (
|
|||
HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView,
|
||||
SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView)
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
url(r'index/?$', IndexView.as_view(), name='index'),
|
||||
url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'),
|
||||
|
|
207
hosting/views.py
|
@ -1,6 +1,7 @@
|
|||
import json
|
||||
import logging
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from time import sleep
|
||||
|
||||
from django import forms
|
||||
|
@ -37,6 +38,7 @@ from utils.forms import (
|
|||
BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm,
|
||||
ResendActivationEmailForm
|
||||
)
|
||||
from utils.hosting_utils import get_vm_price
|
||||
from utils.mailer import BaseEmail
|
||||
from utils.stripe_utils import StripeUtils
|
||||
from utils.views import (
|
||||
|
@ -46,10 +48,11 @@ from utils.views import (
|
|||
from .forms import HostingUserSignupForm, HostingUserLoginForm, \
|
||||
UserHostingKeyForm, generate_ssh_key_name
|
||||
from .mixins import ProcessVMSelectionMixin
|
||||
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
|
||||
from .models import (
|
||||
HostingOrder, HostingBill, HostingPlan, UserHostingKey, VMDetail
|
||||
)
|
||||
from datacenterlight.models import VMTemplate
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a \
|
||||
|
@ -57,8 +60,9 @@ CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a \
|
|||
minutes."
|
||||
|
||||
|
||||
class DashboardView(View):
|
||||
class DashboardView(LoginRequiredMixin, View):
|
||||
template_name = "hosting/dashboard.html"
|
||||
login_url = reverse_lazy('hosting:login')
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {}
|
||||
|
@ -77,8 +81,6 @@ class DjangoHostingView(ProcessVMSelectionMixin, View):
|
|||
templates = OpenNebulaManager().get_templates()
|
||||
data = VirtualMachineTemplateSerializer(templates, many=True).data
|
||||
configuration_options = HostingPlan.get_serialized_configs()
|
||||
|
||||
# configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
||||
context = {
|
||||
'hosting': HOSTING,
|
||||
'hosting_long': "Django",
|
||||
|
@ -131,7 +133,6 @@ class NodeJSHostingView(ProcessVMSelectionMixin, View):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
HOSTING = 'nodejs'
|
||||
# configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
||||
templates = OpenNebulaManager().get_templates()
|
||||
configuration_options = HostingPlan.get_serialized_configs()
|
||||
|
||||
|
@ -246,7 +247,8 @@ class SignupValidateView(TemplateView):
|
|||
<br />{go_back} {hurl}.'.format(
|
||||
signup_success_message=_(
|
||||
'Thank you for signing up. We have sent an email to you. '
|
||||
'Please follow the instructions in it to activate your account. Once activated, you can login using'),
|
||||
'Please follow the instructions in it to activate your '
|
||||
'account. Once activated, you can login using'),
|
||||
go_back=_('Go back to'),
|
||||
lurl=login_url,
|
||||
hurl=home_url
|
||||
|
@ -265,12 +267,30 @@ class SignupValidatedView(SignupValidateView):
|
|||
login_url = '<a href="' + \
|
||||
reverse('hosting:login') + '">' + str(_('login')) + '</a>'
|
||||
section_title = _('Account activation')
|
||||
user = CustomUser.objects.filter(
|
||||
validation_slug=self.kwargs['validate_slug']).first()
|
||||
if validated:
|
||||
message = '{account_activation_string} <br /> {login_string} {lurl}.'.format(
|
||||
message = ('{account_activation_string} <br />'
|
||||
' {login_string} {lurl}.').format(
|
||||
account_activation_string=_(
|
||||
"Your account has been activated."),
|
||||
login_string=_("You can now"),
|
||||
lurl=login_url)
|
||||
email_data = {
|
||||
'subject': _('Welcome to Data Center Light!'),
|
||||
'to': user.email,
|
||||
'context': {
|
||||
'base_url': "{0}://{1}".format(
|
||||
self.request.scheme,
|
||||
self.request.get_host()
|
||||
)
|
||||
},
|
||||
'template_name': 'welcome_user',
|
||||
'template_path': 'datacenterlight/emails/',
|
||||
'from_address': settings.DCL_SUPPORT_FROM_ADDRESS,
|
||||
}
|
||||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
else:
|
||||
home_url = '<a href="' + \
|
||||
reverse('datacenterlight:index') + \
|
||||
|
@ -610,16 +630,8 @@ class PaymentVMView(LoginRequiredMixin, FormView):
|
|||
return context
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
if not UserHostingKey.objects.filter(user=self.request.user).exists():
|
||||
messages.success(
|
||||
request,
|
||||
'In order to create a VM, you create/upload your SSH KEY first.'
|
||||
)
|
||||
return HttpResponseRedirect(reverse('hosting:ssh_keys'))
|
||||
|
||||
if 'next' in request.session:
|
||||
del request.session['next']
|
||||
|
||||
return self.render_to_response(self.get_context_data())
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
|
@ -640,12 +652,9 @@ class PaymentVMView(LoginRequiredMixin, FormView):
|
|||
return HttpResponseRedirect(
|
||||
reverse('hosting:payment') + '#payment_error')
|
||||
|
||||
# Create Billing Address
|
||||
billing_address = form.save()
|
||||
request.session['billing_address_data'] = billing_address_data
|
||||
request.session['billing_address'] = billing_address.id
|
||||
request.session['token'] = token
|
||||
request.session['customer'] = customer.id
|
||||
request.session['customer'] = customer.stripe_id
|
||||
return HttpResponseRedirect("{url}?{query_params}".format(
|
||||
url=reverse('hosting:order-confirmation'),
|
||||
query_params='page=payment'))
|
||||
|
@ -670,16 +679,12 @@ class OrdersHostingDetailView(LoginRequiredMixin,
|
|||
context = super(DetailView, self).get_context_data(**kwargs)
|
||||
obj = self.get_object()
|
||||
owner = self.request.user
|
||||
stripe_customer_id = self.request.session.get('customer')
|
||||
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
||||
stripe_api_cus_id = self.request.session.get('customer')
|
||||
stripe_utils = StripeUtils()
|
||||
if customer:
|
||||
card_details = stripe_utils.get_card_details(
|
||||
customer.stripe_id,
|
||||
self.request.session.get('token')
|
||||
)
|
||||
else:
|
||||
card_details = {}
|
||||
card_details = stripe_utils.get_card_details(
|
||||
stripe_api_cus_id,
|
||||
self.request.session.get('token')
|
||||
)
|
||||
|
||||
if self.request.GET.get('page') == 'payment':
|
||||
context['page_header_text'] = _('Confirm Order')
|
||||
|
@ -689,25 +694,37 @@ class OrdersHostingDetailView(LoginRequiredMixin,
|
|||
if obj is not None:
|
||||
# invoice for previous order
|
||||
try:
|
||||
manager = OpenNebulaManager(
|
||||
email=owner.email, password=owner.password
|
||||
)
|
||||
vm = manager.get_vm(obj.vm_id)
|
||||
context['vm'] = VirtualMachineSerializer(vm).data
|
||||
except WrongIdError:
|
||||
messages.error(
|
||||
self.request,
|
||||
_('The VM you are looking for is unavailable at the '
|
||||
'moment. Please contact Data Center Light support.')
|
||||
)
|
||||
self.kwargs['error'] = 'WrongIdError'
|
||||
context['error'] = 'WrongIdError'
|
||||
except ConnectionRefusedError:
|
||||
messages.error(
|
||||
self.request,
|
||||
_('In order to create a VM, you need to create/upload '
|
||||
'your SSH KEY first.')
|
||||
vm_detail = VMDetail.objects.get(vm_id=obj.vm_id)
|
||||
context['vm'] = vm_detail.__dict__
|
||||
context['vm']['name'] = '{}-{}'.format(
|
||||
context['vm']['configuration'], context['vm']['vm_id'])
|
||||
context['vm']['price'] = get_vm_price(
|
||||
cpu=context['vm']['cores'],
|
||||
disk_size=context['vm']['disk_size'],
|
||||
memory=context['vm']['memory']
|
||||
)
|
||||
context['subscription_end_date'] = vm_detail.end_date()
|
||||
except VMDetail.DoesNotExist:
|
||||
try:
|
||||
manager = OpenNebulaManager(
|
||||
email=owner.email, password=owner.password
|
||||
)
|
||||
vm = manager.get_vm(obj.vm_id)
|
||||
context['vm'] = VirtualMachineSerializer(vm).data
|
||||
except WrongIdError:
|
||||
messages.error(
|
||||
self.request,
|
||||
_('The VM you are looking for is unavailable at the '
|
||||
'moment. Please contact Data Center Light support.')
|
||||
)
|
||||
self.kwargs['error'] = 'WrongIdError'
|
||||
context['error'] = 'WrongIdError'
|
||||
except ConnectionRefusedError:
|
||||
messages.error(
|
||||
self.request,
|
||||
_('In order to create a VM, you need to create/upload '
|
||||
'your SSH KEY first.')
|
||||
)
|
||||
elif not card_details.get('response_object'):
|
||||
# new order, failed to get card details
|
||||
context['failed_payment'] = True
|
||||
|
@ -746,15 +763,15 @@ class OrdersHostingDetailView(LoginRequiredMixin,
|
|||
def post(self, request):
|
||||
template = request.session.get('template')
|
||||
specs = request.session.get('specs')
|
||||
stripe_customer_id = request.session.get('customer')
|
||||
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
||||
# We assume that if the user is here, his/her StripeCustomer
|
||||
# object already exists
|
||||
stripe_customer_id = request.user.stripecustomer.id
|
||||
billing_address_data = request.session.get('billing_address_data')
|
||||
billing_address_id = request.session.get('billing_address')
|
||||
vm_template_id = template.get('id', 1)
|
||||
|
||||
stripe_api_cus_id = self.request.session.get('customer')
|
||||
# Make stripe charge to a customer
|
||||
stripe_utils = StripeUtils()
|
||||
card_details = stripe_utils.get_card_details(customer.stripe_id,
|
||||
card_details = stripe_utils.get_card_details(stripe_api_cus_id,
|
||||
request.session.get(
|
||||
'token'))
|
||||
if not card_details.get('response_object'):
|
||||
|
@ -767,12 +784,10 @@ class OrdersHostingDetailView(LoginRequiredMixin,
|
|||
cpu = specs.get('cpu')
|
||||
memory = specs.get('memory')
|
||||
disk_size = specs.get('disk_size')
|
||||
amount_to_be_charged = (cpu * 5) + (memory * 2) + (disk_size * 0.6)
|
||||
plan_name = "{cpu} Cores, {memory} GB RAM, {disk_size} GB SSD".format(
|
||||
cpu=cpu,
|
||||
memory=memory,
|
||||
disk_size=disk_size)
|
||||
|
||||
amount_to_be_charged = specs.get('price')
|
||||
plan_name = StripeUtils.get_stripe_plan_name(cpu=cpu,
|
||||
memory=memory,
|
||||
disk_size=disk_size)
|
||||
stripe_plan_id = StripeUtils.get_stripe_plan_id(cpu=cpu,
|
||||
ram=memory,
|
||||
ssd=disk_size,
|
||||
|
@ -783,17 +798,29 @@ class OrdersHostingDetailView(LoginRequiredMixin,
|
|||
name=plan_name,
|
||||
stripe_plan_id=stripe_plan_id)
|
||||
subscription_result = stripe_utils.subscribe_customer_to_plan(
|
||||
customer.stripe_id,
|
||||
stripe_api_cus_id,
|
||||
[{"plan": stripe_plan.get(
|
||||
'response_object').stripe_plan_id}])
|
||||
stripe_subscription_obj = subscription_result.get('response_object')
|
||||
# Check if the subscription was approved and is active
|
||||
if stripe_subscription_obj is None or stripe_subscription_obj.status != 'active':
|
||||
if (stripe_subscription_obj is None or
|
||||
stripe_subscription_obj.status != 'active'):
|
||||
msg = subscription_result.get('error')
|
||||
messages.add_message(self.request, messages.ERROR, msg,
|
||||
extra_tags='failed_payment')
|
||||
return HttpResponseRedirect(
|
||||
reverse('hosting:payment') + '#payment_error')
|
||||
response = {
|
||||
'status': False,
|
||||
'redirect': "{url}#{section}".format(
|
||||
url=reverse('hosting:payment'),
|
||||
section='payment_error'),
|
||||
'msg_title': str(_('Error.')),
|
||||
'msg_body': str(
|
||||
_('There was a payment related error.'
|
||||
' On close of this popup, you will be redirected back to'
|
||||
' the payment page.'))
|
||||
}
|
||||
return HttpResponse(json.dumps(response),
|
||||
content_type="application/json")
|
||||
user = {
|
||||
'name': self.request.user.name,
|
||||
'email': self.request.user.email,
|
||||
|
@ -804,8 +831,7 @@ class OrdersHostingDetailView(LoginRequiredMixin,
|
|||
}
|
||||
create_vm_task.delay(vm_template_id, user, specs, template,
|
||||
stripe_customer_id, billing_address_data,
|
||||
billing_address_id,
|
||||
stripe_subscription_obj, card_details_dict)
|
||||
stripe_subscription_obj.id, card_details_dict)
|
||||
|
||||
for session_var in ['specs', 'template', 'billing_address',
|
||||
'billing_address_data',
|
||||
|
@ -817,9 +843,10 @@ class OrdersHostingDetailView(LoginRequiredMixin,
|
|||
'status': True,
|
||||
'redirect': reverse('hosting:virtual_machines'),
|
||||
'msg_title': str(_('Thank you for the order.')),
|
||||
'msg_body': str(_('Your VM will be up and running in a few moments.'
|
||||
' We will send you a confirmation email as soon as'
|
||||
' it is ready.'))
|
||||
'msg_body': str(
|
||||
_('Your VM will be up and running in a few moments.'
|
||||
' We will send you a confirmation email as soon as'
|
||||
' it is ready.'))
|
||||
}
|
||||
|
||||
return HttpResponse(json.dumps(response),
|
||||
|
@ -877,6 +904,10 @@ class VirtualMachinesPlanListView(LoginRequiredMixin, ListView):
|
|||
context = {'error': 'connection'}
|
||||
else:
|
||||
context = super(ListView, self).get_context_data(**kwargs)
|
||||
if UserHostingKey.objects.filter(user=self.request.user).exists():
|
||||
context['show_create_ssh_key_msg'] = False
|
||||
else:
|
||||
context['show_create_ssh_key_msg'] = True
|
||||
return context
|
||||
|
||||
|
||||
|
@ -897,15 +928,6 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
|||
raise ValidationError(_('Invalid storage size'))
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
if not UserHostingKey.objects.filter(user=self.request.user).exists():
|
||||
messages.success(
|
||||
request,
|
||||
_(
|
||||
'In order to create a VM, you need to '
|
||||
'create/upload your SSH KEY first.'
|
||||
)
|
||||
)
|
||||
return HttpResponseRedirect(reverse('hosting:ssh_keys'))
|
||||
context = {'templates': VMTemplate.objects.all()}
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
|
@ -916,7 +938,6 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
|||
memory_field = forms.IntegerField(validators=[self.validate_memory])
|
||||
storage = request.POST.get('storage')
|
||||
storage_field = forms.IntegerField(validators=[self.validate_storage])
|
||||
price = request.POST.get('total')
|
||||
template_id = int(request.POST.get('config'))
|
||||
template = VMTemplate.objects.filter(
|
||||
opennebula_vm_template_id=template_id).first()
|
||||
|
@ -948,7 +969,8 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
|||
extra_tags='storage')
|
||||
return HttpResponseRedirect(
|
||||
reverse('datacenterlight:index') + "#order_form")
|
||||
|
||||
price = get_vm_price(cpu=cores, memory=memory,
|
||||
disk_size=storage)
|
||||
specs = {
|
||||
'cpu': cores,
|
||||
'memory': memory,
|
||||
|
@ -1012,6 +1034,7 @@ class VirtualMachineView(LoginRequiredMixin, View):
|
|||
return redirect(reverse('hosting:virtual_machines'))
|
||||
elif self.request.is_ajax():
|
||||
return HttpResponse()
|
||||
context = None
|
||||
try:
|
||||
serializer = VirtualMachineSerializer(vm)
|
||||
context = {
|
||||
|
@ -1021,7 +1044,11 @@ class VirtualMachineView(LoginRequiredMixin, View):
|
|||
}
|
||||
except Exception as ex:
|
||||
logger.debug("Exception generated {}".format(str(ex)))
|
||||
pass
|
||||
messages.error(self.request,
|
||||
_('We could not find the requested VM. Please '
|
||||
'contact Data Center Light Support.')
|
||||
)
|
||||
return redirect(reverse('hosting:virtual_machines'))
|
||||
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
|
@ -1039,6 +1066,7 @@ class VirtualMachineView(LoginRequiredMixin, View):
|
|||
|
||||
try:
|
||||
vm_data = VirtualMachineSerializer(manager.get_vm(vm.id)).data
|
||||
vm_name = vm_data.get('name')
|
||||
except WrongIdError:
|
||||
return redirect(reverse('hosting:virtual_machines'))
|
||||
|
||||
|
@ -1054,16 +1082,21 @@ class VirtualMachineView(LoginRequiredMixin, View):
|
|||
except WrongIdError:
|
||||
response['status'] = True
|
||||
response['text'] = ugettext('Terminated')
|
||||
vm_detail_obj = VMDetail.objects.filter(
|
||||
vm_id=opennebula_vm_id).first()
|
||||
vm_detail_obj.terminated_at = datetime.utcnow()
|
||||
vm_detail_obj.save()
|
||||
break
|
||||
except BaseException:
|
||||
break
|
||||
else:
|
||||
sleep(2)
|
||||
context = {
|
||||
'vm': vm_data,
|
||||
'vm_name': vm_name,
|
||||
'base_url': "{0}://{1}".format(self.request.scheme,
|
||||
self.request.get_host()),
|
||||
'page_header': _('Virtual Machine Cancellation')
|
||||
'page_header': _('Virtual Machine %(vm_name)s Cancelled') % {
|
||||
'vm_name': vm_name}
|
||||
}
|
||||
email_data = {
|
||||
'subject': context['page_header'],
|
||||
|
@ -1125,3 +1158,15 @@ class HostingBillDetailView(PermissionRequiredMixin, LoginRequiredMixin,
|
|||
bill.total_price += vm['price']
|
||||
context['vms'] = vms
|
||||
return context
|
||||
|
||||
|
||||
def forbidden_view(request, exception=None, reason=''):
|
||||
"""
|
||||
Handle 403 error
|
||||
"""
|
||||
logger.error(str(exception) if exception else None)
|
||||
logger.error('Reason = {reason}'.format(reason=reason))
|
||||
err_msg = _('There was an error processing your request. Please try '
|
||||
'again.')
|
||||
messages.add_message(request, messages.ERROR, err_msg)
|
||||
return HttpResponseRedirect(request.get_full_path())
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-06-23 02:05+0530\n"
|
||||
"POT-Creation-Date: 2017-10-10 21:35+0530\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,42 +18,35 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: forms.py:43
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:43
|
||||
msgid "Card number"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:43
|
||||
msgid "Expiry date"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:44
|
||||
msgid "CCV"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:66
|
||||
msgid "staff status"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:68
|
||||
msgid "Designates whether the user can log into this admin site."
|
||||
msgstr ""
|
||||
|
||||
#: models.py:90
|
||||
msgid "Activate your "
|
||||
msgstr "Aktiviere deinen "
|
||||
msgid "Account Activation"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:90
|
||||
msgid " account"
|
||||
msgstr " Account"
|
||||
|
||||
#: models.py:198
|
||||
msgid "Use this pattern(MM/YYYY)."
|
||||
msgstr ""
|
||||
|
||||
#: models.py:199
|
||||
msgid "Wrong CCV number."
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Activate your "
|
||||
#~ msgstr "Aktiviere deinen "
|
||||
|
||||
#~ msgid " account"
|
||||
#~ msgstr " Account"
|
||||
|
|
|
@ -82,7 +82,7 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
|
|||
|
||||
@classmethod
|
||||
def register(cls, name, password, email, app='digital_glarus',
|
||||
base_url=None, send_email=True):
|
||||
base_url=None, send_email=True, account_details=None):
|
||||
user = cls.objects.filter(email=email).first()
|
||||
if not user:
|
||||
user = cls.objects.create_user(name=name, email=email,
|
||||
|
@ -112,6 +112,9 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
|
|||
'template_name': 'user_activation',
|
||||
'template_path': 'datacenterlight/emails/'
|
||||
}
|
||||
if account_details:
|
||||
email_data['context'][
|
||||
'account_details'] = account_details
|
||||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
return user
|
||||
|
@ -176,6 +179,25 @@ class StripeCustomer(models.Model):
|
|||
def __str__(self):
|
||||
return "%s - %s" % (self.stripe_id, self.user.email)
|
||||
|
||||
@classmethod
|
||||
def create_stripe_api_customer(cls, email=None, token=None,
|
||||
customer_name=None):
|
||||
"""
|
||||
This method creates a Stripe API customer with the given
|
||||
email, token and customer_name. This is different from
|
||||
get_or_create method below in that it does not create a
|
||||
CustomUser and associate the customer created in stripe
|
||||
with it, while get_or_create does that before creating the
|
||||
stripe user.
|
||||
"""
|
||||
stripe_utils = StripeUtils()
|
||||
stripe_data = stripe_utils.create_customer(token, email, customer_name)
|
||||
if stripe_data.get('response_object'):
|
||||
stripe_cus_id = stripe_data.get('response_object').get('id')
|
||||
return stripe_cus_id
|
||||
else:
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def get_or_create(cls, email=None, token=None):
|
||||
"""
|
||||
|
@ -195,7 +217,6 @@ class StripeCustomer(models.Model):
|
|||
|
||||
except StripeCustomer.DoesNotExist:
|
||||
user = CustomUser.objects.get(email=email)
|
||||
|
||||
stripe_utils = StripeUtils()
|
||||
stripe_data = stripe_utils.create_customer(token, email, user.name)
|
||||
if stripe_data.get('response_object'):
|
||||
|
|
|
@ -150,9 +150,10 @@ class OpenNebulaManager():
|
|||
oca.User.METHODS['allocate'], email,
|
||||
password, 'core')
|
||||
logger.debug(
|
||||
"User {0} does not exist. Created the user. User id = {1}",
|
||||
email,
|
||||
opennebula_user
|
||||
"User {} does not exist. Created the user. User id = {}".format(
|
||||
email,
|
||||
opennebula_user
|
||||
)
|
||||
)
|
||||
return opennebula_user
|
||||
except ConnectionRefusedError:
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="/">
|
||||
<a class="navbar-brand" href="https://www.ungleich.ch">
|
||||
<img src="{% static "blog.ungleich.ch/img/logo_white.svg" %}" />
|
||||
</a>
|
||||
</div>
|
||||
|
|
62
ungleich_page/cms_menus.py
Normal file
|
@ -0,0 +1,62 @@
|
|||
from menus.base import NavigationNode
|
||||
from menus.menu_pool import menu_pool
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from cms.menu_bases import CMSAttachMenu
|
||||
from cms.templatetags.cms_tags import _get_placeholder
|
||||
from cms.utils.plugins import get_plugins
|
||||
|
||||
|
||||
class GlasfaserMenu(CMSAttachMenu):
|
||||
|
||||
name = _("Glasfaser menu")
|
||||
|
||||
def get_nodes(self, request):
|
||||
nodes = []
|
||||
glasfaser_cms = 'ungleich_page/glasfaser_cms_page.html'
|
||||
if request and request.current_page.get_template() == glasfaser_cms:
|
||||
template_context = {
|
||||
"request": request,
|
||||
}
|
||||
placeholder_name_list = [
|
||||
'Top Section', 'Middle Section', 'Glasfaser Services',
|
||||
'Glasfaser About', 'Contact Section'
|
||||
]
|
||||
plugins_list = [
|
||||
'SectionWithImage', 'UngelichContactUsSection',
|
||||
'UngelichTextSection', 'Service', 'About'
|
||||
]
|
||||
for placeholder_name in placeholder_name_list:
|
||||
placeholder = _get_placeholder(
|
||||
request.current_page, request.current_page,
|
||||
template_context, placeholder_name
|
||||
)
|
||||
plugins = get_plugins(
|
||||
request, placeholder, request.current_page.get_template()
|
||||
)
|
||||
for plugin in plugins:
|
||||
if type(plugin).__name__ in plugins_list:
|
||||
section_hash = request.build_absolute_uri()
|
||||
if hasattr(plugin, 'menu_text'):
|
||||
menu_text = plugin.menu_text
|
||||
if menu_text.strip() == '':
|
||||
continue
|
||||
menu_words = menu_text.split()
|
||||
if len(menu_words) > 0:
|
||||
section_hash = '{}#{}'.format(
|
||||
section_hash,
|
||||
menu_words[0]
|
||||
)
|
||||
else:
|
||||
continue
|
||||
newnode = NavigationNode(
|
||||
menu_text,
|
||||
url=section_hash,
|
||||
id="{}-{}".format(
|
||||
request.current_page.id, plugin.id
|
||||
)
|
||||
)
|
||||
nodes.append(newnode)
|
||||
return nodes
|
||||
|
||||
|
||||
menu_pool.register_menu(GlasfaserMenu)
|
147
ungleich_page/cms_plugins.py
Normal file
|
@ -0,0 +1,147 @@
|
|||
from cms.plugin_base import CMSPluginBase
|
||||
from cms.plugin_pool import plugin_pool
|
||||
|
||||
from .models import (
|
||||
UngelichContactUsSection, UngelichTextSection, Service, ServiceItem,
|
||||
About, AboutItem, SectionWithImage
|
||||
)
|
||||
|
||||
|
||||
def get_section_id(plugin_instance, default):
|
||||
"""
|
||||
A helper function to get the section id from a given menu text
|
||||
:param plugin_instance:
|
||||
:param default: The default section id to return in case a section id
|
||||
is not found
|
||||
:return: The section id for the plugin_instance
|
||||
"""
|
||||
section_id = default
|
||||
if hasattr(plugin_instance, 'menu_text'):
|
||||
menu_words = plugin_instance.menu_text.split()
|
||||
if len(menu_words) > 0:
|
||||
section_id = menu_words[0]
|
||||
return section_id
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class SectionWithImagePlugin(CMSPluginBase):
|
||||
model = SectionWithImage
|
||||
render_template = "ungleich_page/glasfaser/section_with_image.html"
|
||||
cache = False
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context.update({
|
||||
'image': instance.image,
|
||||
'object': instance,
|
||||
'placeholder': placeholder
|
||||
})
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class SectionContact(CMSPluginBase):
|
||||
model = UngelichContactUsSection
|
||||
render_template = "ungleich_page/glasfaser/section_contact.html"
|
||||
cache = False
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context = super(SectionContact, self).render(
|
||||
context, instance, placeholder
|
||||
)
|
||||
context['instance'] = instance
|
||||
context['section_id'] = get_section_id(instance, 'contact')
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class SectionTextParagraphDCL(CMSPluginBase):
|
||||
model = UngelichTextSection
|
||||
render_template = "ungleich_page/glasfaser/section_text_dcl.html"
|
||||
cache = False
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context = super(SectionTextParagraphDCL, self).render(
|
||||
context, instance, placeholder
|
||||
)
|
||||
context['instance'] = instance
|
||||
context['section_id'] = get_section_id(instance, 'your')
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class SectionTextParagraphGlasfaser(CMSPluginBase):
|
||||
model = UngelichTextSection
|
||||
render_template = "ungleich_page/glasfaser/section_text_glasfaser.html"
|
||||
cache = False
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context = super(SectionTextParagraphGlasfaser, self).render(
|
||||
context, instance, placeholder
|
||||
)
|
||||
context['instance'] = instance
|
||||
context['section_id'] = get_section_id(instance, 'our')
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class GlasfaserServicesPlugin(CMSPluginBase):
|
||||
name = "Glasfaser Services Plugin"
|
||||
model = Service
|
||||
render_template = "ungleich_page/glasfaser/section_services.html"
|
||||
cache = False
|
||||
allow_children = True
|
||||
child_classes = ['GlasfaserServicesItemPlugin']
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context['service_instance'] = instance
|
||||
context['section_id'] = get_section_id(instance, 'services')
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class GlasfaserServicesItemPlugin(CMSPluginBase):
|
||||
name = "Glasfaser Service Item Plugin"
|
||||
model = ServiceItem
|
||||
render_template = "ungleich_page/glasfaser/_services_item.html"
|
||||
cache = False
|
||||
require_parent = True
|
||||
parent_classes = ['GlasfaserServicesPlugin']
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context = super(GlasfaserServicesItemPlugin, self).render(
|
||||
context, instance, placeholder
|
||||
)
|
||||
context['instance'] = instance
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class GlasfaserAboutPlugin(CMSPluginBase):
|
||||
name = "Glasfaser About Plugin"
|
||||
model = About
|
||||
render_template = "ungleich_page/glasfaser/section_about.html"
|
||||
cache = False
|
||||
allow_children = True
|
||||
child_classes = ['GlasfaserAboutItemPlugin']
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context['about_instance'] = instance
|
||||
context['section_id'] = get_section_id(instance, 'about')
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class GlasfaserAboutItemPlugin(CMSPluginBase):
|
||||
name = "Glasfaser About Item Plugin"
|
||||
model = AboutItem
|
||||
render_template = "ungleich_page/glasfaser/_about_item.html"
|
||||
cache = False
|
||||
require_parent = True
|
||||
parent_classes = ['GlasfaserAboutPlugin']
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context = super(GlasfaserAboutItemPlugin, self).render(
|
||||
context, instance, placeholder
|
||||
)
|
||||
context['instance'] = instance
|
||||
return context
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-05-30 13:47+0000\n"
|
||||
"POT-Creation-Date: 2017-11-06 00:24+0530\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -18,165 +18,198 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:8
|
||||
msgid "Glasfaser menu"
|
||||
msgstr ""
|
||||
|
||||
msgid "\"Sorry, we could not find the page you are looking for!\""
|
||||
msgstr ""
|
||||
|
||||
msgid "Toggle navigation"
|
||||
msgstr "Umschalten"
|
||||
|
||||
msgid "CONTACT"
|
||||
msgstr "KONTAKT"
|
||||
|
||||
msgid "HIGH SPEED INTERNET"
|
||||
msgstr ""
|
||||
|
||||
msgid "Thank you for contacting us."
|
||||
msgstr "Nachricht gesendet."
|
||||
|
||||
msgid "Your message was successfully sent to our team."
|
||||
msgstr "Vielen Dank für Deine Nachricht."
|
||||
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "Please enter your name."
|
||||
msgstr "Bitte gib Deinen Namen ein."
|
||||
|
||||
msgid "Email"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
msgid "Please enter a valid email address."
|
||||
msgstr "Bitte gib eine gültige E-Mailadresse ein."
|
||||
|
||||
msgid "Message"
|
||||
msgstr "Nachricht"
|
||||
|
||||
msgid "Sorry, there was an unexpected error. Kindly retry."
|
||||
msgstr ""
|
||||
"Bitte entschuldige, es scheint ein unerwarteter Fehler aufgetreten zu sein. "
|
||||
"Versuche es doch bitte noch einmal."
|
||||
|
||||
msgid "SUBMIT"
|
||||
msgstr "ABSENDEN"
|
||||
|
||||
msgid "ABOUT"
|
||||
msgstr "Über ungleich"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:9
|
||||
msgid "The timeline of ungleich"
|
||||
msgstr "Die Chronik von ungleich"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:24
|
||||
msgid "The first incarnation of ungleich"
|
||||
msgstr "Die erste Inkarnation von ungleich"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:25
|
||||
msgid "in Germany"
|
||||
msgstr "in Deutschland"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:37
|
||||
msgid "ungleich founded"
|
||||
msgstr "ungleich gegründet"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:38
|
||||
msgid "in Switzerland"
|
||||
msgstr "in der Schweiz"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:51
|
||||
msgid "ungleich present at various conferences"
|
||||
msgstr "ungleich präsent an mehreren Konferenzen"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:65
|
||||
msgid "ungleich introduces HA-Hosting"
|
||||
msgstr "ungleich führt HA-Hosting ein"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:66
|
||||
msgid "and introduces affordable 24X7 support."
|
||||
msgstr "und führt kostengünstigen 24X7 Support ein."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:67
|
||||
msgid "ungleich launches"
|
||||
msgstr "ungleich lanciert"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:68
|
||||
msgid "Digital Glarus project"
|
||||
msgstr "Digital Glarus Projekt"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:74
|
||||
msgid ""
|
||||
"ungleich launches <a href=\"https://www.alplora.ch/de/\">Alplora</a>, an "
|
||||
"animal tracking service with LoraWAN technology."
|
||||
msgstr ""
|
||||
"ungleich startet das Projekt <a href=\"https://www.alplora.ch/de/\">AlpLora</"
|
||||
"a>, mit dem Tiere via LoRaWAN geortet werden können"
|
||||
|
||||
msgid ""
|
||||
"ungleich sells <a href=\"https://www.alplora.ch/de/\">Alplora</a> to an IoT "
|
||||
"startup in canton Zürich."
|
||||
msgstr ""
|
||||
"ungleich verkauft das Projekt <a href=\"https://www.alplora.ch/de/"
|
||||
"\">AlpLora</a> an ein IoT-Startup aus dem Kanton Zürich"
|
||||
|
||||
msgid ""
|
||||
"ungleich showcases the most affordable Swiss VM hosting, Data Center Light."
|
||||
msgstr ""
|
||||
"ungleich stellt der Öffentlichkeit das modernste Schweizer Hosting vor, das "
|
||||
"Data Center Light."
|
||||
|
||||
msgid "and"
|
||||
msgstr "und"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_about.html:74
|
||||
msgid "the story continues!"
|
||||
msgstr "Die Geschichte geht weiter!"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:15
|
||||
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:28
|
||||
#: ungleich_page/views.py:36
|
||||
msgid "Contact Us"
|
||||
msgstr "Kontaktieren Sie uns"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:18
|
||||
msgid "Join us at"
|
||||
msgstr "Schliessen Sie sich uns an"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:19
|
||||
msgid "Digital Glarus"
|
||||
msgstr "Digital Glarus"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:20
|
||||
msgid "a great co-working space in the middle of Alps!"
|
||||
msgstr "ein wunderschöner Co-Working Space mitten in den Alpen"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:21
|
||||
msgid "You can contact us at"
|
||||
msgstr "Sie können uns kontaktieren unter"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:26
|
||||
msgid "or"
|
||||
msgstr "oder"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_contact_us.html:60
|
||||
msgid "Submit"
|
||||
msgstr "Absenden"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_footer.html:8
|
||||
msgid "Copyright © ungleich GmbH "
|
||||
msgstr "Copyright © ungleich GmbH"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_footer.html:22
|
||||
msgid "ungleich Home"
|
||||
msgstr "ungleich Home"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_header.html:11
|
||||
msgid "We Design, Configure & Maintain <br> Your Linux Infrastructure "
|
||||
msgstr "Wir designen, erstellen und warten Ihre Linux-Infrastruktur"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:8
|
||||
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:9
|
||||
msgid "Hosting Products "
|
||||
msgstr "Hosting Produkte"
|
||||
msgid "Our Products"
|
||||
msgstr "Unsere Produkte"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:16
|
||||
msgid "HA Hosting"
|
||||
msgstr "HA Hosting"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:18
|
||||
msgid ""
|
||||
"We offer high availablity hosting (HA) in Germany and in Switzerland. Our "
|
||||
"infrastructure is powered by Free and Open Source Software like OpenNebula, "
|
||||
"Qemu and GlusterFS."
|
||||
"Our products include an innovative datacenter,<br>affordable VM hosting, and "
|
||||
"high speed fiber internet for canton Glarus."
|
||||
msgstr ""
|
||||
"Wir offerieren hohe Verfügbarkeit für das Hosting in Deutschland und in der "
|
||||
"Schweiz. Unsere Infrastruktur ist unterstützt durch Free and Open Source "
|
||||
"Software wie OpenNebula."
|
||||
"Zu unseren Produkten gehört ein innovatives Rechenzentrum,<br>modernes VM-"
|
||||
"Hosting und Glasfaser-Internet für den Kanton Glarus."
|
||||
|
||||
msgid "Data Center Light"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"We offer the most affordable hosting in Switzerland. Data Center Light has "
|
||||
"full FOSS stack, 100%% IPv6 and 100%% SSD. Choose any configuration among "
|
||||
"CentOS, Debian, Ubuntu, Devuan, and FreeBSD."
|
||||
msgstr ""
|
||||
"Wir bieten Ihnen ein erschwingliches Hosting in der Schweiz. Data Center "
|
||||
"Light basiert auf FOSS Software, 100%% IPv6 und 100%% SSD. Wählen Sie eine "
|
||||
"beliebige Konfiguration unter CentOS, Debian, Ubuntu, Devuan oder FreeBSD."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:24
|
||||
msgid "Rails Hosting"
|
||||
msgstr "Rails Hosting"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:26
|
||||
msgid ""
|
||||
"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 "
|
||||
"on Rails."
|
||||
msgstr "Sind bereit mit ihrem Ruby on Rails Applikation live zu gehen?"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:32
|
||||
msgid " Configuration as a Service"
|
||||
msgstr "Konfiguration als Service"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_portfolio.html:34
|
||||
msgid ""
|
||||
"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-"
|
||||
"Mail, Databases or Webservers."
|
||||
msgid "High Speed Internet"
|
||||
msgstr ""
|
||||
"Sie brauchen eine Konfiguration? Mit ungleich haben sie ein erfahrenes Team "
|
||||
"gefunden, dass ihnen die Konfiguration von DNS, E-Mail, Datenbanken oder "
|
||||
"Webservern für ihr System anbietet"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:8
|
||||
msgid ""
|
||||
"We offer high speed fiber internet in Glarus Süd, Glarus and Glarus Nord. "
|
||||
"Experience 100 Mbit/s and see how speed can change everything."
|
||||
msgstr ""
|
||||
"Wir bieten außerdem Hochgeschwindigkeitsfaser Internet in Glarus Süd, Glarus "
|
||||
"und Glarus Nord. Surfen Sie mit 100 Mbit/s und erleben Sie, wie "
|
||||
"Geschwindigkeit alles ändern kann."
|
||||
|
||||
msgid "our services"
|
||||
msgstr "Unsere Dienstleistungen"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:10
|
||||
msgid "We support our clients in all areas of Unix infrastructure."
|
||||
msgstr ""
|
||||
"Wir unterstützen unsere Klienten in allen Bereichen der Unix Infrastruktur."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:11
|
||||
msgid ""
|
||||
"Our top notch configuration management is refreshingly simple and reliable."
|
||||
msgstr ""
|
||||
"Unser erstklassiges Konfigurationsmanagement ist erfrischend einfach und "
|
||||
"zuverlässig."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:20
|
||||
msgid "Hosting"
|
||||
msgstr "Hosting"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:22
|
||||
msgid ""
|
||||
"Ruby on Rails. Java hosting, Django hosting, we make it everything run "
|
||||
"smooth and safe."
|
||||
|
@ -184,11 +217,9 @@ msgstr ""
|
|||
"Ruby on Rails. Java hosting, Django hosting, wir garantieren einen "
|
||||
"reibungslosen Ablauf"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:30
|
||||
msgid "Configuration as a Service"
|
||||
msgstr "Konfiguration als Service"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:32
|
||||
msgid ""
|
||||
"Ruby on Rails, Django, Java, Webserver, Mailserver, any infrastructure that "
|
||||
"needs to configured, we provide comprehensive solutions. Amazon, rackspace "
|
||||
|
@ -198,11 +229,9 @@ msgstr ""
|
|||
"welche eine Konfiguration braucht, wir offerieren umfassende Lösungen, "
|
||||
"Amazon, Rackspace oder Bare Metal Servers, wir konfigurieren alles."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:40
|
||||
msgid "Linux System Engineering"
|
||||
msgstr "Linux System Engineering"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_services.html:43
|
||||
msgid ""
|
||||
"Let your developers develop! We take care of your system administration. "
|
||||
"Gentoo, Archlinux, Debian, Ubuntu, and many more."
|
||||
|
@ -210,15 +239,12 @@ msgstr ""
|
|||
"Lassen sie ihre Entwickler entwickeln! Wir kümmern uns um ihre "
|
||||
"Systemadministration. Gentoo, Archlinux, Debian, Ubuntu und viele mehr."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_team.html:8
|
||||
msgid "Why ungleich?*"
|
||||
msgstr "Warum ungleich?"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_team.html:9
|
||||
msgid "What our customers say"
|
||||
msgstr "Was unsere Kunden sagen"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_team.html:29
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t\t\t \"ungleich helped us getting started with our internal\n"
|
||||
|
@ -247,7 +273,6 @@ msgstr ""
|
|||
"Infrastruktur-Einrichtung erhalten, welche es unseren Technikern ermöglicht "
|
||||
"effizienter und bequemer zu arbeiten als zuvor."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_team.html:51
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t\t\t \"Thanks to ungleich team, who has designed and\n"
|
||||
|
@ -265,7 +290,6 @@ msgstr ""
|
|||
"nur in der Kosteneinsparung aber auch zur Zeiteinsparung, was für IT-Firmen "
|
||||
"sehr wichtig ist."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_team.html:67
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t\t\t \"ungleich provided an excellent service in designing\n"
|
||||
|
@ -292,7 +316,6 @@ msgstr ""
|
|||
"allen Firmen empfehlen, bei denen eine solide Infrastruktur stark gefragt "
|
||||
"ist."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_team.html:82
|
||||
msgid ""
|
||||
"\n"
|
||||
"\t\t\t <strong>- Sebastian Plattner,</strong>\n"
|
||||
|
@ -300,52 +323,60 @@ msgid ""
|
|||
"\t\t\t "
|
||||
msgstr ""
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/includes/_team.html:95
|
||||
msgid "*ungleich means not equal to (≠) U+2260."
|
||||
msgstr "*ungleich bedeutet nicht gleich wie (≠) U+2260."
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/landing.html:85
|
||||
#, fuzzy
|
||||
#| msgid "our services"
|
||||
msgid "Services"
|
||||
msgstr "Unsere Dienstleistungen"
|
||||
msgstr "Dienstleistungen"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/landing.html:90
|
||||
msgid "products"
|
||||
msgstr "PRODUKTE"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/landing.html:93
|
||||
msgid "About"
|
||||
msgstr "Über"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/landing.html:96
|
||||
msgid "WHY UNGLEICH?"
|
||||
msgstr "WARUM UNGLEICH?"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/landing.html:99
|
||||
msgid "BLOG"
|
||||
msgstr "BLOG"
|
||||
|
||||
#: ungleich_page/templates/ungleich_page/landing.html:102
|
||||
msgid "CONTACT"
|
||||
msgstr "KONTAKT"
|
||||
|
||||
#: ungleich_page/urls.py:8
|
||||
#, fuzzy
|
||||
#| msgid "Contact Us"
|
||||
msgid "contact/$"
|
||||
msgstr "Kontaktieren Sie uns"
|
||||
msgstr "kontakt/$"
|
||||
|
||||
#: ungleich_page/views.py:26
|
||||
msgid "Message Successfully Sent"
|
||||
msgstr "Nachricht erfolgreich versendet"
|
||||
|
||||
#: ungleich_page/views.py:37
|
||||
msgid "If you have any question, just send us an email."
|
||||
msgstr ""
|
||||
"Wenn Sie irgendwelche Fragen haben, schicken Sie uns einfach eine E-Mail."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Contact Us"
|
||||
#~ msgid "Hosting Products "
|
||||
#~ msgstr "Hosting Produkte"
|
||||
|
||||
#~ msgid "HA Hosting"
|
||||
#~ msgstr "HA Hosting"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "We offer high availablity hosting (HA) in Germany and in Switzerland. Our "
|
||||
#~ "infrastructure is powered by Free and Open Source Software like "
|
||||
#~ "OpenNebula, Qemu and GlusterFS."
|
||||
#~ msgstr ""
|
||||
#~ "Wir offerieren hohe Verfügbarkeit für das Hosting in Deutschland und in "
|
||||
#~ "der Schweiz. Unsere Infrastruktur ist unterstützt durch Free and Open "
|
||||
#~ "Source Software wie OpenNebula."
|
||||
|
||||
#~ msgid " Configuration as a Service"
|
||||
#~ msgstr "Konfiguration als Service"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "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-Mail, Databases or Webservers."
|
||||
#~ msgstr ""
|
||||
#~ "Sie brauchen eine Konfiguration? Mit ungleich haben sie ein erfahrenes "
|
||||
#~ "Team gefunden, dass ihnen die Konfiguration von DNS, E-Mail, Datenbanken "
|
||||
#~ "oder Webservern für ihr System anbietet"
|
||||
|
||||
#~ msgid "Contact"
|
||||
#~ msgstr "Kontaktieren Sie uns"
|
||||
|
|
106
ungleich_page/migrations/0001_initial.py
Normal file
|
@ -0,0 +1,106 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-10-18 18:23
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import djangocms_text_ckeditor.fields
|
||||
import filer.fields.image
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('filer', '0004_auto_20160328_1434'),
|
||||
('cms', '0014_auto_20160404_1908'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Service',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('title', models.CharField(max_length=200)),
|
||||
('sub_title', models.CharField(max_length=200)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ServiceItem',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('title', models.CharField(max_length=200)),
|
||||
('description', djangocms_text_ckeditor.fields.HTMLField()),
|
||||
('image', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='service_item_image', to='filer.Image')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='UngelichContactUsSection',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('email', models.EmailField(max_length=200)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='UngelichPicture',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('title', models.CharField(max_length=400)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='UngelichTextSection',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('title', models.CharField(max_length=200)),
|
||||
('description', djangocms_text_ckeditor.fields.HTMLField()),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='About',
|
||||
fields=[
|
||||
('service_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ungleich_page.Service')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('ungleich_page.service',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='AboutItem',
|
||||
fields=[
|
||||
('ungelichpicture_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ungleich_page.UngelichPicture')),
|
||||
('inverted', models.BooleanField(default=False)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('ungleich_page.ungelichpicture',),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ungelichpicture',
|
||||
name='image',
|
||||
field=filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='image', to='filer.Image'),
|
||||
),
|
||||
]
|
30
ungleich_page/migrations/0002_sectionwithimage.py
Normal file
|
@ -0,0 +1,30 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-10-18 22:02
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import filer.fields.image
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('filer', '0004_auto_20160328_1434'),
|
||||
('ungleich_page', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='SectionWithImage',
|
||||
fields=[
|
||||
('ungelichpicture_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ungleich_page.UngelichPicture')),
|
||||
('price_tag_url', models.URLField(default='', max_length=300)),
|
||||
('price_tag_image', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='price_tag_image', to='filer.Image')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('ungleich_page.ungelichpicture',),
|
||||
),
|
||||
]
|
35
ungleich_page/migrations/0003_auto_20171019_1007.py
Normal file
|
@ -0,0 +1,35 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-10-19 10:07
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ungleich_page', '0002_sectionwithimage'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='sectionwithimage',
|
||||
name='menu_text',
|
||||
field=models.CharField(default='', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='service',
|
||||
name='menu_text',
|
||||
field=models.CharField(default='', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ungelichcontactussection',
|
||||
name='menu_text',
|
||||
field=models.CharField(default='', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ungelichtextsection',
|
||||
name='menu_text',
|
||||
field=models.CharField(default='', max_length=100),
|
||||
),
|
||||
]
|
40
ungleich_page/migrations/0004_auto_20171019_1113.py
Normal file
|
@ -0,0 +1,40 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-10-19 11:13
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ungleich_page', '0003_auto_20171019_1007'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='sectionwithimage',
|
||||
name='menu_text',
|
||||
field=models.CharField(blank=True, default='', max_length=100),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sectionwithimage',
|
||||
name='price_tag_url',
|
||||
field=models.URLField(blank=True, default='', max_length=300),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='service',
|
||||
name='menu_text',
|
||||
field=models.CharField(blank=True, default='', max_length=100),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='ungelichcontactussection',
|
||||
name='menu_text',
|
||||
field=models.CharField(blank=True, default='', max_length=100),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='ungelichtextsection',
|
||||
name='menu_text',
|
||||
field=models.CharField(blank=True, default='', max_length=100),
|
||||
),
|
||||
]
|
45
ungleich_page/migrations/0005_auto_20171019_1517.py
Normal file
|
@ -0,0 +1,45 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-10-19 15:17
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ungleich_page', '0004_auto_20171019_1113'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='ungelichcontactussection',
|
||||
name='address',
|
||||
field=models.CharField(blank=True, default='In der Au 7, Schwanden 8762', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ungelichcontactussection',
|
||||
name='contact_form_header_text',
|
||||
field=models.CharField(blank=True, default='Send us a message.', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ungelichcontactussection',
|
||||
name='contact_text',
|
||||
field=models.CharField(blank=True, default='Contact', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ungelichcontactussection',
|
||||
name='country',
|
||||
field=models.CharField(blank=True, default='Switzerland', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ungelichcontactussection',
|
||||
name='organization_name',
|
||||
field=models.CharField(blank=True, default='ungleich GmbH', max_length=100),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='ungelichcontactussection',
|
||||
name='email',
|
||||
field=models.EmailField(default='info@ungleich.ch', max_length=200),
|
||||
),
|
||||
]
|
20
ungleich_page/migrations/0006_aboutitem_link_url.py
Normal file
|
@ -0,0 +1,20 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-10-20 06:42
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ungleich_page', '0005_auto_20171019_1517'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='aboutitem',
|
||||
name='link_url',
|
||||
field=models.URLField(blank=True, default='', max_length=300),
|
||||
),
|
||||
]
|
|
@ -1,3 +1,89 @@
|
|||
# from django.db import models
|
||||
from cms.models.pluginmodel import CMSPlugin
|
||||
from django.db import models
|
||||
from djangocms_text_ckeditor.fields import HTMLField
|
||||
from filer.fields.image import FilerImageField
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class UngelichPicture(CMSPlugin):
|
||||
image = FilerImageField(
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="image",
|
||||
on_delete=models.SET_NULL
|
||||
)
|
||||
title = models.CharField(max_length=400)
|
||||
|
||||
|
||||
class SectionWithImage(UngelichPicture):
|
||||
menu_text = models.CharField(max_length=100, default="", blank=True)
|
||||
price_tag_image = FilerImageField(
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="price_tag_image",
|
||||
on_delete=models.SET_NULL
|
||||
)
|
||||
price_tag_url = models.URLField(max_length=300, default="", blank=True)
|
||||
|
||||
|
||||
class UngelichContactUsSection(CMSPlugin):
|
||||
menu_text = models.CharField(max_length=100, default="", blank=True)
|
||||
email = models.EmailField(max_length=200, default="info@ungleich.ch")
|
||||
contact_text = models.CharField(
|
||||
max_length=100, default="Contact", blank=True
|
||||
)
|
||||
organization_name = models.CharField(
|
||||
max_length=100, default="ungleich GmbH", blank=True
|
||||
)
|
||||
address = models.CharField(
|
||||
max_length=100, default="In der Au 7, Schwanden 8762", blank=True
|
||||
)
|
||||
country = models.CharField(
|
||||
max_length=100, default="Switzerland", blank=True
|
||||
)
|
||||
contact_form_header_text = models.CharField(
|
||||
max_length=100, default="Send us a message.", blank=True
|
||||
)
|
||||
|
||||
|
||||
class UngelichTextSection(CMSPlugin):
|
||||
menu_text = models.CharField(max_length=100, default="", blank=True)
|
||||
title = models.CharField(max_length=200)
|
||||
description = HTMLField()
|
||||
|
||||
|
||||
class Service(CMSPlugin):
|
||||
menu_text = models.CharField(max_length=100, default="", blank=True)
|
||||
title = models.CharField(max_length=200)
|
||||
sub_title = models.CharField(max_length=200)
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
|
||||
class ServiceItem(CMSPlugin):
|
||||
image = FilerImageField(
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name="service_item_image",
|
||||
on_delete=models.SET_NULL
|
||||
)
|
||||
title = models.CharField(max_length=200)
|
||||
description = HTMLField()
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
|
||||
class About(Service):
|
||||
pass
|
||||
|
||||
|
||||
class AboutItem(UngelichPicture):
|
||||
inverted = models.BooleanField(default=False)
|
||||
link_url = models.URLField(max_length=300, default="", blank=True)
|
||||
|
||||
def __str__(self):
|
||||
alignment = "Right" if self.inverted else "Left"
|
||||
return "{alignment} - {title}".format(
|
||||
alignment=alignment, title=self.title
|
||||
)
|
||||
|
|
|
@ -264,7 +264,8 @@ fieldset[disabled] .btn-xl.active {
|
|||
}
|
||||
|
||||
.navbar-default.navbar-shrink .navbar-brand {
|
||||
font-size: 1.5em;
|
||||
font-size: 1.5em;
|
||||
padding: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -418,7 +419,6 @@ section h3.section-subheading {
|
|||
|
||||
#portfolio .portfolio-item .portfolio-caption h4 {
|
||||
margin: 0;
|
||||
font-size: bold;
|
||||
text-transform: none;
|
||||
color: #494949;
|
||||
}
|
||||
|
|
12
ungleich_page/static/ungleich_page/css/cms.css
Normal file
|
@ -0,0 +1,12 @@
|
|||
.lead, .split-description.wow.fadeInUp p{
|
||||
font-family: "Raleway" , "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
font-size: 21px;
|
||||
color: #3a3a3a;
|
||||
font-weight: 300 !important;
|
||||
}
|
||||
|
||||
@media(min-width: 768px) {
|
||||
.custom-padding-bottom{
|
||||
padding-bottom: 0;
|
||||
}
|
||||
}
|
224
ungleich_page/static/ungleich_page/css/glasfaser.css
Normal file
|
@ -0,0 +1,224 @@
|
|||
.topnav img {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.navbar-transparent #logoWhite {
|
||||
width: 140px;
|
||||
}
|
||||
.navbar-default {
|
||||
border-bottom: 1px solid #e7e7e7;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-nav>li>a {
|
||||
text-transform: uppercase;
|
||||
font-weight: 400;
|
||||
letter-spacing: 1px;
|
||||
color: #777;
|
||||
}
|
||||
.navbar-transparent .navbar-nav>li>a {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.navbar-transparent .navbar-nav>li>a:hover,
|
||||
.navbar-transparent .navbar-nav>li>a:focus,
|
||||
.navbar-transparent .navbar-nav>li>a:focus:active {
|
||||
color: #fed136;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.navbar-transparent {
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
.navbar-transparent {
|
||||
background: rgba(0,0,0,0.05);
|
||||
box-shadow: 0 0 55px rgba(0,0,0,0.09);
|
||||
}
|
||||
}
|
||||
|
||||
.intro-header {
|
||||
background: url(../img/glasfaser/header-nico-sans.jpg) no-repeat center center;
|
||||
background-size: cover;
|
||||
background-position: left;
|
||||
background-color: rgb(118, 140, 163);
|
||||
background-attachment: fixed;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
padding-top: 70px;
|
||||
}
|
||||
|
||||
.intro-header:before {
|
||||
background: transparent;
|
||||
background: rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.price-tag-container {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-right: 8%;
|
||||
margin-left: 10px;
|
||||
margin-bottom: 20px;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.price-tag {
|
||||
background: url(../img/glasfaser/header-pricetag.png) no-repeat center center;
|
||||
height: 225px;
|
||||
width: 225px;
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.high-speed {
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
margin-bottom: 25px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.high-speed h1 {
|
||||
font-size: 32px;
|
||||
font-weight: 700;
|
||||
font-family: 'Open Sans Condensed';
|
||||
padding: 10px 15px 10px 0;
|
||||
text-shadow: 0px 2px 2px rgba(0,0,0,0.52);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.high-speed-border {
|
||||
background: #fff;
|
||||
height: 3px;
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
left: 20px;
|
||||
}
|
||||
|
||||
.high-speed-border:first-of-type {
|
||||
width: 40%;
|
||||
left: initial;
|
||||
}
|
||||
|
||||
.high-speed-border:before {
|
||||
content: ' ';
|
||||
display: inline-block;
|
||||
height: 23px;
|
||||
width: 23px;
|
||||
border-radius: 100%;
|
||||
background: #fff;
|
||||
position: absolute;
|
||||
left: -5px;
|
||||
top: -10px;
|
||||
}
|
||||
|
||||
|
||||
.split-section .container {
|
||||
max-width: 1120px;
|
||||
}
|
||||
.split-section.right .container {
|
||||
max-width: 840px;
|
||||
}
|
||||
.split-section {
|
||||
padding: 90px 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
.split-section.right {
|
||||
padding: 100px 0;
|
||||
background: rgba(0,0,0,0.03);
|
||||
}
|
||||
.split-section.right .split-description {
|
||||
width: 100%;
|
||||
}
|
||||
.split-section .split-text .split-title h2,
|
||||
.split-section.left .split-text .split-title h2 {
|
||||
font-size: 40px;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
.split-section.left .split-text .split-title::before,
|
||||
.split-section.right .split-text .split-title::before {
|
||||
width: 90%;
|
||||
max-width: 420px;
|
||||
}
|
||||
|
||||
.team-member h4 {
|
||||
font-family: 'Raleway', Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||
font-weight: 700;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.timeline>li .timeline-panel {
|
||||
display: flex;
|
||||
min-height: 80px;
|
||||
align-items: center;
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.timeline>li.timeline-inverted>.timeline-panel {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
|
||||
.contact-section h2,
|
||||
.contact-section h3,
|
||||
.contact-section p {
|
||||
color: rgba(255,255,255,0.9);
|
||||
text-transform: initial;
|
||||
font-weight: 300;
|
||||
font-family: 'Lato';
|
||||
}
|
||||
|
||||
.contact-section p {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
footer {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
@media(max-width: 767px) {
|
||||
.split-section .split-text .split-title h2,
|
||||
.split-section.left .split-text .split-title h2 {
|
||||
font-size: 32px;
|
||||
line-height: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media(min-width: 768px) {
|
||||
section {
|
||||
padding: 90px 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.intro-header {
|
||||
align-items: flex-end;
|
||||
}
|
||||
.high-speed h1 {
|
||||
font-size: 88px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) and (max-width: 991px) {
|
||||
.intro-header {
|
||||
background-position: -100px;
|
||||
background-size: auto 110%;
|
||||
}
|
||||
.price-tag {
|
||||
height: 240px;
|
||||
width: 240px;
|
||||
}
|
||||
.timeline>li .timeline-panel {
|
||||
min-height: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.price-tag {
|
||||
min-height: 320px;
|
||||
width: 320px;
|
||||
}
|
||||
.timeline>li .timeline-panel {
|
||||
min-height: 170px;
|
||||
}
|
||||
}
|
BIN
ungleich_page/static/ungleich_page/img/about/7.png
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
ungleich_page/static/ungleich_page/img/about/8.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
ungleich_page/static/ungleich_page/img/glasfaser/a.jpg
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
ungleich_page/static/ungleich_page/img/glasfaser/b.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
|
@ -0,0 +1,66 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="196px"
|
||||
height="196px" viewBox="0 0 196 196" enable-background="new 0 0 196 196" xml:space="preserve">
|
||||
<g id="Layer_1">
|
||||
<g>
|
||||
<ellipse fill="#0D2849" cx="96.871" cy="97.632" rx="68.442" ry="67.431"/>
|
||||
|
||||
<ellipse opacity="0.57" fill="none" stroke="#47B9E8" stroke-width="2" stroke-miterlimit="10" cx="96.719" cy="97.321" rx="62.32" ry="61.179"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#47B9E8" d="M57.043,130.8c0-20.398,0-40.777,0-61.19
|
||||
c9.176,0,18.341,0,27.533,0c0-0.142-0.001-0.25,0-0.36c0.021-1.162,0.002-2.325,0.069-3.485c0.066-1.101,0.483-2.09,1.144-2.978
|
||||
c0.923-1.239,2.173-1.945,3.664-2.244c0.416-0.082,0.85-0.11,1.275-0.112c4.061-0.007,8.123-0.007,12.179-0.002
|
||||
c1.668,0.002,3.154,0.521,4.364,1.683c0.668,0.641,1.144,1.424,1.442,2.312c0.28,0.833,0.355,1.69,0.351,2.561
|
||||
c-0.007,0.865-0.003,1.73-0.003,2.616c9.187,0,18.341,0,27.523,0c0,20.406,0,40.794,0,61.201
|
||||
C110.086,130.8,83.578,130.8,57.043,130.8z M130.484,75.751c-22.465,0-44.889,0-67.331,0c0,0.123,0,0.224,0,0.325
|
||||
c0,5.925,0,11.853,0,17.78c0,0.212,0.001,0.428,0.019,0.641c0.138,1.929,0.936,3.506,2.536,4.634
|
||||
c1.15,0.811,2.456,1.086,3.846,1.086c18.178-0.003,36.358-0.002,54.534-0.003c0.225,0,0.449-0.002,0.672-0.018
|
||||
c1.933-0.139,3.509-0.933,4.638-2.529c0.8-1.132,1.091-2.417,1.091-3.785c-0.004-5.937-0.004-11.873-0.004-17.81
|
||||
C130.484,75.971,130.484,75.87,130.484,75.751z M130.469,104.805c-0.041,0.003-0.063,0-0.078,0.007
|
||||
c-1.979,1.076-4.105,1.528-6.347,1.528c-18.199-0.007-36.398-0.003-54.597-0.003c-1.986,0-3.885-0.378-5.675-1.264
|
||||
c-0.196-0.098-0.396-0.186-0.594-0.28c0,6.646,0,13.271,0,19.892c22.442,0,44.859,0,67.291,0
|
||||
C130.469,118.053,130.469,111.436,130.469,104.805z M90.708,69.586c4.091,0,8.154,0,12.215,0c0-1.017,0-2.012,0-3.011
|
||||
c-4.083,0-8.145,0-12.215,0C90.708,67.589,90.708,68.575,90.708,69.586z"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0D2849" d="M130.484,75.751c0,0.119,0,0.22,0,0.321
|
||||
c0,5.937,0,11.873,0.004,17.81c0,1.369-0.291,2.653-1.091,3.785c-1.129,1.597-2.705,2.391-4.638,2.529
|
||||
c-0.223,0.016-0.447,0.018-0.672,0.018c-18.176,0.001-36.356,0-54.534,0.003c-1.39,0-2.695-0.275-3.846-1.086
|
||||
c-1.6-1.128-2.397-2.705-2.536-4.634c-0.017-0.213-0.019-0.428-0.019-0.641c0-5.928,0-11.855,0-17.78c0-0.101,0-0.202,0-0.325
|
||||
C85.595,75.751,108.02,75.751,130.484,75.751z M81.511,87.99c-2.049,0-4.07,0-6.093,0c0,3.061,0,6.104,0,9.138
|
||||
c2.043,0,4.064,0,6.093,0C81.511,94.078,81.511,91.05,81.511,87.99z M112.144,87.984c0,3.069,0,6.112,0,9.144
|
||||
c2.048,0,4.068,0,6.083,0c0-3.06,0-6.095,0-9.144C116.194,87.984,114.18,87.984,112.144,87.984z"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0D2849" d="M130.469,104.805c0,6.631,0,13.248,0,19.88
|
||||
c-22.432,0-44.848,0-67.291,0c0-6.621,0-13.245,0-19.892c0.198,0.095,0.398,0.183,0.594,0.28c1.79,0.886,3.689,1.264,5.675,1.264
|
||||
c18.199,0,36.397-0.004,54.597,0.003c2.241,0,4.367-0.452,6.347-1.528C130.405,104.805,130.428,104.808,130.469,104.805z"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#0D2849" d="M90.708,69.586c0-1.011,0-1.997,0-3.011c4.07,0,8.132,0,12.215,0
|
||||
c0,1,0,1.995,0,3.011C98.862,69.586,94.799,69.586,90.708,69.586z"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#47B9E8" d="M81.511,87.99c0,3.06,0,6.088,0,9.138c-2.029,0-4.05,0-6.093,0
|
||||
c0-3.034,0-6.077,0-9.138C77.441,87.99,79.462,87.99,81.511,87.99z"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="#47B9E8" d="M112.144,87.984c2.036,0,4.051,0,6.083,0
|
||||
c0,3.049,0,6.084,0,9.144c-2.015,0-4.035,0-6.083,0C112.144,94.097,112.144,91.054,112.144,87.984z"/>
|
||||
</g>
|
||||
|
||||
<image display="none" overflow="visible" width="170" height="166" id="Layer_4_xA0_Image_1_" xlink:href="3DFCBC34760ACD66.png" transform="matrix(1 0 0 1 12.8145 16.6162)">
|
||||
</image>
|
||||
|
||||
<rect x="61.251" y="73.602" display="none" fill="none" stroke="#FFFFFF" stroke-width="5.5" stroke-miterlimit="10" width="28.351" height="52.284"/>
|
||||
|
||||
<rect x="103.226" y="74.338" display="none" fill="none" stroke="#FFFFFF" stroke-width="5.5" stroke-miterlimit="10" width="28.351" height="52.284"/>
|
||||
<rect x="72.665" y="85.384" display="none" fill="#FFFFFF" width="5.155" height="6.996"/>
|
||||
<rect x="72.665" y="107.477" display="none" fill="#FFFFFF" width="5.155" height="6.995"/>
|
||||
<rect x="103.226" y="97.321" display="none" fill="#FFFFFF" width="28.351" height="5"/>
|
||||
</g>
|
||||
<g id="Layer_2" display="none">
|
||||
<g display="inline">
|
||||
|
||||
<text transform="matrix(1 0 0 1 54.2861 73.6836)" fill="#FFFFFF" font-family="'HelveticaNeue-CondensedBold'" font-size="17.6318">IP-Adressen</text>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="2" stroke-miterlimit="10" x1="46.373" y1="116.581" x2="147.75" y2="116.581"/>
|
||||
<text transform="matrix(1 0 0 1 67.772 108.3828)" fill="#FFFFFF" font-family="'HelveticaNeue-Bold'" font-size="26.4477">IPv6</text>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="2" stroke-miterlimit="10" x1="46.373" y1="81.142" x2="147.75" y2="81.142"/>
|
||||
</g>
|
||||
|
||||
<text transform="matrix(1 0 0 1 67.772 141.3809)" display="inline" fill="#FFFFFF" font-family="'HelveticaNeue-Bold'" font-size="26.4477">IPv4</text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.3 KiB |
BIN
ungleich_page/static/ungleich_page/img/glasfaser/c.jpg
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
ungleich_page/static/ungleich_page/img/glasfaser/d.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 108 KiB |
168
ungleich_page/static/ungleich_page/img/glasfaser/ip.svg
Normal file
|
@ -0,0 +1,168 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="196px" height="196px" viewBox="0 0 196 196" enable-background="new 0 0 196 196" xml:space="preserve">
|
||||
<g id="Layer_1_1_">
|
||||
<g>
|
||||
<ellipse fill="#0D2849" cx="96.871" cy="97.632" rx="68.441" ry="67.431"/>
|
||||
|
||||
<ellipse opacity="0.57" fill="none" stroke="#47B9E8" stroke-width="2" stroke-miterlimit="10" enable-background="new " cx="96.719" cy="97.321" rx="62.32" ry="61.179"/>
|
||||
</g>
|
||||
<g display="none">
|
||||
<path display="inline" fill="#FFFFFF" d="M57.043,130.8c0-20.397,0-40.777,0-61.19c9.176,0,18.341,0,27.533,0
|
||||
c0-0.142-0.001-0.25,0-0.36c0.021-1.162,0.002-2.325,0.069-3.485c0.066-1.101,0.483-2.09,1.144-2.978
|
||||
c0.923-1.239,2.173-1.945,3.664-2.244c0.416-0.082,0.85-0.11,1.275-0.112c4.061-0.007,8.124-0.007,12.179-0.002
|
||||
c1.668,0.002,3.153,0.521,4.364,1.683c0.668,0.641,1.144,1.424,1.441,2.312c0.28,0.833,0.355,1.69,0.352,2.561
|
||||
c-0.008,0.865-0.004,1.73-0.004,2.616c9.188,0,18.342,0,27.523,0c0,20.406,0,40.793,0,61.201
|
||||
C110.086,130.8,83.578,130.8,57.043,130.8z M130.484,75.751c-22.465,0-44.889,0-67.332,0c0,0.123,0,0.224,0,0.325
|
||||
c0,5.925,0,11.853,0,17.78c0,0.212,0.001,0.428,0.019,0.641c0.138,1.929,0.936,3.506,2.536,4.634
|
||||
c1.15,0.811,2.456,1.086,3.846,1.086c18.178-0.003,36.358-0.002,54.534-0.003c0.225,0,0.449-0.002,0.672-0.019
|
||||
c1.934-0.139,3.51-0.932,4.639-2.528c0.8-1.132,1.09-2.417,1.09-3.785c-0.004-5.937-0.004-11.873-0.004-17.81
|
||||
C130.484,75.971,130.484,75.87,130.484,75.751z M130.469,104.805c-0.041,0.004-0.062,0-0.078,0.008
|
||||
c-1.979,1.076-4.104,1.527-6.347,1.527c-18.198-0.007-36.398-0.003-54.597-0.003c-1.986,0-3.885-0.378-5.675-1.264
|
||||
c-0.196-0.099-0.396-0.187-0.594-0.28c0,6.646,0,13.271,0,19.893c22.442,0,44.859,0,67.291,0
|
||||
C130.469,118.053,130.469,111.436,130.469,104.805z M90.708,69.586c4.091,0,8.153,0,12.215,0c0-1.017,0-2.012,0-3.011
|
||||
c-4.083,0-8.145,0-12.215,0C90.708,67.589,90.708,68.575,90.708,69.586z"/>
|
||||
<path display="inline" fill="#3077A3" d="M130.484,75.751c0,0.119,0,0.22,0,0.321c0,5.937,0,11.873,0.004,17.81
|
||||
c0,1.369-0.291,2.653-1.092,3.785c-1.129,1.597-2.705,2.392-4.638,2.528c-0.223,0.017-0.446,0.019-0.672,0.019
|
||||
c-18.176,0.001-36.356,0-54.534,0.003c-1.39,0-2.695-0.275-3.846-1.086c-1.6-1.128-2.397-2.705-2.536-4.634
|
||||
c-0.017-0.213-0.019-0.428-0.019-0.641c0-5.928,0-11.855,0-17.78c0-0.101,0-0.202,0-0.325
|
||||
C85.595,75.751,108.02,75.751,130.484,75.751z M81.511,87.99c-2.049,0-4.07,0-6.093,0c0,3.061,0,6.104,0,9.138
|
||||
c2.043,0,4.064,0,6.093,0C81.511,94.078,81.511,91.05,81.511,87.99z M112.145,87.984c0,3.069,0,6.112,0,9.144
|
||||
c2.047,0,4.067,0,6.082,0c0-3.06,0-6.095,0-9.144C116.193,87.984,114.18,87.984,112.145,87.984z"/>
|
||||
<path display="inline" fill="#3077A3" d="M130.469,104.805c0,6.631,0,13.248,0,19.881c-22.432,0-44.848,0-67.291,0
|
||||
c0-6.621,0-13.246,0-19.893c0.198,0.096,0.398,0.184,0.594,0.28c1.79,0.886,3.689,1.264,5.675,1.264
|
||||
c18.199,0,36.397-0.004,54.597,0.003c2.241,0,4.367-0.451,6.347-1.527C130.404,104.805,130.428,104.809,130.469,104.805z"/>
|
||||
<path display="inline" fill="#3077A3" d="M90.708,69.586c0-1.011,0-1.997,0-3.011c4.07,0,8.132,0,12.215,0c0,1,0,1.995,0,3.011
|
||||
C98.861,69.586,94.799,69.586,90.708,69.586z"/>
|
||||
<path display="inline" fill="#FFFFFF" d="M81.511,87.99c0,3.06,0,6.088,0,9.138c-2.029,0-4.05,0-6.093,0c0-3.034,0-6.077,0-9.138
|
||||
C77.441,87.99,79.462,87.99,81.511,87.99z"/>
|
||||
<path display="inline" fill="#FFFFFF" d="M112.145,87.984c2.035,0,4.051,0,6.082,0c0,3.049,0,6.084,0,9.144
|
||||
c-2.015,0-4.035,0-6.082,0C112.145,94.097,112.145,91.054,112.145,87.984z"/>
|
||||
</g>
|
||||
|
||||
<image display="none" overflow="visible" enable-background="new " width="171" height="167" id="Layer_4_xA0_Image_2_" xlink:href="B1D654609C24A42D.png" transform="matrix(0.9941 0 0 0.9941 12.8198 16.6104)">
|
||||
</image>
|
||||
|
||||
<rect x="61.251" y="73.602" display="none" fill="none" stroke="#FFFFFF" stroke-width="5.5" stroke-miterlimit="10" width="28.351" height="52.284"/>
|
||||
|
||||
<rect x="103.227" y="74.338" display="none" fill="none" stroke="#FFFFFF" stroke-width="5.5" stroke-miterlimit="10" width="28.351" height="52.284"/>
|
||||
<rect x="72.665" y="85.384" display="none" fill="#FFFFFF" width="5.155" height="6.996"/>
|
||||
<rect x="72.665" y="107.477" display="none" fill="#FFFFFF" width="5.155" height="6.996"/>
|
||||
<rect x="103.227" y="97.321" display="none" fill="#FFFFFF" width="28.351" height="5"/>
|
||||
</g>
|
||||
<g id="Layer_2">
|
||||
<g>
|
||||
<g enable-background="new ">
|
||||
<path fill="#47B9E8" d="M55.291,61.095h2.539v12.589h-2.539V61.095z"/>
|
||||
<path fill="#47B9E8" d="M64.16,61.095c0.646,0,1.19,0.108,1.631,0.326c0.441,0.218,0.796,0.502,1.067,0.854
|
||||
c0.271,0.354,0.464,0.756,0.582,1.208c0.117,0.453,0.176,0.914,0.176,1.385c0,0.646-0.097,1.21-0.291,1.692
|
||||
c-0.194,0.481-0.464,0.876-0.811,1.181c-0.347,0.307-0.767,0.535-1.261,0.688c-0.494,0.152-1.04,0.229-1.64,0.229h-1.358v5.025
|
||||
h-2.539V61.095H64.16z M63.384,66.79c0.505,0,0.914-0.153,1.226-0.459s0.467-0.781,0.467-1.428c0-0.635-0.135-1.117-0.406-1.446
|
||||
s-0.723-0.493-1.357-0.493h-1.058v3.826H63.384z"/>
|
||||
<path fill="#47B9E8" d="M73.734,69.628h-4.972v-2.08h4.972V69.628z"/>
|
||||
<path fill="#47B9E8" d="M80.98,61.095l3.333,12.589h-2.645l-0.582-2.662h-3.35l-0.582,2.662H74.51l3.333-12.589H80.98z
|
||||
M80.646,68.94l-1.216-5.659h-0.036l-1.216,5.659H80.646z"/>
|
||||
<path fill="#47B9E8" d="M89.955,72.679c-0.271,0.446-0.573,0.758-0.908,0.935c-0.335,0.176-0.75,0.265-1.243,0.265
|
||||
c-1,0-1.734-0.382-2.204-1.146c-0.47-0.764-0.705-2.027-0.705-3.791c0-1.763,0.235-3.035,0.705-3.817
|
||||
c0.47-0.781,1.205-1.172,2.204-1.172c0.458,0,0.849,0.094,1.172,0.282c0.323,0.188,0.614,0.47,0.873,0.846h0.035v-3.984h2.433
|
||||
v12.589H89.99v-1.005H89.955z M87.566,71.276c0.159,0.523,0.502,0.785,1.032,0.785c0.541,0,0.89-0.262,1.049-0.785
|
||||
c0.159-0.522,0.238-1.301,0.238-2.336c0-1.034-0.08-1.812-0.238-2.336s-0.508-0.785-1.049-0.785
|
||||
c-0.529,0-0.873,0.262-1.032,0.785s-0.238,1.302-0.238,2.336C87.328,69.976,87.407,70.754,87.566,71.276z"/>
|
||||
<path fill="#47B9E8" d="M96.268,64.197v1.27h0.035c0.247-0.458,0.546-0.825,0.899-1.102c0.353-0.276,0.782-0.414,1.287-0.414
|
||||
c0.071,0,0.144,0.003,0.22,0.009s0.15,0.015,0.221,0.026v2.327c-0.129-0.012-0.256-0.021-0.379-0.026
|
||||
c-0.124-0.006-0.25-0.009-0.379-0.009c-0.211,0-0.423,0.029-0.635,0.088c-0.211,0.06-0.405,0.156-0.582,0.291
|
||||
c-0.176,0.136-0.317,0.312-0.423,0.529c-0.105,0.218-0.159,0.484-0.159,0.802v5.695H93.94v-9.486H96.268z"/>
|
||||
<path fill="#47B9E8" d="M101.892,70.069c0,0.282,0.021,0.555,0.062,0.819s0.109,0.5,0.203,0.705
|
||||
c0.094,0.206,0.217,0.371,0.37,0.494s0.341,0.186,0.564,0.186c0.411,0,0.711-0.147,0.899-0.441
|
||||
c0.188-0.293,0.316-0.74,0.388-1.34h2.187c-0.047,1.105-0.342,1.945-0.882,2.521c-0.541,0.576-1.394,0.864-2.557,0.864
|
||||
c-0.882,0-1.569-0.147-2.063-0.441c-0.493-0.293-0.857-0.682-1.093-1.163c-0.235-0.482-0.379-1.023-0.433-1.622
|
||||
c-0.053-0.6-0.078-1.199-0.078-1.799c0-0.635,0.043-1.246,0.132-1.834c0.088-0.588,0.265-1.11,0.528-1.569
|
||||
c0.266-0.458,0.645-0.822,1.138-1.093s1.151-0.405,1.975-0.405c0.706,0,1.284,0.114,1.737,0.344
|
||||
c0.452,0.229,0.808,0.553,1.066,0.97c0.258,0.417,0.435,0.923,0.529,1.516c0.094,0.594,0.141,1.255,0.141,1.984v0.546h-4.813
|
||||
V70.069z M104.307,66.904c-0.035-0.276-0.097-0.512-0.185-0.705c-0.089-0.194-0.212-0.341-0.37-0.441
|
||||
c-0.158-0.1-0.361-0.149-0.608-0.149s-0.45,0.056-0.608,0.167c-0.158,0.112-0.285,0.259-0.379,0.441
|
||||
c-0.094,0.182-0.162,0.385-0.203,0.608c-0.041,0.223-0.062,0.446-0.062,0.67v0.37h2.486
|
||||
C104.365,67.501,104.342,67.181,104.307,66.904z"/>
|
||||
<path fill="#47B9E8" d="M109.756,70.897c0,0.412,0.107,0.744,0.326,0.996c0.217,0.253,0.531,0.38,0.943,0.38
|
||||
c0.375,0,0.676-0.095,0.898-0.282c0.224-0.188,0.336-0.471,0.336-0.847c0-0.306-0.089-0.538-0.266-0.696
|
||||
c-0.176-0.159-0.381-0.285-0.617-0.379l-1.709-0.617c-0.671-0.235-1.176-0.567-1.518-0.996c-0.34-0.43-0.511-0.979-0.511-1.648
|
||||
c0-0.389,0.064-0.756,0.194-1.103c0.129-0.347,0.334-0.649,0.617-0.908c0.281-0.258,0.643-0.464,1.084-0.617
|
||||
c0.441-0.152,0.973-0.229,1.596-0.229c1.104,0,1.922,0.235,2.451,0.705c0.528,0.47,0.793,1.135,0.793,1.992v0.388h-2.187
|
||||
c0-0.493-0.079-0.854-0.237-1.084c-0.159-0.229-0.438-0.344-0.838-0.344c-0.307,0-0.573,0.085-0.803,0.256
|
||||
c-0.229,0.17-0.344,0.426-0.344,0.767c0,0.235,0.074,0.447,0.221,0.635c0.146,0.188,0.426,0.347,0.838,0.476l1.463,0.494
|
||||
c0.764,0.259,1.305,0.597,1.622,1.014c0.317,0.418,0.476,0.984,0.476,1.701c0,0.506-0.088,0.943-0.264,1.314
|
||||
c-0.176,0.37-0.42,0.679-0.732,0.925c-0.311,0.247-0.682,0.424-1.11,0.529s-0.902,0.159-1.419,0.159
|
||||
c-0.682,0-1.25-0.065-1.701-0.194c-0.453-0.129-0.812-0.323-1.076-0.582c-0.265-0.258-0.449-0.573-0.555-0.943
|
||||
c-0.106-0.37-0.159-0.784-0.159-1.243V70.58h2.187V70.897z"/>
|
||||
<path fill="#47B9E8" d="M117.584,70.897c0,0.412,0.107,0.744,0.326,0.996c0.217,0.253,0.531,0.38,0.943,0.38
|
||||
c0.375,0,0.676-0.095,0.898-0.282c0.224-0.188,0.336-0.471,0.336-0.847c0-0.306-0.089-0.538-0.266-0.696
|
||||
c-0.176-0.159-0.381-0.285-0.617-0.379l-1.709-0.617c-0.671-0.235-1.176-0.567-1.518-0.996c-0.34-0.43-0.511-0.979-0.511-1.648
|
||||
c0-0.389,0.064-0.756,0.194-1.103c0.129-0.347,0.334-0.649,0.617-0.908c0.281-0.258,0.643-0.464,1.084-0.617
|
||||
c0.441-0.152,0.973-0.229,1.596-0.229c1.104,0,1.922,0.235,2.451,0.705c0.528,0.47,0.793,1.135,0.793,1.992v0.388h-2.187
|
||||
c0-0.493-0.079-0.854-0.237-1.084c-0.159-0.229-0.438-0.344-0.838-0.344c-0.307,0-0.573,0.085-0.803,0.256
|
||||
c-0.229,0.17-0.344,0.426-0.344,0.767c0,0.235,0.074,0.447,0.221,0.635c0.146,0.188,0.426,0.347,0.838,0.476l1.463,0.494
|
||||
c0.764,0.259,1.305,0.597,1.622,1.014c0.317,0.418,0.476,0.984,0.476,1.701c0,0.506-0.088,0.943-0.264,1.314
|
||||
c-0.176,0.37-0.42,0.679-0.732,0.925c-0.311,0.247-0.682,0.424-1.11,0.529s-0.902,0.159-1.419,0.159
|
||||
c-0.682,0-1.25-0.065-1.701-0.194c-0.453-0.129-0.812-0.323-1.076-0.582c-0.265-0.258-0.449-0.573-0.555-0.943
|
||||
c-0.106-0.37-0.159-0.784-0.159-1.243V70.58h2.187V70.897z"/>
|
||||
<path fill="#47B9E8" d="M125.711,70.069c0,0.282,0.021,0.555,0.062,0.819s0.108,0.5,0.203,0.705
|
||||
c0.094,0.206,0.217,0.371,0.369,0.494c0.153,0.123,0.342,0.186,0.564,0.186c0.412,0,0.711-0.147,0.899-0.441
|
||||
c0.188-0.293,0.317-0.74,0.388-1.34h2.187c-0.047,1.105-0.341,1.945-0.882,2.521s-1.393,0.864-2.557,0.864
|
||||
c-0.881,0-1.568-0.147-2.062-0.441c-0.494-0.293-0.858-0.682-1.094-1.163c-0.234-0.482-0.379-1.023-0.432-1.622
|
||||
c-0.053-0.6-0.079-1.199-0.079-1.799c0-0.635,0.044-1.246,0.132-1.834s0.265-1.11,0.529-1.569
|
||||
c0.265-0.458,0.644-0.822,1.137-1.093c0.494-0.271,1.152-0.405,1.975-0.405c0.706,0,1.285,0.114,1.737,0.344
|
||||
c0.452,0.229,0.808,0.553,1.067,0.97c0.258,0.417,0.434,0.923,0.528,1.516c0.095,0.594,0.142,1.255,0.142,1.984v0.546h-4.814
|
||||
V70.069z M128.127,66.904c-0.035-0.276-0.098-0.512-0.186-0.705c-0.088-0.194-0.211-0.341-0.369-0.441
|
||||
c-0.159-0.1-0.362-0.149-0.609-0.149c-0.246,0-0.449,0.056-0.607,0.167c-0.159,0.112-0.285,0.259-0.379,0.441
|
||||
c-0.095,0.182-0.162,0.385-0.203,0.608c-0.041,0.223-0.062,0.446-0.062,0.67v0.37h2.486
|
||||
C128.186,67.501,128.162,67.181,128.127,66.904z"/>
|
||||
<path fill="#47B9E8" d="M134.122,64.197v1.111h0.035c0.259-0.47,0.593-0.813,1.005-1.031c0.411-0.218,0.882-0.326,1.41-0.326
|
||||
c0.776,0,1.373,0.211,1.79,0.635c0.417,0.423,0.626,1.11,0.626,2.062v7.035h-2.434v-6.541c0-0.494-0.082-0.838-0.246-1.032
|
||||
c-0.165-0.193-0.43-0.291-0.794-0.291c-0.858,0-1.287,0.523-1.287,1.569v6.295h-2.433v-9.486H134.122z"/>
|
||||
</g>
|
||||
<line fill="none" stroke="#47B9E8" stroke-width="2" stroke-miterlimit="10" x1="46.373" y1="116.581" x2="147.75" y2="116.581"/>
|
||||
<g enable-background="new ">
|
||||
<path fill="#47B9E8" d="M76.196,90.247v17.136h-3.768V90.247H76.196z"/>
|
||||
<path fill="#47B9E8" d="M87.236,90.247c1.072,0,1.984,0.155,2.736,0.468c0.752,0.312,1.364,0.724,1.836,1.236
|
||||
c0.472,0.512,0.816,1.096,1.032,1.752c0.216,0.656,0.324,1.336,0.324,2.04c0,0.688-0.108,1.364-0.324,2.027
|
||||
c-0.216,0.664-0.56,1.252-1.032,1.765c-0.472,0.512-1.084,0.924-1.836,1.235c-0.752,0.312-1.665,0.469-2.736,0.469h-3.96v6.144
|
||||
h-3.768V90.247H87.236z M86.205,98.311c0.432,0,0.848-0.031,1.248-0.096c0.399-0.063,0.752-0.188,1.056-0.372
|
||||
c0.304-0.184,0.548-0.444,0.732-0.78c0.184-0.336,0.276-0.775,0.276-1.319s-0.092-0.984-0.276-1.32
|
||||
c-0.184-0.336-0.428-0.596-0.732-0.78c-0.304-0.184-0.656-0.308-1.056-0.372c-0.4-0.063-0.816-0.096-1.248-0.096h-2.928v5.136
|
||||
H86.205z"/>
|
||||
<path fill="#47B9E8" d="M98.229,107.383L93.98,94.975h3.576l2.616,8.473h0.049l2.615-8.473h3.385l-4.2,12.408H98.229z"/>
|
||||
<path fill="#47B9E8" d="M114.884,93.438c-0.399-0.416-0.896-0.624-1.487-0.624c-0.609,0-1.117,0.181-1.524,0.54
|
||||
c-0.408,0.36-0.732,0.801-0.972,1.32c-0.24,0.521-0.417,1.076-0.528,1.668c-0.112,0.592-0.177,1.12-0.192,1.584l0.049,0.048
|
||||
c0.463-0.672,1.008-1.151,1.631-1.439c0.625-0.288,1.344-0.433,2.16-0.433c0.721,0,1.424,0.156,2.112,0.469
|
||||
c0.688,0.312,1.272,0.731,1.752,1.26c0.448,0.512,0.776,1.096,0.983,1.752c0.209,0.656,0.312,1.319,0.312,1.992
|
||||
c0,0.863-0.141,1.668-0.42,2.411c-0.28,0.744-0.68,1.393-1.199,1.944c-0.521,0.552-1.141,0.984-1.861,1.296
|
||||
c-0.719,0.312-1.52,0.468-2.399,0.468c-1.265,0-2.312-0.252-3.144-0.756s-1.496-1.164-1.992-1.979
|
||||
c-0.496-0.816-0.84-1.74-1.032-2.772c-0.192-1.031-0.288-2.084-0.288-3.155c0-1.04,0.12-2.08,0.359-3.12
|
||||
c0.24-1.04,0.625-1.98,1.152-2.82c0.528-0.84,1.208-1.524,2.041-2.052c0.831-0.528,1.848-0.792,3.047-0.792
|
||||
c0.721,0,1.393,0.104,2.017,0.312s1.176,0.509,1.655,0.9c0.48,0.392,0.873,0.876,1.177,1.452c0.304,0.575,0.504,1.24,0.6,1.991
|
||||
h-3.239C115.539,94.343,115.283,93.855,114.884,93.438z M112.016,98.923c-0.344,0.168-0.628,0.396-0.852,0.684
|
||||
c-0.225,0.288-0.393,0.621-0.504,0.996c-0.112,0.376-0.168,0.772-0.168,1.188c0,0.384,0.06,0.764,0.18,1.14
|
||||
s0.296,0.712,0.527,1.008c0.232,0.297,0.517,0.532,0.853,0.708c0.336,0.177,0.72,0.265,1.151,0.265
|
||||
c0.416,0,0.781-0.088,1.093-0.265c0.312-0.176,0.579-0.407,0.804-0.695s0.393-0.616,0.504-0.984
|
||||
c0.112-0.368,0.168-0.744,0.168-1.128c0-0.399-0.052-0.788-0.156-1.164c-0.104-0.376-0.26-0.712-0.467-1.008
|
||||
c-0.209-0.296-0.477-0.536-0.805-0.72c-0.328-0.185-0.708-0.276-1.141-0.276C112.756,98.671,112.359,98.755,112.016,98.923z"/>
|
||||
</g>
|
||||
<line fill="none" stroke="#47B9E8" stroke-width="2" stroke-miterlimit="10" x1="46.373" y1="81.142" x2="147.75" y2="81.142"/>
|
||||
</g>
|
||||
<g enable-background="new ">
|
||||
<path fill="#47B9E8" d="M76.196,123.245v17.136h-3.768v-17.136H76.196z"/>
|
||||
<path fill="#47B9E8" d="M87.236,123.245c1.072,0,1.984,0.155,2.736,0.468c0.752,0.312,1.364,0.724,1.836,1.236
|
||||
c0.472,0.512,0.816,1.096,1.032,1.752c0.216,0.656,0.324,1.336,0.324,2.04c0,0.688-0.108,1.364-0.324,2.027
|
||||
c-0.216,0.664-0.56,1.252-1.032,1.765c-0.472,0.512-1.084,0.924-1.836,1.235c-0.752,0.312-1.665,0.469-2.736,0.469h-3.96v6.144
|
||||
h-3.768v-17.136H87.236z M86.205,131.309c0.432,0,0.848-0.031,1.248-0.096c0.399-0.063,0.752-0.188,1.056-0.372
|
||||
c0.304-0.184,0.548-0.444,0.732-0.78c0.184-0.336,0.276-0.775,0.276-1.319s-0.092-0.984-0.276-1.32
|
||||
c-0.184-0.336-0.428-0.596-0.732-0.78c-0.304-0.184-0.656-0.308-1.056-0.372c-0.4-0.063-0.816-0.096-1.248-0.096h-2.928v5.136
|
||||
H86.205z"/>
|
||||
<path fill="#47B9E8" d="M98.229,140.381l-4.248-12.408h3.576l2.616,8.473h0.049l2.615-8.473h3.385l-4.2,12.408H98.229z"/>
|
||||
<path fill="#47B9E8" d="M106.724,136.493v-3.12l7.296-9.792h3.049v10.104h2.231v2.809h-2.231v3.888h-3.24v-3.888H106.724z
|
||||
M113.756,127.853l-4.344,5.832h4.416v-5.832H113.756z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 15 KiB |
50
ungleich_page/static/ungleich_page/img/glasfaser/switch.svg
Normal file
|
@ -0,0 +1,50 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="196px" height="196px" viewBox="0 0 196 196" enable-background="new 0 0 196 196" xml:space="preserve">
|
||||
<g>
|
||||
<ellipse fill="#0D2849" cx="96.871" cy="97.632" rx="68.441" ry="67.431"/>
|
||||
|
||||
<ellipse opacity="0.57" fill="none" stroke="#47B9E8" stroke-width="2" stroke-miterlimit="10" enable-background="new " cx="96.719" cy="97.321" rx="62.32" ry="61.179"/>
|
||||
</g>
|
||||
<g display="none">
|
||||
<path display="inline" opacity="0.84" fill="#FFFFFF" enable-background="new " d="M40.517,144.309c0-29.391,0-58.75,0-88.158
|
||||
c13.22,0,26.423,0,39.667,0c0-0.204-0.002-0.36,0-0.519c0.03-1.674,0.003-3.351,0.1-5.022c0.094-1.585,0.694-3.012,1.647-4.29
|
||||
c1.329-1.784,3.13-2.802,5.277-3.232c0.6-0.118,1.225-0.159,1.838-0.161c5.851-0.011,11.702-0.011,17.547-0.003
|
||||
c2.4,0.003,4.544,0.751,6.286,2.425c0.964,0.923,1.646,2.051,2.078,3.329c0.402,1.201,0.512,2.436,0.506,3.69
|
||||
c-0.011,1.246-0.005,2.492-0.005,3.768c13.235,0,26.423,0,39.653,0c0,29.4,0,58.772,0,88.173
|
||||
C116.934,144.309,78.744,144.309,40.517,144.309z M146.322,64.998c-32.365,0-64.672,0-97.002,0c0,0.177,0,0.323,0,0.468
|
||||
c0,8.537,0,17.076,0,25.616c0,0.307,0.003,0.616,0.027,0.923c0.199,2.78,1.349,5.052,3.652,6.677
|
||||
c1.658,1.168,3.539,1.563,5.542,1.563c26.189-0.005,52.38-0.003,78.566-0.005c0.324,0,0.646-0.004,0.97-0.024
|
||||
c2.782-0.198,5.055-1.343,6.68-3.644c1.152-1.631,1.572-3.48,1.572-5.453c-0.006-8.553-0.006-17.106-0.006-25.659
|
||||
C146.322,65.315,146.322,65.169,146.322,64.998z M146.301,106.855c-0.06,0.004-0.092,0-0.113,0.011
|
||||
c-2.853,1.55-5.914,2.2-9.145,2.2c-26.219-0.01-52.438-0.004-78.656-0.004c-2.861,0-5.598-0.545-8.176-1.819
|
||||
c-0.283-0.142-0.571-0.271-0.856-0.404c0,9.576,0,19.119,0,28.657c32.333,0,64.627,0,96.946,0
|
||||
C146.301,125.941,146.301,116.409,146.301,106.855z M89.017,56.116c5.894,0,11.747,0,17.599,0c0-1.464,0-2.898,0-4.338
|
||||
c-5.884,0-11.734,0-17.599,0C89.017,53.239,89.017,54.66,89.017,56.116z"/>
|
||||
<path display="inline" fill="#3077A3" d="M146.322,64.998c0,0.172,0,0.317,0,0.463c0,8.553,0,17.106,0.006,25.659
|
||||
c0,1.973-0.42,3.822-1.572,5.453c-1.625,2.301-3.896,3.444-6.68,3.644c-0.323,0.021-0.646,0.024-0.969,0.024
|
||||
c-26.188,0.002-52.378,0-78.567,0.005c-2.002,0-3.884-0.396-5.542-1.562c-2.304-1.625-3.453-3.897-3.652-6.678
|
||||
c-0.024-0.307-0.027-0.616-0.027-0.923c0-8.54,0-17.079,0-25.616c0-0.146,0-0.291,0-0.468
|
||||
C81.65,64.998,113.957,64.998,146.322,64.998z M75.768,82.631c-2.953,0-5.865,0-8.779,0c0,4.411,0,8.795,0,13.166
|
||||
c2.944,0,5.856,0,8.779,0C75.768,91.402,75.768,87.039,75.768,82.631z M119.898,82.623c0,4.422,0,8.806,0,13.174
|
||||
c2.949,0,5.861,0,8.764,0c0-4.408,0-8.781,0-13.174C125.734,82.623,122.833,82.623,119.898,82.623z"/>
|
||||
<path display="inline" fill="#3077A3" d="M146.301,106.855c0,9.554,0,19.086,0,28.641c-32.316,0-64.613,0-96.946,0
|
||||
c0-9.538,0-19.081,0-28.657c0.285,0.136,0.573,0.265,0.856,0.404c2.578,1.274,5.315,1.819,8.176,1.819
|
||||
c26.219,0,52.438-0.006,78.656,0.004c3.229,0,6.292-0.65,9.145-2.2C146.209,106.855,146.241,106.859,146.301,106.855z"/>
|
||||
<path display="inline" fill="#3077A3" d="M89.017,56.116c0-1.456,0-2.877,0-4.338c5.864,0,11.715,0,17.599,0
|
||||
c0,1.44,0,2.874,0,4.338C100.764,56.116,94.911,56.116,89.017,56.116z"/>
|
||||
<path display="inline" opacity="0.84" fill="#FFFFFF" enable-background="new " d="M75.768,82.631c0,4.408,0,8.771,0,13.166
|
||||
c-2.923,0-5.835,0-8.779,0c0-4.371,0-8.754,0-13.166C69.903,82.631,72.815,82.631,75.768,82.631z"/>
|
||||
<path display="inline" opacity="0.84" fill="#FFFFFF" enable-background="new " d="M119.898,82.623c2.935,0,5.836,0,8.764,0
|
||||
c0,4.393,0,8.766,0,13.174c-2.9,0-5.812,0-8.764,0C119.898,91.429,119.898,87.044,119.898,82.623z"/>
|
||||
</g>
|
||||
<image display="none" overflow="visible" enable-background="new " width="171" height="167" id="Layer_4_xA0_Image_2_" xlink:href="C949B290C0D038A2.png" transform="matrix(0.9941 0 0 0.9941 12.8198 16.6104)">
|
||||
</image>
|
||||
<rect x="61.251" y="73.602" fill="none" stroke="#47B9E8" stroke-width="5.5" stroke-miterlimit="10" width="28.351" height="52.284"/>
|
||||
<rect x="103.227" y="74.338" fill="none" stroke="#47B9E8" stroke-width="5.5" stroke-miterlimit="10" width="28.351" height="52.284"/>
|
||||
<rect x="72.665" y="85.384" fill="#47B9E8" width="5.155" height="6.996"/>
|
||||
<rect x="72.665" y="107.477" fill="#47B9E8" width="5.155" height="6.996"/>
|
||||
<rect x="103.227" y="97.321" fill="#47B9E8" width="28.351" height="5"/>
|
||||
</svg>
|
After Width: | Height: | Size: 4.5 KiB |
71
ungleich_page/static/ungleich_page/img/logo_black.svg
Normal file
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="448px" height="125px" viewBox="-32.5 -87.5 448 125" enable-background="new -32.5 -87.5 448 125" xml:space="preserve">
|
||||
<g>
|
||||
<path fill="#050505" d="M93.06,20.975c0-1.765,0.621-3.482,1.869-5.161c1.247-1.674,3.027-3.184,5.338-4.517v-0.375
|
||||
c-1.208-0.664-2.28-1.59-3.198-2.779c-0.906-1.189-1.364-2.725-1.364-4.609c0-1.462,0.473-2.938,1.419-4.432
|
||||
c0.935-1.49,2.265-2.816,3.974-3.967v-0.368c-1.589-1.154-2.929-2.695-4.025-4.613c-1.089-1.916-1.636-4.212-1.636-6.887
|
||||
c0-2.498,0.482-4.735,1.456-6.716c0.975-1.978,2.286-3.66,3.932-5.065c1.64-1.401,3.54-2.464,5.703-3.198
|
||||
c2.158-0.729,4.455-1.091,6.893-1.091c2.492,0,4.745,0.363,6.759,1.091h18.348v6.85h-11.139c0.918,0.975,1.737,2.18,2.466,3.604
|
||||
c0.733,1.438,1.096,3.037,1.096,4.799c0,2.44-0.455,4.607-1.366,6.481c-0.913,1.894-2.164,3.486-3.747,4.796
|
||||
c-1.588,1.307-3.438,2.294-5.564,2.961c-2.131,0.668-4.416,1.013-6.852,1.013c-1.092,0-2.265-0.123-3.52-0.371
|
||||
c-1.241-0.236-2.473-0.61-3.693-1.097c-2.071,1.345-3.104,2.891-3.104,4.66c0,1.641,0.762,2.834,2.279,3.562
|
||||
c1.519,0.735,3.715,1.096,6.576,1.096h9.494c5.854,0,10.179,0.843,13.018,2.509c2.828,1.674,4.242,4.438,4.242,8.267
|
||||
c0,2.136-0.597,4.139-1.779,6.025c-1.193,1.889-2.879,3.544-5.072,4.983c-2.188,1.423-4.838,2.552-7.947,3.374
|
||||
c-3.098,0.827-6.571,1.234-10.407,1.234c-6.333,0-11.318-1.02-14.969-3.066C94.887,27.934,93.06,24.928,93.06,20.975z
|
||||
M100.719,19.882c0,2.127,1.174,3.84,3.522,5.155c2.345,1.31,5.737,1.964,10.179,1.964c2.373,0,4.518-0.229,6.438-0.683
|
||||
c1.919-0.453,3.562-1.059,4.932-1.824c1.373-0.762,2.412-1.633,3.15-2.601c0.727-0.971,1.091-2.005,1.091-3.106
|
||||
c0-1.943-0.809-3.235-2.415-3.875c-1.615-0.644-4.036-0.962-7.26-0.962h-7.853c-1.398,0-2.644-0.042-3.737-0.137
|
||||
c-1.1-0.091-2.136-0.285-3.106-0.592c-1.832,1.035-3.105,2.104-3.843,3.196C101.095,17.505,100.719,18.657,100.719,19.882z
|
||||
M113.416-7.059c2.559,0,4.743-0.848,6.581-2.552c1.822-1.708,2.737-4.077,2.737-7.118c0-2.929-0.918-5.271-2.737-7.033
|
||||
c-1.837-1.767-4.021-2.651-6.581-2.651c-2.561,0-4.748,0.885-6.575,2.651c-1.821,1.762-2.739,4.104-2.739,7.033
|
||||
c0,3.041,0.92,5.413,2.739,7.118C108.668-7.906,110.855-7.059,113.416-7.059z"/>
|
||||
</g>
|
||||
<path fill="#050505" d="M24.585,14.149h-7.651l-0.751-7.646h-0.379c-2.271,2.645-4.743,4.768-7.414,6.378
|
||||
c-2.679,1.597-5.777,2.401-9.304,2.401c-5.476,0-9.478-1.585-11.995-4.767c-2.521-3.181-3.776-7.825-3.776-13.932v-23.191
|
||||
l-12.225-0.238l21.669-8.342l-0.094,6.301v24.242c0,4.096,0.725,7.102,2.175,9.021C-3.712,6.299-1.229,7.262,2.3,7.262
|
||||
c2.394,0,4.579-0.584,6.564-1.752c1.981-1.164,4.112-3.135,6.378-5.898v-31.645h9.352L24.585,14.149L24.585,14.149z"/>
|
||||
<path fill="#050505" d="M40.078-32.037h7.649l0.755,7.465h0.372c2.333-2.398,4.851-4.427,7.562-6.093
|
||||
c2.7-1.67,5.857-2.503,9.445-2.503c5.412,0,9.386,1.608,11.902,4.814c2.517,3.208,3.778,7.845,3.778,13.888v28.613h-9.353v-27.386
|
||||
c0-4.027-0.722-7.008-2.167-8.922c-1.447-1.924-3.936-2.889-7.464-2.889c-2.46,0-4.659,0.624-6.616,1.845
|
||||
c-1.948,1.229-4.129,3.065-6.518,5.529v31.824h-9.346v-46.184H40.078z"/>
|
||||
<path fill="#050505" d="M185.909-8.892c0-3.78,0.661-7.167,1.982-10.157c1.32-2.989,3.079-5.543,5.291-7.649
|
||||
c2.201-2.109,4.717-3.719,7.562-4.819c2.83-1.101,5.762-1.651,8.772-1.651c3.405,0,6.406,0.535,9.034,1.608
|
||||
c2.602,1.07,4.827,2.56,6.65,4.475c1.83,1.931,3.218,4.225,4.156,6.907c0.945,2.673,1.423,5.616,1.423,8.825
|
||||
c0,0.955-0.05,1.841-0.147,2.692c-0.094,0.856-0.199,1.56-0.33,2.123h-34.762c0.316,4.537,2,8.081,5.06,10.631
|
||||
c3.055,2.549,6.903,3.822,11.566,3.822c2.522,0,4.862-0.346,7.038-1.042c2.176-0.686,4.302-1.661,6.372-2.916L228.88,9.9
|
||||
c-2.383,1.514-5.083,2.786-8.069,3.829c-2.991,1.038-6.288,1.554-9.877,1.554c-3.465,0-6.715-0.545-9.768-1.65
|
||||
c-3.063-1.102-5.713-2.684-7.983-4.767c-2.271-2.077-4.051-4.615-5.338-7.606C186.555-1.734,185.909-5.119,185.909-8.892z
|
||||
M222.084-12.952c0-4.161-1.078-7.341-3.215-9.548c-2.142-2.202-5.196-3.3-9.162-3.3c-3.462,0-6.551,1.098-9.259,3.3
|
||||
c-2.71,2.209-4.381,5.388-5.002,9.548H222.084z"/>
|
||||
<path fill="#050505" d="M261.514-33.498l0.027,48.596h-9.352v-35.481h-17.538L261.514-33.498z M256.061-43.024
|
||||
c-2.021,0-3.685-0.602-5.008-1.792c-1.315-1.198-1.978-2.806-1.978-4.819c0-2.014,0.657-3.633,1.978-4.862
|
||||
c1.324-1.23,2.987-1.84,5.008-1.84c2.011,0,3.685,0.61,5.008,1.84c1.32,1.229,1.985,2.848,1.985,4.862
|
||||
c0,2.014-0.665,3.624-1.985,4.819C259.745-43.626,258.071-43.024,256.061-43.024z"/>
|
||||
<path fill="#050505" d="M274.5-7.952c0-3.839,0.694-7.275,2.081-10.291c1.386-3.027,3.278-5.571,5.672-7.658
|
||||
c2.388-2.072,5.143-3.642,8.265-4.717c3.121-1.069,6.438-1.603,9.965-1.603c3.777,0,7.085,0.644,9.918,1.931
|
||||
c2.834,1.291,5.199,2.857,7.088,4.678l-4.535,5.95c-1.829-1.513-3.72-2.69-5.676-3.541c-1.943-0.853-4.059-1.276-6.326-1.276
|
||||
c-2.446,0-4.715,0.393-6.796,1.185c-2.07,0.786-3.857,1.9-5.331,3.35c-1.478,1.448-2.628,3.197-3.452,5.244
|
||||
c-0.814,2.044-1.225,4.305-1.225,6.75c0,2.456,0.394,4.711,1.185,6.758c0.785,2.047,1.913,3.791,3.396,5.238
|
||||
c1.48,1.44,3.226,2.572,5.242,3.356c2.015,0.781,4.245,1.174,6.708,1.174c2.832,0,5.386-0.531,7.646-1.597
|
||||
c2.267-1.074,4.306-2.361,6.142-3.875l3.969,6.047c-2.645,2.267-5.545,4.013-8.691,5.238c-3.145,1.224-6.426,1.838-9.821,1.838
|
||||
c-3.59,0-6.942-0.533-10.058-1.602c-3.118-1.065-5.807-2.644-8.081-4.726c-2.263-2.082-4.041-4.613-5.333-7.606
|
||||
C275.146-0.69,274.5-4.107,274.5-7.952z"/>
|
||||
<path fill="#050505" d="M318.894-51.604l19.584-9.712v27.204l-0.569,10.388c2.332-2.388,4.849-4.407,7.562-6.045
|
||||
c2.706-1.632,5.855-2.45,9.443-2.45c5.411,0,9.38,1.603,11.899,4.814c2.517,3.212,3.774,7.841,3.774,13.89v28.615h-9.351v-27.398
|
||||
c0-4.029-0.728-7.004-2.178-8.921c-1.441-1.919-3.923-2.885-7.454-2.885c-2.455,0-4.665,0.615-6.612,1.844
|
||||
c-1.955,1.228-4.131,3.067-6.521,5.529v31.827h-9.354l-0.193-67.096L318.894-51.604z"/>
|
||||
<g>
|
||||
<polygon fill="#050505" points="372.346,-72.483 369.194,-65.904 408.349,-65.739 411.5,-72.447 "/>
|
||||
<polygon fill="#050505" points="369.249,-58.129 365.997,-51.223 405.206,-51.144 408.349,-57.973 "/>
|
||||
<polygon fill="#050505" points="376.891,-43.389 394.854,-81.627 401.77,-81.529 384.02,-43.38 "/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#050505" d="M162.481-0.869c0,3.097,0.775,5.34,2.332,6.713c1.552,1.364,3.569,2.056,6.069,2.056
|
||||
c1.214,0,2.468-0.155,3.748-0.461c1.277-0.306,2.711-0.792,4.293-1.463l2.19,6.765c-1.039,0.358-2.028,0.691-2.968,1.003
|
||||
c-0.954,0.302-1.902,0.556-2.877,0.768c-0.973,0.219-1.991,0.4-3.058,0.55c-1.068,0.149-2.239,0.232-3.518,0.232
|
||||
c-4.993,0-8.783-1.43-11.37-4.297c-2.588-2.859-3.877-6.994-3.877-12.416v-60.796H138.84l23.641-16.66"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.6 KiB |
After Width: | Height: | Size: 50 KiB |
BIN
ungleich_page/static/ungleich_page/img/portfolio/glasfaser.png
Normal file
After Width: | Height: | Size: 114 KiB |
|
@ -2,16 +2,16 @@
|
|||
|
||||
$(function(){
|
||||
new WOW().init();
|
||||
$('.img-toggle').one('mouseover', toggleImage);
|
||||
$('.img-toggle').one('mouseenter', toggleImage);
|
||||
});
|
||||
|
||||
function toggleImage(e) {
|
||||
var $this = $(this),
|
||||
toggle_img = $this.attr('data-replaced'),
|
||||
current_img = $this.attr('src');
|
||||
$this.fadeOut(600, function() {
|
||||
$this.fadeOut(200, function() {
|
||||
$this.attr('src', toggle_img);
|
||||
$this.attr('data-replaced', current_img);
|
||||
$this.fadeIn(900);
|
||||
$this.fadeIn(300);
|
||||
});
|
||||
};
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
{% load staticfiles%}
|
||||
{% load staticfiles i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
|
@ -33,27 +33,21 @@
|
|||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<body class="error404">
|
||||
<body class="error404">
|
||||
<div class="content-404">
|
||||
<div class="container">
|
||||
<div class="text-center">
|
||||
<div class="container text-center">
|
||||
<h1> </h1>
|
||||
<h1>404</h1>
|
||||
<p class="lead">
|
||||
"Sorry, we could not find the page you are looking for!"
|
||||
</p>
|
||||
</div>
|
||||
{% trans '"Sorry, we could not find the page you are looking for!"' %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Footer --><!-- jQuery -->
|
||||
<script src="{% static 'hosting/js/jquery.js' %}"></script>
|
||||
|
||||
<!-- Bootstrap Core JavaScript -->
|
||||
<script src="js/bootstrap.min.js"></script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
|
323
ungleich_page/templates/ungleich_page/glasfaser.html
Normal file
|
@ -0,0 +1,323 @@
|
|||
{% load static bootstrap3 i18n %}
|
||||
{% get_current_language as LANGUAGE_CODE %}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>ungleich GmbH</title>
|
||||
|
||||
<!-- Bootstrap Core CSS -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="{% static 'ungleich_page/css/lib/animate.min.css' %}" rel="stylesheet">
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<link href="//fonts.googleapis.com/css?family=Open+Sans+Condensed:700|Lato:300,400,700|Montserrat:400,700" rel="stylesheet" type="text/css">
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'ungleich_page/css/agency.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'ungleich_page/css/ungleich.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'ungleich_page/css/glasfaser.css' %}" rel="stylesheet">
|
||||
|
||||
<!-- Google analytics -->
|
||||
{% include "google_analytics.html" %}
|
||||
<!-- End Google Analytics -->
|
||||
|
||||
<link rel="shortcut icon" href="{% static 'ungleich_page/img/favicon.ico' %}" type="image/x-icon">
|
||||
</head>
|
||||
|
||||
<body id="page-top" class="index">
|
||||
<nav class="navbar navbar-default navbar-fixed-top topnav navbar-transparent">
|
||||
<div class="topnav">
|
||||
<!-- Brand and toggle get grouped for better mobile display -->
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
|
||||
<span class="sr-only">{% trans "Toggle navigation" %}</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a href="{% url 'ungleich_page:landing' %}" id="logoBlack" class="navbar-brand topnav"><img src="{% static 'ungleich_page/img/logo_black.svg' %}"></a>
|
||||
<a href="{% url 'ungleich_page:landing' %}" id="logoWhite" class="navbar-brand topnav"><img src="{% static 'ungleich_page/img/logo_white.svg' %}"></a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||
<!-- Start Navbar collapse-->
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li>
|
||||
<a class="page-scroll" href="#services">Technische Details</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="page-scroll" href="#about">Wie funktioniert es?</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="page-scroll" href="#contact">{% trans "CONTACT" %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- /.navbar-collapse -->
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Header -->
|
||||
<div class="intro-header" id="home">
|
||||
<div class="price-tag-container">
|
||||
<div class="price-tag"></div>
|
||||
</div>
|
||||
<div class="high-speed">
|
||||
<div class="high-speed-border"></div>
|
||||
<h1>{% trans "HIGH SPEED INTERNET" %}</h1>
|
||||
<div class="high-speed-border"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="split-section left" id="your">
|
||||
<div class="container">
|
||||
<div class="split-text">
|
||||
<div class="split-title">
|
||||
<h2>Unser Glasfaser-Angebot für Glarus Nord, Glarus und Glarus Süd</h2>
|
||||
</div>
|
||||
<div class="split-description wow fadeInUp">
|
||||
<p class="lead"><strong>Surfen Sie mit 100 Mbit/s im Internet!</strong></p>
|
||||
<p class="lead">Mit dem neuen Glasfaser-Angebot der ungleich macht das Arbeiten im Internet richtig Spass. Das beste daran: die Geschwindigkeit ist symmetrisch in beide Richtungen verfügbar. Damit kann Ihr Firmennetzwerk auch Dienste bereitstellen.</p>
|
||||
<p class="lead">Dieses Angebot ist im Moment ausschliesslich für Firmenkunden verfügbar. Die Aufschaltkosten der Glasfaserleitung sind von der Entfernung zum nächsten Anschlusspunkt abhängig. Fragen Sie noch heute nach einem individuellem Angebot. Gerne stellen wir Ihnen eine persönliche Offerte zusammen.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<section class="split-section right" id="our">
|
||||
<div class="container">
|
||||
<div class="split-text text-center">
|
||||
<div class="wow fadeInDown">
|
||||
<h2 class="section-heading text-center">Was ist es?</h2>
|
||||
<h3 class="section-subheading text-muted"></h3>
|
||||
</div>
|
||||
<div class="split-description text-center wow fadeInUp">
|
||||
<p class="lead">Bei diesem Angebot handelt es sich um einen Internetzugang für Firmenkunden.</p>
|
||||
<p class="lead">Sie erhalten in Zusammenarbeit mit unseren Partnern einen Glasfaseranschluss und eine Internetverbindung.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="services">
|
||||
<div class="container">
|
||||
<div class="text-center wow fadeInDown">
|
||||
<h2 class="section-heading">Technische Details</h2>
|
||||
<h3 class="section-subheading text-muted">Im Angebot enthalten sind</h3>
|
||||
</div>
|
||||
<div class="row text-center">
|
||||
<div class="col-sm-4">
|
||||
<div class="team-member wow fadeInUp" data-wow-delay="0.25s">
|
||||
<img src="{% static 'ungleich_page/img/glasfaser/business.svg' %}" class="img-responsive img-circle" alt="">
|
||||
<div class="team-member-caption inline-block">
|
||||
<h4 class="portfolio-caption">Business-Internet</h4>
|
||||
<p class="text-muted">Symmetrische Internetleitung 100 Mbit/s upload und 100 Mbit/s download</p>
|
||||
<p class="text-muted">Glasfaser-Installation bis ins Haus (keine Hausverkabelung)</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
<div class="team-member wow fadeInUp" data-wow-delay="0.5s">
|
||||
<img src="{% static 'ungleich_page/img/glasfaser/ip.svg' %}" class="img-responsive img-circle" alt="">
|
||||
<div class="team-member-caption inline-block">
|
||||
<h4 class="portfolio-caption">Erreichbarkeit im Internet</h4>
|
||||
<p class="text-muted">1 öffentliches IPv6-Netzwerk (/64)</p>
|
||||
<p class="text-muted">1 öffentliche IPv4-Adresse</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
<div class="team-member wow fadeInUp" data-wow-delay="0.75s">
|
||||
<img src="{% static 'ungleich_page/img/glasfaser/switch.svg' %}" class="img-responsive img-circle" alt="">
|
||||
<div class="team-member-caption inline-block">
|
||||
<h4 class="portfolio-caption">Einfach zu nutzen</h4>
|
||||
<p class="text-muted">2 bereits für Sie konfigurierte Endgeräte (benötigt zwei Ihrer Steckdosen)</p>
|
||||
<p class="text-muted">Einfach einstecken und los!</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- About Section -->
|
||||
<section id="about">
|
||||
<div class="container">
|
||||
<div class="text-center wow fadeInDown">
|
||||
<h2 class="section-heading">Wie funktioniert es?</h2>
|
||||
<h3 class="section-subheading text-muted">So kommen Sie in wenigen einfachen Schritten zu Ihrem High-Speed-Internet</h3>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<ul class="timeline">
|
||||
<li>
|
||||
<div class="timeline-image">
|
||||
<img class="img-circle img-responsive" src="{% static 'ungleich_page/img/glasfaser/a.jpg' %}" alt="">
|
||||
</div>
|
||||
<div class="timeline-panel wow slideInLeft">
|
||||
<div class="timeline-body">
|
||||
<p>Senden Sie uns via E-Mail Ihren Firmennamen und Ihre Anschrift zu.</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="timeline-inverted">
|
||||
<div class="timeline-image">
|
||||
<img class="img-circle img-responsive" src="{% static 'ungleich_page/img/glasfaser/b.jpg' %}" alt="">
|
||||
</div>
|
||||
<div class="timeline-panel wow slideInRight">
|
||||
<div class="timeline-body">
|
||||
<p>Wir prüfen dann die Entfernung zum nächsten Anschlusspunkt und schicken Ihnen eine Offerte zu.</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="timeline-image">
|
||||
<img class="img-circle img-responsive" src="{% static 'ungleich_page/img/glasfaser/c.jpg' %}" alt="">
|
||||
</div>
|
||||
<div class="timeline-panel wow slideInLeft">
|
||||
<div class="timeline-body">
|
||||
<p>Sollten Sie dem Angebot zustimmen, wird die Glasfaser zu Ihrem Standort verlegt und die Endgeräte installiert.</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="timeline-inverted" style="background: #fff;">
|
||||
<div class="timeline-image">
|
||||
<img class="img-circle img-responsive" src="{% static 'ungleich_page/img/glasfaser/d.jpg' %}" alt="">
|
||||
</div>
|
||||
<div class="timeline-panel wow slideInDown">
|
||||
<div class="timeline-body">
|
||||
<p>Sie müssen dann nur noch Ihre Geräte anschliessen und schon surfen Sie blitzschnell im Internet!</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- / contact section -->
|
||||
<div id="contact" class="full-contact-section">
|
||||
<div class="intro-header-2 contact-section" id="contact">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="title">
|
||||
<h2>Kontakt</h2>
|
||||
</div>
|
||||
<div class="contact-details">
|
||||
<div class="subtitle">
|
||||
<h3>ungleich GmbH</h3>
|
||||
</div>
|
||||
<div class="description">
|
||||
<p>glasfaser@ungleich.ch</p>
|
||||
<p>In der Au 7, Schwanden 8762</p>
|
||||
<p>Switzerland</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="social">
|
||||
<a target="_blank" class="" href="https://twitter.com/datacenterlight"><i class="fa fa-twitter fa-fw"></i></a>
|
||||
<a target="_blank" class="" href="https://github.com/ungleich"><i class="fa fa-github fa-fw"></i></a>
|
||||
<a target="_blank" class="" href="https://www.facebook.com/ungleich.ch/"><i class="fa fa-facebook"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div id="contact-form" class="contact-form">
|
||||
{% if success %}
|
||||
<div class="contact-form-success">
|
||||
<div class="subtitle text-center">
|
||||
<h3>{% trans "Thank you for contacting us." %}</h3>
|
||||
</div>
|
||||
<p>
|
||||
{% trans "Your message was successfully sent to our team." %}
|
||||
</p>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="row">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<div class="subtitle">
|
||||
<h3>Senden Sie uns eine Nachricht.</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<form class="form-horizontal ajax-form" method="POST" action="{% url 'datacenterlight:contact_us' %}" data-toggle="validator" data-response="#contact-form">
|
||||
{% csrf_token %}
|
||||
<input type="hidden" value="glasfaser" name="from_page">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="name">{% trans "Name" %}</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" name="name" class="form-control" data-minlength="3" data-error="{% trans 'Please enter your name.' %}" required>
|
||||
{{contact_form.name.errors}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="email">{% trans "Email" %}</label>
|
||||
<div class="col-sm-10">
|
||||
<input name="email" type="email" pattern="^[^@\s]+@([^@\s]+\.)+[^@\s]+$" class="form-control" data-error="{% trans 'Please enter a valid email address.' %}" required>
|
||||
{{contact_form.email.errors}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2" for="message">{% trans "Message" %}</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea class="form-control" name="message" id="message" rows="6" required></textarea>
|
||||
{{contact_form.message.errors}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10 text-right">
|
||||
<div class="form-error hide">{% trans "Sorry, there was an unexpected error. Kindly retry." %}</div>
|
||||
<button type="submit" class="btn btn-default">{% trans "SUBMIT" %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.banner -->
|
||||
|
||||
<!-- Footer -->
|
||||
{% include "ungleich_page/includes/_footer.html" %}
|
||||
|
||||
<!-- jQuery -->
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
if ($(".has-error").length != 0) {
|
||||
window.location = window.location.pathname + "#contact"
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
|
||||
<!-- Plugin JavaScript -->
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/classie/1.0.1/classie.min.js" type="text/javascript"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js" type="text/javascript"></script>
|
||||
|
||||
<!-- Custom Theme JavaScript -->
|
||||
<script src="{% static 'ungleich_page/js/ungleich.js' %}" type="text/javascript"></script>
|
||||
<script src="{% static 'datacenterlight/js/main.js' %}"></script>
|
||||
|
||||
<!-- Custom Fonts -->
|
||||
<link href="//fonts.googleapis.com/css?family=Raleway" rel="stylesheet" type="text/css">
|
||||
<link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,12 @@
|
|||
<li {% if instance.inverted %}class="timeline-inverted"{% endif %}>
|
||||
{% if instance.link_url %}<a href="{{ instance.link_url }}" target="_blank">{% endif %}
|
||||
<div class="timeline-image">
|
||||
<img class="img-circle img-responsive" src="{{ instance.image.url }}" alt="">
|
||||
</div>
|
||||
{% if instance.link_url %}</a>{% endif %}
|
||||
<div class="timeline-panel wow {% if instance.inverted %}slideInRight{% else %}slideInLeft{% endif %}">
|
||||
<div class="timeline-body">
|
||||
<p>{{ instance.title }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
|
@ -0,0 +1,7 @@
|
|||
<div class="team-member wow fadeInUp" data-wow-delay="0.25s">
|
||||
<img src="{{ instance.image.url }}" class="img-responsive img-circle" alt="">
|
||||
<div class="team-member-caption inline-block">
|
||||
<h4 class="portfolio-caption">{{ instance.title }}</h4>
|
||||
<p class="text-muted">{{ instance.description }}</p>
|
||||
</div>
|
||||
</div>
|
12
ungleich_page/templates/ungleich_page/glasfaser/menus.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
{% load menu_tags %}
|
||||
|
||||
{% for child in children %}
|
||||
<li class="child{% if child.selected %} selected{% endif %}{% if child.ancestor %} ancestor{% endif %}{% if child.sibling %} sibling{% endif %}{% if child.descendant %} descendant{% endif %}">
|
||||
<a href="{{ child.attr.redirect_url|default:child.get_absolute_url }}" class="page-scroll">{{ child.get_menu_title }}</a>
|
||||
{% if child.children %}
|
||||
<ul>
|
||||
{% show_menu from_level to_level extra_inactive extra_active template "" "" child %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
|
@ -0,0 +1,18 @@
|
|||
{% load cms_tags %}
|
||||
<section id="{{section_id}}">
|
||||
<div class="container">
|
||||
<div class="text-center wow fadeInDown">
|
||||
<h2 class="section-heading">{{ about_instance.title }}</h2>
|
||||
<h3 class="section-subheading text-muted">{{ about_instance.sub_title }}</h3>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<ul class="timeline">
|
||||
{% for plugin in about_instance.child_plugin_instances %}
|
||||
{% render_plugin plugin %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|