Readded hostingplans

This commit is contained in:
Modulos 2017-05-13 13:47:53 +02:00
commit 752e11bcea
9 changed files with 148 additions and 96 deletions

View file

@ -4,8 +4,9 @@ from django.core.urlresolvers import reverse
from utils.mailer import BaseEmail
from .models import HostingOrder, HostingBill
from .models import HostingOrder, HostingBill, HostingPlan
admin.site.register(HostingOrder)
admin.site.register(HostingBill)
admin.site.register(HostingPlan)

View file

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2017-05-13 11:35
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hosting', '0039_hostingorder_price'),
]
operations = [
migrations.CreateModel(
name='HostingPlan',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('disk_size', models.FloatField(default=0.0)),
('cpu_cores', models.FloatField(default=0.0)),
('memory', models.FloatField(default=0.0)),
],
),
]

View file

@ -21,6 +21,31 @@ from .managers import VMPlansManager
logger = logging.getLogger(__name__)
class HostingPlan(models.Model):
disk_size = models.FloatField(default=0.0)
cpu_cores = models.FloatField(default=0.0)
memory = models.FloatField(default=0.0)
def serialize(self):
return {
'id': self.id,
'cpu':self.cpu_cores,
'memory': self.memory,
'disk_size': self.disk_size,
'price': self.price(),
}
@classmethod
def get_serialized_configs(cls):
return [cfg.serialize()
for cfg in cls.objects.all()]
def price(self):
price = self.disk_size * 0.2
price += self.cpu_cores * 5
price += self.memory * 2
return price
class HostingOrder(AssignPermissionsMixin, models.Model):
ORDER_APPROVED_STATUS = 'Approved'

View file

@ -4,7 +4,7 @@
{% block content %}
<div class="container">
<div class="orders-container">
<div class="orders-container" style="padding-bottom: 15%">
{# Adress bar #}
<div class="row">
<div class="invoice-title">
@ -78,14 +78,14 @@
</div>
<div class="row">
<div class="col-sm-6">
{% trans "CH02 0900 0000 6071 8848 8%}
{% trans "CH02 0900 0000 6071 8848 8" %}
</div>
<div class="col-sm-6">
{% trans "POFICHBEXXX" %}
</div>
</div>
</div>
<div>
</div>
</div>
{% endblock %}

View file

@ -11,27 +11,22 @@
<form method="POST" action="">
{% csrf_token %}
<div class="form-group">
Select VM:
Select VM Template:
<select name="vm_template_id">
{% for template in templates %}
<option value="{{template.id}}">
CORE: {{template.cores}},
RAM: {{template.memory}} GiB,
SSD: {{template.disk_size}} GiB
</option>
<option value="{{template.id}}">{{template.name}} </option>
{% endfor %}
</select>
</div>
<div class="form-group">
Select VM Configuration:
<select name="vm_image_id">
<option value="-1" selected> None </option>
{% for image in images %}
<option value="{{image.id}}"> {{image.name}} </option>
<select name="configuration">
{% for config in configuration_options %}
<option value="{{config.id}}">
CORE: {{config.cpu|floatformat}},
RAM: {{config.memory|floatformat}} GiB,
SSD: {{config.disk_size|floatformat}} GiB
</option>
{% endfor %}
</select>
</div>

View file

@ -100,14 +100,17 @@
<div class="content">
<!-- <p><b>Type</b> <span class="pull-right">{{request.session.vm_specs.location_code}}</span></p> -->
<!-- <hr> -->
<p><b>Cores</b> <span class="pull-right">{{request.session.template.cores}}</span></p>
<p><b>Cores</b> <span
class="pull-right">{{request.session.specs.cpu|floatformat}}</span></p>
<hr>
<p><b>Memory</b> <span class="pull-right">{{request.session.template.memory}} GiB</span></p>
<p><b>Memory</b> <span
class="pull-right">{{request.session.specs.memory|floatformat}} GiB</span></p>
<hr>
<p><b>Disk space</b> <span class="pull-right">{{request.session.template.disk_size}} GiB</span></p>
<p><b>Disk space</b> <span
class="pull-right">{{request.session.specs.disk_size|floatformat}} GiB</span></p>
<hr>
<h4>Total<p
class="pull-right"><b>{{request.session.template.price }} CHF</b></p></h4>
class="pull-right"><b>{{request.session.specs.price }} CHF</b></p></h4>
</div>
</div>
</div>

View file

@ -25,14 +25,13 @@ from utils.stripe_utils import StripeUtils
from utils.forms import BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin
from utils.mailer import BaseEmail
from .models import HostingOrder, HostingBill, UserHostingKey
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm
from .mixins import ProcessVMSelectionMixin
from opennebula_api.models import OpenNebulaManager
from opennebula_api.serializers import VirtualMachineSerializer,\
VirtualMachineTemplateSerializer,\
ImageSerializer
VirtualMachineTemplateSerializer
from oca.exceptions import OpenNebulaException
@ -391,13 +390,12 @@ class PaymentVMView(LoginRequiredMixin, FormView):
context = self.get_context_data()
specifications = request.session.get('template')
template = request.session.get('template')
specs = request.session.get('specs')
vm_template_id = specifications.get('id', 1)
vm_template_id = template.get('id', 1)
vm_image_id = request.session.get('image').get('id', None)
final_price = specifications.get('price', 1)
final_price = specs.get('price')
token = form.cleaned_data.get('token')
@ -445,7 +443,8 @@ class PaymentVMView(LoginRequiredMixin, FormView):
# Create a vm using logged user
vm_id = manager.create_vm(
template_id=vm_template_id,
image_id=vm_image_id,
#XXX: Confi
specs=specs,
ssh_key=user_key.public_key,
)
@ -573,11 +572,11 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
manager = OpenNebulaManager()
templates = manager.get_templates()
images = manager.get_images()
configuration_options = HostingPlan.get_serialized_configs()
context = {
'templates': VirtualMachineTemplateSerializer(templates, many=True).data,
'images' : ImageSerializer(images, many=True).data
'configuration_options' : configuration_options,
}
return render(request, self.template_name, context)
@ -585,10 +584,11 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
manager = OpenNebulaManager()
template_id = request.POST.get('vm_template_id')
template = manager.get_template(template_id)
image_id = request.POST.get('vm_image_id')
image = manager.get_image(image_id)
configuration_id = int(request.POST.get('configuration'))
configuration = HostingPlan.objects.get(id=configuration_id)
request.session['template'] = VirtualMachineTemplateSerializer(template).data
#request.session['image'] = ImageSerializer(image).data
request.session['specs'] = configuration.serialize()
return redirect(reverse('hosting:payment'))
@ -701,6 +701,10 @@ class HostingBillDetailView(PermissionRequiredMixin, LoginRequiredMixin, DetailV
# Get vms
queryset = manager.get_vms()
vms = VirtualMachineSerializer(queryset, many=True).data
# Set total price
bill = context['bill']
bill.total_price = 0.0
for vm in vms:
bill.total_price += vm['price']
context['vms'] = vms
return context