Merge pull request #627 from tiwariav/task/dcl_calculator_on_non_cms_pages
Task/4527 dcl calculator on non-cms pages
This commit is contained in:
		
				commit
				
					
						6ff03d8f48
					
				
			
		
					 16 changed files with 227 additions and 104 deletions
				
			
		| 
						 | 
					@ -26,6 +26,10 @@ class CMSIntegration(models.Model):
 | 
				
			||||||
    navbar_placeholder = PlaceholderField(
 | 
					    navbar_placeholder = PlaceholderField(
 | 
				
			||||||
        'datacenterlight_navbar', related_name='dcl-navbar-placeholder+'
 | 
					        'datacenterlight_navbar', related_name='dcl-navbar-placeholder+'
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					    calculator_placeholder = PlaceholderField(
 | 
				
			||||||
 | 
					        'datacenterlight_calculator',
 | 
				
			||||||
 | 
					        related_name='dcl-calculator-placeholder+'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
    domain = models.ForeignKey(Site, null=True, blank=True)
 | 
					    domain = models.ForeignKey(Site, null=True, blank=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
| 
						 | 
					@ -288,7 +292,7 @@ class DCLSectionPromoPluginModel(CMSPlugin):
 | 
				
			||||||
        return extra_classes
 | 
					        return extra_classes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DCLCustomPricingModel(CMSPlugin):
 | 
					class DCLCalculatorPluginModel(CMSPlugin):
 | 
				
			||||||
    pricing = models.ForeignKey(
 | 
					    pricing = models.ForeignKey(
 | 
				
			||||||
        VMPricing,
 | 
					        VMPricing,
 | 
				
			||||||
        related_name="dcl_custom_pricing_vm_pricing",
 | 
					        related_name="dcl_custom_pricing_vm_pricing",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,9 +6,9 @@ from .cms_models import (
 | 
				
			||||||
    DCLFooterPluginModel, DCLLinkPluginModel, DCLNavbarDropdownPluginModel,
 | 
					    DCLFooterPluginModel, DCLLinkPluginModel, DCLNavbarDropdownPluginModel,
 | 
				
			||||||
    DCLSectionIconPluginModel, DCLSectionImagePluginModel,
 | 
					    DCLSectionIconPluginModel, DCLSectionImagePluginModel,
 | 
				
			||||||
    DCLSectionPluginModel, DCLNavbarPluginModel,
 | 
					    DCLSectionPluginModel, DCLNavbarPluginModel,
 | 
				
			||||||
    DCLSectionPromoPluginModel, DCLCustomPricingModel
 | 
					    DCLSectionPromoPluginModel, DCLCalculatorPluginModel
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from .models import VMTemplate, VMPricing
 | 
					from .models import VMTemplate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@plugin_pool.register_plugin
 | 
					@plugin_pool.register_plugin
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@ class DCLSectionPlugin(CMSPluginBase):
 | 
				
			||||||
    allow_children = True
 | 
					    allow_children = True
 | 
				
			||||||
    child_classes = [
 | 
					    child_classes = [
 | 
				
			||||||
        'DCLSectionIconPlugin', 'DCLSectionImagePlugin',
 | 
					        'DCLSectionIconPlugin', 'DCLSectionImagePlugin',
 | 
				
			||||||
        'DCLSectionPromoPlugin', 'UngleichHTMLPlugin'
 | 
					        'DCLSectionPromoPlugin', 'UngleichHTMLPlugin', 'DCLCalculatorPlugin'
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def render(self, context, instance, placeholder):
 | 
					    def render(self, context, instance, placeholder):
 | 
				
			||||||
| 
						 | 
					@ -30,14 +30,18 @@ class DCLSectionPlugin(CMSPluginBase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        context['children_to_side'] = []
 | 
					        context['children_to_side'] = []
 | 
				
			||||||
        context['children_to_content'] = []
 | 
					        context['children_to_content'] = []
 | 
				
			||||||
 | 
					        context['children_calculator'] = []
 | 
				
			||||||
        if instance.child_plugin_instances is not None:
 | 
					        if instance.child_plugin_instances is not None:
 | 
				
			||||||
            right_children = [
 | 
					            right_children = [
 | 
				
			||||||
                'DCLSectionImagePluginModel',
 | 
					                'DCLSectionImagePluginModel',
 | 
				
			||||||
                'DCLSectionIconPluginModel'
 | 
					                'DCLSectionIconPluginModel',
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
            for child in instance.child_plugin_instances:
 | 
					            for child in instance.child_plugin_instances:
 | 
				
			||||||
 | 
					                print(child.__dict__)
 | 
				
			||||||
                if child.__class__.__name__ in right_children:
 | 
					                if child.__class__.__name__ in right_children:
 | 
				
			||||||
                    context['children_to_side'].append(child)
 | 
					                    context['children_to_side'].append(child)
 | 
				
			||||||
 | 
					                elif child.plugin_type == 'DCLCalculatorPlugin':
 | 
				
			||||||
 | 
					                    context['children_calculator'].append(child)
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    context['children_to_content'].append(child)
 | 
					                    context['children_to_content'].append(child)
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
| 
						 | 
					@ -75,52 +79,20 @@ class DCLSectionPromoPlugin(CMSPluginBase):
 | 
				
			||||||
@plugin_pool.register_plugin
 | 
					@plugin_pool.register_plugin
 | 
				
			||||||
class DCLCalculatorPlugin(CMSPluginBase):
 | 
					class DCLCalculatorPlugin(CMSPluginBase):
 | 
				
			||||||
    module = "Datacenterlight"
 | 
					    module = "Datacenterlight"
 | 
				
			||||||
    name = "DCL Calculator Section Plugin"
 | 
					    name = "DCL Calculator Plugin"
 | 
				
			||||||
    model = DCLSectionPluginModel
 | 
					    model = DCLCalculatorPluginModel
 | 
				
			||||||
    render_template = "datacenterlight/cms/calculator.html"
 | 
					    render_template = "datacenterlight/cms/calculator.html"
 | 
				
			||||||
    cache = False
 | 
					    cache = False
 | 
				
			||||||
    allow_children = True
 | 
					    require_parent = True
 | 
				
			||||||
    child_classes = [
 | 
					 | 
				
			||||||
        'DCLSectionPromoPlugin', 'UngleichHTMLPlugin', 'DCLCustomPricingPlugin'
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def render(self, context, instance, placeholder):
 | 
					    def render(self, context, instance, placeholder):
 | 
				
			||||||
        context = super(DCLCalculatorPlugin, self).render(
 | 
					        context = super(DCLCalculatorPlugin, self).render(
 | 
				
			||||||
            context, instance, placeholder
 | 
					            context, instance, placeholder
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        context['templates'] = VMTemplate.objects.all()
 | 
					        context['templates'] = VMTemplate.objects.all()
 | 
				
			||||||
        context['children_to_content'] = []
 | 
					 | 
				
			||||||
        pricing_plugin_model = None
 | 
					 | 
				
			||||||
        if instance.child_plugin_instances is not None:
 | 
					 | 
				
			||||||
            context['children_to_content'].extend(
 | 
					 | 
				
			||||||
                instance.child_plugin_instances
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            for child in instance.child_plugin_instances:
 | 
					 | 
				
			||||||
                if child.__class__.__name__ == 'DCLCustomPricingModel':
 | 
					 | 
				
			||||||
                    # The second clause is just to make sure we pick up the
 | 
					 | 
				
			||||||
                    # most recent CustomPricing, if more than one is present
 | 
					 | 
				
			||||||
                    if (pricing_plugin_model is None or child.pricing_id >
 | 
					 | 
				
			||||||
                            pricing_plugin_model.model.pricing_id):
 | 
					 | 
				
			||||||
                        pricing_plugin_model = child
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if pricing_plugin_model:
 | 
					 | 
				
			||||||
            context['vm_pricing'] = VMPricing.get_vm_pricing_by_name(
 | 
					 | 
				
			||||||
                name=pricing_plugin_model.pricing.name
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            context['vm_pricing'] = VMPricing.get_default_pricing()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@plugin_pool.register_plugin
 | 
					 | 
				
			||||||
class DCLCustomPricingPlugin(CMSPluginBase):
 | 
					 | 
				
			||||||
    module = "Datacenterlight"
 | 
					 | 
				
			||||||
    name = "DCL Custom Pricing Plugin"
 | 
					 | 
				
			||||||
    model = DCLCustomPricingModel
 | 
					 | 
				
			||||||
    render_plugin = False
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@plugin_pool.register_plugin
 | 
					@plugin_pool.register_plugin
 | 
				
			||||||
class DCLBannerListPlugin(CMSPluginBase):
 | 
					class DCLBannerListPlugin(CMSPluginBase):
 | 
				
			||||||
    module = "Datacenterlight"
 | 
					    module = "Datacenterlight"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					# Generated by Django 1.9.4 on 2018-04-25 09:20
 | 
				
			||||||
 | 
					from __future__ import unicode_literals
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import cms.models.fields
 | 
				
			||||||
 | 
					from django.db import migrations
 | 
				
			||||||
 | 
					import django.db.models.deletion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Migration(migrations.Migration):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dependencies = [
 | 
				
			||||||
 | 
					        ('datacenterlight', '0020_merge'),
 | 
				
			||||||
 | 
					        ('cms', '0014_auto_20160404_1908'),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    operations = [
 | 
				
			||||||
 | 
					        migrations.AddField(
 | 
				
			||||||
 | 
					            model_name='cmsintegration',
 | 
				
			||||||
 | 
					            name='calculator_placeholder',
 | 
				
			||||||
 | 
					            field=cms.models.fields.PlaceholderField(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE,
 | 
				
			||||||
 | 
					                                                     related_name='dcl-calculator-placeholder+', slotname='datacenterlight_calculator', to='cms.Placeholder'),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.RenameModel(
 | 
				
			||||||
 | 
					            old_name='DCLCustomPricingModel',
 | 
				
			||||||
 | 
					            new_name='DCLCalculatorPluginModel',
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
| 
						 | 
					@ -776,7 +776,7 @@ textarea {
 | 
				
			||||||
  width: 100%;
 | 
					  width: 100%;
 | 
				
			||||||
  margin: 0 auto;
 | 
					  margin: 0 auto;
 | 
				
			||||||
  background: #fff;
 | 
					  background: #fff;
 | 
				
			||||||
  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
 | 
					  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1), 0 0 6px rgba(0, 0, 0, 0.15);
 | 
				
			||||||
  padding-bottom: 40px;
 | 
					  padding-bottom: 40px;
 | 
				
			||||||
  border-radius: 7px;
 | 
					  border-radius: 7px;
 | 
				
			||||||
  text-align: center;
 | 
					  text-align: center;
 | 
				
			||||||
| 
						 | 
					@ -929,7 +929,7 @@ textarea {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media(max-width:991px) {
 | 
					@media(max-width:767px) {
 | 
				
			||||||
  .section-sm-center .split-text,
 | 
					  .section-sm-center .split-text,
 | 
				
			||||||
  .section-sm-center .space {
 | 
					  .section-sm-center .space {
 | 
				
			||||||
    text-align: center !important;
 | 
					    text-align: center !important;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -175,7 +175,7 @@
 | 
				
			||||||
            window.coresUnitPrice = 5;
 | 
					            window.coresUnitPrice = 5;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if(typeof window.ramUnitPrice === 'undefined'){
 | 
					        if(typeof window.ramUnitPrice === 'undefined'){
 | 
				
			||||||
            window.coresUnitPrice = 2;
 | 
					            window.ramUnitPrice = 2;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if(typeof window.ssdUnitPrice === 'undefined'){
 | 
					        if(typeof window.ssdUnitPrice === 'undefined'){
 | 
				
			||||||
            window.ssdUnitPrice = 0.6;
 | 
					            window.ssdUnitPrice = 0.6;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,6 +61,7 @@
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    {% endplaceholder %}
 | 
					    {% endplaceholder %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {% url 'datacenterlight:index' as calculator_form_url %}
 | 
				
			||||||
    {% placeholder 'Datacenterlight Content' %}
 | 
					    {% placeholder 'Datacenterlight Content' %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    {% placeholder 'datacenterlight_footer'%}
 | 
					    {% placeholder 'datacenterlight_footer'%}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,16 +1,5 @@
 | 
				
			||||||
<div class="split-section {{ instance.get_extra_classes }}" id="{{ instance.html_id }}">
 | 
					 | 
				
			||||||
  <div class="container">
 | 
					 | 
				
			||||||
    <div class="row">
 | 
					 | 
				
			||||||
      <div class="col-sm-6 {% if instance.text_direction == 'right' %}col-sm-push-6{% endif %} split-text">
 | 
					 | 
				
			||||||
        {% include "datacenterlight/cms/includes/_section_split_content.html" %}
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
      <div class="col-sm-6 {% if instance.text_direction == 'right' %}col-sm-pull-6{% endif %}">
 | 
					 | 
				
			||||||
<div class="price-calc-section">
 | 
					<div class="price-calc-section">
 | 
				
			||||||
  <div class="card">
 | 
					  <div class="card">
 | 
				
			||||||
            {% include "datacenterlight/includes/_calculator_form.html" %}
 | 
					    {% include "datacenterlight/includes/_calculator_form.html" with vm_pricing=instance.pricing %}
 | 
				
			||||||
          </div>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
| 
						 | 
					@ -2,17 +2,24 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<section class="split-section {{ instance.get_extra_classes }}" id="{{ instance.html_id }}">
 | 
					<section class="split-section {{ instance.get_extra_classes }}" id="{{ instance.html_id }}">
 | 
				
			||||||
  <div class="container">
 | 
					  <div class="container">
 | 
				
			||||||
    {% if children_to_side|length %}
 | 
					    {% if children_to_side|length or children_calculator|length %}
 | 
				
			||||||
      <div class="row">
 | 
					      <div class="row">
 | 
				
			||||||
        <div class="col-sm-6 {% if instance.text_direction == 'right' %}col-sm-push-6{% endif %} split-text">
 | 
					        <div class="col-sm-6 {% if instance.text_direction == 'right' %}col-sm-push-6{% endif %} split-text">
 | 
				
			||||||
          {% include "datacenterlight/cms/includes/_section_split_content.html" %}
 | 
					          {% include "datacenterlight/cms/includes/_section_split_content.html" %}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="col-sm-6 {% if instance.text_direction == 'right' %}col-sm-pull-6{% endif %} split-figure">
 | 
					        <div class="col-sm-6 {% if instance.text_direction == 'right' %}col-sm-pull-6{% endif %} split-figure">
 | 
				
			||||||
 | 
					          {% if children_calculator|length %}
 | 
				
			||||||
 | 
					            {% for plugin in children_calculator %}
 | 
				
			||||||
 | 
					              {% render_plugin plugin %}
 | 
				
			||||||
 | 
					            {% endfor %}
 | 
				
			||||||
 | 
					          {% endif %}
 | 
				
			||||||
 | 
					          {% if children_to_side %}
 | 
				
			||||||
            <div class="section-figure">
 | 
					            <div class="section-figure">
 | 
				
			||||||
              {% for plugin in children_to_side %}
 | 
					              {% for plugin in children_to_side %}
 | 
				
			||||||
                {% render_plugin plugin %}
 | 
					                {% render_plugin plugin %}
 | 
				
			||||||
              {% endfor %}
 | 
					              {% endfor %}
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 | 
					          {% endif %}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    {% else %}
 | 
					    {% else %}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,13 +11,13 @@
 | 
				
			||||||
    </script>
 | 
					    </script>
 | 
				
			||||||
{% endif %}
 | 
					{% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<form id="order_form" method="POST" action="{% url 'datacenterlight:index' %}" data-toggle="validator" role="form">
 | 
					<form id="order_form" method="POST" action="{{calculator_form_url}}" data-toggle="validator" role="form">
 | 
				
			||||||
    {% csrf_token %}
 | 
					    {% csrf_token %}
 | 
				
			||||||
    <div class="title">
 | 
					    <div class="title">
 | 
				
			||||||
        <h3>{% trans "VM hosting" %} </h3>
 | 
					        <h3>{% trans "VM hosting" %} </h3>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div class="price">
 | 
					    <div class="price">
 | 
				
			||||||
        <span id="total">15</span>
 | 
					        <span id="total"></span>
 | 
				
			||||||
        <span>CHF/{% trans "month" %}</span>
 | 
					        <span>CHF/{% trans "month" %}</span>
 | 
				
			||||||
        {% if vm_pricing.vat_inclusive %}
 | 
					        {% if vm_pricing.vat_inclusive %}
 | 
				
			||||||
        <div class="price-text">
 | 
					        <div class="price-text">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -352,6 +352,18 @@ CMS_PLACEHOLDER_CONF = {
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    'datacenterlight_calculator': {
 | 
				
			||||||
 | 
					        'name': _('Datacenterlight Calculator'),
 | 
				
			||||||
 | 
					        'plugins': ['DCLCalculatorPlugin'],
 | 
				
			||||||
 | 
					        'default_plugins': [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                'plugin_type': 'DCLCalculatorPlugin',
 | 
				
			||||||
 | 
					                'values': {
 | 
				
			||||||
 | 
					                    'pricing_id': 1
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CMS_PERMISSION = True
 | 
					CMS_PERMISSION = True
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,9 @@
 | 
				
			||||||
/* Create VM calculator */
 | 
					/* Create VM calculator */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.price-calc-section {
 | 
					.price-calc-section {
 | 
				
			||||||
    padding: 80px 40px !important;
 | 
					    padding: 20px 0 !important;
 | 
				
			||||||
 | 
					    font-weight: 300;
 | 
				
			||||||
 | 
					    font-size: 18px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media (max-width: 768px) {
 | 
					@media (max-width: 768px) {
 | 
				
			||||||
| 
						 | 
					@ -40,19 +42,19 @@
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.price-calc-section .card {
 | 
					.price-calc-section .card {
 | 
				
			||||||
    width: 50%;
 | 
					    border-radius: 7px;
 | 
				
			||||||
    margin: 0 auto;
 | 
					    margin: 0 auto;
 | 
				
			||||||
    background: #fff;
 | 
					    background: #fff;
 | 
				
			||||||
    box-shadow: 1px 3px 6px 2px rgba(0, 0, 0, 0.2);
 | 
					    box-shadow: 1px 3px 6px 2px rgba(0, 0, 0, 0.2);
 | 
				
			||||||
    padding-bottom: 30px;
 | 
					    padding-bottom: 30px;
 | 
				
			||||||
    text-align: center;
 | 
					    text-align: center;
 | 
				
			||||||
    max-width: 320px;
 | 
					    max-width: 4000px;
 | 
				
			||||||
    position: relative;
 | 
					    position: relative;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media (min-width: 768px) {
 | 
					@media (min-width: 768px) {
 | 
				
			||||||
    .price-calc-section .card {
 | 
					    .price-calc-section .card {
 | 
				
			||||||
        margin-left: 0;
 | 
					        /* margin-left: 0; */
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +87,7 @@
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.price-calc-section .card .description {
 | 
					.price-calc-section .card .description {
 | 
				
			||||||
    padding: 7px 8px 2px;
 | 
					    padding: 12px;
 | 
				
			||||||
    position: relative;
 | 
					    position: relative;
 | 
				
			||||||
    display: flex;
 | 
					    display: flex;
 | 
				
			||||||
    justify-content: space-around !important;
 | 
					    justify-content: space-around !important;
 | 
				
			||||||
| 
						 | 
					@ -93,7 +95,7 @@
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.price-calc-section .card .description span {
 | 
					.price-calc-section .card .description span {
 | 
				
			||||||
    font-size: 14px;
 | 
					    font-size: 16px;
 | 
				
			||||||
    margin-left: 5px;
 | 
					    margin-left: 5px;
 | 
				
			||||||
    /* margin-left: 0px; */
 | 
					    /* margin-left: 0px; */
 | 
				
			||||||
    /* justify-self: start; */
 | 
					    /* justify-self: start; */
 | 
				
			||||||
| 
						 | 
					@ -104,17 +106,18 @@
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.price-calc-section .card .description .select-number{
 | 
					.price-calc-section .card .description .select-number{
 | 
				
			||||||
    font-size: 16px;
 | 
					    font-size: 18px;
 | 
				
			||||||
    text-align: center;
 | 
					    text-align: center;
 | 
				
			||||||
    width: 85px;
 | 
					    width: 85px;
 | 
				
			||||||
 | 
					    padding: 5px 10px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.price-calc-section .card .description i {
 | 
					.price-calc-section .card .description i {
 | 
				
			||||||
    color: #29427a;
 | 
					    color: #29427a;
 | 
				
			||||||
    cursor: pointer;
 | 
					    cursor: pointer;
 | 
				
			||||||
    font-size: 20px;
 | 
					    font-size: 20px;
 | 
				
			||||||
    border: 1px solid #ccc;
 | 
					    /* border: 1px solid #ccc; */
 | 
				
			||||||
    padding: 5px 6px 3px;
 | 
					    /* padding: 5px 6px 3px; */
 | 
				
			||||||
    border-radius: 5px;
 | 
					    border-radius: 5px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -193,7 +196,7 @@
 | 
				
			||||||
.price-calc-section .help-block.with-errors {
 | 
					.price-calc-section .help-block.with-errors {
 | 
				
			||||||
    text-align: center;
 | 
					    text-align: center;
 | 
				
			||||||
    margin: 0 0;
 | 
					    margin: 0 0;
 | 
				
			||||||
    padding: 0 0 5px;
 | 
					    padding: 0 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
.price-calc-section .help-block.with-errors ul {
 | 
					.price-calc-section .help-block.with-errors ul {
 | 
				
			||||||
    margin-bottom: 0;
 | 
					    margin-bottom: 0;
 | 
				
			||||||
| 
						 | 
					@ -209,10 +212,10 @@
 | 
				
			||||||
    display: block;
 | 
					    display: block;
 | 
				
			||||||
    position: absolute;
 | 
					    position: absolute;
 | 
				
			||||||
    bottom: 0;
 | 
					    bottom: 0;
 | 
				
			||||||
    left: 18%;
 | 
					    left: 0;
 | 
				
			||||||
    z-index: 20;
 | 
					    z-index: 20;
 | 
				
			||||||
    height: 1px;
 | 
					    height: 1px;
 | 
				
			||||||
    width: 65%;
 | 
					    width: 100%;
 | 
				
			||||||
    background: rgba(128, 128, 128, 0.2);
 | 
					    background: rgba(128, 128, 128, 0.2);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -153,4 +153,83 @@ $( document ).ready(function() {
 | 
				
			||||||
            $('.navbar-fixed-top.topnav').css('padding-right', topnavPadding-scrollbarWidth);
 | 
					            $('.navbar-fixed-top.topnav').css('padding-right', topnavPadding-scrollbarWidth);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* ---------------------------------------------
 | 
				
			||||||
 | 
					     Scripts initialization
 | 
				
			||||||
 | 
					     --------------------------------------------- */
 | 
				
			||||||
 | 
					    var cardPricing = {
 | 
				
			||||||
 | 
					        'cpu': {
 | 
				
			||||||
 | 
					            'id': 'coreValue',
 | 
				
			||||||
 | 
					            'value': 1,
 | 
				
			||||||
 | 
					            'min': 1,
 | 
				
			||||||
 | 
					            'max': 48,
 | 
				
			||||||
 | 
					            'interval': 1
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        'ram': {
 | 
				
			||||||
 | 
					            'id': 'ramValue',
 | 
				
			||||||
 | 
					            'value': 2,
 | 
				
			||||||
 | 
					            'min': 1,
 | 
				
			||||||
 | 
					            'max': 200,
 | 
				
			||||||
 | 
					            'interval': 1
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        'storage': {
 | 
				
			||||||
 | 
					            'id': 'storageValue',
 | 
				
			||||||
 | 
					            'value': 10,
 | 
				
			||||||
 | 
					            'min': 10,
 | 
				
			||||||
 | 
					            'max': 2000,
 | 
				
			||||||
 | 
					            'interval': 10
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _initPricing() {
 | 
				
			||||||
 | 
					        _fetchPricing();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $('.fa-minus-circle.left').click(function(event) {
 | 
				
			||||||
 | 
					            var data = $(this).data('minus');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            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) {
 | 
				
			||||||
 | 
					            var data = $(this).data('plus');
 | 
				
			||||||
 | 
					            if (cardPricing[data].value < cardPricing[data].max) {
 | 
				
			||||||
 | 
					                cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            _fetchPricing();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $('.input-price').change(function() {
 | 
				
			||||||
 | 
					            var data = $(this).attr("name");
 | 
				
			||||||
 | 
					            cardPricing[data].value = $('input[name=' + data + ']').val();
 | 
				
			||||||
 | 
					            _fetchPricing();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _fetchPricing() {
 | 
				
			||||||
 | 
					        Object.keys(cardPricing).map(function(element) {
 | 
				
			||||||
 | 
					            $('input[name=' + element + ']').val(cardPricing[element].value);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        _calcPricing();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _calcPricing() {
 | 
				
			||||||
 | 
					        if(typeof window.coresUnitPrice === 'undefined'){
 | 
				
			||||||
 | 
					            window.coresUnitPrice = 5;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(typeof window.ramUnitPrice === 'undefined'){
 | 
				
			||||||
 | 
					            window.ramUnitPrice = 2;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(typeof window.ssdUnitPrice === 'undefined'){
 | 
				
			||||||
 | 
					            window.ssdUnitPrice = 0.6;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        var total = (cardPricing['cpu'].value * window.coresUnitPrice) +
 | 
				
			||||||
 | 
					                    (cardPricing['ram'].value * window.ramUnitPrice) +
 | 
				
			||||||
 | 
					                    (cardPricing['storage'].value * window.ssdUnitPrice);
 | 
				
			||||||
 | 
					        total = parseFloat(total.toFixed(2));
 | 
				
			||||||
 | 
					        $("#total").text(total);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _initPricing();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
{% load staticfiles bootstrap3%}
 | 
					{% load staticfiles i18n cms_tags sekizai_tags %}
 | 
				
			||||||
{% load i18n %}
 | 
					
 | 
				
			||||||
<!DOCTYPE html>
 | 
					<!DOCTYPE html>
 | 
				
			||||||
<html lang="en">
 | 
					<html lang="en">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,9 @@
 | 
				
			||||||
    {% block css_extra %}
 | 
					    {% block css_extra %}
 | 
				
			||||||
    {% endblock css_extra %}
 | 
					    {% endblock css_extra %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
 | 
				
			||||||
 | 
					    {% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <!-- Custom Fonts -->
 | 
					    <!-- Custom Fonts -->
 | 
				
			||||||
    <link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
 | 
					    <link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
 | 
				
			||||||
    <link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
 | 
					    <link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
 | 
				
			||||||
| 
						 | 
					@ -48,7 +51,7 @@
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
 | 
					    {% cms_toolbar %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    {% block navbar %}
 | 
					    {% block navbar %}
 | 
				
			||||||
        {% include "hosting/includes/_navbar_user.html" %}
 | 
					        {% include "hosting/includes/_navbar_user.html" %}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,9 @@
 | 
				
			||||||
{% extends "hosting/base_short.html" %}
 | 
					{% extends "hosting/base_short.html" %}
 | 
				
			||||||
{% load staticfiles bootstrap3 i18n %}
 | 
					{% load staticfiles bootstrap3 i18n cms_tags %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block content %}
 | 
					{% block content %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="dashboard-container create-vm-container">
 | 
					<div class="dashboard-container create-vm-container">
 | 
				
			||||||
    <div class="row">
 | 
					    <div class="row">
 | 
				
			||||||
        <div class="col-sm-5">
 | 
					        <div class="col-sm-5">
 | 
				
			||||||
| 
						 | 
					@ -17,14 +19,8 @@
 | 
				
			||||||
                {% endif %}
 | 
					                {% endif %}
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="col-sm-6">
 | 
					        <div class="col-sm-6 hosting-calculator">
 | 
				
			||||||
            <div class="price-calc-section no-padding">
 | 
					            {% render_placeholder cms_integration.calculator_placeholder %}
 | 
				
			||||||
                <div class="landing card">
 | 
					 | 
				
			||||||
                    <div class="caption">
 | 
					 | 
				
			||||||
                        {% include "hosting/calculator_form.html" %}
 | 
					 | 
				
			||||||
                    </div>
 | 
					 | 
				
			||||||
                </div>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,12 +42,12 @@
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
                <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-order-table-total">
 | 
					                <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">
 | 
					                    <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>
 | 
					                        {%trans "Total" %} <span>{% if vm_pricing.vat_inclusive %}{%trans "including VAT" %}{% else %}{%trans "excluding VAT" %}{% endif %}</span>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                    <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 tbl-no-padding">
 | 
					                    <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 tbl-no-padding">
 | 
				
			||||||
                        <div class="col-xs-12 col-sm-4 col-md-4 col-lg-4"></div>
 | 
					                        <div class="col-xs-12 col-sm-4 col-md-4 col-lg-4"></div>
 | 
				
			||||||
                        <div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 tbl-total">{{request.session.specs.price|intcomma}}
 | 
					                        <div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 tbl-total">
 | 
				
			||||||
                            CHF<span class="dcl-price-month">/{% trans "Month" %}</span>
 | 
					                            {{request.session.specs.price|intcomma}} CHF/{% trans "Month" %}
 | 
				
			||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,8 +30,9 @@ from stored_messages.api import mark_read
 | 
				
			||||||
from stored_messages.models import Message
 | 
					from stored_messages.models import Message
 | 
				
			||||||
from stored_messages.settings import stored_messages_settings
 | 
					from stored_messages.settings import stored_messages_settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from datacenterlight.models import VMTemplate
 | 
					from datacenterlight.models import VMTemplate, VMPricing
 | 
				
			||||||
from datacenterlight.tasks import create_vm_task
 | 
					from datacenterlight.tasks import create_vm_task
 | 
				
			||||||
 | 
					from datacenterlight.utils import get_cms_integration
 | 
				
			||||||
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 (
 | 
					from opennebula_api.serializers import (
 | 
				
			||||||
| 
						 | 
					@ -42,7 +43,7 @@ from utils.forms import (
 | 
				
			||||||
    BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm,
 | 
					    BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm,
 | 
				
			||||||
    ResendActivationEmailForm
 | 
					    ResendActivationEmailForm
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from utils.hosting_utils import get_vm_price, get_vm_price_with_vat
 | 
					from utils.hosting_utils import get_vm_price_with_vat
 | 
				
			||||||
from utils.mailer import BaseEmail
 | 
					from utils.mailer import BaseEmail
 | 
				
			||||||
from utils.stripe_utils import StripeUtils
 | 
					from utils.stripe_utils import StripeUtils
 | 
				
			||||||
from utils.tasks import send_plain_email_task
 | 
					from utils.tasks import send_plain_email_task
 | 
				
			||||||
| 
						 | 
					@ -854,7 +855,7 @@ class OrdersHostingDetailView(LoginRequiredMixin, DetailView):
 | 
				
			||||||
        cpu = specs.get('cpu')
 | 
					        cpu = specs.get('cpu')
 | 
				
			||||||
        memory = specs.get('memory')
 | 
					        memory = specs.get('memory')
 | 
				
			||||||
        disk_size = specs.get('disk_size')
 | 
					        disk_size = specs.get('disk_size')
 | 
				
			||||||
        amount_to_be_charged = specs.get('price')
 | 
					        amount_to_be_charged = specs.get('total_price')
 | 
				
			||||||
        plan_name = StripeUtils.get_stripe_plan_name(cpu=cpu,
 | 
					        plan_name = StripeUtils.get_stripe_plan_name(cpu=cpu,
 | 
				
			||||||
                                                     memory=memory,
 | 
					                                                     memory=memory,
 | 
				
			||||||
                                                     disk_size=disk_size)
 | 
					                                                     disk_size=disk_size)
 | 
				
			||||||
| 
						 | 
					@ -1003,7 +1004,11 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @method_decorator(decorators)
 | 
					    @method_decorator(decorators)
 | 
				
			||||||
    def get(self, request, *args, **kwargs):
 | 
					    def get(self, request, *args, **kwargs):
 | 
				
			||||||
        context = {'templates': VMTemplate.objects.all()}
 | 
					        print(get_cms_integration('default'))
 | 
				
			||||||
 | 
					        context = {
 | 
				
			||||||
 | 
					            'templates': VMTemplate.objects.all(),
 | 
				
			||||||
 | 
					            'cms_integration': get_cms_integration('default'),
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        return render(request, self.template_name, context)
 | 
					        return render(request, self.template_name, context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @method_decorator(decorators)
 | 
					    @method_decorator(decorators)
 | 
				
			||||||
| 
						 | 
					@ -1015,18 +1020,34 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
 | 
				
			||||||
        storage = request.POST.get('storage')
 | 
					        storage = request.POST.get('storage')
 | 
				
			||||||
        storage_field = forms.IntegerField(validators=[self.validate_storage])
 | 
					        storage_field = forms.IntegerField(validators=[self.validate_storage])
 | 
				
			||||||
        template_id = int(request.POST.get('config'))
 | 
					        template_id = int(request.POST.get('config'))
 | 
				
			||||||
 | 
					        pricing_name = request.POST.get('pricing_name')
 | 
				
			||||||
 | 
					        vm_pricing = VMPricing.get_vm_pricing_by_name(pricing_name)
 | 
				
			||||||
        template = VMTemplate.objects.filter(
 | 
					        template = VMTemplate.objects.filter(
 | 
				
			||||||
            opennebula_vm_template_id=template_id).first()
 | 
					            opennebula_vm_template_id=template_id).first()
 | 
				
			||||||
        template_data = VMTemplateSerializer(template).data
 | 
					        template_data = VMTemplateSerializer(template).data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if vm_pricing is None:
 | 
				
			||||||
 | 
					            vm_pricing_name_msg = _(
 | 
				
			||||||
 | 
					                "Incorrect pricing name. Please contact support"
 | 
				
			||||||
 | 
					                "{support_email}".format(
 | 
				
			||||||
 | 
					                    support_email=settings.DCL_SUPPORT_FROM_ADDRESS
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            messages.add_message(
 | 
				
			||||||
 | 
					                self.request, messages.ERROR, vm_pricing_name_msg,
 | 
				
			||||||
 | 
					                extra_tags='pricing'
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            return redirect(CreateVirtualMachinesView.as_view())
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            vm_pricing_name = vm_pricing.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            cores = cores_field.clean(cores)
 | 
					            cores = cores_field.clean(cores)
 | 
				
			||||||
        except ValidationError as err:
 | 
					        except ValidationError as err:
 | 
				
			||||||
            msg = '{} : {}.'.format(cores, str(err))
 | 
					            msg = '{} : {}.'.format(cores, str(err))
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg,
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
                                 extra_tags='cores')
 | 
					                                 extra_tags='cores')
 | 
				
			||||||
            return HttpResponseRedirect(
 | 
					            return redirect(CreateVirtualMachinesView.as_view())
 | 
				
			||||||
                reverse('datacenterlight:index') + "#order_form")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            memory = memory_field.clean(memory)
 | 
					            memory = memory_field.clean(memory)
 | 
				
			||||||
| 
						 | 
					@ -1034,8 +1055,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
 | 
				
			||||||
            msg = '{} : {}.'.format(memory, str(err))
 | 
					            msg = '{} : {}.'.format(memory, str(err))
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg,
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
                                 extra_tags='memory')
 | 
					                                 extra_tags='memory')
 | 
				
			||||||
            return HttpResponseRedirect(
 | 
					            return redirect(CreateVirtualMachinesView.as_view())
 | 
				
			||||||
                reverse('datacenterlight:index') + "#order_form")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            storage = storage_field.clean(storage)
 | 
					            storage = storage_field.clean(storage)
 | 
				
			||||||
| 
						 | 
					@ -1043,15 +1063,24 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
 | 
				
			||||||
            msg = '{} : {}.'.format(storage, str(err))
 | 
					            msg = '{} : {}.'.format(storage, str(err))
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg,
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
                                 extra_tags='storage')
 | 
					                                 extra_tags='storage')
 | 
				
			||||||
            return HttpResponseRedirect(
 | 
					            return redirect(CreateVirtualMachinesView.as_view())
 | 
				
			||||||
                reverse('datacenterlight:index') + "#order_form")
 | 
					
 | 
				
			||||||
        price = get_vm_price(cpu=cores, memory=memory,
 | 
					        price, vat, vat_percent = get_vm_price_with_vat(
 | 
				
			||||||
                             disk_size=storage)
 | 
					            cpu=cores,
 | 
				
			||||||
 | 
					            memory=memory,
 | 
				
			||||||
 | 
					            ssd_size=storage,
 | 
				
			||||||
 | 
					            pricing_name=vm_pricing_name
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        specs = {
 | 
					        specs = {
 | 
				
			||||||
            'cpu': cores,
 | 
					            'cpu': cores,
 | 
				
			||||||
            'memory': memory,
 | 
					            'memory': memory,
 | 
				
			||||||
            'disk_size': storage,
 | 
					            'disk_size': storage,
 | 
				
			||||||
            'price': price
 | 
					            'price': price,
 | 
				
			||||||
 | 
					            'vat': vat,
 | 
				
			||||||
 | 
					            'vat_percent': vat_percent,
 | 
				
			||||||
 | 
					            'total_price': price + vat,
 | 
				
			||||||
 | 
					            'pricing_name': vm_pricing_name
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        request.session['specs'] = specs
 | 
					        request.session['specs'] = specs
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue