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
* [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)

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\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 "
"von unserem Team"
#: templates/datacenterlight/calculator_form.html:5
#: templates/datacenterlight/pricing.html:22
msgid "VM hosting"
msgstr ""
#: templates/datacenterlight/calculator_form.html:9
msgid "month"
msgstr "Monat"
#: templates/datacenterlight/calculator_form.html:11
#: templates/datacenterlight/pricing.html:28
msgid "VAT included"
msgstr "MwSt. inklusive"
#: templates/datacenterlight/calculator_form.html:16
#: templates/datacenterlight/pricing.html:33
msgid "Hosted in Switzerland"
msgstr "Standort: Schweiz"
#: templates/datacenterlight/calculator_form.html:21
msgid "Please enter a value in range 1 - 48."
msgstr "Bitte gib einen Wert von 1 bis 48 ein."
#: templates/datacenterlight/calculator_form.html:30
msgid "Please enter a value in range 2 - 200."
msgstr "Bitte gib einen Wert von 2 bis 200 ein."
#: templates/datacenterlight/calculator_form.html:39
msgid "Please enter a value in range 10 - 2000."
msgstr "Bitte gib einen Wert von 10 bis 200 ein."
#: templates/datacenterlight/calculator_form.html:40
#: templates/datacenterlight/pricing.html:50
msgid "GB Storage (SSD)"
msgstr "GB Storage (SSD)"
#: templates/datacenterlight/calculator_form.html:59
msgid "Name"
msgstr ""
#: templates/datacenterlight/calculator_form.html:60
msgid "Your Name"
msgstr "Dein Name"
#: templates/datacenterlight/calculator_form.html:60
msgid "Please enter your name."
msgstr "Bitte gib Deinen Namen ein."
#: templates/datacenterlight/calculator_form.html:74
msgid "Email"
msgstr "E-Mail-Adresse"
#: templates/datacenterlight/calculator_form.html:75
msgid "Your Email"
msgstr "Deine E-Mail"
#: templates/datacenterlight/calculator_form.html:75
msgid "Please enter a valid email address."
msgstr "Bitte gib eine gültige E-Mailadresse ein."
#: templates/datacenterlight/calculator_form.html:88
msgid "Continue"
msgstr "Weiter"
#: templates/datacenterlight/emails/request_access_confirmation.html:99
#: templates/datacenterlight/emails/request_access_confirmation.txt:99
msgid "Thank you for your request."
@ -129,27 +193,28 @@ msgstr ""
#: templates/datacenterlight/includes/_footer.html:11
#: templates/datacenterlight/includes/_footer.html:31
#: templates/datacenterlight/includes/_navbar.html:27
#: templates/datacenterlight/index.html:20
#: templates/datacenterlight/index.html:47
#: templates/datacenterlight/includes/_navbar.html:28
#: templates/datacenterlight/index.html:19
#: templates/datacenterlight/index.html:46
msgid "Highlights"
msgstr ""
#: templates/datacenterlight/includes/_footer.html:14
#: templates/datacenterlight/includes/_footer.html:34
#: templates/datacenterlight/includes/_navbar.html:30
#: templates/datacenterlight/index.html:86
#: templates/datacenterlight/index.html:85
msgid "Scale out"
msgstr "Skalierung"
#: templates/datacenterlight/includes/_footer.html:17
#: templates/datacenterlight/includes/_footer.html:37
#: templates/datacenterlight/includes/_navbar.html:33
#: templates/datacenterlight/index.html:112
#: templates/datacenterlight/includes/_navbar.html:31
#: templates/datacenterlight/index.html:111
msgid "Reliable and light"
msgstr "Zuverlässig und leicht"
#: templates/datacenterlight/includes/_footer.html:20
#: templates/datacenterlight/includes/_navbar.html:36
#: templates/datacenterlight/includes/_navbar.html:32
msgid "Order VM"
msgstr "VM bestellen"
@ -167,28 +232,33 @@ msgstr "Home"
msgid "Pricing"
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!"
msgstr "Endlich: bezahlbares VM Hosting in der Schweiz"
#: templates/datacenterlight/index.html:23
#: templates/datacenterlight/index.html:22
msgid "I want it!"
msgstr "Das will ich haben!"
#: templates/datacenterlight/index.html:53
#: templates/datacenterlight/index.html:52
msgid ""
"Reuses existing factory halls instead of building a new expensive building."
msgstr ""
"Verwendet ehemalige Fabrikhallen anstatt ein neues, teures Gebäude zu "
"errichten."
#: templates/datacenterlight/index.html:58
#: templates/datacenterlight/index.html:57
msgid "Only wants you to pay for what you actually need."
msgstr ""
"Möchte, dass du nur bezahlst, was du auch wirklich brauchst: Wähle deine "
"Ressourcen individuell aus!"
#: templates/datacenterlight/index.html:62
#: templates/datacenterlight/index.html:61
msgid ""
"Is creative, using a modern and alternative design for a data center in "
"order to make it more sustainable and affordable at the same time."
@ -197,7 +267,7 @@ msgstr ""
"macht um Nachhaltigkeit zu fördern und somit erschwingliche Preise bieten zu "
"können."
#: templates/datacenterlight/index.html:66
#: templates/datacenterlight/index.html:65
msgid ""
"Cuts down the costs for you by using FOSS (Free Open Source Software) "
"exclusively, wherefore we can save money from paying licenses."
@ -206,7 +276,7 @@ msgstr ""
"mit FOSS (Free Open Source Software) arbeitet und wir daher auf "
"Lizenzgebühren verzichten können."
#: templates/datacenterlight/index.html:89
#: templates/datacenterlight/index.html:88
msgid ""
"We don't use special hardware. We use commodity hardware: we buy computers "
"that you buy. Just many more and put them in a cozy home for computers "
@ -216,7 +286,7 @@ msgstr ""
"erschwingliche Systeme. Bei grösserer Auslastung werden mehr "
"Standardkomponenten hinzugekauft und skalieren so das Datencenter."
#: templates/datacenterlight/index.html:115
#: templates/datacenterlight/index.html:114
msgid ""
"Our VMs are located in Switzerland, with reliable power supply and fast "
"internet connection. Our VM costs less thanks to our featherlight "
@ -226,91 +296,26 @@ msgstr ""
"Energieversorgung, sowie schneller Internetverbindung ausgestattet. Unser "
"Angebot ist aufgrund unserer leichten Infrastruktur überaus kostengünstig."
#: templates/datacenterlight/index.html:133
#: templates/datacenterlight/index.html:132
#: templates/datacenterlight/pricing.html:86
msgid "Simple and affordable: Try our virtual machine with featherlight price."
msgstr ""
"Einfach und bezahlbar: Teste nun unsere virtuellen Maschinen mit "
"federleichten Preisen."
#: templates/datacenterlight/index.html:134
#: templates/datacenterlight/index.html:133
msgid "Affordable VM hosting based in Switzerland"
msgstr "Bezahlbares VM Hosting in der Schweiz"
#: templates/datacenterlight/index.html:145
#: 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
#: templates/datacenterlight/index.html:166
msgid "Switzerland "
msgstr "Schweiz"
#: templates/datacenterlight/index.html:271
#: templates/datacenterlight/index.html:183
msgid "Questions?"
msgstr "Fragen?"
#: templates/datacenterlight/index.html:271
#: templates/datacenterlight/index.html:183
msgid "Contact us!"
msgstr "Kontaktiere uns!"
@ -319,46 +324,46 @@ msgid "Confirm Order"
msgstr "Bestellung Bestätigen"
#: templates/datacenterlight/order_detail.html:30
msgid "Billed To:"
msgstr "Rechnungsadresse"
#: templates/datacenterlight/order_detail.html:39
msgid "Date"
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:"
msgstr "Bezahlmethode"
#: templates/datacenterlight/order_detail.html:49
#: templates/datacenterlight/order_detail.html:48
msgid "ending"
msgstr "endend in"
#: templates/datacenterlight/order_detail.html:59
#: templates/datacenterlight/order_detail.html:58
msgid "Order summary"
msgstr "Bestellungsübersicht"
#: templates/datacenterlight/order_detail.html:63
#: templates/datacenterlight/order_detail.html:62
msgid "Cores"
msgstr "Prozessorkerne"
#: templates/datacenterlight/order_detail.html:65
#: templates/datacenterlight/order_detail.html:64
msgid "Memory"
msgstr "Arbeitsspeicher"
#: templates/datacenterlight/order_detail.html:67
#: templates/datacenterlight/order_detail.html:66
msgid "Disk space"
msgstr "Festplattenkapazität"
#: templates/datacenterlight/order_detail.html:69
#: templates/datacenterlight/order_detail.html:68
msgid "Configuration"
msgstr "Konfiguration"
#: templates/datacenterlight/order_detail.html:71
#: templates/datacenterlight/order_detail.html:70
msgid "Total"
msgstr ""
#: templates/datacenterlight/order_detail.html:78
#: templates/datacenterlight/order_detail.html:77
msgid "Place order"
msgstr "Bestellen"
@ -366,6 +371,10 @@ msgstr "Bestellen"
msgid "We are cutting down the costs significantly!"
msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen"
#: templates/datacenterlight/pricing.html:79
msgid "Order Now!"
msgstr "Bestelle jetzt!"
#: templates/datacenterlight/pricing.html:89
msgid ""
"Our VMs are hosted in Glarus, Switzerland, and our website is currently "
@ -392,14 +401,115 @@ msgstr ""
msgid "as soon as possible!"
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"
msgstr "ist kein gültiger Name"
#: views.py:241
#: views.py:242
msgid "is not a proper email"
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"
#~ 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):
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):
email = models.CharField(max_length=250)
name = models.CharField(max_length=250)
# vm = models.ForeignKey(BetaAccessVM)
def __str__(self):
@ -48,3 +49,13 @@ class BetaAccessVM(models.Model):
amount=vm[VM_AMOUNT], type=vm_type))
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
/* ---------------------------------------------
Scripts initialization
--------------------------------------------- */
var cardPricing ={
var cardPricing = {
'cpu': {
'id': 'coreValue',
'value': 1,
'min':1,
'min': 1,
'max': 48,
'interval': 1
},
'ram': {
'id': 'ramValue',
'value': 2,
'min':2,
'min': 2,
'max': 200,
'interval': 1
},
@ -24,131 +24,141 @@
'id': 'storageValue',
'value': 10,
'min': 10,
'max': 500,
'max': 2000,
'interval': 10
}
}
$(window).load(function(){
};
$(window).load(function() {
});
$(document).ready(function(){
$(document).ready(function() {
verifiedUrl();
_navScroll();
_initScroll();
_initNavUrl();
_initPricing();
_navScroll();
_initScroll();
_initNavUrl();
_initPricing();
});
$(window).resize(function(){
$(window).resize(function() {
});
/* ---------------------------------------------
Nav panel classic
--------------------------------------------- */
if (window.matchMedia("(min-width: 767px)").matches) {
$('ul.nav li.dropdown').hover(function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
}, function() {
$(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();
if (window.matchMedia("(min-width: 767px)").matches) {
$('ul.nav li.dropdown').hover(function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
}, function() {
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
});
} 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-default .btn-link").css("color", "#777");
$(".dropdown-menu").removeClass("navbar-transparent");
$(".dropdown-menu > li > a").css("color", "#777");
}else{
} else {
$(".navbar").addClass("navbar-transparent");
$(".navbar-default .btn-link").css("color", "#fff");
$(".dropdown-menu").addClass("navbar-transparent");
$(".dropdown-menu > li > a").css("color", "#fff");
}
}
function _initNavUrl(){
$('.url').click(function(){
var href = $(this).attr('data-url');
$('.navbar-collapse').removeClass('in');
$('.navbar-collapse').addClass('collapsing');
$('html, body').animate({
scrollTop: $(href).offset().top
}, 1000);
function _initNavUrl() {
$('.url').click(function(event) {
event.preventDefault();
var href = $(this).attr('data-url');
$('.navbar-collapse').removeClass('in');
$('.navbar-collapse').addClass('collapsing');
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();
console.log('epa');
}
}
function _initPricing(){
function _initPricing() {
_fetchPricing();
$('.fa-minus-circle.left').click(function(event){
$('.fa-minus-circle.left').click(function(event) {
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;
}
_fetchPricing();
});
$('.fa-plus-circle.right').click(function(event){
$('.fa-plus-circle.right').click(function(event) {
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;
}
_fetchPricing();
});
$('.input-price').change(function(){
$('.input-price').change(function() {
var data = $(this).attr("name");
cardPricing[data].value = $('input[name='+data+']').val();
cardPricing[data].value = $('input[name=' + data + ']').val();
_fetchPricing();
});
}
function _fetchPricing(){
Object.keys(cardPricing).map(function(element){
function _fetchPricing() {
Object.keys(cardPricing).map(function(element) {
//$('#'+cardPricing[element].id).val(cardPricing[element].value);
$('input[name='+element+']').val(cardPricing[element].value);
$('input[name=' + element + ']').val(cardPricing[element].value);
});
_calcPricing();
}
function _calcPricing(){
var total = (cardPricing['cpu'].value * 5) + (2* cardPricing['ram'].value) + (0.6* cardPricing['storage'].value);
function _calcPricing() {
var total = (cardPricing['cpu'].value * 5) + (2 * cardPricing['ram'].value) + (0.6 * cardPricing['storage'].value);
total = parseFloat(total.toFixed(2));
$("#total").text(total);
$('input[name=total]').val(total);
}
function form_success(){
function form_success() {
$('#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>
<html lang="{{LANGUAGE_CODE}}">
<head>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Data Center Light by ungleich">
<meta name="author" content="ungleich GmbH">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Data Center Light by ungleich">
<meta name="author" content="ungleich GmbH">
<title>Data Center Light -
{% block title %}VM hosting made in Switzerland{% endblock %}</title>
<!-- Bootstrap Core CSS -->
<link href="{% static 'datacenterlight/css/bootstrap.min.css' %}" rel="stylesheet">
<title>Data Center Light -
{% block title %}VM hosting made in Switzerland{% endblock %}</title>
<!-- Bootstrap Core CSS -->
<link href="{% static 'datacenterlight/css/bootstrap.min.css' %}" rel="stylesheet">
<!-- Custom Fonts -->
<!--Import Google Icon Font-->
<link href="//fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
<link href="//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon" />
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.min.css" rel="stylesheet">
<!-- Custom Fonts -->
<!--Import Google Icon Font-->
<link href="//fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
<link href="//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon" />
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.min.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
<!-- Custom CSS -->
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
</head>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
</head>
<body>
<body>
<!-- Navigation -->
{% include "datacenterlight/includes/_navbar.html" %}
{% block content %}
{% endblock %}
{% include "datacenterlight/includes/_footer.html" %}
<!-- Footer -->
<!-- jQuery -->
<script src="{% static 'datacenterlight/js/jquery.js' %}"></script>
<!-- Navigation -->
{% include "datacenterlight/includes/_navbar.html" %}
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.js"></script>
{% block content %}
{% endblock %}
<!-- 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>
{% 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>
<!-- 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>

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>
</button>
{% 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="logoWhite" class="navbar-brand topnav url" data-url="#home"><img src="{% static 'datacenterlight/img/logo_white.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" data-url="#home"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
{% 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="logoWhite" class="navbar-brand topnav url"><img src="{% static 'datacenterlight/img/logo_white.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"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
{% endif %}
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><!-- Start Navbar collapse-->
<ul class="nav navbar-nav navbar-right">
{% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %}
<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 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">
<li><a class="url" href="{% url 'datacenterlight:index' %}#your" data-url="#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" href="{% url 'datacenterlight:index' %}#price" data-url="#price" >{% trans "Order VM" %}</a></li>
</ul>
<li><a class="url menu-url" data-url="#your" href="#your">{% trans "Scale out" %}</a></li>
<li><a class="url menu-url" data-url="#our" href="#our">{% trans "Reliable and light" %}</a></li>
<li> <a class="url menu-url" data-url="#price" href="#price">{% trans "Order VM" %}</a></li>
</ul>
</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>
<a class="url" href="{% url 'datacenterlight:index' %}#contact" data-url="#contact" >{% trans "Contact" %}</a>
@ -41,18 +41,19 @@
{% endif %}
<li class="nav-language">
<div class="select-language">
{% if LANGUAGE_CODE == 'en-us'%}
{% if LANGUAGE_CODE == 'en-us'%}
<span>English</span>
{% else %}
<span>Deutsch</span>
{% endif %}
<i class="fa fa-globe" aria-hidden="true"></i>
</div>
<div class="drop-language">
{% if LANGUAGE_CODE == 'en-us'%}
<a class="url" href="{% change_lang 'de' %}">Deutsch</a>
{% if LANGUAGE_CODE == 'en-us'%}
<a href="{% change_lang 'de' %}">Deutsch</a>
{% else %}
<a class="url" href="{% change_lang 'en-us' %}" >English</a>
<a href="{% change_lang 'en-us' %}" >English</a>
{% endif %}
</div>

View file

@ -1,6 +1,5 @@
{% extends "datacenterlight/base.html" %}
{% load staticfiles i18n%}
{% get_current_language as LANGUAGE_CODE %}
{% block content %}
@ -10,7 +9,7 @@
<div class="row">
<div class="col-lg-12">
<div class="intro-message">
<h1>Data Center Light</h1>
<h3>{% trans "Finally, an affordable VM hosting in Switzerland!" %}</h3>
@ -60,13 +59,13 @@
<li>
<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>
</li>
</li>
<li>
<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>
</li>
</li>
</ul>
</div>
</div>
</div>
@ -87,7 +86,7 @@
</div>
<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>
</div>
</div>
</div>
@ -112,8 +111,8 @@
<h2>{% trans "Reliable and light" %}</h2>
</div>
<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>
@ -122,7 +121,7 @@
<!-- /.container -->
<!-- /.option 1 -->
</div>
<!-- /.content-section-b -->
<div class="content-section-a pricing-section" id="price">
@ -131,7 +130,7 @@
<div class="row text-center">
<div class="col-xs-12 col-md-6 text">
<h2 class="section-heading">{% trans "Simple and affordable: Try our virtual machine with featherlight price." %}</h2>
<p class="lead">{% trans "Affordable VM hosting based in Switzerland" %}</p>
<p class="lead new-lead">{% trans "Affordable VM hosting based in Switzerland" %}</p>
</div>
<div class="col-xs-12 col-md-6 hero-feature">
@ -139,94 +138,7 @@
<div class="landing card">
<img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt="">
<div class="caption">
<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="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>
{% include "datacenterlight/calculator_form.html" %}
</div>
</div>
</div>
@ -242,7 +154,7 @@
<div class="intro-header-2 contact-section" id="contact">
<div class="container">
<div class="row">
<div class="col-sm-6 col-md-6">
<div class="card">
<div class="subtitle">
@ -254,15 +166,9 @@
<p>{% trans "Switzerland " %}</p>
</div>
<div class="social">
<a target="_blank" class="" href="https://twitter.com/datacenterlight">
<i class="fa fa-twitter fa-fw"></i>
</a>
<a target="_blank" class="" href="https://github.com/ungleich">
<i class="fa fa-github fa-fw"></i>
</a>
<a target="_blank" class="" href="https://www.facebook.com/ungleich.ch/">
<i class="fa fa-facebook fa-fw"></i>
</a>
<a target="_blank" class="" href="https://twitter.com/datacenterlight"><i class="fa fa-twitter fa-fw"></i></a>
<a target="_blank" class="" href="https://github.com/ungleich"><i class="fa fa-github fa-fw"></i></a>
<a target="_blank" class="" href="https://www.facebook.com/ungleich.ch/"><i class="fa fa-facebook fa-fw"></i></a>
</div>
</div>
</div>
@ -275,7 +181,7 @@
</div>
</div>
</div>
<!-- /.banner -->
{% endblock %}
{% endblock %}

View file

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

View file

@ -13,73 +13,73 @@
<div class="price-calc-section">
<div class="card">
<img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt="">
<div class="caption">
<form method="POST" action="">
{% csrf_token %}
<div class="title">
<h3>{% trans "VM hosting" %} </h3>
</div>
<div class="price">
<span id="total">15</span>
<span>CHF</span>
<div class="price-text">
<p>{% trans "VAT included" %}</p>
</div>
</div>
<div class="descriptions">
<div class="description">
<p>{% trans "Hosted in Switzerland" %}</p>
</div>
<div class="description">
<i class="fa fa-minus-circle left" data-minus="cpu" aria-hidden="true"></i>
<input class="input-price" type="number" min="1" max="42" id="coreValue" name="cpu">
<span> Core</span>
<i class="fa fa-plus-circle right" data-plus="cpu" aria-hidden="true"></i>
</div>
<div class="description">
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
<input id="ramValue" class="input-price" type="number" min="2" max="200" name="ram">
<span> GB RAM</span>
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
</div>
<div class="description">
<i class="fa fa-minus-circle left" data-minus="storage" aria-hidden="true"></i>
<input id="storageValue" class="input-price" type="number" min="10" max="500" step="10" name="storage">
<span>{% trans "GB Storage (SSD)" %}</span>
<i class="fa fa-plus-circle right" data-plus="storage" aria-hidden="true"></i>
</div>
<img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt="">
<div class="caption">
<form method="POST" action="">
{% csrf_token %}
<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 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>
<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>
<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>
</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 class="text">

View file

@ -12,29 +12,21 @@
</div>
</div>
<script src="{% static 'datacenterlight/js/jquery.js' %}"></script>
<script type="text/javascript">
window.onload=function(){
$('.selectpicker').selectpicker({
style: 'btn-link',
windowPadding: 10,
});
<script type="text/javascript">
window.onload=function(){
$('.selectpicker').selectpicker({
style: 'btn-link',
windowPadding: 10,
});
var hash = window.location.hash.substr(1);
console.log(hash);
if (hash == 'requestform'){
$('#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>
var hash = window.location.hash.substr(1);
console.log(hash);
if (hash == 'requestform'){
$('#reques-success-message').modal('show');
}
};
</script>
{% endblock %}

View file

@ -1,22 +1,19 @@
{% extends "datacenterlight/base.html" %}
{% load staticfiles i18n%}
{% get_current_language as LANGUAGE_CODE %}
{% block content %}
<!-- Why Data Center Light? -->
<div class="full-whydcl-sec">
<div class="whydcl-header whydcl-section" id="why_dcl">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="single-heading">
<h2>{% trans "Why Data Center Light?" %}</h2>
<div class="whydcl-header whydcl-section" id="why_dcl">
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12">
<div class="single-heading">
<h2>{% trans "Why Data Center Light?" %}</h2>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="split-section left" id="tech_stack">
@ -35,39 +32,39 @@
</div>
</div>
<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">
<img class="img-responsive btm-space" src="{% static 'datacenterlight/img/devuan.png' %}" alt="Devuan">
<span class="logo-caption">{% trans "Our services run on" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our monitoring" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our storage layer" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our web frontend" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our cloud" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our configuration management system" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our awesome juice" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our NAT64 gateway" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our services run on" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our monitoring" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our storage layer" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our web frontend" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our cloud" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our configuration management system" %}</span>
</div>
<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">
<span class="logo-caption">{% trans "Our awesome juice" %}</span>
</div>
<div class="col-xs-12 col-sm-6 col-md-6 col-md-6 logo-wrap">
<img class="img-responsive btm-space-tayga" src="{% static 'datacenterlight/img/tayga.png' %}" alt="Tayga">
<span class="logo-caption">{% trans "Our NAT64 gateway" %}</span>
</div>
</div>
</div>
</div>
@ -77,21 +74,21 @@
<div class=" space">
<div class="container">
<div class="row">
<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">
<img class="img-responsive" src="{% static 'datacenterlight/img/opennebula.png' %}" alt="Opennebula">
</div>
<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">
</div>
<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">
</div>
<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">
<img class="img-responsive" src="{% static 'datacenterlight/img/opennebula.png' %}" alt="Opennebula">
</div>
<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">
</div>
<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">
</div>
</div>
<div class="col-xs-12 col-sm-8 col-md-7 text-right">
<div class="tech-sub-sec">
<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>
@ -102,33 +99,30 @@
<div class="space">
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 tech-sub-sec">
<h2>{% trans "We bring the future to you." %}</h2>
</div>
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 text-left tech-sub-sec landscape-xs-6">
<p class="lead">{% blocktrans %} Data Center Light uses the most modern technologies out there.<br>
Your VM needs only IPv6. Data Center Light provides<br> transparent two-way IPv6/IPv4 translation.
{% endblocktrans %}</p>
</div>
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 percent-text text-right landscape-xs-6">
100% <strong>IPv6</strong>
</div>
</div>
<div class="col-lg-12 space-block"></div>
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 percent-text landscape-xs-8">
<span class="pull-left space-middle"> 100% <strong>SSD</strong></span> <span class="pull-left ssdimg"><img class="img-responsive" src="{% static 'datacenterlight/img/ssd.jpg' %}" alt="SSD"></span>
</div>
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 text-right tech-sub-sec padding-vertical landscape-xs-4">
<div>
<p class="lead">{% blocktrans %} No more spinning metal plates! Data Center Light uses only SSDs. We keep things faster and lighter. {% endblocktrans %}</p>
</div>
</div>
<div class="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">
<h2>{% trans "We bring the future to you." %}</h2>
</div>
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 text-left tech-sub-sec landscape-xs-6">
<p class="lead new-lead">{% blocktrans %} Data Center Light uses the most modern technologies out there.<br>
Your VM needs only IPv6. Data Center Light provides<br> transparent two-way IPv6/IPv4 translation.
{% endblocktrans %}</p>
</div>
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 percent-text text-right landscape-xs-6">
100% <strong>IPv6</strong>
</div>
</div>
<div class="col-lg-12 space-block"></div>
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<div class="col-xs-12 col-sm-7 col-md-8 col-lg-8 percent-text landscape-xs-8">
<span class="pull-left space-middle"> 100% <strong>SSD</strong></span> <span class="pull-left ssdimg"><img class="img-responsive" src="{% static 'datacenterlight/img/ssd.jpg' %}" alt="SSD"></span>
</div>
<div class="col-xs-12 col-sm-5 col-md-4 col-lg-4 text-right tech-sub-sec padding-vertical landscape-xs-4">
<div>
<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>
@ -142,7 +136,7 @@
<div class="row text-center">
<div class="col-xs-12 col-md-6 text">
<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 class="col-xs-12 col-md-6 hero-feature">
@ -150,94 +144,7 @@
<div class="landing card">
<img class="img-beta" src="{% static 'datacenterlight/img/beta-img.png' %}" alt="">
<div class="caption">
<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="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>
{% include "datacenterlight/calculator_form.html" %}
</div>
</div>
</div>
@ -249,6 +156,4 @@
</div>
<!-- End Why Data Center Light? -->
{% endblock %}
{% endblock %}

View file

@ -1,7 +1,7 @@
from django.views.generic import FormView, CreateView, TemplateView, DetailView
from django.http import HttpResponseRedirect
from .forms import BetaAccessForm
from .models import BetaAccess, BetaAccessVMType, BetaAccessVM
from .models import BetaAccess, BetaAccessVMType, BetaAccessVM, VMTemplate
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.core.mail import EmailMessage
@ -21,7 +21,7 @@ from datetime import datetime
from membership.models import CustomUser, StripeCustomer
from oca.pool import WrongIdError
from opennebula_api.models import OpenNebulaManager
from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer
from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer
class LandingProgramView(TemplateView):
@ -195,42 +195,69 @@ class IndexView(CreateView):
success_url = "/datacenterlight#requestform"
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)
def get(self, request, *args, **kwargs):
for session_var in ['specs', 'user', 'billing_address_data']:
if session_var in request.session:
del request.session[session_var]
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'
}
vm_templates = VMTemplate.objects.all()
context = {
'templates': vm_templates
}
return render(request, self.template_name, context)
def post(self, request):
cores = request.POST.get('cpu')
cores_field = forms.IntegerField(validators=[self.validate_cores])
memory = request.POST.get('ram')
memory_field = forms.IntegerField(validators=[self.validate_memory])
storage = request.POST.get('storage')
storage_field = forms.IntegerField(validators=[self.validate_storage])
price = request.POST.get('total')
template_id = int(request.POST.get('config'))
manager = OpenNebulaManager()
template = manager.get_template(template_id)
template_data = VirtualMachineTemplateSerializer(template).data
template = VMTemplate.objects.filter(opennebula_vm_template_id=template_id).first()
template_data = VMTemplateSerializer(template).data
name = request.POST.get('name')
email = request.POST.get('email')
name_field = forms.CharField()
email_field = forms.EmailField()
try:
cores = cores_field.clean(cores)
except ValidationError as err:
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:
name = name_field.clean(name)
except ValidationError as err:
@ -315,25 +342,6 @@ class WhyDataCenterLightView(IndexView):
template_name = "datacenterlight/whydatacenterlight.html"
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):
template_name = 'hosting/payment.html'
@ -345,6 +353,7 @@ class PaymentOrderView(FormView):
if billing_address_data:
form_kwargs.update({
'initial': {
'cardholder_name': billing_address_data['cardholder_name'],
'street_address': billing_address_data['street_address'],
'city': billing_address_data['city'],
'postal_code': billing_address_data['postal_code'],
@ -465,9 +474,9 @@ class OrderConfirmationView(DetailView):
template_id=vm_template_id,
specs=specs,
vm_name="{email}-{template_name}-{date}".format(
email=user.get('email'),
template_name=template.get('name'),
date=int(datetime.now().strftime("%s")))
email=user.get('email'),
template_name=template.get('name'),
date=int(datetime.now().strftime("%s")))
)
# 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{
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>
@ -132,7 +173,15 @@
<section id="services">
<div class="container">
<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>
<hr class="primary">
</div>
@ -526,4 +575,4 @@
</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>
<![endif]-->
<!-- <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');
ga('send', 'pageview');
</script>
<!-- Google analytics -->
{% include 'google_analytics.html' %}
<!-- End Google Analytics -->
<link rel="shortcut icon" href="{% static 'digitalglarus/img/favicon.ico' %}" type="image/x-icon">
<style id="igtranslator-color" type="text/css"></style>
<style type="text/css">

View file

@ -146,7 +146,6 @@ TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'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, 'membership'),
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/cms/ungleichch'),
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,
'OPTIONS': {
@ -516,8 +515,12 @@ DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS')
# Settings for Google analytics
GOOGLE_ANALYTICS_PROPERTY_IDS = {
'datacenterlight.ch': 'UA-62285904-9',
'ungleich.ch': 'UA-62285904-1',
'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',
'dynamicweb-development.ungleich.ch': 'development',
'dynamicweb-staging.ungleich.ch': 'staging'

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,55 +18,55 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: forms.py:28
#: forms.py:25
msgid "Your account is not activated yet."
msgstr "Dein Account wurde noch nicht aktiviert."
#: forms.py:65
#: forms.py:62
msgid "Paste here your public key"
msgstr "Fügen Sie Ihren public key ein"
#: templates/hosting/base_short.html:68
#: templates/hosting/base_short.html:71
msgid "My Virtual Machines"
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"
msgstr "Meine Bestellungen"
#: templates/hosting/base_short.html:82
#: templates/hosting/base_short.html:85
msgid "Keys"
msgstr "Schlüssel"
#: templates/hosting/base_short.html:87
#: templates/hosting/base_short.html:90
msgid "Notifications "
msgstr "Benachrichtigungen"
#: templates/hosting/base_short.html:90
#: templates/hosting/base_short.html:93
msgid "Logout"
msgstr "Abmelden"
#: templates/hosting/base_short.html:95
#: templates/hosting/base_short.html:98
msgid "How it works"
msgstr "So funktioniert es"
#: templates/hosting/base_short.html:98
#: templates/hosting/base_short.html:101
msgid "Your infrastructure"
msgstr "deine Infrastruktur"
#: templates/hosting/base_short.html:101
#: templates/hosting/base_short.html:104
msgid "Our inftrastructure"
msgstr "Unsere Infrastruktur"
#: templates/hosting/base_short.html:104
#: templates/hosting/base_short.html:107
msgid "Pricing"
msgstr "Preise"
#: templates/hosting/base_short.html:107
#: templates/hosting/base_short.html:110
msgid "Contact"
msgstr "Kontakt"
#: templates/hosting/base_short.html:110
#: templates/hosting/base_short.html:113
#: templates/hosting/confirm_reset_password.html:38
#: templates/hosting/login.html:17 templates/hosting/login.html.py:26
#: templates/hosting/reset_password.html:32 templates/hosting/signup.html:30
@ -185,20 +185,14 @@ msgid "New Virtual Machine"
msgstr "Neue virtuelle Maschine"
#: templates/hosting/create_virtual_machine.html:28
#, fuzzy
#| msgid "Select VM Template:"
msgid "Step 1. Select VM Template:"
msgstr "Wähle eine Vorlage"
#: templates/hosting/create_virtual_machine.html:42
#, fuzzy
#| msgid "Select VM Configuration:"
msgid "Step2. Select VM Configuration"
msgstr "Wähle eine Konfiguration"
#: templates/hosting/create_virtual_machine.html:59
#, fuzzy
#| msgid "Pricing"
msgid "Price "
msgstr "Preis"
@ -239,7 +233,7 @@ msgid "Don't have an account yet ? "
msgstr "Besitzt du kein Benutzerkonto?"
#: templates/hosting/login.html:37 templates/hosting/signup.html.py:13
#: templates/hosting/signup.html:21 views.py:223
#: templates/hosting/signup.html:21 views.py:219
msgid "Sign up"
msgstr "Registrieren"
@ -295,23 +289,23 @@ msgstr "Bezahlmethode"
msgid "Order summary"
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
msgid "Cores"
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
msgid "Memory"
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"
msgstr "Festplattenkapazität"
#: templates/hosting/order_detail.html:71
#: templates/hosting/order_detail.html:71 templates/hosting/payment.html:41
msgid "Total"
msgstr ""
msgstr "Gesamt"
#: templates/hosting/order_detail.html:77
msgid "Finish Configuration"
@ -355,42 +349,97 @@ msgstr "Schliessen"
msgid "Delete"
msgstr "Löschen"
#: templates/hosting/payment.html:12
msgid "Billing Amount"
msgstr "Rechnungsbetrag"
#: templates/hosting/payment.html:10
msgid "Your Order"
msgstr "Deine Bestellung"
#: templates/hosting/payment.html:26
#: templates/hosting/payment.html:22
#: templates/hosting/virtual_machine_detail.html:98
msgid "Configuration"
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"
msgstr "Rechnungsadresse"
#: templates/hosting/payment.html:52
msgid "Payment Details"
msgstr "Rechnungsdetails"
#: templates/hosting/payment.html:66
msgid "Credit Card"
msgstr "Kreditkarte"
#: templates/hosting/payment.html:65
msgid "Submit Payment"
msgstr "Betrag überweisen"
#: templates/hosting/payment.html:71
msgid ""
"\n"
" Please fill in your credit card information "
"below. We are using <a\n"
" href=\"https://stripe.com\" target="
"\"_blank\">Stripe</a> for payment and do not store\n"
" your information in our database.\n"
" "
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
msgid "CARD NUMBER"
#: templates/hosting/payment.html:90
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"
#: templates/hosting/payment.html:89
msgid "Valid Card Number"
msgstr "Gültige Kreditkartennummer"
#: templates/hosting/payment.html:98
msgid "EXPIRATION DATE"
#: templates/hosting/payment.html:117
msgid "Expiry Date"
msgstr "Ablaufdatum"
#: templates/hosting/payment.html:109
msgid "CV CODE"
msgstr "CV Code"
#: templates/hosting/payment.html:122
msgid "CVC"
msgstr ""
#: templates/hosting/payment.html:126
msgid "Card Type"
msgstr "Kartentyp"
#: templates/hosting/payment.html:135
msgid ""
"\n"
" You are not making any payment "
"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
msgid "Reset your password"
@ -431,14 +480,10 @@ msgid "Created at"
msgstr "Erstellt am"
#: templates/hosting/user_keys.html:43
#, fuzzy
#| msgid "Delete"
msgid "Delete Key"
msgstr "Löschen"
#: templates/hosting/user_keys.html:56
#, fuzzy
#| msgid "Do You want do delete your order?"
msgid "Do You want to delete this key?"
msgstr "Möchtest Du den Schlüssel löschen?"
@ -502,11 +547,11 @@ msgstr "IPv4"
msgid "Ipv6"
msgstr "IPv6"
#: views.py:213 views.py:232
#: views.py:207 views.py:229
msgid "login"
msgstr "einloggen"
#: views.py:217
#: views.py:212
msgid ""
"Thank you for signing up. We have sent an email to you. Please follow the "
"instructions in it to activate your account. Once activated, you can login "
@ -516,32 +561,55 @@ msgstr ""
"den Anweisungen um deinen Account zu aktivieren. Danach kannst du dich über "
"diesen"
#: views.py:218 views.py:243
#: views.py:214 views.py:240
msgid "Go back to"
msgstr "Zurück"
#: views.py:233
#: views.py:230
msgid "Account activation"
msgstr "Accountaktivierung"
#: views.py:236
#: views.py:233
msgid "Your account has been activated."
msgstr "Dein Account wurde aktiviert."
#: views.py:237
#: views.py:234
msgid "You can now"
msgstr "Du kannst dich nun"
#: views.py:242
#: views.py:239
msgid "Sorry. Your request is invalid."
msgstr "Entschuldigung, deine Anfrage ist ungültig."
#: views.py:760
#: views.py:757
msgid ""
"We could not find the requested VM. Please "
"contact Data Center Light Support."
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"
#~ msgstr "Home"

View file

@ -4,14 +4,15 @@
* For details, see http://www.apache.org/licenses/LICENSE-2.0.
*/
@font-face {
font-family: 'Lato-Regular';
src: url('../fonts/Lato/Lato-Regular.ttf');
}
@font-face {
src: url('../fonts/Lato/Lato-Black.ttf');
}
@font-face {
font-family: 'Lato-Light';
src: url('../fonts/Lato/Lato-Light.ttf');
@ -33,10 +34,35 @@ h6 {
font-family: 'Lato-Regular', sans-serif;
font-weight: 300;
}
.topnav {
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 {
font-size: 18px;
font-weight: 400;
@ -191,17 +217,19 @@ h6 {
float: right;
margin-top: 0;
}
/*------Auth section---------*/
.auth-container{
.auth-container {
height: 100vh;
position: relative;
}
.auth-bg{
.auth-bg {
background: url(../img/auth-bg.jpg);
position: fixed;
left: 0;
top: 0;
width: 100%;
width: 100%;
height: 100vh;
background-repeat: no-repeat;
background-position: center center;
@ -209,7 +237,8 @@ h6 {
background-attachment: fixed;
}
.auth-bg::before{
.auth-bg::before {
content: "";
position: absolute;
top: 0;
@ -219,26 +248,30 @@ h6 {
background: rgba(75, 75, 101, 0.55);
z-index: 1;
}
.auth-container .container{
.auth-container .container {
z-index: 1000;
}
.auth-container .auth-content{
.auth-container .auth-content {
width: 100%;
margin: 0 auto;
max-width: 390px;
}
.auth-container .auth-center{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
.auth-container .auth-center {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 100%;
}
.auth-container .auth-title{
.auth-container .auth-title {
margin-bottom: 50px;
}
.auth-container .auth-title h2{
.auth-container .auth-title h2 {
color: #fff;
font-size: 44px;
text-align: center;
@ -247,7 +280,8 @@ h6 {
margin-bottom: 30px;
position: relative;
}
.auth-container .auth-title h2::after{
.auth-container .auth-title h2::after {
content: "";
position: absolute;
bottom: -20px;
@ -258,17 +292,17 @@ h6 {
transform: translate(-50%, 0);
}
.auth-box{
.auth-box {
background: #fff;
padding: 0;
padding-bottom: 30px;
box-sizing: border-box;
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
border-radius: 4px;
z-index: 10;
}
.auth-box .section-heading{
.auth-box .section-heading {
color: #5a5a5a;
padding-top: 30px;
padding-bottom: 5px;
@ -279,42 +313,51 @@ h6 {
border-radius: 3px 3px 0px 0px;
margin: 0 auto;
}
.auth-box .form{
.auth-box .form {
padding: 20px;
width: 80%;
margin: 0 auto;
}
.auth-box .form .red{
.auth-box .form .red {
color: #ea3a3a;
}
.auth-box .form .btn{
box-shadow: 0 0px 9px rgba(0,0,0,0.19), 0 3px 5px rgba(0,0,0,0.23);
.auth-box .form .btn {
box-shadow: 0 0px 9px rgba(0, 0, 0, 0.19), 0 3px 5px rgba(0, 0, 0, 0.23);
letter-spacing: 3px;
font-size: 17px;
text-transform: uppercase;
}
.auth-box .form .form-control{
.auth-box .form .form-control {
height: 44px;
font-size: 16px;
}
.auth-box .auth-footer {
text-align: center;
padding: 10px;
}
.auth-box .auth-footer .text{
.auth-box .auth-footer .text {
color: #777;
}
.auth-box .auth-footer .links a{
color: #1e94cc;
}
.auth-box .auth-footer .links a:hover{
.auth-box .auth-footer .links a {
color: #1e94cc;
}
.auth-box.sign-up{
.auth-box .auth-footer .links a:hover {
color: #1e94cc;
}
.auth-box.sign-up {
padding-bottom: 5px;
}
.auth-box.sign-up .form{
.auth-box.sign-up .form {
padding: 15px 20px 0 20px;
}
@ -325,6 +368,7 @@ h6 {
line-height: 30px;
font-family: 'Lato' !important;
}
.sign-up-message a {
font-size: 18px;
color: #1e94cc !important;
@ -353,38 +397,47 @@ h6 {
ul.banner-social-buttons > li:last-child {
margin-bottom: 0;
}
.auth-box .form {
padding: 15px 0px 0 0;
}
.auth-box.sign-up .form {
padding: 15px 0px 0 0;
}
.auth-box .form .form-control {
height: 44px;
font-size: 13px;
}
.auth-container .auth-title {
display: none;
}
}
@media (max-width: 540px) {
.auth-container .auth-title h2{
.auth-container .auth-title h2 {
font-size: 32px;
width: 90%;
margin-bottom: 50px;
}
.auth-container.auth-signup .auth-title h2{
.auth-container.auth-signup .auth-title h2 {
font-size: 20px;
width: 90%;
margin-bottom: 50px;
}
.auth-box .form {
width: 90%;
}
.auth-box .section-heading {
font-size: 15px;
}
}
footer {
padding: 2%;
background-color: #f8f8f8;
@ -418,3 +471,246 @@ a.unlink:hover {
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;
}
$.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))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
}
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;
if (!hasCreditcard){
if (!hasCreditcard) {
var stripe = Stripe(window.stripeKey);
var elements = stripe.elements({locale: window.current_lan});
var card = elements.create('card', options={hidePostalCode: true});
card.mount('#card-element');
var element_style = {
fonts: [{
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);
// hasCreditcard= true;
@ -42,85 +146,58 @@ $( document ).ready(function() {
submit_form_btn.on('click', submit_payment);
function submit_payment(e){
e.preventDefault();
console.log("creditcard sdasd");
// if (hasCreditcard) {
$('#billing-form').submit();
// }
function submit_payment(e) {
e.preventDefault();
console.log("creditcard sdasd");
// if (hasCreditcard) {
$('#billing-form').submit();
// }
}
var $form_new = $('#payment-form-new');
$form_new.submit(payWithStripe_new);
var $form = $('#payment-form');
$form.submit(payWithStripe);
/* If you're using Stripe for payments */
function payWithStripe(e) {
function payWithStripe_new(e) {
e.preventDefault();
function stripeTokenHandler(token) {
// Insert the token ID into the form so it gets submitted to the server
var form = document.getElementById('payment-form');
var hiddenInput = document.createElement('input');
$('#id_token').val(token.id);
$('#billing-form').submit();
// Insert the token ID into the form so it gets submitted to the server
var form = document.getElementById('payment-form-new');
$('#id_token').val(token.id);
$('#billing-form').submit();
}
stripe.createToken(card).then(function(result) {
stripe.createToken(cardNumberElement).then(function (result) {
if (result.error) {
// Inform the user if there was an error
var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message;
// Inform the user if there was an error
var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message;
} 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
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 */
$.validator.addMethod("month", function(value, element) {
return this.optional(element) || /^(01|02|03|04|05|06|07|08|09|10|11|12)$/.test(value);
$.validator.addMethod("month", function (value, element) {
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.");
$.validator.addMethod("year", function(value, element) {
return this.optional(element) || /^[0-9]{2}$/.test(value);
$.validator.addMethod("year", function (value, element) {
return this.optional(element) || /^[0-9]{2}$/.test(value);
}, "Please specify a valid 2-digit year.");
validator = $form.validate({
validator = $form_new.validate({
rules: {
cardNumber: {
required: true,
@ -140,28 +217,16 @@ $( document ).ready(function() {
digits: true
}
},
highlight: function(element) {
highlight: function (element) {
$(element).closest('.form-control').removeClass('success').addClass('error');
},
unhighlight: function(element) {
unhighlight: function (element) {
$(element).closest('.form-control').removeClass('error').addClass('success');
},
errorPlacement: function(error, element) {
errorPlacement: function (error, element) {
$(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);
// var readyInterval = setInterval(function() {
// if (paymentFormReady()) {

View file

@ -45,16 +45,10 @@
}
</style>
{% 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');
ga('send', 'pageview');
</script>
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
</head>
<body>

View file

@ -41,29 +41,34 @@
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
</head>
<body>
<!-- Navigation -->
{% block navbar %}
<nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation">
<div class="container topnav">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<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>
</div>
{% if request.user.is_authenticated %}
<!-- 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">
<!-- Navigation -->
<nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation">
<div class="container topnav">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<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>
</div>
{% if request.user.is_authenticated %}
<!-- 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>
<a href="{% url 'hosting: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>
</ul>
</li>
<!--
<li>
<a href="{{ request.session.hosting_url}}#how">{% trans "How it works"%}</a>
</li>
<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>
</ul>
</div>
{% endif %}
<!-- /.navbar-collapse -->
</div>
{% endif %}
<!-- /.navbar-collapse -->
</div>
<!-- /.container -->
</nav>
<!-- /.container -->
</nav>
{% endblock navbar %}
<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/respond.js/1.4.2/respond.min.js"></script>
<![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');
ga('send', 'pageview');
</script>
<!-- Google analytics -->
{% include 'google_analytics.html' %}
<!-- End Google Analytics -->
</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="//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" />
<!-- Google analytics -->
{% include 'google_analytics.html' %}
<!-- End Google Analytics -->
</head>
<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" %}
{% load i18n %}
{% load staticfiles bootstrap3%}
{% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %}
{% block content %}
<div class="auth-container">
<div class="auth-bg"></div>
<div class="auth-center">
<div class="auth-title">
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
</div>
<div class="auth-content">
<div class="intro-message auth-box">
<h2 class="section-heading">{% trans "Login"%}</h2>
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidated>
@ -26,8 +31,8 @@
{% trans "Login"%}
</button>
{% endbuttons %}
<input type='hidden' name='next' value='{{request.GET.next}}'/>
<input type='hidden' name='next' value='{{request.GET.next}}'/>
</form>
<div class="auth-footer">
<div class="text">

View file

@ -24,15 +24,7 @@
</div>
<hr>
<div class="row">
<div class="col-xs-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 class="col-xs-6 text-right">
<div class="col-xs-12 col-md-6 pull-right order-confirm-date">
<address>
<strong>{% trans "Date"%}:</strong><br>
<span id="order-created_at">{{order.created_at|date:'Y-m-d H:i'}}</span><br><br>
@ -44,6 +36,15 @@
</address>
</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 class="row">
<div class="col-xs-6">

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -129,6 +129,12 @@ class VirtualMachineSerializer(serializers.Serializer):
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):
return int(string.replace(':', ''), 16)

View file

@ -34,6 +34,10 @@
{% endblock %}
{% render_block "external-css" %}
{% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
</head>
<body>
@ -60,16 +64,7 @@
{% bootstrap_javascript %}
{% endaddtoblock %}
{% 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/js/navbar-scroll-up.js' %}" type="text/javascript" />

View file

@ -16,7 +16,7 @@
</h2>
</a>
<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 class="post-subtitle">

View file

@ -31,26 +31,9 @@
<link href="{% static 'ungleich_page/css/ungleich.css' %}" rel="stylesheet">
<!-- 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');
ga('send', 'pageview');
</script>
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon">
<style id="igtranslator-color" type="text/css"></style>
</head>

View file

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

View file

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