Merge pull request #73 from levivm/develop
Changed offers in VM pricing, Fixed pricing error changing disk size,…
This commit is contained in:
commit
f1b1faa631
13 changed files with 124 additions and 44 deletions
|
@ -443,6 +443,12 @@ PARLER_LANGUAGES = {1: ({'code': 'en-us'}, {'code': 'de'},)}
|
||||||
AUTH_USER_MODEL = 'membership.CustomUser'
|
AUTH_USER_MODEL = 'membership.CustomUser'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
# PAYMENT
|
# PAYMENT
|
||||||
|
|
||||||
STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services"
|
STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services"
|
||||||
|
@ -455,7 +461,7 @@ REGISTRATION_MESSAGE = {'subject': "Validation mail",
|
||||||
STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY')
|
STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY')
|
||||||
STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY')
|
STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY')
|
||||||
|
|
||||||
DEBUG = False
|
DEBUG = True
|
||||||
|
|
||||||
if DEBUG:
|
if DEBUG:
|
||||||
from .local import *
|
from .local import *
|
||||||
|
|
|
@ -12,39 +12,41 @@ class Command(BaseCommand):
|
||||||
'core_price': 10,
|
'core_price': 10,
|
||||||
'memory_price': 5,
|
'memory_price': 5,
|
||||||
'disk_size_price': 1,
|
'disk_size_price': 1,
|
||||||
'description': 'VM auf einzelner HW, Raid1, kein HA'
|
'description': 'VM auf einzelner HW, Raid1, kein HA',
|
||||||
|
'location':'DE'
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'hetzner_nug': {
|
# 'hetzner_nug': {
|
||||||
'base_price': 5,
|
# 'base_price': 5,
|
||||||
'memory_price': 2,
|
# 'memory_price': 2,
|
||||||
'core_price': 2,
|
# 'core_price': 2,
|
||||||
'disk_size_price': 0.5,
|
# 'disk_size_price': 0.5,
|
||||||
'description': 'VM ohne Uptime Garantie'
|
# 'description': 'VM ohne Uptime Garantie'
|
||||||
},
|
# },
|
||||||
'hetzner': hetzner,
|
'hetzner': hetzner,
|
||||||
'hetzner_raid6': {
|
# 'hetzner_raid6': {
|
||||||
'base_price': hetzner['base_price']*1.2,
|
# 'base_price': hetzner['base_price']*1.2,
|
||||||
'core_price': hetzner['core_price']*1.2,
|
# 'core_price': hetzner['core_price']*1.2,
|
||||||
'memory_price': hetzner['memory_price']*1.2,
|
# 'memory_price': hetzner['memory_price']*1.2,
|
||||||
'disk_size_price': hetzner['disk_size_price']*1.2,
|
# 'disk_size_price': hetzner['disk_size_price']*1.2,
|
||||||
'description': 'VM auf einzelner HW, Raid1, kein HA'
|
# 'description': 'VM auf einzelner HW, Raid1, kein HA'
|
||||||
|
|
||||||
},
|
# },
|
||||||
'hetzner_glusterfs': {
|
# 'hetzner_glusterfs': {
|
||||||
'base_price': hetzner['base_price']*1.4,
|
# 'base_price': hetzner['base_price']*1.4,
|
||||||
'core_price': hetzner['core_price']*1.4,
|
# 'core_price': hetzner['core_price']*1.4,
|
||||||
'memory_price': hetzner['memory_price']*1.4,
|
# 'memory_price': hetzner['memory_price']*1.4,
|
||||||
'disk_size_price': hetzner['disk_size_price']*1.4,
|
# 'disk_size_price': hetzner['disk_size_price']*1.4,
|
||||||
'description': 'VM auf einzelner HW, Raid1, kein HA'
|
# 'description': 'VM auf einzelner HW, Raid1, kein HA'
|
||||||
},
|
# },
|
||||||
'bern': {
|
'bern': {
|
||||||
'base_price': 12,
|
'base_price': 12,
|
||||||
'core_price': 25,
|
'core_price': 25,
|
||||||
'memory_price': 7,
|
'memory_price': 7,
|
||||||
'disk_size_price': 0.70,
|
'disk_size_price': 0.70,
|
||||||
'description': "VM in Bern, HA Setup ohne HA Garantie",
|
'description': "VM in Bern, HA Setup ohne HA Garantie",
|
||||||
|
'location':'CH',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
21
hosting/migrations/0017_virtualmachinetype_location.py
Normal file
21
hosting/migrations/0017_virtualmachinetype_location.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2016-05-19 04:14
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('hosting', '0016_delete_railsbetauser'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='virtualmachinetype',
|
||||||
|
name='location',
|
||||||
|
field=models.CharField(choices=[('DE', 'Germany'), ('CH', 'Switzerland')], default='DE', max_length=3),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
|
@ -17,6 +17,8 @@ class VirtualMachineType(models.Model):
|
||||||
HETZNER_R6 = 'hetzner_raid6'
|
HETZNER_R6 = 'hetzner_raid6'
|
||||||
HETZNER_G = 'hetzner_glusterfs'
|
HETZNER_G = 'hetzner_glusterfs'
|
||||||
BERN = 'bern'
|
BERN = 'bern'
|
||||||
|
DE_LOCATION = 'DE'
|
||||||
|
CH_LOCATION = 'CH'
|
||||||
|
|
||||||
HOSTING_TYPES = (
|
HOSTING_TYPES = (
|
||||||
(HETZNER_NUG, 'Hetzner No Uptime Guarantee'),
|
(HETZNER_NUG, 'Hetzner No Uptime Guarantee'),
|
||||||
|
@ -26,12 +28,17 @@ class VirtualMachineType(models.Model):
|
||||||
(BERN, 'Bern'),
|
(BERN, 'Bern'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
LOCATIONS_CHOICES = (
|
||||||
|
(DE_LOCATION, 'Germany'),
|
||||||
|
(CH_LOCATION, 'Switzerland'),
|
||||||
|
)
|
||||||
description = models.TextField()
|
description = models.TextField()
|
||||||
base_price = models.FloatField()
|
base_price = models.FloatField()
|
||||||
memory_price = models.FloatField()
|
memory_price = models.FloatField()
|
||||||
core_price = models.FloatField()
|
core_price = models.FloatField()
|
||||||
disk_size_price = models.FloatField()
|
disk_size_price = models.FloatField()
|
||||||
hosting_company = models.CharField(max_length=30, choices=HOSTING_TYPES)
|
hosting_company = models.CharField(max_length=30, choices=HOSTING_TYPES)
|
||||||
|
location = models.CharField(max_length=3, choices=LOCATIONS_CHOICES)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s" % (self.get_hosting_company_display())
|
return "%s" % (self.get_hosting_company_display())
|
||||||
|
@ -65,6 +72,8 @@ class VirtualMachineType(models.Model):
|
||||||
'hosting_company_name': self.get_hosting_company_display(),
|
'hosting_company_name': self.get_hosting_company_display(),
|
||||||
'hosting_company': self.hosting_company,
|
'hosting_company': self.hosting_company,
|
||||||
'default_price': self.defeault_price(),
|
'default_price': self.defeault_price(),
|
||||||
|
'location_code': self.location,
|
||||||
|
'location': self.get_location_display(),
|
||||||
'id': self.id,
|
'id': self.id,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
.pricing li.type {
|
.pricing li.type {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: 13px;
|
padding: 13px;
|
||||||
height: 200px;
|
height: 150px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pricing big {
|
.pricing big {
|
||||||
|
@ -72,6 +72,16 @@
|
||||||
box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1);
|
box-shadow: inset 0px 2px 2px rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
/* pricing color */
|
/* pricing color */
|
||||||
|
|
||||||
|
.p-black big,
|
||||||
|
.p-black h3 {
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-black button {
|
||||||
|
background: black;
|
||||||
|
}
|
||||||
|
|
||||||
.p-green big,
|
.p-green big,
|
||||||
.p-green h3 {
|
.p-green h3 {
|
||||||
color: #4c7737;
|
color: #4c7737;
|
||||||
|
|
BIN
hosting/static/hosting/img/CH_flag.png
Normal file
BIN
hosting/static/hosting/img/CH_flag.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 841 B |
BIN
hosting/static/hosting/img/DE_flag.png
Normal file
BIN
hosting/static/hosting/img/DE_flag.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 376 B |
|
@ -49,5 +49,9 @@ $( document ).ready(function() {
|
||||||
|
|
||||||
$('.disk-space-selector').on('change',change_attribute);
|
$('.disk-space-selector').on('change',change_attribute);
|
||||||
|
|
||||||
|
//Disable input
|
||||||
|
$('.disk-space-selector').keypress(function(event){
|
||||||
|
event.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
|
@ -81,19 +81,19 @@
|
||||||
</li>
|
</li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#how">How it works</a>
|
<a href="{{ request.session.hosting_url}}#how">How it works</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#your">Your infrastructure</a>
|
<a href="{{ request.session.hosting_url }}#your">Your infrastructure</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#our">Our inftrastructure</a>
|
<a href="{{ request.session.hosting_url }}#our">Our inftrastructure</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#price">Pricing</a>
|
<a href="{{ request.session.hosting_url }}#price">Pricing</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#contact">Contact</a>
|
<a href="{{ request.session.hosting_url }}#contact">Contact</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'hosting:login' %}?next={{request.current_path}}">Login</a>
|
<a href="{% url 'hosting:login' %}?next={{request.current_path}}">Login</a>
|
||||||
|
@ -123,21 +123,22 @@
|
||||||
</li>
|
</li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#how">How it works</a>
|
<a href="{{ request.session.hosting_url}}#how">How it works</a>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#your">Your infrastructure</a></li>
|
<a href="{{ request.session.hosting_url }}#your">Your infrastructure</a></li>
|
||||||
<li>⋅</li>
|
<li>⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#our">Our infrastructure</a></li>
|
<a href="{{ request.session.hosting_url }}#our">Our infrastructure</a></li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#services">Pricing</a>
|
<a href="{{ request.session.hosting_url }}#services">Pricing</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="footer-menu-divider">⋅</li>
|
<li class="footer-menu-divider">⋅</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ request.META.HTTP_REFERER }}#contact">Contact</a>
|
<a href="{{ request.session.hosting_url }}#contact">Contact</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. All Rights Reserved</p>
|
<p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. All Rights Reserved</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{% load staticfiles %}
|
||||||
<a name="price"></a>
|
<a name="price"></a>
|
||||||
<div class="content-section-b">
|
<div class="content-section-b">
|
||||||
<div class="container-fluid pricing-container">
|
<div class="container-fluid pricing-container">
|
||||||
|
@ -6,7 +7,6 @@
|
||||||
<hr class="section-heading-spacer">
|
<hr class="section-heading-spacer">
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
<h2 class="section-heading">Hosting Price</h2>
|
<h2 class="section-heading">Hosting Price</h2>
|
||||||
<p class="lead">Here are samples of our {{ hosting_long }} hosting offers, suited for different projects. Our offer examples come in different size, speed, and storage. </p>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -17,17 +17,31 @@
|
||||||
<!-- Page Features -->
|
<!-- Page Features -->
|
||||||
<div class="row text-center">
|
<div class="row text-center">
|
||||||
|
|
||||||
<div class="block col-md-offset-1">
|
<div class="block col-md-offset-3">
|
||||||
{% for vm in vm_types %}
|
{% for vm in vm_types %}
|
||||||
<div class="col-xs-12 col-sm-6 col-md-2">
|
<div class="col-xs-12 col-sm-6 col-md-4">
|
||||||
<form class="form-inline" method="POST" action="{{request.path}}">
|
<form class="form-inline" method="POST" action="{{request.path}}">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="hidden" name="hosting_company" value="{{vm.hosting_company}}">
|
<input type="hidden" name="hosting_company" value="{{vm.hosting_company}}">
|
||||||
<input type="hidden" name="hosting_company_name" value="{{vm.hosting_company_name}}">
|
<input type="hidden" name="hosting_company_name" value="{{vm.hosting_company_name}}">
|
||||||
<ul class="pricing {% cycle 'p-green' 'p-yel' 'p-red' 'p-blue' %}">
|
|
||||||
|
|
||||||
|
<ul class="pricing {% cycle 'p-red' 'p-black' 'p-red' 'p-yel' %}">
|
||||||
<li class="type">
|
<li class="type">
|
||||||
<!-- <img src="http://bread.pp.ua/n/settings_g.svg" alt=""> -->
|
<!-- <img src="http://bread.pp.ua/n/settings_g.svg" alt=""> -->
|
||||||
<h3 >{{vm.hosting_company_name}}</h3>
|
<h3 >{{vm.hosting_company_name}}</h3>
|
||||||
|
<br/>
|
||||||
|
<img class="img-responsive" src="{{ STATIC_URL }}hosting/img/{{vm.location_code}}_flag.png" alt="">
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<!-- Single button -->
|
||||||
|
<div class="btn-group">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="cores">Location: </label>
|
||||||
|
{{vm.location}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<!-- Single button -->
|
<!-- Single button -->
|
||||||
|
@ -64,7 +78,7 @@
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col-xs-offset-1 col-xs-9 col-sm-12 col-md-12 col-md-offset-0">
|
<div class="col-xs-offset-1 col-xs-9 col-sm-12 col-md-12 col-md-offset-0">
|
||||||
<label for="Disk Size">Disk Size: </label>
|
<label for="Disk Size">Disk Size: </label>
|
||||||
<input class="form-control short-input text-center disk-space-selector" name="disk_space" type="number" id="{{vm.hosting_company}}-disk_space" min="10" value="10" data-vm-type="{{vm.hosting_company}}"/>
|
<input class="form-control short-input text-center disk-space-selector" name="disk_space" type="number" id="{{vm.hosting_company}}-disk_space" min="10" value="10" step="10" data-vm-type="{{vm.hosting_company}}"/>
|
||||||
<span>GiB</span>
|
<span>GiB</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -75,7 +89,7 @@
|
||||||
<span>per month</span>
|
<span>per month</span>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<button>Buy it</button>
|
<button>Book it</button>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -5,6 +5,17 @@
|
||||||
<div class="intro-auth intro-login">
|
<div class="intro-auth intro-login">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="col-md-4 col-md-offset-4">
|
<div class="col-md-4 col-md-offset-4">
|
||||||
|
|
||||||
|
{% block messages %}
|
||||||
|
{% if request.GET.logged_out %}
|
||||||
|
<div class="alert alert-warning"> <!-- singular -->
|
||||||
|
<a class="close" data-dismiss="alert">×</a>
|
||||||
|
You haven been logged out
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
<div class="intro-message">
|
<div class="intro-message">
|
||||||
<h2 class="section-heading">Login</h2>
|
<h2 class="section-heading">Login</h2>
|
||||||
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidate>
|
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidate>
|
||||||
|
|
|
@ -20,5 +20,5 @@ urlpatterns = [
|
||||||
url(r'login/?$', LoginView.as_view(), name='login'),
|
url(r'login/?$', LoginView.as_view(), name='login'),
|
||||||
url(r'signup/?$', SignupView.as_view(), name='signup'),
|
url(r'signup/?$', SignupView.as_view(), name='signup'),
|
||||||
url(r'^logout/?$', 'django.contrib.auth.views.logout',
|
url(r'^logout/?$', 'django.contrib.auth.views.logout',
|
||||||
{'next_page': '/ungleich_page'}, name='logout')
|
{'next_page': '/hosting/login?logged_out=true'}, name='logout')
|
||||||
]
|
]
|
||||||
|
|
|
@ -29,10 +29,11 @@ class DjangoHostingView(ProcessVMSelectionMixin, View):
|
||||||
'email': "info@django-hosting.ch",
|
'email': "info@django-hosting.ch",
|
||||||
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
request.session['hosting_url'] = reverse('hosting:djangohosting')
|
||||||
context = self.get_context_data()
|
context = self.get_context_data()
|
||||||
|
|
||||||
return render(request, self.template_name, context)
|
return render(request, self.template_name, context)
|
||||||
|
@ -53,6 +54,7 @@ class RailsHostingView(ProcessVMSelectionMixin, View):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
request.session['hosting_url'] = reverse('hosting:railshosting')
|
||||||
context = self.get_context_data()
|
context = self.get_context_data()
|
||||||
return render(request, self.template_name, context)
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
|
@ -72,7 +74,7 @@ class NodeJSHostingView(ProcessVMSelectionMixin, View):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
|
request.session['hosting_url'] = reverse('hosting:nodejshosting')
|
||||||
context = self.get_context_data()
|
context = self.get_context_data()
|
||||||
|
|
||||||
return render(request, self.template_name, context)
|
return render(request, self.template_name, context)
|
||||||
|
|
Loading…
Reference in a new issue