merged master
This commit is contained in:
commit
10108f7d93
15 changed files with 763 additions and 480 deletions
29
datacenterlight/management/commands/fetchvmtemplates.py
Normal file
29
datacenterlight/management/commands/fetchvmtemplates.py
Normal 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)))
|
|
@ -15,6 +15,7 @@ class BetaAccessVMType(models.Model):
|
||||||
class BetaAccess(models.Model):
|
class BetaAccess(models.Model):
|
||||||
email = models.CharField(max_length=250)
|
email = models.CharField(max_length=250)
|
||||||
name = models.CharField(max_length=250)
|
name = models.CharField(max_length=250)
|
||||||
|
|
||||||
# vm = models.ForeignKey(BetaAccessVM)
|
# vm = models.ForeignKey(BetaAccessVM)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
@ -48,3 +49,13 @@ class BetaAccessVM(models.Model):
|
||||||
amount=vm[VM_AMOUNT], type=vm_type))
|
amount=vm[VM_AMOUNT], type=vm_type))
|
||||||
|
|
||||||
return created_vms
|
return created_vms
|
||||||
|
|
||||||
|
|
||||||
|
class VMTemplate(models.Model):
|
||||||
|
name = models.CharField(max_length=50)
|
||||||
|
opennebula_vm_template_id = models.IntegerField()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(cls, name, opennebula_vm_template_id):
|
||||||
|
vm_template = cls(name=name, opennebula_vm_template_id=opennebula_vm_template_id)
|
||||||
|
return vm_template
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,22 +1,22 @@
|
||||||
(function($){
|
(function($) {
|
||||||
"use strict"; // Start of use strict
|
"use strict"; // Start of use strict
|
||||||
|
|
||||||
|
|
||||||
/* ---------------------------------------------
|
/* ---------------------------------------------
|
||||||
Scripts initialization
|
Scripts initialization
|
||||||
--------------------------------------------- */
|
--------------------------------------------- */
|
||||||
var cardPricing ={
|
var cardPricing = {
|
||||||
'cpu': {
|
'cpu': {
|
||||||
'id': 'coreValue',
|
'id': 'coreValue',
|
||||||
'value': 1,
|
'value': 1,
|
||||||
'min':1,
|
'min': 1,
|
||||||
'max': 48,
|
'max': 48,
|
||||||
'interval': 1
|
'interval': 1
|
||||||
},
|
},
|
||||||
'ram': {
|
'ram': {
|
||||||
'id': 'ramValue',
|
'id': 'ramValue',
|
||||||
'value': 2,
|
'value': 2,
|
||||||
'min':2,
|
'min': 2,
|
||||||
'max': 200,
|
'max': 200,
|
||||||
'interval': 1
|
'interval': 1
|
||||||
},
|
},
|
||||||
|
@ -28,12 +28,12 @@
|
||||||
'interval': 10
|
'interval': 10
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
$(window).load(function(){
|
$(window).load(function() {
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function() {
|
||||||
verifiedUrl();
|
verifiedUrl();
|
||||||
_navScroll();
|
_navScroll();
|
||||||
_initScroll();
|
_initScroll();
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$(window).resize(function(){
|
$(window).resize(function() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,96 +59,106 @@
|
||||||
}, function() {
|
}, function() {
|
||||||
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
|
$(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
/* the viewport is less than 400 pixels wide */
|
/* the viewport is less than 400 pixels wide */
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function _initScroll(){
|
|
||||||
$(window).scroll(function(){
|
|
||||||
_navScroll();
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _navScroll(){
|
|
||||||
if($(window).scrollTop() > 10 ){
|
|
||||||
|
function _initScroll() {
|
||||||
|
$(window).scroll(function() {
|
||||||
|
_navScroll();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function _navScroll() {
|
||||||
|
if ($(window).scrollTop() > 10) {
|
||||||
$(".navbar").removeClass("navbar-transparent");
|
$(".navbar").removeClass("navbar-transparent");
|
||||||
$(".navbar-default .btn-link").css("color", "#777");
|
$(".navbar-default .btn-link").css("color", "#777");
|
||||||
$(".dropdown-menu").removeClass("navbar-transparent");
|
$(".dropdown-menu").removeClass("navbar-transparent");
|
||||||
$(".dropdown-menu > li > a").css("color", "#777");
|
$(".dropdown-menu > li > a").css("color", "#777");
|
||||||
}else{
|
} else {
|
||||||
$(".navbar").addClass("navbar-transparent");
|
$(".navbar").addClass("navbar-transparent");
|
||||||
$(".navbar-default .btn-link").css("color", "#fff");
|
$(".navbar-default .btn-link").css("color", "#fff");
|
||||||
$(".dropdown-menu").addClass("navbar-transparent");
|
$(".dropdown-menu").addClass("navbar-transparent");
|
||||||
$(".dropdown-menu > li > a").css("color", "#fff");
|
$(".dropdown-menu > li > a").css("color", "#fff");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function _initNavUrl(){
|
|
||||||
$('.url').click(function(){
|
function _initNavUrl() {
|
||||||
|
$('.url').click(function(event) {
|
||||||
|
event.preventDefault();
|
||||||
var href = $(this).attr('data-url');
|
var href = $(this).attr('data-url');
|
||||||
$('.navbar-collapse').removeClass('in');
|
$('.navbar-collapse').removeClass('in');
|
||||||
$('.navbar-collapse').addClass('collapsing');
|
$('.navbar-collapse').addClass('collapsing');
|
||||||
|
var url = window.location.pathname;
|
||||||
|
var urlSplit = url.split('/');
|
||||||
|
if (urlSplit.length === 3 && urlSplit[2] === 'datacenterlight') {
|
||||||
$('html, body').animate({
|
$('html, body').animate({
|
||||||
scrollTop: $(href).offset().top
|
scrollTop: $(href).offset().top
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
} else {
|
||||||
|
var allUrl = window.location.href;
|
||||||
|
var redirect = allUrl.split('whydatacenterlight')
|
||||||
|
window.location.href = '/en-us/datacenterlight' + href;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function verifiedUrl(){
|
|
||||||
if(window.location.href.indexOf('#success') > -1){
|
function verifiedUrl() {
|
||||||
|
if (window.location.href.indexOf('#success') > -1) {
|
||||||
form_success();
|
form_success();
|
||||||
console.log('epa');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _initPricing(){
|
function _initPricing() {
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
|
|
||||||
$('.fa-minus-circle.left').click(function(event){
|
$('.fa-minus-circle.left').click(function(event) {
|
||||||
var data = $(this).data('minus');
|
var data = $(this).data('minus');
|
||||||
|
|
||||||
if(cardPricing[data].value > cardPricing[data].min){
|
if (cardPricing[data].value > cardPricing[data].min) {
|
||||||
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
|
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
|
||||||
}
|
}
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
});
|
});
|
||||||
$('.fa-plus-circle.right').click(function(event){
|
$('.fa-plus-circle.right').click(function(event) {
|
||||||
var data = $(this).data('plus');
|
var data = $(this).data('plus');
|
||||||
if(cardPricing[data].value < cardPricing[data].max){
|
if (cardPricing[data].value < cardPricing[data].max) {
|
||||||
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
|
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
|
||||||
}
|
}
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.input-price').change(function(){
|
$('.input-price').change(function() {
|
||||||
var data = $(this).attr("name");
|
var data = $(this).attr("name");
|
||||||
cardPricing[data].value = $('input[name='+data+']').val();
|
cardPricing[data].value = $('input[name=' + data + ']').val();
|
||||||
_fetchPricing();
|
_fetchPricing();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function _fetchPricing(){
|
|
||||||
Object.keys(cardPricing).map(function(element){
|
function _fetchPricing() {
|
||||||
|
Object.keys(cardPricing).map(function(element) {
|
||||||
//$('#'+cardPricing[element].id).val(cardPricing[element].value);
|
//$('#'+cardPricing[element].id).val(cardPricing[element].value);
|
||||||
$('input[name='+element+']').val(cardPricing[element].value);
|
$('input[name=' + element + ']').val(cardPricing[element].value);
|
||||||
});
|
});
|
||||||
_calcPricing();
|
_calcPricing();
|
||||||
}
|
}
|
||||||
|
|
||||||
function _calcPricing(){
|
function _calcPricing() {
|
||||||
var total = (cardPricing['cpu'].value * 5) + (2* cardPricing['ram'].value) + (0.6* cardPricing['storage'].value);
|
var total = (cardPricing['cpu'].value * 5) + (2 * cardPricing['ram'].value) + (0.6 * cardPricing['storage'].value);
|
||||||
total = parseFloat(total.toFixed(2));
|
total = parseFloat(total.toFixed(2));
|
||||||
|
|
||||||
$("#total").text(total);
|
$("#total").text(total);
|
||||||
$('input[name=total]').val(total);
|
$('input[name=total]').val(total);
|
||||||
}
|
}
|
||||||
function form_success(){
|
|
||||||
|
function form_success() {
|
||||||
$('#sucessModal').modal('show');
|
$('#sucessModal').modal('show');
|
||||||
}
|
}
|
||||||
function _calculate(numbers, price){
|
|
||||||
$('#valueTotal').text(numbers*price*31);
|
function _calculate(numbers, price) {
|
||||||
|
$('#valueTotal').text(numbers * price * 31);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|
|
@ -18,35 +18,62 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="description input">
|
<div class="description input">
|
||||||
<i class="fa fa-minus-circle left" data-minus="cpu" aria-hidden="true"></i>
|
<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>
|
<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>
|
<span> Core</span>
|
||||||
<i class="fa fa-plus-circle right" data-plus="cpu" aria-hidden="true"></i>
|
<i class="fa fa-plus-circle right" data-plus="cpu" aria-hidden="true"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="help-block with-errors"></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>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="description input">
|
<div class="description input">
|
||||||
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
|
<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>
|
<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>
|
<span> GB RAM</span>
|
||||||
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
|
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="help-block with-errors"></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>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="description input">
|
<div class="description input">
|
||||||
<i class="fa fa-minus-circle left" data-minus="storage" aria-hidden="true"></i>
|
<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>
|
<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>
|
<span>{% trans "GB Storage (SSD)" %}</span>
|
||||||
<i class="fa fa-plus-circle right" data-plus="storage" aria-hidden="true"></i>
|
<i class="fa fa-plus-circle right" data-plus="storage" aria-hidden="true"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="help-block with-errors"></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>
|
||||||
<div class="description select-configuration input form-group justify-center">
|
<div class="description select-configuration input form-group justify-center">
|
||||||
<label for="config">OS</label>
|
<label for="config">OS</label>
|
||||||
<select name="config" id="">
|
<select name="config" id="">
|
||||||
{% for template in templates %}
|
{% for template in templates %}
|
||||||
<option value="{{template.id}}">{{template.name}} </option>
|
<option value="{{template.opennebula_vm_template_id}}">{{template.name}}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
@ -57,14 +84,17 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="description input justify-center">
|
<div class="description input justify-center">
|
||||||
<label for="name" class="control-label">{% trans "Name"%}</label>
|
<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>
|
<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>
|
||||||
<div class="help-block with-errors">
|
<div class="help-block with-errors">
|
||||||
{% for message in messages %}
|
{% for message in messages %}
|
||||||
{% if 'name' in message.tags %}
|
{% if 'name' in message.tags %}
|
||||||
<ul class="list-unstyled"><li>
|
<ul class="list-unstyled">
|
||||||
|
<li>
|
||||||
{{ message|safe }}
|
{{ message|safe }}
|
||||||
</li></ul>
|
</li>
|
||||||
|
</ul>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
@ -72,14 +102,18 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="description input justify-center">
|
<div class="description input justify-center">
|
||||||
<label for="email" class="control-label">{% trans "Email"%}</label>
|
<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>
|
<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>
|
||||||
<div class="help-block with-errors">
|
<div class="help-block with-errors">
|
||||||
{% for message in messages %}
|
{% for message in messages %}
|
||||||
{% if 'email' in message.tags %}
|
{% if 'email' in message.tags %}
|
||||||
<ul class="list-unstyled"><li>
|
<ul class="list-unstyled">
|
||||||
|
<li>
|
||||||
{{ message|safe }}
|
{{ message|safe }}
|
||||||
</li></ul>
|
</li>
|
||||||
|
</ul>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
</button>
|
</button>
|
||||||
{% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %}
|
{% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %}
|
||||||
<a href="{% url 'datacenterlight:index' %}" id="logoBlack" class="navbar-brand topnav url" data-url="#home"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
|
<a href="{% url 'datacenterlight:index' %}" id="logoBlack" class="navbar-brand topnav" data-url="#home"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
|
||||||
<a href="{% url 'datacenterlight:index' %}" id="logoWhite" class="navbar-brand topnav url" data-url="#home"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
|
<a href="{% url 'datacenterlight:index' %}" id="logoWhite" class="navbar-brand topnav" data-url="#home"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a href="{% url 'datacenterlight:index' %}" id="logoBlack" class="navbar-brand topnav url"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
|
<a href="{% url 'datacenterlight:index' %}" id="logoBlack" class="navbar-brand topnav"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
|
||||||
<a href="{% url 'datacenterlight:index' %}" id="logoWhite" class="navbar-brand topnav url"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
|
<a href="{% url 'datacenterlight:index' %}" id="logoWhite" class="navbar-brand topnav"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -25,15 +25,15 @@
|
||||||
{% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %}
|
{% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %}
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a class="dropdown-toggle visible-mobile" href="#" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Highlights" %}<span class="caret"></span></a>
|
<a class="dropdown-toggle visible-mobile" href="#" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Highlights" %}<span class="caret"></span></a>
|
||||||
<a class="dropdown-toggle url disabled visible-desktop" href="{% url 'datacenterlight:index' %}#how" data-url="#how" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Highlights" %}<span class="caret"></span></a>
|
<a class="dropdown-toggle url disabled visible-desktop menu-url" data-url="#how" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Highlights" %}<span class="caret"></span></a>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a class="url" href="{% url 'datacenterlight:index' %}#your" data-url="#your" >{% trans "Scale out" %}</a></li>
|
<li><a class="url menu-url" data-url="#your" href="#your">{% trans "Scale out" %}</a></li>
|
||||||
<li><a class="url" href="{% url 'datacenterlight:index' %}#our" data-url="#our">{% trans "Reliable and light" %}</a></li>
|
<li><a class="url menu-url" data-url="#our" href="#our">{% trans "Reliable and light" %}</a></li>
|
||||||
<li> <a class="url" href="{% url 'datacenterlight:index' %}#price" data-url="#price" >{% trans "Order VM" %}</a></li>
|
<li> <a class="url menu-url" data-url="#price" href="#price">{% trans "Order VM" %}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="url" href="{% url 'datacenterlight:index' %}/whydatacenterlight" >{% trans "Why Data Center Light?" %}</a>
|
<a href="{% url 'datacenterlight:index' %}/whydatacenterlight" >{% trans "Why Data Center Light?" %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="url" href="{% url 'datacenterlight:index' %}#contact" data-url="#contact" >{% trans "Contact" %}</a>
|
<a class="url" href="{% url 'datacenterlight:index' %}#contact" data-url="#contact" >{% trans "Contact" %}</a>
|
||||||
|
@ -48,11 +48,12 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<i class="fa fa-globe" aria-hidden="true"></i>
|
<i class="fa fa-globe" aria-hidden="true"></i>
|
||||||
</div>
|
</div>
|
||||||
<div onclick="return true" class="drop-language">
|
|
||||||
|
<div class="drop-language">
|
||||||
{% if LANGUAGE_CODE == 'en-us'%}
|
{% if LANGUAGE_CODE == 'en-us'%}
|
||||||
<a class="url" href="{% change_lang 'de' %}">Deutsch</a>
|
<a href="{% change_lang 'de' %}">Deutsch</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a class="url" href="{% change_lang 'en-us' %}" >English</a>
|
<a href="{% change_lang 'en-us' %}" >English</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from django.views.generic import FormView, CreateView, TemplateView, DetailView
|
from django.views.generic import FormView, CreateView, TemplateView, DetailView
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from .forms import BetaAccessForm
|
from .forms import BetaAccessForm
|
||||||
from .models import BetaAccess, BetaAccessVMType, BetaAccessVM
|
from .models import BetaAccess, BetaAccessVMType, BetaAccessVM, VMTemplate
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.core.mail import EmailMessage
|
from django.core.mail import EmailMessage
|
||||||
|
@ -21,7 +21,7 @@ from datetime import datetime
|
||||||
from membership.models import CustomUser, StripeCustomer
|
from membership.models import CustomUser, StripeCustomer
|
||||||
|
|
||||||
from opennebula_api.models import OpenNebulaManager
|
from opennebula_api.models import OpenNebulaManager
|
||||||
from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer
|
from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer, VMTemplateSerializer
|
||||||
|
|
||||||
|
|
||||||
class LandingProgramView(TemplateView):
|
class LandingProgramView(TemplateView):
|
||||||
|
@ -194,41 +194,68 @@ class IndexView(CreateView):
|
||||||
success_url = "/datacenterlight#requestform"
|
success_url = "/datacenterlight#requestform"
|
||||||
success_message = "Thank you, we will contact you as soon as possible"
|
success_message = "Thank you, we will contact you as soon as possible"
|
||||||
|
|
||||||
|
def validate_cores(self, value):
|
||||||
|
if (value > 48) or (value < 1):
|
||||||
|
raise ValidationError(_('Not a proper cores number'))
|
||||||
|
|
||||||
|
def validate_memory(self, value):
|
||||||
|
if (value > 200) or (value < 2):
|
||||||
|
raise ValidationError(_('Not a proper ram number'))
|
||||||
|
|
||||||
|
def validate_storage(self, value):
|
||||||
|
if (value > 2000) or (value < 10):
|
||||||
|
raise ValidationError(_('Not a proper storage number'))
|
||||||
|
|
||||||
@cache_control(no_cache=True, must_revalidate=True, no_store=True)
|
@cache_control(no_cache=True, must_revalidate=True, no_store=True)
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
for session_var in ['specs', 'user', 'billing_address_data']:
|
for session_var in ['specs', 'user', 'billing_address_data']:
|
||||||
if session_var in request.session:
|
if session_var in request.session:
|
||||||
del request.session[session_var]
|
del request.session[session_var]
|
||||||
try:
|
|
||||||
manager = OpenNebulaManager()
|
vm_templates = VMTemplate.objects.all()
|
||||||
templates = manager.get_templates()
|
|
||||||
context = {
|
context = {
|
||||||
'templates': VirtualMachineTemplateSerializer(templates, many=True).data
|
'templates': vm_templates
|
||||||
}
|
|
||||||
except:
|
|
||||||
messages.error(request,
|
|
||||||
'We have a temporary problem to connect to our backend. \
|
|
||||||
Please try again in a few minutes'
|
|
||||||
)
|
|
||||||
context = {
|
|
||||||
'error': 'connection'
|
|
||||||
}
|
}
|
||||||
return render(request, self.template_name, context)
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
cores = request.POST.get('cpu')
|
cores = request.POST.get('cpu')
|
||||||
|
cores_field = forms.IntegerField(validators=[self.validate_cores])
|
||||||
memory = request.POST.get('ram')
|
memory = request.POST.get('ram')
|
||||||
|
memory_field = forms.IntegerField(validators=[self.validate_memory])
|
||||||
storage = request.POST.get('storage')
|
storage = request.POST.get('storage')
|
||||||
|
storage_field = forms.IntegerField(validators=[self.validate_storage])
|
||||||
price = request.POST.get('total')
|
price = request.POST.get('total')
|
||||||
template_id = int(request.POST.get('config'))
|
template_id = int(request.POST.get('config'))
|
||||||
manager = OpenNebulaManager()
|
template = VMTemplate.objects.filter(opennebula_vm_template_id=template_id).first()
|
||||||
template = manager.get_template(template_id)
|
template_data = VMTemplateSerializer(template).data
|
||||||
template_data = VirtualMachineTemplateSerializer(template).data
|
|
||||||
|
|
||||||
name = request.POST.get('name')
|
name = request.POST.get('name')
|
||||||
email = request.POST.get('email')
|
email = request.POST.get('email')
|
||||||
name_field = forms.CharField()
|
name_field = forms.CharField()
|
||||||
email_field = forms.EmailField()
|
email_field = forms.EmailField()
|
||||||
|
|
||||||
|
try:
|
||||||
|
cores = cores_field.clean(cores)
|
||||||
|
except ValidationError as err:
|
||||||
|
msg = '{} : {}.'.format(cores, str(err))
|
||||||
|
messages.add_message(self.request, messages.ERROR, msg, extra_tags='cores')
|
||||||
|
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
|
||||||
|
|
||||||
|
try:
|
||||||
|
memory = memory_field.clean(memory)
|
||||||
|
except ValidationError as err:
|
||||||
|
msg = '{} : {}.'.format(memory, str(err))
|
||||||
|
messages.add_message(self.request, messages.ERROR, msg, extra_tags='memory')
|
||||||
|
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
|
||||||
|
|
||||||
|
try:
|
||||||
|
storage = storage_field.clean(storage)
|
||||||
|
except ValidationError as err:
|
||||||
|
msg = '{} : {}.'.format(storage, str(err))
|
||||||
|
messages.add_message(self.request, messages.ERROR, msg, extra_tags='storage')
|
||||||
|
return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
name = name_field.clean(name)
|
name = name_field.clean(name)
|
||||||
except ValidationError as err:
|
except ValidationError as err:
|
||||||
|
@ -313,25 +340,6 @@ class WhyDataCenterLightView(IndexView):
|
||||||
template_name = "datacenterlight/whydatacenterlight.html"
|
template_name = "datacenterlight/whydatacenterlight.html"
|
||||||
model = BetaAccess
|
model = BetaAccess
|
||||||
|
|
||||||
@cache_control(no_cache=True, must_revalidate=True, no_store=True)
|
|
||||||
def get(self, request, *args, **kwargs):
|
|
||||||
try:
|
|
||||||
manager = OpenNebulaManager()
|
|
||||||
templates = manager.get_templates()
|
|
||||||
context = {
|
|
||||||
'templates': VirtualMachineTemplateSerializer(templates, many=True).data,
|
|
||||||
}
|
|
||||||
except:
|
|
||||||
messages.error(
|
|
||||||
request,
|
|
||||||
'We have a temporary problem to connect to our backend. \
|
|
||||||
Please try again in a few minutes'
|
|
||||||
)
|
|
||||||
context = {
|
|
||||||
'error': 'connection'
|
|
||||||
}
|
|
||||||
return render(request, self.template_name, context)
|
|
||||||
|
|
||||||
|
|
||||||
class PaymentOrderView(FormView):
|
class PaymentOrderView(FormView):
|
||||||
template_name = 'hosting/payment.html'
|
template_name = 'hosting/payment.html'
|
||||||
|
|
|
@ -39,6 +39,30 @@ h6 {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.navbar-transparent {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-transparent .navbar-nav>li>a {
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
font-family: 'Lato-Regular', sans-serif;
|
||||||
|
}
|
||||||
|
.navbar-transparent .navbar-nav>li>a:hover {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.navbar-transparent .navbar-nav>li>a:focus, .navbar-transparent .navbar-nav>li>a:hover {
|
||||||
|
color: #fff;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-transparent #logoWhite{
|
||||||
|
display: block;
|
||||||
|
width: 220px;
|
||||||
|
}
|
||||||
|
|
||||||
.lead {
|
.lead {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
|
|
|
@ -48,6 +48,8 @@
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
{% block navbar %}
|
||||||
|
|
||||||
<!-- Navigation -->
|
<!-- Navigation -->
|
||||||
|
|
||||||
<nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation">
|
<nav class="navbar navbar-default navbar-fixed-top topnav" role="navigation">
|
||||||
|
@ -93,25 +95,6 @@
|
||||||
<li><a href="{% url 'hosting:logout' %}"><i class="glyphicon glyphicon-lock"></i>{% trans "Logout"%} </a></li>
|
<li><a href="{% url 'hosting:logout' %}"><i class="glyphicon glyphicon-lock"></i>{% trans "Logout"%} </a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<!--
|
|
||||||
<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>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -119,7 +102,7 @@
|
||||||
</div>
|
</div>
|
||||||
<!-- /.container -->
|
<!-- /.container -->
|
||||||
</nav>
|
</nav>
|
||||||
|
{% endblock navbar %}
|
||||||
|
|
||||||
|
|
||||||
<div class="content-dashboard">
|
<div class="content-dashboard">
|
||||||
|
|
11
hosting/templates/hosting/includes/_navbar_transparent.html
Normal file
11
hosting/templates/hosting/includes/_navbar_transparent.html
Normal 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>
|
|
@ -1,6 +1,11 @@
|
||||||
{% extends "hosting/base_short.html" %}
|
{% extends "hosting/base_short.html" %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load staticfiles bootstrap3%}
|
{% load staticfiles bootstrap3%}
|
||||||
|
|
||||||
|
{% block navbar %}
|
||||||
|
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||||
|
{% endblock navbar %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<div class="auth-container">
|
<div class="auth-container">
|
||||||
|
|
|
@ -2,6 +2,11 @@
|
||||||
{% load staticfiles bootstrap3%}
|
{% load staticfiles bootstrap3%}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block navbar %}
|
||||||
|
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||||
|
{% endblock navbar %}
|
||||||
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="auth-container">
|
<div class="auth-container">
|
||||||
<div class="auth-bg"></div>
|
<div class="auth-bg"></div>
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
{% extends "hosting/base_short.html" %}
|
{% extends "hosting/base_short.html" %}
|
||||||
{% load staticfiles bootstrap3 i18n %}
|
{% load staticfiles bootstrap3 i18n %}
|
||||||
|
|
||||||
|
{% block navbar %}
|
||||||
|
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||||
|
{% endblock navbar %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="auth-container auth-signup">
|
<div class="auth-container auth-signup">
|
||||||
<div class="auth-bg"></div>
|
<div class="auth-bg"></div>
|
||||||
|
|
|
@ -325,7 +325,7 @@ class OpenNebulaManager():
|
||||||
public_templates = [
|
public_templates = [
|
||||||
template
|
template
|
||||||
for template in self._get_template_pool()
|
for template in self._get_template_pool()
|
||||||
if 'public-' in template.name
|
if template.name.startswith('public-')
|
||||||
]
|
]
|
||||||
return public_templates
|
return public_templates
|
||||||
except ConnectionRefusedError:
|
except ConnectionRefusedError:
|
||||||
|
|
|
@ -129,6 +129,12 @@ class VirtualMachineSerializer(serializers.Serializer):
|
||||||
return obj.name.strip('public-')
|
return obj.name.strip('public-')
|
||||||
|
|
||||||
|
|
||||||
|
class VMTemplateSerializer(serializers.Serializer):
|
||||||
|
"""Serializer to map the VMTemplate instance into JSON format."""
|
||||||
|
id = serializers.IntegerField(read_only=True, source='opennebula_vm_template_id')
|
||||||
|
name = serializers.CharField(read_only=True)
|
||||||
|
|
||||||
|
|
||||||
def hexstr2int(string):
|
def hexstr2int(string):
|
||||||
return int(string.replace(':', ''), 16)
|
return int(string.replace(':', ''), 16)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue