merged master

This commit is contained in:
ARvind Tiwari 2017-07-28 16:45:34 +05:30
commit 925252f1c9
44 changed files with 2581 additions and 1811 deletions

View file

@ -1,3 +1,36 @@
1.0.21: 2017-07-21
* #3591: [datacenterlight, payment] Fixed card holder name to appear on Confirm Order page
* #3558: [datacenterlight] Changed font family and background color for header
* #3581: [datacenterlight] Lead font weight change
* #3584: [all] Add flag is_superuser=True in MyUserManager
1.0.20: 2017-07-18
* #3590: [digitalglarus] Added impact hub partner logo and text in digitalglarus
[datacenterlight, hosting] Fixed overlapping of date and billing address in the mobile view
* #3580: [datacenterlight, hosting] Introduced newly designed payment page. Cust1.0.20: 2017-07-18
* #3590: [digitalglarus] Added impact hub partner logo and text in digitalglarus
[datacenterlight, hosting] Fixed overlapping of date and billing address in the mobile view
* #3580: [datacenterlight, hosting] Introduced newly designed payment page. Customized Stripe credit card input fields
* #3568: [all] Improved the way of adding Google analytics (ga) code. We now have ga code for ungleich, digitalglarus, blog, hosting
and datacenterlight
* #3564: [datacenterlight] Improved calculator form validations, both client side and server side
[datacenterlight] Changed "Place order" button to "Submit" in the payment page
* #3540: [datacenterlight] Improved credit card section with Stripe clarification texts and corresponding DE translationsomized Stripe credit card input fields
* #3568: [all] Improved the way of adding Google analytics (ga) code. We now have ga code for ungleich, digitalglarus, blog, hosting
and datacenterlight
* #3564: [datacenterlight] Improved calculator form validations, both client side and server side
[datacenterlight] Changed "Place order" button to "Submit" in the payment page
* #3540: [datacenterlight] Improved credit card section with Stripe clarification texts and corresponding DE translations
1.0.19: 2017-07-09
* [blog] Added a space between "Posted on" and the "Date"
* [datacenterlight, digitalglarus] Introduced Google Analytics for DCL and digitalglarus.ch
* [datacenterlight] Fixed calculator error message positioning
* [digitalglarus] Fixed favicon for digitalglarus
* [all] Introduced PEP8 code standards using flake8
* [all] DEBUG is set to False on production
* [all] Using memcached as cache provider on production
* [datacenterlight] Removed Order Now button outline in the order form
* [datacenterlight] Refactored html pages, fixed missing body tag, removed some duplicate script imports
* [datacenterlight] Introduced Why Data Center Light page
1.0.18: 2017-07-02 1.0.18: 2017-07-02
* [datacenterlight] Introduced the new flow. Landing page -> Payment -> Order confirmation -> Success * [datacenterlight] Introduced the new flow. Landing page -> Payment -> Order confirmation -> Success
* [datacenterlight] Fixed issue showing local time to the user in order confirmation page, vm pages (like ssh keys) * [datacenterlight] Fixed issue showing local time to the user in order confirmation page, vm pages (like ssh keys)

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-02 23:08+0530\n" "POT-Creation-Date: 2017-07-24 18:51+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -42,6 +42,70 @@ msgstr ""
"Vielen dank für Ihre Anmeldung. Sie erhalten in kürze eine Bestätigungsmail " "Vielen dank für Ihre Anmeldung. Sie erhalten in kürze eine Bestätigungsmail "
"von unserem Team" "von unserem Team"
#: templates/datacenterlight/calculator_form.html:5
#: templates/datacenterlight/pricing.html:22
msgid "VM hosting"
msgstr ""
#: templates/datacenterlight/calculator_form.html:9
msgid "month"
msgstr "Monat"
#: templates/datacenterlight/calculator_form.html:11
#: templates/datacenterlight/pricing.html:28
msgid "VAT included"
msgstr "MwSt. inklusive"
#: templates/datacenterlight/calculator_form.html:16
#: templates/datacenterlight/pricing.html:33
msgid "Hosted in Switzerland"
msgstr "Standort: Schweiz"
#: templates/datacenterlight/calculator_form.html:21
msgid "Please enter a value in range 1 - 48."
msgstr "Bitte gib einen Wert von 1 bis 48 ein."
#: templates/datacenterlight/calculator_form.html:30
msgid "Please enter a value in range 2 - 200."
msgstr "Bitte gib einen Wert von 2 bis 200 ein."
#: templates/datacenterlight/calculator_form.html:39
msgid "Please enter a value in range 10 - 2000."
msgstr "Bitte gib einen Wert von 10 bis 200 ein."
#: templates/datacenterlight/calculator_form.html:40
#: templates/datacenterlight/pricing.html:50
msgid "GB Storage (SSD)"
msgstr "GB Storage (SSD)"
#: templates/datacenterlight/calculator_form.html:59
msgid "Name"
msgstr ""
#: templates/datacenterlight/calculator_form.html:60
msgid "Your Name"
msgstr "Dein Name"
#: templates/datacenterlight/calculator_form.html:60
msgid "Please enter your name."
msgstr "Bitte gib Deinen Namen ein."
#: templates/datacenterlight/calculator_form.html:74
msgid "Email"
msgstr "E-Mail-Adresse"
#: templates/datacenterlight/calculator_form.html:75
msgid "Your Email"
msgstr "Deine E-Mail"
#: templates/datacenterlight/calculator_form.html:75
msgid "Please enter a valid email address."
msgstr "Bitte gib eine gültige E-Mailadresse ein."
#: templates/datacenterlight/calculator_form.html:88
msgid "Continue"
msgstr "Weiter"
#: templates/datacenterlight/emails/request_access_confirmation.html:99 #: templates/datacenterlight/emails/request_access_confirmation.html:99
#: templates/datacenterlight/emails/request_access_confirmation.txt:99 #: templates/datacenterlight/emails/request_access_confirmation.txt:99
msgid "Thank you for your request." msgid "Thank you for your request."
@ -129,27 +193,28 @@ msgstr ""
#: templates/datacenterlight/includes/_footer.html:11 #: templates/datacenterlight/includes/_footer.html:11
#: templates/datacenterlight/includes/_footer.html:31 #: templates/datacenterlight/includes/_footer.html:31
#: templates/datacenterlight/includes/_navbar.html:27 #: templates/datacenterlight/includes/_navbar.html:27
#: templates/datacenterlight/index.html:20 #: templates/datacenterlight/includes/_navbar.html:28
#: templates/datacenterlight/index.html:47 #: templates/datacenterlight/index.html:19
#: templates/datacenterlight/index.html:46
msgid "Highlights" msgid "Highlights"
msgstr "" msgstr ""
#: templates/datacenterlight/includes/_footer.html:14 #: templates/datacenterlight/includes/_footer.html:14
#: templates/datacenterlight/includes/_footer.html:34 #: templates/datacenterlight/includes/_footer.html:34
#: templates/datacenterlight/includes/_navbar.html:30 #: templates/datacenterlight/includes/_navbar.html:30
#: templates/datacenterlight/index.html:86 #: templates/datacenterlight/index.html:85
msgid "Scale out" msgid "Scale out"
msgstr "Skalierung" msgstr "Skalierung"
#: templates/datacenterlight/includes/_footer.html:17 #: templates/datacenterlight/includes/_footer.html:17
#: templates/datacenterlight/includes/_footer.html:37 #: templates/datacenterlight/includes/_footer.html:37
#: templates/datacenterlight/includes/_navbar.html:33 #: templates/datacenterlight/includes/_navbar.html:31
#: templates/datacenterlight/index.html:112 #: templates/datacenterlight/index.html:111
msgid "Reliable and light" msgid "Reliable and light"
msgstr "Zuverlässig und leicht" msgstr "Zuverlässig und leicht"
#: templates/datacenterlight/includes/_footer.html:20 #: templates/datacenterlight/includes/_footer.html:20
#: templates/datacenterlight/includes/_navbar.html:36 #: templates/datacenterlight/includes/_navbar.html:32
msgid "Order VM" msgid "Order VM"
msgstr "VM bestellen" msgstr "VM bestellen"
@ -167,28 +232,33 @@ msgstr "Home"
msgid "Pricing" msgid "Pricing"
msgstr "Preise" msgstr "Preise"
#: templates/datacenterlight/index.html:16 #: templates/datacenterlight/includes/_navbar.html:36
#: templates/datacenterlight/whydatacenterlight.html:12
msgid "Why Data Center Light?"
msgstr "Warum Data Center Light?"
#: templates/datacenterlight/index.html:15
msgid "Finally, an affordable VM hosting in Switzerland!" msgid "Finally, an affordable VM hosting in Switzerland!"
msgstr "Endlich: bezahlbares VM Hosting in der Schweiz" msgstr "Endlich: bezahlbares VM Hosting in der Schweiz"
#: templates/datacenterlight/index.html:23 #: templates/datacenterlight/index.html:22
msgid "I want it!" msgid "I want it!"
msgstr "Das will ich haben!" msgstr "Das will ich haben!"
#: templates/datacenterlight/index.html:53 #: templates/datacenterlight/index.html:52
msgid "" msgid ""
"Reuses existing factory halls instead of building a new expensive building." "Reuses existing factory halls instead of building a new expensive building."
msgstr "" msgstr ""
"Verwendet ehemalige Fabrikhallen anstatt ein neues, teures Gebäude zu " "Verwendet ehemalige Fabrikhallen anstatt ein neues, teures Gebäude zu "
"errichten." "errichten."
#: templates/datacenterlight/index.html:58 #: templates/datacenterlight/index.html:57
msgid "Only wants you to pay for what you actually need." msgid "Only wants you to pay for what you actually need."
msgstr "" msgstr ""
"Möchte, dass du nur bezahlst, was du auch wirklich brauchst: Wähle deine " "Möchte, dass du nur bezahlst, was du auch wirklich brauchst: Wähle deine "
"Ressourcen individuell aus!" "Ressourcen individuell aus!"
#: templates/datacenterlight/index.html:62 #: templates/datacenterlight/index.html:61
msgid "" msgid ""
"Is creative, using a modern and alternative design for a data center in " "Is creative, using a modern and alternative design for a data center in "
"order to make it more sustainable and affordable at the same time." "order to make it more sustainable and affordable at the same time."
@ -197,7 +267,7 @@ msgstr ""
"macht um Nachhaltigkeit zu fördern und somit erschwingliche Preise bieten zu " "macht um Nachhaltigkeit zu fördern und somit erschwingliche Preise bieten zu "
"können." "können."
#: templates/datacenterlight/index.html:66 #: templates/datacenterlight/index.html:65
msgid "" msgid ""
"Cuts down the costs for you by using FOSS (Free Open Source Software) " "Cuts down the costs for you by using FOSS (Free Open Source Software) "
"exclusively, wherefore we can save money from paying licenses." "exclusively, wherefore we can save money from paying licenses."
@ -206,7 +276,7 @@ msgstr ""
"mit FOSS (Free Open Source Software) arbeitet und wir daher auf " "mit FOSS (Free Open Source Software) arbeitet und wir daher auf "
"Lizenzgebühren verzichten können." "Lizenzgebühren verzichten können."
#: templates/datacenterlight/index.html:89 #: templates/datacenterlight/index.html:88
msgid "" msgid ""
"We don't use special hardware. We use commodity hardware: we buy computers " "We don't use special hardware. We use commodity hardware: we buy computers "
"that you buy. Just many more and put them in a cozy home for computers " "that you buy. Just many more and put them in a cozy home for computers "
@ -216,7 +286,7 @@ msgstr ""
"erschwingliche Systeme. Bei grösserer Auslastung werden mehr " "erschwingliche Systeme. Bei grösserer Auslastung werden mehr "
"Standardkomponenten hinzugekauft und skalieren so das Datencenter." "Standardkomponenten hinzugekauft und skalieren so das Datencenter."
#: templates/datacenterlight/index.html:115 #: templates/datacenterlight/index.html:114
msgid "" msgid ""
"Our VMs are located in Switzerland, with reliable power supply and fast " "Our VMs are located in Switzerland, with reliable power supply and fast "
"internet connection. Our VM costs less thanks to our featherlight " "internet connection. Our VM costs less thanks to our featherlight "
@ -226,91 +296,26 @@ msgstr ""
"Energieversorgung, sowie schneller Internetverbindung ausgestattet. Unser " "Energieversorgung, sowie schneller Internetverbindung ausgestattet. Unser "
"Angebot ist aufgrund unserer leichten Infrastruktur überaus kostengünstig." "Angebot ist aufgrund unserer leichten Infrastruktur überaus kostengünstig."
#: templates/datacenterlight/index.html:133 #: templates/datacenterlight/index.html:132
#: templates/datacenterlight/pricing.html:86 #: templates/datacenterlight/pricing.html:86
msgid "Simple and affordable: Try our virtual machine with featherlight price." msgid "Simple and affordable: Try our virtual machine with featherlight price."
msgstr "" msgstr ""
"Einfach und bezahlbar: Teste nun unsere virtuellen Maschinen mit " "Einfach und bezahlbar: Teste nun unsere virtuellen Maschinen mit "
"federleichten Preisen." "federleichten Preisen."
#: templates/datacenterlight/index.html:134 #: templates/datacenterlight/index.html:133
msgid "Affordable VM hosting based in Switzerland" msgid "Affordable VM hosting based in Switzerland"
msgstr "Bezahlbares VM Hosting in der Schweiz" msgstr "Bezahlbares VM Hosting in der Schweiz"
#: templates/datacenterlight/index.html:145 #: templates/datacenterlight/index.html:166
#: templates/datacenterlight/pricing.html:22
msgid "VM hosting"
msgstr ""
#: templates/datacenterlight/index.html:149
msgid "month"
msgstr "Monat"
#: templates/datacenterlight/index.html:151
#: templates/datacenterlight/pricing.html:28
msgid "VAT included"
msgstr "MwSt. inklusive"
#: templates/datacenterlight/index.html:156
#: templates/datacenterlight/pricing.html:33
msgid "Hosted in Switzerland"
msgstr "Standort: Schweiz"
#: templates/datacenterlight/index.html:161
msgid "Please enter a value greater than or equal to 1."
msgstr "Bitte gib einen Wert größer oder gleich 1 ein."
#: templates/datacenterlight/index.html:170
msgid "Please enter a value greater than or equal to 2."
msgstr "Bitte gib einen Wert größer oder gleich 2 ein."
#: templates/datacenterlight/index.html:179
msgid "Please enter a value greater than or equal to 10."
msgstr "Bitte gib einen Wert größer oder gleich 10 ein"
#: templates/datacenterlight/index.html:180
#: templates/datacenterlight/pricing.html:50
msgid "GB Storage (SSD)"
msgstr "GB Storage (SSD)"
#: templates/datacenterlight/index.html:199
msgid "Name"
msgstr ""
#: templates/datacenterlight/index.html:200
msgid "Your Name"
msgstr "Dein Name"
#: templates/datacenterlight/index.html:200
msgid "Please enter your name"
msgstr "Bitte gib Deinen Namen ein"
#: templates/datacenterlight/index.html:214
msgid "Email"
msgstr "E-Mail-Adresse"
#: templates/datacenterlight/index.html:215
msgid "Your Email"
msgstr "Deine E-Mail"
#: templates/datacenterlight/index.html:215
msgid "Please enter a valid email address"
msgstr "Bitte gib eine gültige E-Mailadresse ein"
#: templates/datacenterlight/index.html:228
#: templates/datacenterlight/pricing.html:79
msgid "Order Now!"
msgstr "Bestelle jetzt!"
#: templates/datacenterlight/index.html:254
msgid "Switzerland " msgid "Switzerland "
msgstr "Schweiz" msgstr "Schweiz"
#: templates/datacenterlight/index.html:271 #: templates/datacenterlight/index.html:183
msgid "Questions?" msgid "Questions?"
msgstr "Fragen?" msgstr "Fragen?"
#: templates/datacenterlight/index.html:271 #: templates/datacenterlight/index.html:183
msgid "Contact us!" msgid "Contact us!"
msgstr "Kontaktiere uns!" msgstr "Kontaktiere uns!"
@ -319,46 +324,46 @@ msgid "Confirm Order"
msgstr "Bestellung Bestätigen" msgstr "Bestellung Bestätigen"
#: templates/datacenterlight/order_detail.html:30 #: templates/datacenterlight/order_detail.html:30
msgid "Billed To:"
msgstr "Rechnungsadresse"
#: templates/datacenterlight/order_detail.html:39
msgid "Date" msgid "Date"
msgstr "Datum" msgstr "Datum"
#: templates/datacenterlight/order_detail.html:48 #: templates/datacenterlight/order_detail.html:36
msgid "Billed To:"
msgstr "Rechnungsadresse"
#: templates/datacenterlight/order_detail.html:47
msgid "Payment Method:" msgid "Payment Method:"
msgstr "Bezahlmethode" msgstr "Bezahlmethode"
#: templates/datacenterlight/order_detail.html:49 #: templates/datacenterlight/order_detail.html:48
msgid "ending" msgid "ending"
msgstr "endend in" msgstr "endend in"
#: templates/datacenterlight/order_detail.html:59 #: templates/datacenterlight/order_detail.html:58
msgid "Order summary" msgid "Order summary"
msgstr "Bestellungsübersicht" msgstr "Bestellungsübersicht"
#: templates/datacenterlight/order_detail.html:63 #: templates/datacenterlight/order_detail.html:62
msgid "Cores" msgid "Cores"
msgstr "Prozessorkerne" msgstr "Prozessorkerne"
#: templates/datacenterlight/order_detail.html:65 #: templates/datacenterlight/order_detail.html:64
msgid "Memory" msgid "Memory"
msgstr "Arbeitsspeicher" msgstr "Arbeitsspeicher"
#: templates/datacenterlight/order_detail.html:67 #: templates/datacenterlight/order_detail.html:66
msgid "Disk space" msgid "Disk space"
msgstr "Festplattenkapazität" msgstr "Festplattenkapazität"
#: templates/datacenterlight/order_detail.html:69 #: templates/datacenterlight/order_detail.html:68
msgid "Configuration" msgid "Configuration"
msgstr "Konfiguration" msgstr "Konfiguration"
#: templates/datacenterlight/order_detail.html:71 #: templates/datacenterlight/order_detail.html:70
msgid "Total" msgid "Total"
msgstr "" msgstr ""
#: templates/datacenterlight/order_detail.html:78 #: templates/datacenterlight/order_detail.html:77
msgid "Place order" msgid "Place order"
msgstr "Bestellen" msgstr "Bestellen"
@ -366,6 +371,10 @@ msgstr "Bestellen"
msgid "We are cutting down the costs significantly!" msgid "We are cutting down the costs significantly!"
msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen" msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen"
#: templates/datacenterlight/pricing.html:79
msgid "Order Now!"
msgstr "Bestelle jetzt!"
#: templates/datacenterlight/pricing.html:89 #: templates/datacenterlight/pricing.html:89
msgid "" msgid ""
"Our VMs are hosted in Glarus, Switzerland, and our website is currently " "Our VMs are hosted in Glarus, Switzerland, and our website is currently "
@ -392,14 +401,115 @@ msgstr ""
msgid "as soon as possible!" msgid "as soon as possible!"
msgstr "" msgstr ""
#: views.py:234 #: templates/datacenterlight/whydatacenterlight.html:26
msgid "Tech Stack"
msgstr "Tech Stack"
#: templates/datacenterlight/whydatacenterlight.html:29
msgid "We are seriously open source."
msgstr "Wir sind vollends opensource."
#: templates/datacenterlight/whydatacenterlight.html:30
msgid ""
" Our full software stack is open source We don't use anything that isn't "
"open source. <br>Yes, we are that cool. "
msgstr ""
"Unser gesamter Softwaresstack ist Open-Source Wir verwenden nichts, das "
"nicht Open-Source ist.<br/>Yep, so cool sind wir."
#: templates/datacenterlight/whydatacenterlight.html:37
msgid "Our services run on"
msgstr "Unsere Dienste läuft auf"
#: templates/datacenterlight/whydatacenterlight.html:41
msgid "Our monitoring"
msgstr "Unser Monitoring"
#: templates/datacenterlight/whydatacenterlight.html:45
msgid "Our storage layer"
msgstr "Unser Storage-Layer"
#: templates/datacenterlight/whydatacenterlight.html:49
msgid "Our web frontend"
msgstr "Unser Web-Frontend"
#: templates/datacenterlight/whydatacenterlight.html:53
msgid "Our cloud"
msgstr "Unsere Cloud"
#: templates/datacenterlight/whydatacenterlight.html:57
msgid "Our configuration management system"
msgstr "Unser Konfigurationsmanagementsystem"
#: templates/datacenterlight/whydatacenterlight.html:61
msgid "Our awesome juice"
msgstr "Unser Treibstoff"
#: templates/datacenterlight/whydatacenterlight.html:65
msgid "Our NAT64 gateway"
msgstr "Unser NAT64 Gateway"
#: templates/datacenterlight/whydatacenterlight.html:90
msgid "We believe in giving back to the FOSS community."
msgstr "Wir unterstützen die FOSS Community."
#: templates/datacenterlight/whydatacenterlight.html:91
msgid ""
"Data Center Light is the child of free and open source software (FOSS) "
"movement. <br>We grew up with it, live by it, and believe in it.<br> The "
"more we work on our data center,<br> the more we contribute back to the FOSS "
"community."
msgstr ""
"Data Center Light ist ein Teil der Free und Opens Source Software (FOSS) "
"Bewegung.<br/> Wir sind damit gross geworden, leben damit und glauben daran."
"<br/> Je weiter wir mit unserem Data Center Light vorankommen, desto mehr "
"können wir etwas an die FOSS Community zurückgeben."
#: templates/datacenterlight/whydatacenterlight.html:104
msgid "We bring the future to you."
msgstr "Wir bringen die Zukunft zu dir."
#: templates/datacenterlight/whydatacenterlight.html:107
msgid ""
" Data Center Light uses the most modern technologies out there.<br>\n"
" Your VM needs only IPv6. Data Center Light "
"provides<br> transparent two-way IPv6/IPv4 translation.\n"
" "
msgstr ""
"Data Center Light verwendet die zur Zeit modernsten Technologien.<br/>Deine "
"VM läuft mit IPv6. Data Center Light bietet eine transparente IPv6/IPv4-"
"Zweiweglösung."
#: templates/datacenterlight/whydatacenterlight.html:122
msgid ""
" No more spinning metal plates! Data Center Light uses only SSDs. We keep "
"things faster and lighter. "
msgstr ""
"Keine drehenden Metallplatten mehr! Data Center Light verwendet "
"ausschliesslich SSDs. Wir halten die Dinge schnell, leicht und effizient."
#: templates/datacenterlight/whydatacenterlight.html:138
msgid "Starting from only 15CHF per month. Try now."
msgstr "Unser Angebot beginnt bei 15 CHF pro Monat. Probier's jetzt aus!"
#: templates/datacenterlight/whydatacenterlight.html:139
msgid "Actions speak louder than words. Let's do it, try our VM now."
msgstr "Tagen sagen mehr als Worte Teste jetzt unsere VM!"
#: views.py:235
msgid "is not a proper name" msgid "is not a proper name"
msgstr "ist kein gültiger Name" msgstr "ist kein gültiger Name"
#: views.py:241 #: views.py:242
msgid "is not a proper email" msgid "is not a proper email"
msgstr "ist keine gültige E-Mailadresse" msgstr "ist keine gültige E-Mailadresse"
#~ msgid "Please enter a value greater than or equal to 1."
#~ msgstr "Bitte gib einen Wert größer oder gleich 1 ein."
#~ msgid "Please enter a value greater than or equal to 10."
#~ msgstr "Bitte gib einen Wert größer oder gleich 10 ein"
#~ msgid "Buy VM" #~ msgid "Buy VM"
#~ msgstr "VM Kaufen" #~ msgstr "VM Kaufen"

View file

@ -0,0 +1,29 @@
from django.core.management.base import BaseCommand
from opennebula_api.models import OpenNebulaManager
from datacenterlight.models import VMTemplate
import logging
logger = logging.getLogger(__name__)
class Command(BaseCommand):
help = 'Fetches the VM templates from OpenNebula and populates the dcl VMTemplate model'
def handle(self, *args, **options):
try:
manager = OpenNebulaManager()
templates = manager.get_templates()
dcl_vm_templates = []
for template in templates:
template_name = template.name.strip('public-')
template_id = template.id
dcl_vm_template = VMTemplate.create(template_name, template_id)
dcl_vm_templates.append(dcl_vm_template)
old_vm_templates = VMTemplate.objects.all()
old_vm_templates.delete()
for dcl_vm_template in dcl_vm_templates:
dcl_vm_template.save()
except Exception as e:
logger.error('Error connecting to OpenNebula. Error Details: {err}'.format(err=str(e)))

View file

@ -9,12 +9,13 @@ class BetaAccessVMType(models.Model):
def __str__(self): def __str__(self):
return "ID: %s - SSD %s - RAM %s - CPU %s - Price %s " % \ return "ID: %s - SSD %s - RAM %s - CPU %s - Price %s " % \
(self.id, str(self.ssd), self.ram, self.cpu, self.price) (self.id, str(self.ssd), self.ram, self.cpu, self.price)
class BetaAccess(models.Model): class BetaAccess(models.Model):
email = models.CharField(max_length=250) email = models.CharField(max_length=250)
name = models.CharField(max_length=250) name = models.CharField(max_length=250)
# vm = models.ForeignKey(BetaAccessVM) # vm = models.ForeignKey(BetaAccessVM)
def __str__(self): def __str__(self):
@ -48,3 +49,13 @@ class BetaAccessVM(models.Model):
amount=vm[VM_AMOUNT], type=vm_type)) amount=vm[VM_AMOUNT], type=vm_type))
return created_vms return created_vms
class VMTemplate(models.Model):
name = models.CharField(max_length=50)
opennebula_vm_template_id = models.IntegerField()
@classmethod
def create(cls, name, opennebula_vm_template_id):
vm_template = cls(name=name, opennebula_vm_template_id=opennebula_vm_template_id)
return vm_template

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 6 KiB

View file

@ -1,22 +1,22 @@
(function($){ (function($) {
"use strict"; // Start of use strict "use strict"; // Start of use strict
/* --------------------------------------------- /* ---------------------------------------------
Scripts initialization Scripts initialization
--------------------------------------------- */ --------------------------------------------- */
var cardPricing ={ var cardPricing = {
'cpu': { 'cpu': {
'id': 'coreValue', 'id': 'coreValue',
'value': 1, 'value': 1,
'min':1, 'min': 1,
'max': 48, 'max': 48,
'interval': 1 'interval': 1
}, },
'ram': { 'ram': {
'id': 'ramValue', 'id': 'ramValue',
'value': 2, 'value': 2,
'min':2, 'min': 2,
'max': 200, 'max': 200,
'interval': 1 'interval': 1
}, },
@ -24,131 +24,141 @@
'id': 'storageValue', 'id': 'storageValue',
'value': 10, 'value': 10,
'min': 10, 'min': 10,
'max': 500, 'max': 2000,
'interval': 10 'interval': 10
} }
} };
$(window).load(function(){ $(window).load(function() {
}); });
$(document).ready(function(){ $(document).ready(function() {
verifiedUrl(); verifiedUrl();
_navScroll(); _navScroll();
_initScroll(); _initScroll();
_initNavUrl(); _initNavUrl();
_initPricing(); _initPricing();
}); });
$(window).resize(function(){ $(window).resize(function() {
}); });
/* --------------------------------------------- /* ---------------------------------------------
Nav panel classic Nav panel classic
--------------------------------------------- */ --------------------------------------------- */
if (window.matchMedia("(min-width: 767px)").matches) { if (window.matchMedia("(min-width: 767px)").matches) {
$('ul.nav li.dropdown').hover(function() { $('ul.nav li.dropdown').hover(function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500); $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
}, function() { }, function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500); $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
});
} else {
/* the viewport is less than 400 pixels wide */
}
function _initScroll(){
$(window).scroll(function(){
_navScroll();
}); });
} else {
/* the viewport is less than 400 pixels wide */
} }
function _navScroll(){
if($(window).scrollTop() > 10 ){
function _initScroll() {
$(window).scroll(function() {
_navScroll();
});
}
function _navScroll() {
if ($(window).scrollTop() > 10) {
$(".navbar").removeClass("navbar-transparent"); $(".navbar").removeClass("navbar-transparent");
$(".navbar-default .btn-link").css("color", "#777"); $(".navbar-default .btn-link").css("color", "#777");
$(".dropdown-menu").removeClass("navbar-transparent"); $(".dropdown-menu").removeClass("navbar-transparent");
$(".dropdown-menu > li > a").css("color", "#777"); $(".dropdown-menu > li > a").css("color", "#777");
}else{ } else {
$(".navbar").addClass("navbar-transparent"); $(".navbar").addClass("navbar-transparent");
$(".navbar-default .btn-link").css("color", "#fff"); $(".navbar-default .btn-link").css("color", "#fff");
$(".dropdown-menu").addClass("navbar-transparent"); $(".dropdown-menu").addClass("navbar-transparent");
$(".dropdown-menu > li > a").css("color", "#fff"); $(".dropdown-menu > li > a").css("color", "#fff");
} }
} }
function _initNavUrl(){
$('.url').click(function(){ function _initNavUrl() {
var href = $(this).attr('data-url'); $('.url').click(function(event) {
$('.navbar-collapse').removeClass('in'); event.preventDefault();
$('.navbar-collapse').addClass('collapsing'); var href = $(this).attr('data-url');
$('html, body').animate({ $('.navbar-collapse').removeClass('in');
scrollTop: $(href).offset().top $('.navbar-collapse').addClass('collapsing');
}, 1000); var url = window.location.pathname;
var urlSplit = url.split('/');
if (urlSplit.length === 3 && urlSplit[2] === 'datacenterlight') {
$('html, body').animate({
scrollTop: $(href).offset().top
}, 1000);
} else {
var allUrl = window.location.href;
var redirect = allUrl.split('whydatacenterlight')
window.location.href = '/en-us/datacenterlight' + href;
}
}); });
} }
function verifiedUrl(){
if(window.location.href.indexOf('#success') > -1){ function verifiedUrl() {
if (window.location.href.indexOf('#success') > -1) {
form_success(); form_success();
console.log('epa');
} }
} }
function _initPricing(){ function _initPricing() {
_fetchPricing(); _fetchPricing();
$('.fa-minus-circle.left').click(function(event){ $('.fa-minus-circle.left').click(function(event) {
var data = $(this).data('minus'); var data = $(this).data('minus');
if(cardPricing[data].value > cardPricing[data].min){ if (cardPricing[data].value > cardPricing[data].min) {
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval; cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
} }
_fetchPricing(); _fetchPricing();
}); });
$('.fa-plus-circle.right').click(function(event){ $('.fa-plus-circle.right').click(function(event) {
var data = $(this).data('plus'); var data = $(this).data('plus');
if(cardPricing[data].value < cardPricing[data].max){ if (cardPricing[data].value < cardPricing[data].max) {
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval; cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
} }
_fetchPricing(); _fetchPricing();
}); });
$('.input-price').change(function(){ $('.input-price').change(function() {
var data = $(this).attr("name"); var data = $(this).attr("name");
cardPricing[data].value = $('input[name='+data+']').val(); cardPricing[data].value = $('input[name=' + data + ']').val();
_fetchPricing(); _fetchPricing();
}); });
} }
function _fetchPricing(){
Object.keys(cardPricing).map(function(element){ function _fetchPricing() {
Object.keys(cardPricing).map(function(element) {
//$('#'+cardPricing[element].id).val(cardPricing[element].value); //$('#'+cardPricing[element].id).val(cardPricing[element].value);
$('input[name='+element+']').val(cardPricing[element].value); $('input[name=' + element + ']').val(cardPricing[element].value);
}); });
_calcPricing(); _calcPricing();
} }
function _calcPricing(){ function _calcPricing() {
var total = (cardPricing['cpu'].value * 5) + (2* cardPricing['ram'].value) + (0.6* cardPricing['storage'].value); var total = (cardPricing['cpu'].value * 5) + (2 * cardPricing['ram'].value) + (0.6 * cardPricing['storage'].value);
total = parseFloat(total.toFixed(2)); total = parseFloat(total.toFixed(2));
$("#total").text(total); $("#total").text(total);
$('input[name=total]').val(total); $('input[name=total]').val(total);
} }
function form_success(){
function form_success() {
$('#sucessModal').modal('show'); $('#sucessModal').modal('show');
} }
function _calculate(numbers, price){
$('#valueTotal').text(numbers*price*31); function _calculate(numbers, price) {
$('#valueTotal').text(numbers * price * 31);
} }
})(jQuery);
})(jQuery);

View file

@ -3,65 +3,66 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{LANGUAGE_CODE}}"> <html lang="{{LANGUAGE_CODE}}">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Data Center Light by ungleich"> <meta name="description" content="Data Center Light by ungleich">
<meta name="author" content="ungleich GmbH"> <meta name="author" content="ungleich GmbH">
<title>Data Center Light - <title>Data Center Light -
{% block title %}VM hosting made in Switzerland{% endblock %}</title> {% block title %}VM hosting made in Switzerland{% endblock %}</title>
<!-- Bootstrap Core CSS --> <!-- Bootstrap Core CSS -->
<link href="{% static 'datacenterlight/css/bootstrap.min.css' %}" rel="stylesheet"> <link href="{% static 'datacenterlight/css/bootstrap.min.css' %}" rel="stylesheet">
<!-- Custom Fonts --> <!-- Custom Fonts -->
<!--Import Google Icon Font--> <!--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="{% 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 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" /> <link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon" />
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.min.css" rel="stylesheet"> <link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.min.css" rel="stylesheet">
<!-- Custom CSS --> <!-- Custom CSS -->
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet"> <link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- 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:// --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]> <!--[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/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]--> <![endif]-->
<!-- Google analytics --> <!-- Google analytics -->
{% include "google_analytics.html" %} {% include "google_analytics.html" %}
<!-- End Google Analytics --> <!-- End Google Analytics -->
</head> </head>
<body> <body>
<!-- Navigation --> <!-- Navigation -->
{% include "datacenterlight/includes/_navbar.html" %} {% include "datacenterlight/includes/_navbar.html" %}
{% block content %}
{% endblock %}
{% include "datacenterlight/includes/_footer.html" %}
<!-- Footer -->
<!-- jQuery -->
<script src="{% static 'datacenterlight/js/jquery.js' %}"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.js"></script> {% block content %}
{% endblock %}
<!-- Bootstrap Core JavaScript --> {% include "datacenterlight/includes/_footer.html" %}
<script src="{% static 'datacenterlight/js/bootstrap.min.js' %}"></script> <!-- Footer -->
<script src="{% static 'datacenterlight/js/main.js' %}"></script>
<!-- Load form js --> <!-- jQuery -->
<script src="{% static 'datacenterlight/js/form.js' %}"></script> <script src="{% static 'datacenterlight/js/jquery.js' %}"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.js"></script>
<!-- Bootstrap Core JavaScript -->
<script src="{% static 'datacenterlight/js/bootstrap.min.js' %}"></script>
<script src="{% static 'datacenterlight/js/main.js' %}"></script>
<!-- Load form js -->
<script src="{% static 'datacenterlight/js/form.js' %}"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
</body>
</html> </html>

View file

@ -0,0 +1,123 @@
{% load staticfiles i18n%}
<form id="order_form" method="POST" action="" data-toggle="validator" role="form">
{% csrf_token %}
<div class="title">
<h3>{% trans "VM hosting" %} </h3>
</div>
<div class="price">
<span id="total">15</span>
<span>CHF/{% trans "month" %}</span>
<div class="price-text">
<p>{% trans "VAT included" %}</p>
</div>
</div>
<div class="descriptions">
<div class="description form-group">
<p>{% trans "Hosted in Switzerland" %}</p>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="cpu" aria-hidden="true"></i>
<input class="input-price select-number" type="number" min="1" max="48" id="coreValue" name="cpu"
data-error="{% trans 'Please enter a value in range 1 - 48.' %}" required>
<span> Core</span>
<i class="fa fa-plus-circle right" data-plus="cpu" aria-hidden="true"></i>
</div>
<div class="help-block with-errors">
{% for message in messages %}
{% if 'cores' in message.tags %}
<ul class="list-unstyled"><li>
{{ message|safe }}
</li></ul>
{% endif %}
{% endfor %}
</div>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
<input id="ramValue" class="input-price select-number" type="number" min="2" max="200" name="ram"
data-error="{% trans 'Please enter a value in range 2 - 200.' %}" required>
<span> GB RAM</span>
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
</div>
<div class="help-block with-errors">
{% for message in messages %}
{% if 'memory' in message.tags %}
<ul class="list-unstyled"><li>
{{ message|safe }}
</li></ul>
{% endif %}
{% endfor %}
</div>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="storage" aria-hidden="true"></i>
<input id="storageValue" class="input-price select-number" type="number" min="10" max="2000" step="10"
name="storage" data-error="{% trans 'Please enter a value in range 10 - 2000.' %}" required>
<span>{% trans "GB Storage (SSD)" %}</span>
<i class="fa fa-plus-circle right" data-plus="storage" aria-hidden="true"></i>
</div>
<div class="help-block with-errors">
{% for message in messages %}
{% if 'storage' in message.tags %}
<ul class="list-unstyled"><li>
{{ message|safe }}
</li></ul>
{% endif %}
{% endfor %}
</div>
</div>
<div class="description select-configuration input form-group justify-center">
<label for="config">OS</label>
<select name="config" id="">
{% for template in templates %}
<option value="{{template.opennebula_vm_template_id}}">{{template.name}}</option>
{% 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>

View file

@ -12,28 +12,28 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
{% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %} {% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %}
<a href="{% url 'datacenterlight:index' %}" id="logoBlack" class="navbar-brand topnav url" data-url="#home"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a> <a href="{% url 'datacenterlight:index' %}" id="logoBlack" class="navbar-brand topnav" data-url="#home"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
<a href="{% url 'datacenterlight:index' %}" id="logoWhite" class="navbar-brand topnav url" data-url="#home"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a> <a href="{% url 'datacenterlight:index' %}" id="logoWhite" class="navbar-brand topnav" data-url="#home"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
{% else %} {% else %}
<a href="{% url 'datacenterlight:index' %}" id="logoBlack" class="navbar-brand topnav url"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a> <a href="{% url 'datacenterlight:index' %}" id="logoBlack" class="navbar-brand topnav"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
<a href="{% url 'datacenterlight:index' %}" id="logoWhite" class="navbar-brand topnav url"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a> <a href="{% url 'datacenterlight:index' %}" id="logoWhite" class="navbar-brand topnav"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
{% endif %} {% endif %}
</div> </div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><!-- Start Navbar collapse--> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><!-- Start Navbar collapse-->
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
{% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %} {% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %}
<li class="dropdown"> <li class="dropdown">
<a class="dropdown-toggle visible-mobile" href="#" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Highlights" %}<span class="caret"></span></a> <a class="dropdown-toggle visible-mobile" href="#" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Highlights" %}<span class="caret"></span></a>
<a class="dropdown-toggle url disabled visible-desktop" href="{% url 'datacenterlight:index' %}#how" data-url="#how" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Highlights" %}<span class="caret"></span></a> <a class="dropdown-toggle url disabled visible-desktop menu-url" data-url="#how" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Highlights" %}<span class="caret"></span></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="url" href="{% url 'datacenterlight:index' %}#your" data-url="#your" >{% trans "Scale out" %}</a></li> <li><a class="url menu-url" data-url="#your" href="#your">{% trans "Scale out" %}</a></li>
<li><a class="url" href="{% url 'datacenterlight:index' %}#our" data-url="#our">{% trans "Reliable and light" %}</a></li> <li><a class="url menu-url" data-url="#our" href="#our">{% trans "Reliable and light" %}</a></li>
<li> <a class="url" href="{% url 'datacenterlight:index' %}#price" data-url="#price" >{% trans "Order VM" %}</a></li> <li> <a class="url menu-url" data-url="#price" href="#price">{% trans "Order VM" %}</a></li>
</ul> </ul>
</li> </li>
<li> <li>
<a class="url" href="{% url 'datacenterlight:index' %}/whydatacenterlight" >{% trans "Why Data Center Light?" %}</a> <a href="{% url 'datacenterlight:index' %}/whydatacenterlight" >{% trans "Why Data Center Light?" %}</a>
</li> </li>
<li> <li>
<a class="url" href="{% url 'datacenterlight:index' %}#contact" data-url="#contact" >{% trans "Contact" %}</a> <a class="url" href="{% url 'datacenterlight:index' %}#contact" data-url="#contact" >{% trans "Contact" %}</a>
@ -41,18 +41,19 @@
{% endif %} {% endif %}
<li class="nav-language"> <li class="nav-language">
<div class="select-language"> <div class="select-language">
{% if LANGUAGE_CODE == 'en-us'%} {% if LANGUAGE_CODE == 'en-us'%}
<span>English</span> <span>English</span>
{% else %} {% else %}
<span>Deutsch</span> <span>Deutsch</span>
{% endif %} {% endif %}
<i class="fa fa-globe" aria-hidden="true"></i> <i class="fa fa-globe" aria-hidden="true"></i>
</div> </div>
<div class="drop-language"> <div class="drop-language">
{% if LANGUAGE_CODE == 'en-us'%} {% if LANGUAGE_CODE == 'en-us'%}
<a class="url" href="{% change_lang 'de' %}">Deutsch</a> <a href="{% change_lang 'de' %}">Deutsch</a>
{% else %} {% else %}
<a class="url" href="{% change_lang 'en-us' %}" >English</a> <a href="{% change_lang 'en-us' %}" >English</a>
{% endif %} {% endif %}
</div> </div>

View file

@ -1,6 +1,5 @@
{% extends "datacenterlight/base.html" %} {% extends "datacenterlight/base.html" %}
{% load staticfiles i18n%} {% load staticfiles i18n%}
{% get_current_language as LANGUAGE_CODE %}
{% block content %} {% block content %}
@ -10,7 +9,7 @@
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="intro-message"> <div class="intro-message">
<h1>Data Center Light</h1> <h1>Data Center Light</h1>
<h3>{% trans "Finally, an affordable VM hosting in Switzerland!" %}</h3> <h3>{% trans "Finally, an affordable VM hosting in Switzerland!" %}</h3>
@ -60,13 +59,13 @@
<li> <li>
<i class="fa-li fa fa-check-square-o fa-lg"></i> <i class="fa-li fa fa-check-square-o fa-lg"></i>
<p class="lead">{% trans "Is creative, using a modern and alternative design for a data center in order to make it more sustainable and affordable at the same time." %}</p> <p class="lead">{% trans "Is creative, using a modern and alternative design for a data center in order to make it more sustainable and affordable at the same time." %}</p>
</li> </li>
<li> <li>
<i class="fa-li fa fa-check-square-o fa-lg"></i> <i class="fa-li fa fa-check-square-o fa-lg"></i>
<p class="lead">{% trans "Cuts down the costs for you by using FOSS (Free Open Source Software) exclusively, wherefore we can save money from paying licenses." %}</p> <p class="lead">{% trans "Cuts down the costs for you by using FOSS (Free Open Source Software) exclusively, wherefore we can save money from paying licenses." %}</p>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
@ -87,7 +86,7 @@
</div> </div>
<div class="split-description"> <div class="split-description">
<p class="lead">{% trans "We don't use special hardware. We use commodity hardware: we buy computers that you buy. Just many more and put them in a cozy home for computers called data center." %}</p> <p class="lead">{% trans "We don't use special hardware. We use commodity hardware: we buy computers that you buy. Just many more and put them in a cozy home for computers called data center." %}</p>
</div> </div>
</div> </div>
</div> </div>
@ -112,8 +111,8 @@
<h2>{% trans "Reliable and light" %}</h2> <h2>{% trans "Reliable and light" %}</h2>
</div> </div>
<div class="split-description"> <div class="split-description">
<p class="lead">{% trans "Our VMs are located in Switzerland, with reliable power supply and fast internet connection. Our VM costs less thanks to our featherlight infrastructure." %}</p> <p class="lead">{% trans "Our VMs are located in Switzerland, with reliable power supply and fast internet connection. Our VM costs less thanks to our featherlight infrastructure." %}</p>
</div> </div>
</div> </div>
</div> </div>
@ -122,7 +121,7 @@
<!-- /.container --> <!-- /.container -->
<!-- /.option 1 --> <!-- /.option 1 -->
</div> </div>
<!-- /.content-section-b --> <!-- /.content-section-b -->
<div class="content-section-a pricing-section" id="price"> <div class="content-section-a pricing-section" id="price">
@ -131,7 +130,7 @@
<div class="row text-center"> <div class="row text-center">
<div class="col-xs-12 col-md-6 text"> <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> <h2 class="section-heading">{% trans "Simple and affordable: Try our virtual machine with featherlight price." %}</h2>
<p class="lead">{% trans "Affordable VM hosting based in Switzerland" %}</p> <p class="lead new-lead">{% trans "Affordable VM hosting based in Switzerland" %}</p>
</div> </div>
<div class="col-xs-12 col-md-6 hero-feature"> <div class="col-xs-12 col-md-6 hero-feature">
@ -139,94 +138,7 @@
<div class="landing card"> <div class="landing card">
<img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt=""> <img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt="">
<div class="caption"> <div class="caption">
<form id="order_form" method="POST" action="" data-toggle="validator" role="form"> {% include "datacenterlight/calculator_form.html" %}
{% csrf_token %}
<div class="title">
<h3>{% trans "VM hosting" %} </h3>
</div>
<div class="price">
<span id="total">15</span>
<span>CHF/{% trans "month" %}</span>
<div class="price-text">
<p>{% trans "VAT included" %}</p>
</div>
</div>
<div class="descriptions">
<div class="description form-group">
<p>{% trans "Hosted in Switzerland" %}</p>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="cpu" aria-hidden="true"></i>
<input class="input-price select-number" type="number" min="1" max="42" id="coreValue" name="cpu" data-error="{% trans 'Please enter a value greater than or equal to 1.' %}" required>
<span> Core</span>
<i class="fa fa-plus-circle right" data-plus="cpu" aria-hidden="true"></i>
</div>
<div class="help-block with-errors"></div>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
<input id="ramValue" class="input-price select-number" type="number" min="2" max="200" name="ram" data-error="{% trans 'Please enter a value greater than or equal to 2.' %}" required>
<span> GB RAM</span>
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
</div>
<div class="help-block with-errors"></div>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="storage" aria-hidden="true"></i>
<input id="storageValue" class="input-price select-number" type="number" min="10" max="500" step="10" name="storage" data-error="{% trans 'Please enter a value greater than or equal to 10.' %}" required>
<span>{% trans "GB Storage (SSD)" %}</span>
<i class="fa fa-plus-circle right" data-plus="storage" aria-hidden="true"></i>
</div>
<div class="help-block with-errors"></div>
</div>
<div class="description select-configuration input form-group justify-center">
<label for="config">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 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" value="{% trans 'Order Now!' %}"></input>
</form>
</div> </div>
</div> </div>
</div> </div>
@ -242,7 +154,7 @@
<div class="intro-header-2 contact-section" id="contact"> <div class="intro-header-2 contact-section" id="contact">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-sm-6 col-md-6"> <div class="col-sm-6 col-md-6">
<div class="card"> <div class="card">
<div class="subtitle"> <div class="subtitle">
@ -254,15 +166,9 @@
<p>{% trans "Switzerland " %}</p> <p>{% trans "Switzerland " %}</p>
</div> </div>
<div class="social"> <div class="social">
<a target="_blank" class="" href="https://twitter.com/datacenterlight"> <a target="_blank" class="" href="https://twitter.com/datacenterlight"><i class="fa fa-twitter fa-fw"></i></a>
<i class="fa fa-twitter fa-fw"></i> <a target="_blank" class="" href="https://github.com/ungleich"><i class="fa fa-github fa-fw"></i></a>
</a> <a target="_blank" class="" href="https://www.facebook.com/ungleich.ch/"><i class="fa fa-facebook 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 fa-fw"></i>
</a>
</div> </div>
</div> </div>
</div> </div>
@ -275,7 +181,7 @@
</div> </div>
</div> </div>
</div> </div>
<!-- /.banner --> <!-- /.banner -->
{% endblock %} {% endblock %}

View file

@ -4,94 +4,93 @@
{% load custom_tags %} {% load custom_tags %}
{% block content %} {% block content %}
<div class="order-detail-container"> <div class="order-detail-container">
{% if messages %} {% 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="row">
<div class="col-xs-6"> <div class="col-xs-12 col-md-8 col-md-offset-2">
<address> <br/>
<h3><b>{% trans "Billed To:"%}</b></h3> <div class="alert alert-warning">
{% with request.session.billing_address_data as billing_address %} {% for message in messages %}
{{request.session.user.name}}<br> {{billing_address|get_value_from_dict:'street_address'}}, {{billing_address|get_value_from_dict:'postal_code'}}<br> <span>{{ message }}</span>
{{billing_address|get_value_from_dict:'city'}}, {{billing_address|get_value_from_dict:'country'}}. {% endfor %}
{% endwith %} </div>
</address>
</div>
<div class="col-xs-6 text-right">
<address>
<strong>{% trans "Date"%}:</strong><br>
<span id="order-created_at">{% now "Y-m-d H:i" %}</span><br><br>
</address>
</div> </div>
</div> </div>
{% endif %}
{% if not error %}
<div class="row"> <div class="row">
<div class="col-xs-6"> <div class="col-xs-12 col-md-8 col-md-offset-2">
<address> <div class="invoice-title">
<strong>{% trans "Payment Method:"%}</strong><br> <h2>{% trans "Confirm Order"%}</h2>
{{cc_brand}} {% trans "ending" %} **** {{cc_last4}}<br> </div>
{{request.session.user.email}} <hr>
</address> <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" %} **** {{cc_last4}}<br>
{{request.session.user.email}}
</address>
</div>
</div>
</div> </div>
</div> </div>
</div>
</div> <div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="row"> <h3><b>{% trans "Order summary"%}</b></h3>
<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> <hr>
<p><b>{% trans "Memory"%}</b> <span class="pull-right">{{vm.memory}} GB</span></p> <div class="content">
<hr> {% with request.session.specs as vm %}
<p><b>{% trans "Disk space"%}</b> <span class="pull-right">{{vm.disk_size}} GB</span></p> <p><b>{% trans "Cores"%}</b> <span class="pull-right">{{vm.cpu}}</span></p>
<hr> <hr>
<p><b>{% trans "Configuration"%}</b> <span class="pull-right">{{request.session.template.name}}</span></p> <p><b>{% trans "Memory"%}</b> <span class="pull-right">{{vm.memory}} GB</span></p>
<hr> <hr>
<h4>{% trans "Total"%}<p class="pull-right"><b>{{vm.price}} CHF</b></p></h4> <p><b>{% trans "Disk space"%}</b> <span class="pull-right">{{vm.disk_size}} GB</span></p>
{% endwith %} <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></p></h4>
{% endwith %}
</div>
<br/>
<form method="post">
{% csrf_token %}
<div class=" content pull-right">
<a href="{{next_url}}" ><button class="btn btn-info">{% trans "Place order"%}</button></a>
</div>
</form>
</div>
</div> </div>
<br/> {% endif %}
<form method="post">
{% csrf_token %}
<div class=" content pull-right">
<a href="{{next_url}}" ><button class="btn btn-info">{% trans "Place order"%}</button></a>
</div>
</form>
</div>
</div> </div>
{% endif %}
</div>
<script type="text/javascript"> <script type="text/javascript">
window.onload = function () { window.onload = function () {
var locale_date = moment.utc(document.getElementById("order-created_at").textContent,'YYYY-MM-DD HH:mm').toDate(); 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"); locale_date = moment(locale_date).format("YYYY-MM-DD h:mm:ss a");
document.getElementById('order-created_at').innerHTML = locale_date; document.getElementById('order-created_at').innerHTML = locale_date;
}; };
</script> </script>
{%endblock%} {%endblock%}

View file

@ -13,73 +13,73 @@
<div class="price-calc-section"> <div class="price-calc-section">
<div class="card"> <div class="card">
<img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt=""> <img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt="">
<div class="caption"> <div class="caption">
<form method="POST" action=""> <form method="POST" action="">
{% csrf_token %} {% 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="title">
<h3>{% trans "VM hosting" %} </h3>
<div class="description select-configuration input"> </div>
<label for="name">OS</label> <div class="price">
<select name="config" id=""> <span id="total">15</span>
{% for template in templates %} <span>CHF</span>
<option value="{{template.id}}">{{template.name}} </option> <div class="price-text">
{% endfor %} <p>{% trans "VAT included" %}</p>
</select> </div>
</div> </div>
<input type="hidden" name="total"> <div class="descriptions">
<div class="description">
<!-- <div class="description input"> <p>{% trans "Hosted in Switzerland" %}</p>
<label for="name">Name</label> </div>
<input type="text" name="name" placeholder="Your Name"> <div class="description">
</div> <i class="fa fa-minus-circle left" data-minus="cpu" aria-hidden="true"></i>
<div class="description input"> <input class="input-price" type="number" min="1" max="42" id="coreValue" name="cpu">
<label for="email">Email</label> <span> Core</span>
<input type="email" name="email" placeholder="Your Email"> <i class="fa fa-plus-circle right" data-plus="cpu" aria-hidden="true"></i>
</div> --> </div>
<div class="description">
<!--<div class="description check-ip"> <i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
<input type="checkbox" name="ipv6"> Ipv6 Only<br> <input id="ramValue" class="input-price" type="number" min="2" max="200" name="ram">
</div>--> <span> GB RAM</span>
</div> <i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
<input type="submit" class="btn btn-primary" value="{% trans 'Order Now!' %}"></input> </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>
</form>
</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>
<div class="text"> <div class="text">

View file

@ -12,29 +12,21 @@
</div> </div>
</div> </div>
<script src="{% static 'datacenterlight/js/jquery.js' %}"></script>
<script type="text/javascript"> <script type="text/javascript">
window.onload=function(){ window.onload=function(){
$('.selectpicker').selectpicker({ $('.selectpicker').selectpicker({
style: 'btn-link', style: 'btn-link',
windowPadding: 10, windowPadding: 10,
}); });
var hash = window.location.hash.substr(1); var hash = window.location.hash.substr(1);
console.log(hash); console.log(hash);
if (hash == 'requestform'){ if (hash == 'requestform'){
$('#reques-success-message').modal('show'); $('#reques-success-message').modal('show');
} }
};
</script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.js"></script>
<!-- Bootstrap Core JavaScript -->
<script src="{% static 'datacenterlight/js/bootstrap.min.js' %}"></script>
<script src="{% static 'datacenterlight/js/main.js' %}"></script>
};
</script>
{% endblock %} {% endblock %}

View file

@ -1,22 +1,19 @@
{% extends "datacenterlight/base.html" %} {% extends "datacenterlight/base.html" %}
{% load staticfiles i18n%} {% load staticfiles i18n%}
{% get_current_language as LANGUAGE_CODE %}
{% block content %} {% block content %}
<!-- Why Data Center Light? --> <!-- Why Data Center Light? -->
<div class="full-whydcl-sec"> <div class="full-whydcl-sec">
<div class="whydcl-header whydcl-section" id="why_dcl"> <div class="whydcl-header whydcl-section" id="why_dcl">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-sm-12 col-md-12"> <div class="col-sm-12 col-md-12">
<div class="single-heading"> <div class="single-heading">
<h2>{% trans "Why Data Center Light?" %}</h2> <h2>{% trans "Why Data Center Light?" %}</h2>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="split-section left" id="tech_stack"> <div class="split-section left" id="tech_stack">
@ -35,39 +32,39 @@
</div> </div>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6"> <div class="col-xs-12 col-sm-6 col-md-6">
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap"> <div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive btm-space" src="{% static 'datacenterlight/img/devuan.png' %}" alt="Devuan"> <img class="img-responsive btm-space" src="{% static 'datacenterlight/img/devuan.png' %}" alt="Devuan">
<span class="logo-caption">{% trans "Our services run on" %}</span> <span class="logo-caption">{% trans "Our services run on" %}</span>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap"> <div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive" src="{% static 'datacenterlight/img/prometheus.png' %}" alt="Prometheus"> <img class="img-responsive" src="{% static 'datacenterlight/img/prometheus.png' %}" alt="Prometheus">
<span class="logo-caption">{% trans "Our monitoring" %}</span> <span class="logo-caption">{% trans "Our monitoring" %}</span>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap"> <div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive btm-space" src="{% static 'datacenterlight/img/Ceph_Logo.png' %}" alt="Ceph"> <img class="img-responsive btm-space" src="{% static 'datacenterlight/img/Ceph_Logo.png' %}" alt="Ceph">
<span class="logo-caption">{% trans "Our storage layer" %}</span> <span class="logo-caption">{% trans "Our storage layer" %}</span>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap"> <div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive" src="{% static 'datacenterlight/img/django.png' %}" alt="Django"> <img class="img-responsive" src="{% static 'datacenterlight/img/django.png' %}" alt="Django">
<span class="logo-caption">{% trans "Our web frontend" %}</span> <span class="logo-caption">{% trans "Our web frontend" %}</span>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap"> <div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive btm-space" src="{% static 'datacenterlight/img/opennebula.png' %}" alt="Opennebula"> <img class="img-responsive btm-space" src="{% static 'datacenterlight/img/opennebula.png' %}" alt="Opennebula">
<span class="logo-caption">{% trans "Our cloud" %}</span> <span class="logo-caption">{% trans "Our cloud" %}</span>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap"> <div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive" src="{% static 'datacenterlight/img/cdistbyungleich.png' %}" alt="Cdist by ungleich"> <img class="img-responsive" src="{% static 'datacenterlight/img/cdistbyungleich.png' %}" alt="Cdist by ungleich">
<span class="logo-caption">{% trans "Our configuration management system" %}</span> <span class="logo-caption">{% trans "Our configuration management system" %}</span>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap"> <div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive" src="{% static 'datacenterlight/img/python-logo.png' %}" alt="Python"> <img class="img-responsive" src="{% static 'datacenterlight/img/python-logo.png' %}" alt="Python">
<span class="logo-caption">{% trans "Our awesome juice" %}</span> <span class="logo-caption">{% trans "Our awesome juice" %}</span>
</div> </div>
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap"> <div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive" src="{% static 'datacenterlight/img/tayga.png' %}" alt="Tayga"> <img class="img-responsive btm-space-tayga" src="{% static 'datacenterlight/img/tayga.png' %}" alt="Tayga">
<span class="logo-caption">{% trans "Our NAT64 gateway" %}</span> <span class="logo-caption">{% trans "Our NAT64 gateway" %}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@ -77,21 +74,21 @@
<div class=" space"> <div class=" space">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-xs-12 col-sm-4 col-md-5 "> <div class="col-xs-12 col-sm-4 col-md-5 ">
<div class="col-xs-12 col-sm-12 col-md-6 col-md-6 logo-wrap-1"> <div class="col-xs-12 col-sm-12 col-md-6 col-md-6 logo-wrap-1">
<img class="img-responsive" src="{% static 'datacenterlight/img/opennebula.png' %}" alt="Opennebula"> <img class="img-responsive" src="{% static 'datacenterlight/img/opennebula.png' %}" alt="Opennebula">
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-6 col-md-6 logo-wrap-1"> <div class="col-xs-12 col-sm-12 col-md-6 col-md-6 logo-wrap-1">
<img class="img-responsive" src="{% static 'datacenterlight/img/cdistbyungleich.png' %}" alt="Cdist byu ngleich"> <img class="img-responsive" src="{% static 'datacenterlight/img/cdistbyungleich.png' %}" alt="Cdist byu ngleich">
</div> </div>
<div class="col-xs-12 col-sm-12 col-md-6 col-md-6 logo-wrap-1"> <div class="col-xs-12 col-sm-12 col-md-6 col-md-6 logo-wrap-1">
<img class="img-responsive" src="{% static 'datacenterlight/img/prometheus.png' %}" alt="Prometheus"> <img class="img-responsive" src="{% static 'datacenterlight/img/prometheus.png' %}" alt="Prometheus">
</div> </div>
</div> </div>
<div class="col-xs-12 col-sm-8 col-md-7 text-right"> <div class="col-xs-12 col-sm-8 col-md-7 text-right">
<div class="tech-sub-sec"> <div class="tech-sub-sec">
<h2>{% trans "We believe in giving back to the FOSS community." %}</h2> <h2>{% trans "We believe in giving back to the FOSS community." %}</h2>
<p class="lead">{% blocktrans %}Data Center Light is the child of free and open source software (FOSS). <br>We grew up with it, live by it, and believe in it.<br> The more we work on our data center,<br> the more we contribute back to the FOSS community.{% endblocktrans %}</p> <p class="lead new-lead">{% blocktrans %}Data Center Light is the child of free and open source software (FOSS) movement. <br>We grew up with it, live by it, and believe in it.<br> The more we work on our data center,<br> the more we contribute back to the FOSS community.{% endblocktrans %}</p>
</div> </div>
</div> </div>
</div> </div>
@ -102,33 +99,30 @@
<div class="space"> <div class="space">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 tech-sub-sec"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 tech-sub-sec">
<h2>{% trans "We bring the future to you." %}</h2> <h2>{% trans "We bring the future to you." %}</h2>
</div> </div>
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 text-left tech-sub-sec landscape-xs-6"> <div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 text-left tech-sub-sec landscape-xs-6">
<p class="lead">{% blocktrans %} Data Center Light uses the most modern technologies out there.<br> <p class="lead new-lead">{% blocktrans %} Data Center Light uses the most modern technologies out there.<br>
Your VM needs only IPv6. Data Center Light provides<br> transparent two-way IPv6/IPv4 translation. Your VM needs only IPv6. Data Center Light provides<br> transparent two-way IPv6/IPv4 translation.
{% endblocktrans %}</p> {% endblocktrans %}</p>
</div> </div>
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 percent-text text-right landscape-xs-6"> <div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 percent-text text-right landscape-xs-6">
100% <strong>IPv6</strong> 100% <strong>IPv6</strong>
</div> </div>
</div> </div>
<div class="col-lg-12 space-block"></div> <div class="col-lg-12 space-block"></div>
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 percent-text landscape-xs-8"> <div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 percent-text landscape-xs-8">
<span class="pull-left space-middle"> 100% <strong>SSD</strong></span> <span class="pull-left ssdimg"><img class="img-responsive" src="{% static 'datacenterlight/img/ssd.jpg' %}" alt="SSD"></span> <span class="pull-left space-middle"> 100% <strong>SSD</strong></span> <span class="pull-left ssdimg"><img class="img-responsive" src="{% static 'datacenterlight/img/ssd.jpg' %}" alt="SSD"></span>
</div> </div>
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 text-right tech-sub-sec padding-vertical landscape-xs-4"> <div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 text-right tech-sub-sec padding-vertical landscape-xs-4">
<div> <div>
<p class="lead">{% blocktrans %} No more spinning metal plates! Data Center Light uses only SSDs. We keep things faster and lighter. {% endblocktrans %}</p> <p class="lead new-lead">{% blocktrans %} No more spinning metal plates! Data Center Light uses only SSDs. We keep things faster and lighter. {% endblocktrans %}</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@ -142,7 +136,7 @@
<div class="row text-center"> <div class="row text-center">
<div class="col-xs-12 col-md-6 text"> <div class="col-xs-12 col-md-6 text">
<h2 class="section-heading">{% trans "Starting from only 15CHF per month. Try now." %}</h2> <h2 class="section-heading">{% trans "Starting from only 15CHF per month. Try now." %}</h2>
<p class="lead">{% trans "Actions speak louder than words. Let's do it, try our VM now." %}</p> <p class="lead new-lead">{% trans "Actions speak louder than words. Let's do it, try our VM now." %}</p>
</div> </div>
<div class="col-xs-12 col-md-6 hero-feature"> <div class="col-xs-12 col-md-6 hero-feature">
@ -150,94 +144,7 @@
<div class="landing card"> <div class="landing card">
<img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt=""> <img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt="">
<div class="caption"> <div class="caption">
<form id="order_form" method="POST" action="" data-toggle="validator" role="form"> {% include "datacenterlight/calculator_form.html" %}
{% csrf_token %}
<div class="title">
<h3>{% trans "VM hosting" %} </h3>
</div>
<div class="price">
<span id="total">15</span>
<span>CHF/{% trans "month" %}</span>
<div class="price-text">
<p>{% trans "VAT included" %}</p>
</div>
</div>
<div class="descriptions">
<div class="description form-group">
<p>{% trans "Hosted in Switzerland" %}</p>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="cpu" aria-hidden="true"></i>
<input class="input-price select-number" type="number" min="1" max="42" id="coreValue" name="cpu" data-error="{% trans 'Please enter a value greater than or equal to 1.' %}" required>
<span> Core</span>
<i class="fa fa-plus-circle right" data-plus="cpu" aria-hidden="true"></i>
</div>
<div class="help-block with-errors"></div>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
<input id="ramValue" class="input-price select-number" type="number" min="2" max="200" name="ram" data-error="{% trans 'Please enter a value greater than or equal to 2.' %}" required>
<span> GB RAM</span>
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
</div>
<div class="help-block with-errors"></div>
</div>
<div class="form-group">
<div class="description input">
<i class="fa fa-minus-circle left" data-minus="storage" aria-hidden="true"></i>
<input id="storageValue" class="input-price select-number" type="number" min="10" max="500" step="10" name="storage" data-error="{% trans 'Please enter a value greater than or equal to 10.' %}" required>
<span>{% trans "GB Storage (SSD)" %}</span>
<i class="fa fa-plus-circle right" data-plus="storage" aria-hidden="true"></i>
</div>
<div class="help-block with-errors"></div>
</div>
<div class="description select-configuration input form-group justify-center">
<label for="config">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 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" value="{% trans 'Order Now!' %}"></input>
</form>
</div> </div>
</div> </div>
</div> </div>
@ -249,6 +156,4 @@
</div> </div>
<!-- End Why Data Center Light? --> <!-- End Why Data Center Light? -->
{% endblock %}
{% endblock %}

View file

@ -1,7 +1,7 @@
from django.views.generic import FormView, CreateView, TemplateView, DetailView from django.views.generic import FormView, CreateView, TemplateView, DetailView
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from .forms import BetaAccessForm from .forms import BetaAccessForm
from .models import BetaAccess, BetaAccessVMType, BetaAccessVM from .models import BetaAccess, BetaAccessVMType, BetaAccessVM, VMTemplate
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
@ -21,7 +21,7 @@ from datetime import datetime
from membership.models import CustomUser, StripeCustomer from membership.models import CustomUser, StripeCustomer
from oca.pool import WrongIdError from oca.pool import WrongIdError
from opennebula_api.models import OpenNebulaManager from opennebula_api.models import OpenNebulaManager
from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer
class LandingProgramView(TemplateView): class LandingProgramView(TemplateView):
@ -195,42 +195,69 @@ class IndexView(CreateView):
success_url = "/datacenterlight#requestform" success_url = "/datacenterlight#requestform"
success_message = "Thank you, we will contact you as soon as possible" success_message = "Thank you, we will contact you as soon as possible"
def validate_cores(self, value):
if (value > 48) or (value < 1):
raise ValidationError(_('Not a proper cores number'))
def validate_memory(self, value):
if (value > 200) or (value < 2):
raise ValidationError(_('Not a proper ram number'))
def validate_storage(self, value):
if (value > 2000) or (value < 10):
raise ValidationError(_('Not a proper storage number'))
@cache_control(no_cache=True, must_revalidate=True, no_store=True) @cache_control(no_cache=True, must_revalidate=True, no_store=True)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
for session_var in ['specs', 'user', 'billing_address_data']: for session_var in ['specs', 'user', 'billing_address_data']:
if session_var in request.session: if session_var in request.session:
del request.session[session_var] del request.session[session_var]
try:
manager = OpenNebulaManager() vm_templates = VMTemplate.objects.all()
templates = manager.get_templates() context = {
context = { 'templates': vm_templates
'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) return render(request, self.template_name, context)
def post(self, request): def post(self, request):
cores = request.POST.get('cpu') cores = request.POST.get('cpu')
cores_field = forms.IntegerField(validators=[self.validate_cores])
memory = request.POST.get('ram') memory = request.POST.get('ram')
memory_field = forms.IntegerField(validators=[self.validate_memory])
storage = request.POST.get('storage') storage = request.POST.get('storage')
storage_field = forms.IntegerField(validators=[self.validate_storage])
price = request.POST.get('total') price = request.POST.get('total')
template_id = int(request.POST.get('config')) template_id = int(request.POST.get('config'))
manager = OpenNebulaManager() template = VMTemplate.objects.filter(opennebula_vm_template_id=template_id).first()
template = manager.get_template(template_id) template_data = VMTemplateSerializer(template).data
template_data = VirtualMachineTemplateSerializer(template).data
name = request.POST.get('name') name = request.POST.get('name')
email = request.POST.get('email') email = request.POST.get('email')
name_field = forms.CharField() name_field = forms.CharField()
email_field = forms.EmailField() email_field = forms.EmailField()
try:
cores = cores_field.clean(cores)
except ValidationError as err:
msg = '{} : {}.'.format(cores, str(err))
messages.add_message(self.request, messages.ERROR, msg, extra_tags='cores')
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
try:
memory = memory_field.clean(memory)
except ValidationError as err:
msg = '{} : {}.'.format(memory, str(err))
messages.add_message(self.request, messages.ERROR, msg, extra_tags='memory')
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
try:
storage = storage_field.clean(storage)
except ValidationError as err:
msg = '{} : {}.'.format(storage, str(err))
messages.add_message(self.request, messages.ERROR, msg, extra_tags='storage')
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
try: try:
name = name_field.clean(name) name = name_field.clean(name)
except ValidationError as err: except ValidationError as err:
@ -315,25 +342,6 @@ class WhyDataCenterLightView(IndexView):
template_name = "datacenterlight/whydatacenterlight.html" template_name = "datacenterlight/whydatacenterlight.html"
model = BetaAccess model = BetaAccess
@cache_control(no_cache=True, must_revalidate=True, no_store=True)
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)
class PaymentOrderView(FormView): class PaymentOrderView(FormView):
template_name = 'hosting/payment.html' template_name = 'hosting/payment.html'
@ -345,6 +353,7 @@ class PaymentOrderView(FormView):
if billing_address_data: if billing_address_data:
form_kwargs.update({ form_kwargs.update({
'initial': { 'initial': {
'cardholder_name': billing_address_data['cardholder_name'],
'street_address': billing_address_data['street_address'], 'street_address': billing_address_data['street_address'],
'city': billing_address_data['city'], 'city': billing_address_data['city'],
'postal_code': billing_address_data['postal_code'], 'postal_code': billing_address_data['postal_code'],
@ -465,9 +474,9 @@ class OrderConfirmationView(DetailView):
template_id=vm_template_id, template_id=vm_template_id,
specs=specs, specs=specs,
vm_name="{email}-{template_name}-{date}".format( vm_name="{email}-{template_name}-{date}".format(
email=user.get('email'), email=user.get('email'),
template_name=template.get('name'), template_name=template.get('name'),
date=int(datetime.now().strftime("%s"))) date=int(datetime.now().strftime("%s")))
) )
# Create a Hosting Order # Create a Hosting Order

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View file

@ -121,7 +121,48 @@
p a{ p a{
color: #ecf0f1; color: #ecf0f1;
} }
.section-top-content {
font-size: 30px;
font-weight: 600;
padding-top: 50px;
}
.section-top-content span{
font-weight: 300;
}
.section-top-txt {
padding-top: 80px;
text-transform: uppercase;
text-align: right;
}
.section-top-img {
padding:0px;
}
@media(max-width:500px) {
.section-top-txt {
padding: 55px 5px 0 0px;
}
.section-top-content {
font-size: 28px;
}
}
@media(max-width:360px) {
.section-top-txt {
padding: 32px 5px 0 0px;
}
.section-top-content {
font-size: 18px;
}
}
@media screen and (min-device-width: 768px) and (max-device-width: 991px) {
.section-top-txt {
padding-top: 43px;
}
}
@media screen and (min-device-width: 992px) and (max-device-width: 1200px) {
.section-top-txt {
padding-top: 65px;
}
}
</style> </style>
@ -132,7 +173,15 @@
<section id="services"> <section id="services">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-lg-12 text-center wow fadeInDown"> <div class="col-lg-12 text-center wow fadeInDown section-top-content">
<div class="col-lg-3 col-sm-2 col-xs-12"></div>
<div class="col-lg-6 col-sm-10 col-xs-12">
<div class="col-lg-5 col-sm-5 col-xs-6 section-top-txt">Partner <span>of</span></div>
<div class="col-lg-7 col-sm-4 col-xs-6 section-top-img"><a href="https://zurich.impacthub.ch" target="_blank"><img src="{% static 'digitalglarus/img/impacthub_logo.jpg' %}" class="img-responsive" alt=""></a></div>
</div>
<div class="col-lg-3 col-sm-12 col-xs-12"></div>
</div>
<div class="col-lg-12 col-xs-12 text-center wow fadeInDown">
<h2 class="section-heading">In Digital Glarus you can..</h2> <h2 class="section-heading">In Digital Glarus you can..</h2>
<hr class="primary"> <hr class="primary">
</div> </div>
@ -526,4 +575,4 @@
</div> </div>
</div> --> </div> -->
{% endblock %} {% endblock %}

View file

@ -45,17 +45,10 @@
<script src="{% static 'digitalglarus/https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <script src="{% static 'digitalglarus/https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]--> <![endif]-->
<!-- <link href="css/ungleich.css" rel="stylesheet" type="text/css"></link> --> <!-- <link href="css/ungleich.css" rel="stylesheet" type="text/css"></link> -->
<!-- Google tracking -->
<script src="//www.google-analytics.com/analytics.js" async></script><script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-62285904-1', 'auto'); <!-- Google analytics -->
ga('send', 'pageview'); {% include 'google_analytics.html' %}
<!-- End Google Analytics -->
</script>
<link rel="shortcut icon" href="{% static 'digitalglarus/img/favicon.ico' %}" type="image/x-icon"> <link rel="shortcut icon" href="{% static 'digitalglarus/img/favicon.ico' %}" type="image/x-icon">
<style id="igtranslator-color" type="text/css"></style> <style id="igtranslator-color" type="text/css"></style>
<style type="text/css"> <style type="text/css">

View file

@ -146,7 +146,6 @@ TEMPLATES = [
{ {
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(PROJECT_DIR, 'cms_templates/'), 'DIRS': [os.path.join(PROJECT_DIR, 'cms_templates/'),
os.path.join(PROJECT_DIR, 'templates'),
os.path.join(PROJECT_DIR, 'cms_templates/djangocms_blog/'), os.path.join(PROJECT_DIR, 'cms_templates/djangocms_blog/'),
os.path.join(PROJECT_DIR, 'membership'), os.path.join(PROJECT_DIR, 'membership'),
os.path.join(PROJECT_DIR, 'hosting/templates/'), os.path.join(PROJECT_DIR, 'hosting/templates/'),
@ -154,8 +153,8 @@ TEMPLATES = [
os.path.join(PROJECT_DIR, 'ungleich/templates/djangocms_blog/'), os.path.join(PROJECT_DIR, 'ungleich/templates/djangocms_blog/'),
os.path.join(PROJECT_DIR, 'ungleich/templates/cms/ungleichch'), os.path.join(PROJECT_DIR, 'ungleich/templates/cms/ungleichch'),
os.path.join(PROJECT_DIR, 'ungleich/templates/ungleich'), os.path.join(PROJECT_DIR, 'ungleich/templates/ungleich'),
os.path.join(PROJECT_DIR, 'ungleich_page/templates/ungleich_page') os.path.join(PROJECT_DIR, 'ungleich_page/templates/ungleich_page'),
os.path.join(PROJECT_DIR, 'templates/analytics'),
], ],
'APP_DIRS': True, 'APP_DIRS': True,
'OPTIONS': { 'OPTIONS': {
@ -516,8 +515,12 @@ DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS')
# Settings for Google analytics # Settings for Google analytics
GOOGLE_ANALYTICS_PROPERTY_IDS = { GOOGLE_ANALYTICS_PROPERTY_IDS = {
'datacenterlight.ch': 'UA-62285904-9', 'ungleich.ch': 'UA-62285904-1',
'digitalglarus.ch': 'UA-62285904-2', 'digitalglarus.ch': 'UA-62285904-2',
'blog.ungleich.ch': 'UA-62285904-4',
'hosting': 'UA-62285904-5',
'datacenterlight.ch': 'UA-62285904-9',
'127.0.0.1:8000': 'localhost', '127.0.0.1:8000': 'localhost',
'dynamicweb-development.ungleich.ch': 'development', 'dynamicweb-development.ungleich.ch': 'development',
'dynamicweb-staging.ungleich.ch': 'staging' 'dynamicweb-staging.ungleich.ch': 'staging'

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-01 02:09+0530\n" "POT-Creation-Date: 2017-07-17 00:53+0530\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,55 +18,55 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:28 #: forms.py:25
msgid "Your account is not activated yet." msgid "Your account is not activated yet."
msgstr "Dein Account wurde noch nicht aktiviert." msgstr "Dein Account wurde noch nicht aktiviert."
#: forms.py:65 #: forms.py:62
msgid "Paste here your public key" msgid "Paste here your public key"
msgstr "Fügen Sie Ihren public key ein" msgstr "Fügen Sie Ihren public key ein"
#: templates/hosting/base_short.html:68 #: templates/hosting/base_short.html:71
msgid "My Virtual Machines" msgid "My Virtual Machines"
msgstr "Meine virtuellen Maschinen" msgstr "Meine virtuellen Maschinen"
#: templates/hosting/base_short.html:73 templates/hosting/orders.html.py:12 #: templates/hosting/base_short.html:76 templates/hosting/orders.html.py:12
msgid "My Orders" msgid "My Orders"
msgstr "Meine Bestellungen" msgstr "Meine Bestellungen"
#: templates/hosting/base_short.html:82 #: templates/hosting/base_short.html:85
msgid "Keys" msgid "Keys"
msgstr "Schlüssel" msgstr "Schlüssel"
#: templates/hosting/base_short.html:87 #: templates/hosting/base_short.html:90
msgid "Notifications " msgid "Notifications "
msgstr "Benachrichtigungen" msgstr "Benachrichtigungen"
#: templates/hosting/base_short.html:90 #: templates/hosting/base_short.html:93
msgid "Logout" msgid "Logout"
msgstr "Abmelden" msgstr "Abmelden"
#: templates/hosting/base_short.html:95 #: templates/hosting/base_short.html:98
msgid "How it works" msgid "How it works"
msgstr "So funktioniert es" msgstr "So funktioniert es"
#: templates/hosting/base_short.html:98 #: templates/hosting/base_short.html:101
msgid "Your infrastructure" msgid "Your infrastructure"
msgstr "deine Infrastruktur" msgstr "deine Infrastruktur"
#: templates/hosting/base_short.html:101 #: templates/hosting/base_short.html:104
msgid "Our inftrastructure" msgid "Our inftrastructure"
msgstr "Unsere Infrastruktur" msgstr "Unsere Infrastruktur"
#: templates/hosting/base_short.html:104 #: templates/hosting/base_short.html:107
msgid "Pricing" msgid "Pricing"
msgstr "Preise" msgstr "Preise"
#: templates/hosting/base_short.html:107 #: templates/hosting/base_short.html:110
msgid "Contact" msgid "Contact"
msgstr "Kontakt" msgstr "Kontakt"
#: templates/hosting/base_short.html:110 #: templates/hosting/base_short.html:113
#: templates/hosting/confirm_reset_password.html:38 #: templates/hosting/confirm_reset_password.html:38
#: templates/hosting/login.html:17 templates/hosting/login.html.py:26 #: templates/hosting/login.html:17 templates/hosting/login.html.py:26
#: templates/hosting/reset_password.html:32 templates/hosting/signup.html:30 #: templates/hosting/reset_password.html:32 templates/hosting/signup.html:30
@ -185,20 +185,14 @@ msgid "New Virtual Machine"
msgstr "Neue virtuelle Maschine" msgstr "Neue virtuelle Maschine"
#: templates/hosting/create_virtual_machine.html:28 #: templates/hosting/create_virtual_machine.html:28
#, fuzzy
#| msgid "Select VM Template:"
msgid "Step 1. Select VM Template:" msgid "Step 1. Select VM Template:"
msgstr "Wähle eine Vorlage" msgstr "Wähle eine Vorlage"
#: templates/hosting/create_virtual_machine.html:42 #: templates/hosting/create_virtual_machine.html:42
#, fuzzy
#| msgid "Select VM Configuration:"
msgid "Step2. Select VM Configuration" msgid "Step2. Select VM Configuration"
msgstr "Wähle eine Konfiguration" msgstr "Wähle eine Konfiguration"
#: templates/hosting/create_virtual_machine.html:59 #: templates/hosting/create_virtual_machine.html:59
#, fuzzy
#| msgid "Pricing"
msgid "Price " msgid "Price "
msgstr "Preis" msgstr "Preis"
@ -239,7 +233,7 @@ msgid "Don't have an account yet ? "
msgstr "Besitzt du kein Benutzerkonto?" msgstr "Besitzt du kein Benutzerkonto?"
#: templates/hosting/login.html:37 templates/hosting/signup.html.py:13 #: templates/hosting/login.html:37 templates/hosting/signup.html.py:13
#: templates/hosting/signup.html:21 views.py:223 #: templates/hosting/signup.html:21 views.py:219
msgid "Sign up" msgid "Sign up"
msgstr "Registrieren" msgstr "Registrieren"
@ -295,23 +289,23 @@ msgstr "Bezahlmethode"
msgid "Order summary" msgid "Order summary"
msgstr "Bestellungsübersicht" msgstr "Bestellungsübersicht"
#: templates/hosting/order_detail.html:65 templates/hosting/payment.html:17 #: templates/hosting/order_detail.html:65 templates/hosting/payment.html:13
#: templates/hosting/virtual_machine_detail.html:76 #: templates/hosting/virtual_machine_detail.html:76
msgid "Cores" msgid "Cores"
msgstr "Prozessorkerne" msgstr "Prozessorkerne"
#: templates/hosting/order_detail.html:67 templates/hosting/payment.html:20 #: templates/hosting/order_detail.html:67 templates/hosting/payment.html:16
#: templates/hosting/virtual_machine_detail.html:82 #: templates/hosting/virtual_machine_detail.html:82
msgid "Memory" msgid "Memory"
msgstr "Arbeitsspeicher" msgstr "Arbeitsspeicher"
#: templates/hosting/order_detail.html:69 templates/hosting/payment.html:23 #: templates/hosting/order_detail.html:69 templates/hosting/payment.html:19
msgid "Disk space" msgid "Disk space"
msgstr "Festplattenkapazität" msgstr "Festplattenkapazität"
#: templates/hosting/order_detail.html:71 #: templates/hosting/order_detail.html:71 templates/hosting/payment.html:41
msgid "Total" msgid "Total"
msgstr "" msgstr "Gesamt"
#: templates/hosting/order_detail.html:77 #: templates/hosting/order_detail.html:77
msgid "Finish Configuration" msgid "Finish Configuration"
@ -355,42 +349,97 @@ msgstr "Schliessen"
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
#: templates/hosting/payment.html:12 #: templates/hosting/payment.html:10
msgid "Billing Amount" msgid "Your Order"
msgstr "Rechnungsbetrag" msgstr "Deine Bestellung"
#: templates/hosting/payment.html:26 #: templates/hosting/payment.html:22
#: templates/hosting/virtual_machine_detail.html:98 #: templates/hosting/virtual_machine_detail.html:98
msgid "Configuration" msgid "Configuration"
msgstr "Konfiguration" msgstr "Konfiguration"
#: templates/hosting/payment.html:38 #: templates/hosting/payment.html:41
msgid "including VAT"
msgstr "inkl. Mehrwertsteuer"
#: templates/hosting/payment.html:55
msgid "Billing Address" msgid "Billing Address"
msgstr "Rechnungsadresse" msgstr "Rechnungsadresse"
#: templates/hosting/payment.html:52 #: templates/hosting/payment.html:66
msgid "Payment Details" msgid "Credit Card"
msgstr "Rechnungsdetails" msgstr "Kreditkarte"
#: templates/hosting/payment.html:65 #: templates/hosting/payment.html:71
msgid "Submit Payment" msgid ""
msgstr "Betrag überweisen" "\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"
" "
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."
#: templates/hosting/payment.html:84 #: templates/hosting/payment.html:90
msgid "CARD NUMBER" msgid ""
"\n"
" You are not making any payment yet. "
"After submitting your card\n"
" information, you will be taken to "
"the Confirm Order Page.\n"
" "
msgstr ""
"\n"
"Es wird noch keine Bezahlung vorgenommen. Nach der Eingabe Deiner "
"Kreditkateninformationen wirst du auf die Bestellbestätigungsseite "
"weitergeleitet."
#: templates/hosting/payment.html:101 templates/hosting/payment.html.py:143
msgid "Submit"
msgstr "Absenden"
#: templates/hosting/payment.html:113
msgid "Card Number"
msgstr "Kreditkartennummer" msgstr "Kreditkartennummer"
#: templates/hosting/payment.html:89 #: templates/hosting/payment.html:117
msgid "Valid Card Number" msgid "Expiry Date"
msgstr "Gültige Kreditkartennummer"
#: templates/hosting/payment.html:98
msgid "EXPIRATION DATE"
msgstr "Ablaufdatum" msgstr "Ablaufdatum"
#: templates/hosting/payment.html:109 #: templates/hosting/payment.html:122
msgid "CV CODE" msgid "CVC"
msgstr "CV Code" msgstr ""
#: templates/hosting/payment.html:126
msgid "Card Type"
msgstr "Kartentyp"
#: templates/hosting/payment.html:135
msgid ""
"\n"
" You are not making any payment "
"yet. After submitting your card\n"
" information, you will be taken "
"to the Confirm Order Page.\n"
" "
msgstr ""
"\n"
"Es wird noch keine Bezahlung vorgenommen. Nach der Eingabe Deiner "
"Kreditkateninformationen wirst du auf die Bestellbestätigungsseite "
"weitergeleitet."
#: templates/hosting/payment.html:178
msgid "Processing"
msgstr "Weiter"
#: templates/hosting/payment.html:179
msgid "Enter your credit card number"
msgstr "Deine Kreditkartennummer"
#: templates/hosting/reset_password.html:15 #: templates/hosting/reset_password.html:15
msgid "Reset your password" msgid "Reset your password"
@ -431,14 +480,10 @@ msgid "Created at"
msgstr "Erstellt am" msgstr "Erstellt am"
#: templates/hosting/user_keys.html:43 #: templates/hosting/user_keys.html:43
#, fuzzy
#| msgid "Delete"
msgid "Delete Key" msgid "Delete Key"
msgstr "Löschen" msgstr "Löschen"
#: templates/hosting/user_keys.html:56 #: templates/hosting/user_keys.html:56
#, fuzzy
#| msgid "Do You want do delete your order?"
msgid "Do You want to delete this key?" msgid "Do You want to delete this key?"
msgstr "Möchtest Du den Schlüssel löschen?" msgstr "Möchtest Du den Schlüssel löschen?"
@ -502,11 +547,11 @@ msgstr "IPv4"
msgid "Ipv6" msgid "Ipv6"
msgstr "IPv6" msgstr "IPv6"
#: views.py:213 views.py:232 #: views.py:207 views.py:229
msgid "login" msgid "login"
msgstr "einloggen" msgstr "einloggen"
#: views.py:217 #: views.py:212
msgid "" msgid ""
"Thank you for signing up. We have sent an email to you. Please follow the " "Thank you for signing up. We have sent an email to you. Please follow the "
"instructions in it to activate your account. Once activated, you can login " "instructions in it to activate your account. Once activated, you can login "
@ -516,32 +561,55 @@ msgstr ""
"den Anweisungen um deinen Account zu aktivieren. Danach kannst du dich über " "den Anweisungen um deinen Account zu aktivieren. Danach kannst du dich über "
"diesen" "diesen"
#: views.py:218 views.py:243 #: views.py:214 views.py:240
msgid "Go back to" msgid "Go back to"
msgstr "Zurück" msgstr "Zurück"
#: views.py:233 #: views.py:230
msgid "Account activation" msgid "Account activation"
msgstr "Accountaktivierung" msgstr "Accountaktivierung"
#: views.py:236 #: views.py:233
msgid "Your account has been activated." msgid "Your account has been activated."
msgstr "Dein Account wurde aktiviert." msgstr "Dein Account wurde aktiviert."
#: views.py:237 #: views.py:234
msgid "You can now" msgid "You can now"
msgstr "Du kannst dich nun" msgstr "Du kannst dich nun"
#: views.py:242 #: views.py:239
msgid "Sorry. Your request is invalid." msgid "Sorry. Your request is invalid."
msgstr "Entschuldigung, deine Anfrage ist ungültig." msgstr "Entschuldigung, deine Anfrage ist ungültig."
#: views.py:760 #: views.py:757
msgid "" msgid ""
"We could not find the requested VM. Please " "We could not find the requested VM. Please "
"contact Data Center Light Support." "contact Data Center Light Support."
msgstr "" msgstr ""
#~ msgid "Billing Amount"
#~ msgstr "Rechnungsbetrag"
#~ msgid "Payment Details"
#~ msgstr "Rechnungsdetails"
#~ msgid "Place Order"
#~ msgstr "Bestelle"
#~ 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. Nach der Eingabe deiner "
#~ "Kreditkateninformationen wirst du auf die Bestellbestätigungsseite "
#~ "weitergeleitet."
#~ msgid "CARD NUMBER"
#~ msgstr "Kreditkartennummer"
#~ msgid "EXPIRATION DATE"
#~ msgstr "Ablaufdatum"
#~ msgid "Home" #~ msgid "Home"
#~ msgstr "Home" #~ msgstr "Home"

View file

@ -4,14 +4,15 @@
* For details, see http://www.apache.org/licenses/LICENSE-2.0. * For details, see http://www.apache.org/licenses/LICENSE-2.0.
*/ */
@font-face { @font-face {
font-family: 'Lato-Regular'; font-family: 'Lato-Regular';
src: url('../fonts/Lato/Lato-Regular.ttf'); src: url('../fonts/Lato/Lato-Regular.ttf');
} }
@font-face { @font-face {
src: url('../fonts/Lato/Lato-Black.ttf'); src: url('../fonts/Lato/Lato-Black.ttf');
} }
@font-face { @font-face {
font-family: 'Lato-Light'; font-family: 'Lato-Light';
src: url('../fonts/Lato/Lato-Light.ttf'); src: url('../fonts/Lato/Lato-Light.ttf');
@ -33,10 +34,35 @@ h6 {
font-family: 'Lato-Regular', sans-serif; font-family: 'Lato-Regular', sans-serif;
font-weight: 300; font-weight: 300;
} }
.topnav { .topnav {
font-size: 14px; font-size: 14px;
} }
.navbar-transparent {
background: transparent;
border: none;
padding: 20px;
}
.navbar-transparent .navbar-nav>li>a {
color: #fff;
cursor: pointer;
font-family: 'Lato-Regular', sans-serif;
}
.navbar-transparent .navbar-nav>li>a:hover {
color: #fff;
}
.navbar-transparent .navbar-nav>li>a:focus, .navbar-transparent .navbar-nav>li>a:hover {
color: #fff;
background-color: transparent;
}
.navbar-transparent #logoWhite{
display: block;
width: 220px;
}
.lead { .lead {
font-size: 18px; font-size: 18px;
font-weight: 400; font-weight: 400;
@ -191,17 +217,19 @@ h6 {
float: right; float: right;
margin-top: 0; margin-top: 0;
} }
/*------Auth section---------*/ /*------Auth section---------*/
.auth-container{ .auth-container {
height: 100vh; height: 100vh;
position: relative; position: relative;
} }
.auth-bg{
.auth-bg {
background: url(../img/auth-bg.jpg); background: url(../img/auth-bg.jpg);
position: fixed; position: fixed;
left: 0; left: 0;
top: 0; top: 0;
width: 100%; width: 100%;
height: 100vh; height: 100vh;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center center; background-position: center center;
@ -209,7 +237,8 @@ h6 {
background-attachment: fixed; background-attachment: fixed;
} }
.auth-bg::before{
.auth-bg::before {
content: ""; content: "";
position: absolute; position: absolute;
top: 0; top: 0;
@ -219,26 +248,30 @@ h6 {
background: rgba(75, 75, 101, 0.55); background: rgba(75, 75, 101, 0.55);
z-index: 1; z-index: 1;
} }
.auth-container .container{
.auth-container .container {
z-index: 1000; z-index: 1000;
} }
.auth-container .auth-content{
.auth-container .auth-content {
width: 100%; width: 100%;
margin: 0 auto; margin: 0 auto;
max-width: 390px; max-width: 390px;
} }
.auth-container .auth-center{
position: absolute; .auth-container .auth-center {
left: 50%; position: absolute;
top: 50%; left: 50%;
transform: translate(-50%,-50%); top: 50%;
transform: translate(-50%, -50%);
width: 100%; width: 100%;
} }
.auth-container .auth-title{ .auth-container .auth-title {
margin-bottom: 50px; margin-bottom: 50px;
} }
.auth-container .auth-title h2{
.auth-container .auth-title h2 {
color: #fff; color: #fff;
font-size: 44px; font-size: 44px;
text-align: center; text-align: center;
@ -247,7 +280,8 @@ h6 {
margin-bottom: 30px; margin-bottom: 30px;
position: relative; position: relative;
} }
.auth-container .auth-title h2::after{
.auth-container .auth-title h2::after {
content: ""; content: "";
position: absolute; position: absolute;
bottom: -20px; bottom: -20px;
@ -258,17 +292,17 @@ h6 {
transform: translate(-50%, 0); transform: translate(-50%, 0);
} }
.auth-box{ .auth-box {
background: #fff; background: #fff;
padding: 0; padding: 0;
padding-bottom: 30px; padding-bottom: 30px;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
border-radius: 4px; border-radius: 4px;
z-index: 10; z-index: 10;
} }
.auth-box .section-heading{ .auth-box .section-heading {
color: #5a5a5a; color: #5a5a5a;
padding-top: 30px; padding-top: 30px;
padding-bottom: 5px; padding-bottom: 5px;
@ -279,42 +313,51 @@ h6 {
border-radius: 3px 3px 0px 0px; border-radius: 3px 3px 0px 0px;
margin: 0 auto; margin: 0 auto;
} }
.auth-box .form{
.auth-box .form {
padding: 20px; padding: 20px;
width: 80%; width: 80%;
margin: 0 auto; margin: 0 auto;
} }
.auth-box .form .red{
.auth-box .form .red {
color: #ea3a3a; color: #ea3a3a;
} }
.auth-box .form .btn{
box-shadow: 0 0px 9px rgba(0,0,0,0.19), 0 3px 5px rgba(0,0,0,0.23); .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; letter-spacing: 3px;
font-size: 17px; font-size: 17px;
text-transform: uppercase; text-transform: uppercase;
} }
.auth-box .form .form-control{
.auth-box .form .form-control {
height: 44px; height: 44px;
font-size: 16px; font-size: 16px;
} }
.auth-box .auth-footer { .auth-box .auth-footer {
text-align: center; text-align: center;
padding: 10px; padding: 10px;
} }
.auth-box .auth-footer .text{
.auth-box .auth-footer .text {
color: #777; color: #777;
} }
.auth-box .auth-footer .links a{
color: #1e94cc; .auth-box .auth-footer .links a {
}
.auth-box .auth-footer .links a:hover{
color: #1e94cc; color: #1e94cc;
} }
.auth-box.sign-up{ .auth-box .auth-footer .links a:hover {
color: #1e94cc;
}
.auth-box.sign-up {
padding-bottom: 5px; padding-bottom: 5px;
} }
.auth-box.sign-up .form{
.auth-box.sign-up .form {
padding: 15px 20px 0 20px; padding: 15px 20px 0 20px;
} }
@ -325,6 +368,7 @@ h6 {
line-height: 30px; line-height: 30px;
font-family: 'Lato' !important; font-family: 'Lato' !important;
} }
.sign-up-message a { .sign-up-message a {
font-size: 18px; font-size: 18px;
color: #1e94cc !important; color: #1e94cc !important;
@ -353,38 +397,47 @@ h6 {
ul.banner-social-buttons > li:last-child { ul.banner-social-buttons > li:last-child {
margin-bottom: 0; margin-bottom: 0;
} }
.auth-box .form { .auth-box .form {
padding: 15px 0px 0 0; padding: 15px 0px 0 0;
} }
.auth-box.sign-up .form { .auth-box.sign-up .form {
padding: 15px 0px 0 0; padding: 15px 0px 0 0;
} }
.auth-box .form .form-control { .auth-box .form .form-control {
height: 44px; height: 44px;
font-size: 13px; font-size: 13px;
} }
.auth-container .auth-title { .auth-container .auth-title {
display: none; display: none;
} }
} }
@media (max-width: 540px) { @media (max-width: 540px) {
.auth-container .auth-title h2{ .auth-container .auth-title h2 {
font-size: 32px; font-size: 32px;
width: 90%; width: 90%;
margin-bottom: 50px; margin-bottom: 50px;
} }
.auth-container.auth-signup .auth-title h2{
.auth-container.auth-signup .auth-title h2 {
font-size: 20px; font-size: 20px;
width: 90%; width: 90%;
margin-bottom: 50px; margin-bottom: 50px;
} }
.auth-box .form { .auth-box .form {
width: 90%; width: 90%;
} }
.auth-box .section-heading { .auth-box .section-heading {
font-size: 15px; font-size: 15px;
} }
} }
footer { footer {
padding: 2%; padding: 2%;
background-color: #f8f8f8; background-color: #f8f8f8;
@ -418,3 +471,246 @@ a.unlink:hover {
color: inherit; color: inherit;
} }
/***** DCL payment page **********/
.dcl-order-container {
font-family: Lato;
}
.dcl-order-table-header {
border-bottom: 1px solid #eee;
padding-top: 15px;
padding-bottom: 15px;
font-size: 16px;
color: #333;
text-align: center;
font-weight: 300;
}
.dcl-order-table-content {
border-bottom: 1px solid #eee;
padding-top: 15px;
padding-bottom: 15px;
font-size: 18px;
font-weight: 600;
text-align: center;
}
.tbl-content {
}
.dcl-order-table-total {
border-bottom: 4px solid #eee;
padding-top: 15px;
padding-bottom: 20px;
font-size: 20px;
font-weight: 600;
color: #999;
}
.dcl-order-table-total span {
font-size: 13px;
color: #999;
font-weight: 400;
padding-left: 5px;
}
.dcl-order-table-total .tbl-total {
text-align: center;
color: #000;
}
.tbl-no-padding {
padding: 0px;
}
.dcl-billing-sec {
margin-top: 50px;
}
.dcl-order-sec {
padding: 0 30px;
}
.card-warning-content {
font-family: Lato;
border: 1px solid #a1a1a1;
border-radius: 3px;
padding: 5px;
}
.stripe-payment-btn {
outline: none;
width: auto;
float: right;
font-style: normal;
font-weight: 300;
position: absolute;
padding-left: 30px;
padding-right: 30px;
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{
width:100%;
margin-bottom:0px;
}
.my-input {
border-bottom: 1px solid #ccc;
}
.card-cvc-element .my-input {
padding-left: 10px;
}
#card-errors {
clear: both;
padding: 0 0 10px;
color: #eb4d5c;
}
.credit-card-goup{
padding: 0;
}
.order-confirm-date{
text-align:right;
}
@media (max-width: 767px) {
.dcl-order-table-total span {
padding-left: 3px;
}
.dcl-order-sec {
padding: 10px 20px 30px 20px;
border-bottom: 4px solid #eee;
}
.tbl-header {
border-bottom: 1px solid #eee;
padding: 10px 0;
}
.tbl-content {
border-bottom: 1px solid #eee;
padding: 10px 0;
}
.dcl-order-table-header {
border-bottom: 0px solid #eee;
padding: 10px 0;
text-align: left;
}
.dcl-order-table-content {
border-bottom: 0px solid #eee;
padding: 10px 0;
text-align: right;
font-size: 16px;
}
.dcl-order-table-total {
font-size: 18px;
color: #000;
padding: 10px 0;
border-bottom: 0px solid #eee;
}
.dcl-order-table-total .tbl-total {
padding: 0px;
text-align: right;
}
.dcl-billing-sec {
margin-top: 30px;
margin-bottom: 30px;
}
.brand {
}
.card-expiry-element {
padding-right: 10px;
}
.card-cvc-element {
padding-left: 10px;
}
.hide-mobile{
display:none;
}
#billing-form .form-control {
box-shadow: none !important;
font-weight: 400;
}
.order-confirm-date{
text-align:left;
}
}
@media (min-width: 1200px) {
.dcl-order-container {
width: 990px;
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
}
@media (min-width: 768px) {
.dcl-billing {
padding-right: 50px;
border-right: 1px solid #eee;
}
.dcl-creditcard {
padding-left: 50px;
}
.tbl-tot {
padding-left: 17px;
}
.content-dashboard {
/*width: auto !important;*/
}
}
@media only screen and (max-width: 1040px) and (min-width: 768px) {
.content-dashboard {
width: 96% !important;
}
}
@media only screen and (max-width: 1330px) and (min-width: 1200px) {
.content-dashboard {
width: 100% !important;
}
}

View file

@ -1,39 +1,143 @@
$( document ).ready(function() { var cardBrandToPfClass = {
'visa': 'pf-visa',
'mastercard': 'pf-mastercard',
'amex': 'pf-american-express',
'discover': 'pf-discover',
'diners': 'pf-diners',
'jcb': 'pf-jcb',
'unknown': 'pf-credit-card'
};
function setBrandIcon(brand) {
var brandIconElement = document.getElementById('brand-icon');
var pfClass = 'pf-credit-card';
if (brand in cardBrandToPfClass) {
pfClass = cardBrandToPfClass[brand];
}
for (var i = brandIconElement.classList.length - 1; i >= 0; i--) {
brandIconElement.classList.remove(brandIconElement.classList[i]);
}
brandIconElement.classList.add('pf');
brandIconElement.classList.add(pfClass);
}
$(document).ready(function () {
$.ajaxSetup({
beforeSend: function (xhr, settings) {
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
$.ajaxSetup({ // Only send the token to relative URLs i.e. locally.
beforeSend: function(xhr, settings) { xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
function getCookie(name) { }
var cookieValue = null; }
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
}
}); });
var hasCreditcard = window.hasCreditcard || false; var hasCreditcard = window.hasCreditcard || false;
if (!hasCreditcard){ if (!hasCreditcard) {
var stripe = Stripe(window.stripeKey); var stripe = Stripe(window.stripeKey);
var elements = stripe.elements({locale: window.current_lan}); var element_style = {
var card = elements.create('card', options={hidePostalCode: true}); fonts: [{
card.mount('#card-element'); family: 'lato-light',
src: 'url(https://cdn.jsdelivr.net/font-lato/2.0/Lato/Lato-Light.woff) format("woff2")'
}, {
family: 'lato-regular',
src: 'url(https://cdn.jsdelivr.net/font-lato/2.0/Lato/Lato-Regular.woff) format("woff2")'
}
],
locale: window.current_lan
};
var elements = stripe.elements(element_style);
var credit_card_text_style = {
base: {
iconColor: '#666EE8',
color: '#31325F',
lineHeight: '25px',
fontWeight: 300,
fontFamily: "'lato-light', sans-serif",
fontSize: '14px',
'::placeholder': {
color: '#777'
}
},
invalid: {
iconColor: '#eb4d5c',
color: '#eb4d5c',
lineHeight: '25px',
fontWeight: 300,
fontFamily: "'lato-regular', sans-serif",
fontSize: '14px',
'::placeholder': {
color: '#eb4d5c',
fontWeight: 400
}
}
};
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') {
enter_ccard_text = window.enter_your_card_text;
}
var cardNumberElement = elements.create('cardNumber', {
style: credit_card_text_style,
placeholder: enter_ccard_text
});
cardNumberElement.mount('#card-number-element');
var cardExpiryElement = elements.create('cardExpiry', {
style: credit_card_text_style
});
cardExpiryElement.mount('#card-expiry-element');
var cardCvcElement = elements.create('cardCvc', {
style: credit_card_text_style
});
cardCvcElement.mount('#card-cvc-element');
cardNumberElement.on('change', function (event) {
if (event.brand) {
setBrandIcon(event.brand);
}
});
} }
console.log("has creditcard", hasCreditcard); console.log("has creditcard", hasCreditcard);
// hasCreditcard= true; // hasCreditcard= true;
@ -42,85 +146,58 @@ $( document ).ready(function() {
submit_form_btn.on('click', submit_payment); submit_form_btn.on('click', submit_payment);
function submit_payment(e){ function submit_payment(e) {
e.preventDefault(); e.preventDefault();
console.log("creditcard sdasd"); console.log("creditcard sdasd");
// if (hasCreditcard) { // if (hasCreditcard) {
$('#billing-form').submit(); $('#billing-form').submit();
// } // }
} }
var $form_new = $('#payment-form-new');
$form_new.submit(payWithStripe_new);
var $form = $('#payment-form'); function payWithStripe_new(e) {
$form.submit(payWithStripe);
/* If you're using Stripe for payments */
function payWithStripe(e) {
e.preventDefault(); e.preventDefault();
function stripeTokenHandler(token) { function stripeTokenHandler(token) {
// Insert the token ID into the form so it gets submitted to the server // Insert the token ID into the form so it gets submitted to the server
var form = document.getElementById('payment-form'); var form = document.getElementById('payment-form-new');
var hiddenInput = document.createElement('input'); $('#id_token').val(token.id);
$('#id_token').val(token.id); $('#billing-form').submit();
$('#billing-form').submit();
} }
stripe.createToken(card).then(function(result) { stripe.createToken(cardNumberElement).then(function (result) {
if (result.error) { if (result.error) {
// Inform the user if there was an error // Inform the user if there was an error
var errorElement = document.getElementById('card-errors'); var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message; errorElement.textContent = result.error.message;
} else { } else {
$form.find('[type=submit]').html('Processing <i class="fa fa-spinner fa-pulse"></i>'); var process_text = "Processing";
if (typeof window.processing_text !== 'undefined') {
process_text = window.processing_text
}
$form_new.find('[type=submit]').html(process_text + ' <i class="fa fa-spinner fa-pulse"></i>');
// Send the token to your server // Send the token to your server
stripeTokenHandler(result.token); stripeTokenHandler(result.token);
} }
}); });
// /* Visual feedback */
// $form.find('[type=submit]').html('Validating <i class="fa fa-spinner fa-pulse"></i>');
// var PublishableKey = window.stripeKey;
// Stripe.setPublishableKey(PublishableKey);
// Stripe.card.createToken($form, function stripeResponseHandler(status, response) {
// if (response.error) {
// /* Visual feedback */
// $form.find('[type=submit]').html('Try again');
// /* Show Stripe errors on the form */
// $form.find('.payment-errors').text(response.error.message);
// $form.find('.payment-errors').closest('.row').show();
// } else {
// /* Visual feedback */
// $form.find('[type=submit]').html('Processing <i class="fa fa-spinner fa-pulse"></i>');
// /* Hide Stripe errors on the form */
// $form.find('.payment-errors').closest('.row').hide();
// $form.find('.payment-errors').text("");
// // response contains id and card, which contains additional card details
// var token = response.id;
// // AJAX
// //set token on a hidden input
// $('#id_token').val(token);
// $('#billing-form').submit();
// }
// });
} }
/* Form validation */ /* Form validation */
$.validator.addMethod("month", function(value, element) { $.validator.addMethod("month", function (value, element) {
return this.optional(element) || /^(01|02|03|04|05|06|07|08|09|10|11|12)$/.test(value); return this.optional(element) || /^(01|02|03|04|05|06|07|08|09|10|11|12)$/.test(value);
}, "Please specify a valid 2-digit month."); }, "Please specify a valid 2-digit month.");
$.validator.addMethod("year", function(value, element) { $.validator.addMethod("year", function (value, element) {
return this.optional(element) || /^[0-9]{2}$/.test(value); return this.optional(element) || /^[0-9]{2}$/.test(value);
}, "Please specify a valid 2-digit year."); }, "Please specify a valid 2-digit year.");
validator = $form.validate({ validator = $form_new.validate({
rules: { rules: {
cardNumber: { cardNumber: {
required: true, required: true,
@ -140,28 +217,16 @@ $( document ).ready(function() {
digits: true digits: true
} }
}, },
highlight: function(element) { highlight: function (element) {
$(element).closest('.form-control').removeClass('success').addClass('error'); $(element).closest('.form-control').removeClass('success').addClass('error');
}, },
unhighlight: function(element) { unhighlight: function (element) {
$(element).closest('.form-control').removeClass('error').addClass('success'); $(element).closest('.form-control').removeClass('error').addClass('success');
}, },
errorPlacement: function(error, element) { errorPlacement: function (error, element) {
$(element).closest('.form-group').append(error); $(element).closest('.form-group').append(error);
} }
}); });
paymentFormReady = function() {
if ($form.find('[name=cardNumber]').hasClass("success") &&
$form.find('[name=expMonth]').hasClass("success") &&
$form.find('[name=expYear]').hasClass("success") &&
$form.find('[name=cvCode]').val().length > 1) {
return true;
} else {
return false;
}
};
// $form.find('[type=submit]').prop('disabled', true); // $form.find('[type=submit]').prop('disabled', true);
// var readyInterval = setInterval(function() { // var readyInterval = setInterval(function() {
// if (paymentFormReady()) { // if (paymentFormReady()) {

View file

@ -45,16 +45,10 @@
} }
</style> </style>
{% endwith %} {% endwith %}
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-62285904-5', 'auto'); <!-- Google analytics -->
ga('send', 'pageview'); {% include "google_analytics.html" %}
<!-- End Google Analytics -->
</script>
</head> </head>
<body> <body>

View file

@ -41,29 +41,34 @@
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]--> <![endif]-->
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
</head> </head>
<body> <body>
<!-- Navigation --> {% block navbar %}
<nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation"> <!-- Navigation -->
<div class="container topnav">
<!-- Brand and toggle get grouped for better mobile display --> <nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation">
<div class="navbar-header"> <div class="container topnav">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <!-- Brand and toggle get grouped for better mobile display -->
<span class="sr-only">Toggle navigation</span> <div class="navbar-header">
<span class="icon-bar"></span> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="icon-bar"></span> <span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> <span class="icon-bar"></span>
<a class="navbar-brand topnav" href="{% if site_url %}{{site_url}}{% else %}{{ request.session.hosting_url}}{% endif %}"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a> <span class="icon-bar"></span>
</div> </button>
{% if request.user.is_authenticated %} <a class="navbar-brand topnav" href="{% if site_url %}{{site_url}}{% else %}{{ request.session.hosting_url}}{% endif %}"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
<!-- Collect the nav links, forms, and other content for toggling --> </div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> {% if request.user.is_authenticated %}
<ul class="nav navbar-nav navbar-right"> <!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right">
<li> <li>
<a href="{% url 'hosting:virtual_machines' %}"> <a href="{% url 'hosting:virtual_machines' %}">
<i class="fa fa-server" aria-hidden="true"></i> {% trans "My Virtual Machines"%} <i class="fa fa-server" aria-hidden="true"></i> {% trans "My Virtual Machines"%}
@ -91,33 +96,14 @@
<li><a href="{% url 'hosting:logout' %}"><i class="glyphicon glyphicon-lock"></i>{% trans "Logout"%} </a></li> <li><a href="{% url 'hosting:logout' %}"><i class="glyphicon glyphicon-lock"></i>{% trans "Logout"%} </a></li>
</ul> </ul>
</li> </li>
<!-- </ul>
<li> </div>
<a href="{{ request.session.hosting_url}}#how">{% trans "How it works"%}</a> {% endif %}
</li> <!-- /.navbar-collapse -->
<li>
<a href="{{ request.session.hosting_url }}#your">{% trans "Your infrastructure"%}</a>
</li>
<li>
<a href="{{ request.session.hosting_url }}#our">{% trans "Our inftrastructure"%}</a>
</li>
<li>
<a href="{{ request.session.hosting_url }}#price">{% trans "Pricing" %}</a>
</li>
<li>
<a href="{{ request.session.hosting_url }}#contact">{% trans "Contact"%}</a>
</li>
<li>
<a href="{% url 'hosting:login' %}?next={{request.current_path}}">{% trans "Login"%}</a>
</li> -->
</ul>
</div> </div>
{% endif %} <!-- /.container -->
<!-- /.navbar-collapse --> </nav>
</div> {% endblock navbar %}
<!-- /.container -->
</nav>
<div class="content-dashboard"> <div class="content-dashboard">

View file

@ -31,16 +31,10 @@
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <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> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]--> <![endif]-->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-62285904-5', 'auto'); <!-- Google analytics -->
ga('send', 'pageview'); {% include 'google_analytics.html' %}
<!-- End Google Analytics -->
</script>
</head> </head>

View file

@ -18,7 +18,9 @@
<link href="{% static 'hosting/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css"> <link href="{% static 'hosting/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 href="//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="{% static 'hosting/img/favicon.ico' %}" type="image/x-icon" /> <link rel="shortcut icon" href="{% static 'hosting/img/favicon.ico' %}" type="image/x-icon" />
<!-- Google analytics -->
{% include 'google_analytics.html' %}
<!-- End Google Analytics -->
</head> </head>
<body> <body>

View file

@ -0,0 +1,11 @@
{% load static i18n %}
<nav class="navbar navbar-default navbar-fixed-top topnav navbar-transparent" role="navigation">
<div class="container topnav">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<a id="logoWhite" class="navbar-brand topnav" href="{% if site_url %}{{site_url}}{% else %}{{ request.session.hosting_url}}{% endif %}"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
</div>
</div>
<!-- /.container -->
</nav>

View file

@ -1,18 +1,23 @@
{% extends "hosting/base_short.html" %} {% extends "hosting/base_short.html" %}
{% load i18n %} {% load i18n %}
{% load staticfiles bootstrap3%} {% load staticfiles bootstrap3%}
{% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container"> <div class="auth-container">
<div class="auth-bg"></div> <div class="auth-bg"></div>
<div class="auth-center"> <div class="auth-center">
<div class="auth-title"> <div class="auth-title">
<h2>{% trans "Your VM hosted in Switzerland"%}</h2> <h2>{% trans "Your VM hosted in Switzerland"%}</h2>
</div> </div>
<div class="auth-content"> <div class="auth-content">
<div class="intro-message auth-box"> <div class="intro-message auth-box">
<h2 class="section-heading">{% trans "Login"%}</h2> <h2 class="section-heading">{% trans "Login"%}</h2>
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidated> <form action="{% url 'hosting:login' %}" method="post" class="form" novalidated>
@ -26,8 +31,8 @@
{% trans "Login"%} {% trans "Login"%}
</button> </button>
{% endbuttons %} {% endbuttons %}
<input type='hidden' name='next' value='{{request.GET.next}}'/> <input type='hidden' name='next' value='{{request.GET.next}}'/>
</form> </form>
<div class="auth-footer"> <div class="auth-footer">
<div class="text"> <div class="text">

View file

@ -24,15 +24,7 @@
</div> </div>
<hr> <hr>
<div class="row"> <div class="row">
<div class="col-xs-6"> <div class="col-xs-12 col-md-6 pull-right order-confirm-date">
<address>
<h3><b>{% trans "Billed To:"%}</b></h3>
{{user.name}}<br>
{{order.billing_address.street_address}},{{order.billing_address.postal_code}}<br>
{{order.billing_address.city}}, {{order.billing_address.country}}.
</address>
</div>
<div class="col-xs-6 text-right">
<address> <address>
<strong>{% trans "Date"%}:</strong><br> <strong>{% trans "Date"%}:</strong><br>
<span id="order-created_at">{{order.created_at|date:'Y-m-d H:i'}}</span><br><br> <span id="order-created_at">{{order.created_at|date:'Y-m-d H:i'}}</span><br><br>
@ -44,6 +36,15 @@
</address> </address>
</div> </div>
<div class="col-xs-12 col-md-6">
<address>
<h3><b>{% trans "Billed To:"%}</b></h3>
{{user.name}}<br>
{{order.billing_address.street_address}},{{order.billing_address.postal_code}}<br>
{{order.billing_address.city}}, {{order.billing_address.country}}.
</address>
</div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-xs-6"> <div class="col-xs-6">

View file

@ -2,154 +2,182 @@
{% load staticfiles bootstrap3 i18n %} {% load staticfiles bootstrap3 i18n %}
{% block content %} {% block content %}
<!-- Credit card form --> <!-- Credit card form -->
<div> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paymentfont/1.1.2/css/paymentfont.min.css"/>
<div class="payment-container"> <div class="dcl-order-container">
<div class="row"> <div class="payment-container">
<div class="col-xs-12 col-md-offset-2 col-md-4 summary-box"> <div class="row">
<form role="form" novalidate> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-order-sec">
<div class="row"> <h3><strong>{%trans "Your Order" %}</strong></h3>
<div class="col-xs-12"> <div class="col-xs-6 col-sm-12 col-md-12 col-lg-12 dcl-order-table-header">
<h3><b>{%trans "Billing Amount" %}</b></h3> <div class="col-xs-12 col-sm-2 col-md-1 col-lg-1 tbl-header">
<hr> {%trans "Cores" %}
<div class="content"> </div>
<!-- <p><b>Type</b> <span class="pull-right">{{request.session.vm_specs.location_code}}</span></p> --> <div class="col-xs-12 col-sm-3 col-md-4 col-lg-4 tbl-header">
<!-- <hr> --> {%trans "Memory" %}
<p><b>{%trans "Cores"%}</b> <span </div>
class="pull-right">{{request.session.specs.cpu|floatformat}}</span></p> <div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 tbl-header">
<hr> {%trans "Disk space" %}
<p><b>{%trans "Memory"%}</b> <span </div>
class="pull-right">{{request.session.specs.memory|floatformat}} GB</span></p> <div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 tbl-header">
<hr> {%trans "Configuration" %}
<p><b>{%trans "Disk space"%}</b> <span </div>
class="pull-right">{{request.session.specs.disk_size|floatformat}} GB</span></p> </div>
<hr> <div class="col-xs-6 col-sm-12 col-md-12 col-lg-12 dcl-order-table-content">
<p><b>{%trans "Configuration"%}</b> <span <div class="col-xs-12 col-sm-2 col-md-1 col-lg-1 tbl-content">
class="pull-right">{{request.session.template.name}}</span></p> {{request.session.specs.cpu|floatformat}}
<hr> </div>
<h4>Total<p <div class="col-xs-12 col-sm-3 col-md-4 col-lg-4 tbl-content">
class="pull-right"><b>{{request.session.specs.price }} CHF</b></p></h4> {{request.session.specs.memory|floatformat}} GB
</div> </div>
</div> <div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 tbl-content">
</div> {{request.session.specs.disk_size|floatformat}} GB
</form> </div>
<div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 tbl-content">
</div> {{request.session.template.name}}
<div class="col-xs-12 col-md-4 billing"> </div>
<h3><b>{%trans "Billing Address"%}</b></h3> </div>
<hr> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-order-table-total">
<form role="form" id="billing-form" method="post" action="" novalidate> <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 tbl-tot tbl-no-padding">
{% for field in form %} {%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-6 col-md-6 col-lg-6"></div>
<div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 tbl-total">{{request.session.specs.price}}
CHF
</div>
</div>
</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>
<form role="form" id="billing-form" method="post" action="" novalidate>
{% for field in form %}
{% csrf_token %} {% csrf_token %}
{% bootstrap_field field show_label=False type='fields'%} {% bootstrap_field field show_label=False type='fields'%}
{% endfor %} {% endfor %}
{% bootstrap_form_errors form type='non_fields'%} {% bootstrap_form_errors form type='non_fields'%}
</form> </form>
</div> </div>
</div> <div class="col-xs-12 col-sm-7 col-md-6 creditcard-box dcl-creditcard">
<div class="row"> <h3><b>{%trans "Credit Card"%}</b></h3>
<div class="col-xs-12 col-md-offset-2 col-md-4 "></div> <hr>
<div class="col-xs-12 col-md-4 creditcard-box"> <div>
<h3><b>{%trans "Payment Details"%}</b></h3> <div>
<hr> <p>
<div> {% blocktrans %}
<div> Please fill in your credit card information below. We are using <a
{% if credit_card_data.last4 %} href="https://stripe.com" target="_blank">Stripe</a> for payment and do not store
<form role="form" id="payment-form-with-creditcard"novalidate> your information in our database.
<h5 class="billing-head">Credit Card</h5> {% endblocktrans %}
<h5 class="membership-lead">Last 4: *****{{credit_card_data.last4}}</h5> </p>
<h5 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h5> </div>
<input type="hidden" name="credit_card_needed" value="false"/> <br>
</form> <div>
<div class="col-xs-6"> {% if credit_card_data.last4 %}
<button id="payment_button_with_creditcard" class="btn btn-success btn-sm btn-block" type="submit"> <form role="form" id="payment-form-with-creditcard" novalidate>
{% trans "Submit Payment" %} <h5 class="billing-head">Credit Card</h5>
</button> <h5 class="membership-lead">Last 4: *****{{credit_card_data.last4}}</h5>
</div> <h5 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h5>
{% else %} <input type="hidden" name="credit_card_needed" value="false"/>
</form>
<form role="form" id="payment-form" novalidate>
<div class="row"> <div class="row">
<div class="form-group"> <div class="col-xs-12">
<div id="card-element"> <p>
<!-- a Stripe Element will be inserted here. --> {% blocktrans %}
</div> You are not making any payment yet. After submitting your card
information, you will be taken to the Confirm Order Page.
{% endblocktrans %}
</p>
</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> </div>
</div>
<div id="card-errors" role="alert"></div>
<!-- <div class="row"> {% else %}
<div class="col-xs-9 col-md-12"> <form action="" id="payment-form-new" method="POST">
<div class="form-group"> <input type="hidden" name="token"/>
<label class="control-label" for="cardNumber">{%trans "CARD NUMBER"%}</label> <div class="group">
<div class="input-group"> <div class="col-xs-12 col-sm-12 col-md-10 col-lg-9 credit-card-goup">
<input type="text" <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 card-element card-number-element">
class="form-control" <label>{%trans "Card Number" %}</label>
name="cardNumber" <div id="card-number-element" class="field my-input"></div>
placeholder="{%trans "Valid Card Number"%}" required autofocus data-stripe="number" /> </div>
<span class="input-group-addon"><i class="fa fa-credit-card"></i></span> <div class="col-xs-5 col-sm-3 col-md-3 col-lg-3 card-element card-expiry-element">
</div> <label>{%trans "Expiry Date" %}</label>
</div> <div id="card-expiry-element" class="field my-input"></div>
</div> </div>
</div> <div class="col-xs-12 col-sm-2 col-md-6 col-lg-7 hide-mobile"></div>
<div class="row"> <div class="col-xs-3 col-sm-3 col-md-3 col-lg-2 card-element card-cvc-element">
<div class="col-xs-6 col-md-7"> <label>{%trans "CVC" %}</label>
<div class="form-group"> <div id="card-cvc-element" class="field my-input"></div>
<label for="expMonth">{%trans "EXPIRATION DATE"%}</label><br/> </div>
<div class="col-xs-6 col-lg-6 col-md-6 pl-ziro"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 card-element brand">
<input type="text" class="form-control" name="expMonth" placeholder="MM" required data-stripe="exp_month" /> <label>{%trans "Card Type" %}</label>
</div> <i class="pf pf-credit-card" id="brand-icon"></i>
<div class="col-xs-6 col-lg-6 col-md-6 pl-ziro"> </div>
<input type="text" class="form-control" name="expYear" placeholder="YY" required data-stripe="exp_year" /> </div>
</div> </div>
</div> <div id="card-errors" role="alert"></div>
</div> <div class="row">
<div class="col-xs-4 col-md-5 pull-right"> <div class="col-xs-12">
<div class="form-group"> <p class="card-warning-content">
<label for="cvCode">{%trans "CV CODE"%}</label> {% blocktrans %}
<input type="password" class="form-control" name="cvCode" placeholder="CV" required data-stripe="cvc" /> You are not making any payment yet. After submitting your card
</div> information, you will be taken to the Confirm Order Page.
</div> {% endblocktrans %}
</div> --> </p>
<div class="row"> </div>
<div class="col-xs-6 float-right"> <div class="col-xs-12">
<button class="btn btn-success btn-sm btn-block" type="submit">Submit Payment</button> <div class="col-xs-6 pull-right">
</div> <button class="btn btn-success stripe-payment-btn" type="submit">{%trans "Submit" %}
</div> </button>
<div class="row" style="display:none;"> </div>
<div class="col-xs-12"> </div>
<p class="payment-errors"></p> </div>
</div>
</div>
{% if paymentError %}
<div class="row">
<div class="col-xs-12">
<p>
{% bootstrap_alert paymentError alert_type='danger' %}
</p>
</div>
</div>
{% endif %}
<div class="row" style="display:none;">
<div class="col-xs-12">
<p class="payment-errors"></p>
</div>
</div>
{% if paymentError %}
<div class="row">
<div class="col-xs-12">
<p>
{% bootstrap_alert paymentError alert_type='danger' %}
</p>
</div>
</div>
{% endif %}
</form>
</form> {% endif %}
{% endif %} </div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
</div> </div>
<!-- stripe key data --> <!-- stripe key data -->
{% if stripe_key %} {% if stripe_key %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
<script type="text/javascript"> <script type="text/javascript">
window.processing_text = '{%trans "Processing" %}';
window.enter_your_card_text = '{%trans "Enter your credit card number" %}';
(function () {
(function () {
window.stripeKey = "{{stripe_key}}"; window.stripeKey = "{{stripe_key}}";
window.current_lan = "{{LANGUAGE_CODE}}"; window.current_lan = "{{LANGUAGE_CODE}}";
})(); })();
@ -158,13 +186,11 @@
{% if credit_card_data.last4 and credit_card_data.cc_brand %} {% if credit_card_data.last4 and credit_card_data.cc_brand %}
<script type="text/javascript"> <script type="text/javascript">
(function () {window.hasCreditcard = true;})(); (function () {
window.hasCreditcard = true;
})();
</script> </script>
{%endif%} {%endif%}
{%endblock%} {%endblock%}

View file

@ -2,6 +2,11 @@
{% load staticfiles bootstrap3%} {% load staticfiles bootstrap3%}
{% load i18n %} {% load i18n %}
{% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container"> <div class="auth-container">
<div class="auth-bg"></div> <div class="auth-bg"></div>
@ -10,7 +15,7 @@
<h2>{% trans "Your VM hosted in Switzerland"%}</h2> <h2>{% trans "Your VM hosted in Switzerland"%}</h2>
</div> </div>
<div class="auth-content"> <div class="auth-content">
<div class="intro-message auth-box sign-up"> <div class="intro-message auth-box sign-up">
<h2 class="section-heading">{% trans "Reset your password"%}</h2> <h2 class="section-heading">{% trans "Reset your password"%}</h2>
<form action="{% url 'hosting:reset_password' %}" method="post" class="form" novalidate> <form action="{% url 'hosting:reset_password' %}" method="post" class="form" novalidate>

View file

@ -1,6 +1,10 @@
{% extends "hosting/base_short.html" %} {% extends "hosting/base_short.html" %}
{% load staticfiles bootstrap3 i18n %} {% load staticfiles bootstrap3 i18n %}
{% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container auth-signup"> <div class="auth-container auth-signup">
<div class="auth-bg"></div> <div class="auth-bg"></div>
@ -32,7 +36,7 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -479,6 +479,7 @@ class PaymentVMView(LoginRequiredMixin, FormView):
form_kwargs.update({ form_kwargs.update({
'initial': { 'initial': {
'cardholder_name': current_billing_address.cardholder_name,
'street_address': current_billing_address.street_address, 'street_address': current_billing_address.street_address,
'city': current_billing_address.city, 'city': current_billing_address.city,
'postal_code': current_billing_address.postal_code, 'postal_code': current_billing_address.postal_code,

View file

@ -51,6 +51,8 @@ class MyUserManager(BaseUserManager):
name=name, name=name,
) )
user.is_admin = True user.is_admin = True
user.is_active = True
user.is_superuser = True
user.save(using=self._db) user.save(using=self._db)
return user return user

View file

@ -59,7 +59,7 @@ class OpenNebulaManager():
domain=settings.OPENNEBULA_DOMAIN, domain=settings.OPENNEBULA_DOMAIN,
port=settings.OPENNEBULA_PORT, port=settings.OPENNEBULA_PORT,
endpoint=settings.OPENNEBULA_ENDPOINT endpoint=settings.OPENNEBULA_ENDPOINT
)) ))
def _get_opennebula_client(self, username, password): def _get_opennebula_client(self, username, password):
return oca.Client("{0}:{1}".format( return oca.Client("{0}:{1}".format(
@ -71,7 +71,7 @@ class OpenNebulaManager():
domain=settings.OPENNEBULA_DOMAIN, domain=settings.OPENNEBULA_DOMAIN,
port=settings.OPENNEBULA_PORT, port=settings.OPENNEBULA_PORT,
endpoint=settings.OPENNEBULA_ENDPOINT endpoint=settings.OPENNEBULA_ENDPOINT
)) ))
def _get_user(self, user): def _get_user(self, user):
"""Get the corresponding opennebula user for a CustomUser object """Get the corresponding opennebula user for a CustomUser object
@ -325,7 +325,7 @@ class OpenNebulaManager():
public_templates = [ public_templates = [
template template
for template in self._get_template_pool() for template in self._get_template_pool()
if 'public-' in template.name if template.name.startswith('public-')
] ]
return public_templates return public_templates
except ConnectionRefusedError: except ConnectionRefusedError:
@ -396,7 +396,7 @@ class OpenNebulaManager():
def delete_template(self, template_id): def delete_template(self, template_id):
self.oneadmin_client.call(oca.VmTemplate.METHODS[ self.oneadmin_client.call(oca.VmTemplate.METHODS[
'delete'], template_id, False) 'delete'], template_id, False)
def change_user_password(self, new_password): def change_user_password(self, new_password):
self.oneadmin_client.call( self.oneadmin_client.call(

View file

@ -129,6 +129,12 @@ class VirtualMachineSerializer(serializers.Serializer):
return obj.name.strip('public-') return obj.name.strip('public-')
class VMTemplateSerializer(serializers.Serializer):
"""Serializer to map the VMTemplate instance into JSON format."""
id = serializers.IntegerField(read_only=True, source='opennebula_vm_template_id')
name = serializers.CharField(read_only=True)
def hexstr2int(string): def hexstr2int(string):
return int(string.replace(':', ''), 16) return int(string.replace(':', ''), 16)

View file

@ -34,6 +34,10 @@
{% endblock %} {% endblock %}
{% render_block "external-css" %} {% render_block "external-css" %}
{% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %} {% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
</head> </head>
<body> <body>
@ -60,16 +64,7 @@
{% bootstrap_javascript %} {% bootstrap_javascript %}
{% endaddtoblock %} {% endaddtoblock %}
{% addtoblock "js" %} {% addtoblock "js" %}
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-62285904-4', 'auto');
ga('send', 'pageview');
</script>
<script src="{% static 'blog.ungleich.ch/vendor/js/jquery.min.js' %}" type="text/javascript" /> <script src="{% static 'blog.ungleich.ch/vendor/js/jquery.min.js' %}" type="text/javascript" />
<script src="{% static 'blog.ungleich.ch/js/navbar-scroll-up.js' %}" type="text/javascript" /> <script src="{% static 'blog.ungleich.ch/js/navbar-scroll-up.js' %}" type="text/javascript" />

View file

@ -16,7 +16,7 @@
</h2> </h2>
</a> </a>
<p class="post-meta" style="font-size:0.9em;"> <p class="post-meta" style="font-size:0.9em;">
{% trans "Posted on" %}{{ post.date_published|date:"DATE_FORMAT" }} {% trans "Posted on" %} {{ post.date_published|date:"DATE_FORMAT" }}
</p> </p>
<p class="post-subtitle"> <p class="post-subtitle">

View file

@ -31,26 +31,9 @@
<link href="{% static 'ungleich_page/css/ungleich.css' %}" rel="stylesheet"> <link href="{% static 'ungleich_page/css/ungleich.css' %}" rel="stylesheet">
<!-- Google analytics -->
<!-- Google tracking --> {% include "google_analytics.html" %}
<script src="//www.google-analytics.com/analytics.js" async></script> <!-- End Google Analytics -->
<script>
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-62285904-1', 'auto');
ga('send', 'pageview');
</script>
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon"> <link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon">
<style id="igtranslator-color" type="text/css"></style> <style id="igtranslator-color" type="text/css"></style>
</head> </head>

View file

@ -5,11 +5,12 @@ from django.core.mail import EmailMultiAlternatives
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import authenticate from django.contrib.auth import authenticate
from membership.models import CustomUser from membership.models import CustomUser
# from utils.fields import CountryField # from utils.fields import CountryField
class SignupFormMixin(forms.ModelForm): class SignupFormMixin(forms.ModelForm):
confirm_password = forms.CharField(widget=forms.PasswordInput()) confirm_password = forms.CharField(widget=forms.PasswordInput())
password = forms.CharField(widget=forms.PasswordInput()) password = forms.CharField(widget=forms.PasswordInput())
@ -50,8 +51,6 @@ class LoginFormMixin(forms.Form):
return email return email
except CustomUser.DoesNotExist: except CustomUser.DoesNotExist:
raise forms.ValidationError("User does not exist") raise forms.ValidationError("User does not exist")
else:
return email
class PasswordResetRequestForm(forms.Form): class PasswordResetRequestForm(forms.Form):
@ -67,8 +66,6 @@ class PasswordResetRequestForm(forms.Form):
return email return email
except CustomUser.DoesNotExist: except CustomUser.DoesNotExist:
raise forms.ValidationError("User does not exist") raise forms.ValidationError("User does not exist")
else:
return email
class SetPasswordForm(forms.Form): class SetPasswordForm(forms.Form):
@ -91,7 +88,7 @@ class SetPasswordForm(forms.Form):
if password1 != password2: if password1 != password2:
raise forms.ValidationError( raise forms.ValidationError(
self.error_messages['password_mismatch'], self.error_messages['password_mismatch'],
code='password_mismatch',) code='password_mismatch', )
return password2 return password2
@ -104,8 +101,9 @@ class BillingAddressForm(forms.ModelForm):
class Meta: class Meta:
model = BillingAddress model = BillingAddress
fields = ['street_address', 'city', 'postal_code', 'country'] fields = ['cardholder_name', 'street_address', 'city', 'postal_code', 'country']
labels = { labels = {
'cardholder_name': _('Cardholder Name'),
'street_address': _('Street Address'), 'street_address': _('Street Address'),
'city': _('City'), 'city': _('City'),
'postal_code': _('Postal Code'), 'postal_code': _('Postal Code'),

View file

@ -8,6 +8,7 @@ from .fields import CountryField
# Create your models here. # Create your models here.
class BaseBillingAddress(models.Model): class BaseBillingAddress(models.Model):
cardholder_name = models.CharField(max_length=100, default="")
street_address = models.CharField(max_length=100) street_address = models.CharField(max_length=100)
city = models.CharField(max_length=50) city = models.CharField(max_length=50)
postal_code = models.CharField(max_length=50) postal_code = models.CharField(max_length=50)
@ -18,7 +19,6 @@ class BaseBillingAddress(models.Model):
class BillingAddress(BaseBillingAddress): class BillingAddress(BaseBillingAddress):
def __str__(self): def __str__(self):
return self.street_address return self.street_address
@ -32,6 +32,7 @@ class UserBillingAddress(BaseBillingAddress):
def to_dict(self): def to_dict(self):
return { return {
'Cardholder Name': self.cardholder_name,
'Street Address': self.street_address, 'Street Address': self.street_address,
'City': self.city, 'City': self.city,
'Postal Code': self.postal_code, 'Postal Code': self.postal_code,