Merge pull request #672 from pcoder/task/5681/offer-512mb-ram
Allow admin to lower the minimum RAM for a calculator instance to 512 MB
This commit is contained in:
		
				commit
				
					
						961bf2e46f
					
				
			
		
					 9 changed files with 171 additions and 26 deletions
				
			
		|  | @ -361,3 +361,4 @@ class DCLCalculatorPluginModel(CMSPlugin): | ||||||
|         help_text="Write the name of the template that you need selected as" |         help_text="Write the name of the template that you need selected as" | ||||||
|                   " default when the calculator loads" |                   " default when the calculator loads" | ||||||
|     ) |     ) | ||||||
|  |     enable_512mb_ram = models.BooleanField(default=False) | ||||||
|  |  | ||||||
|  | @ -99,9 +99,8 @@ class DCLCalculatorPlugin(CMSPluginBase): | ||||||
|             context['templates'] = VMTemplate.objects.filter( |             context['templates'] = VMTemplate.objects.filter( | ||||||
|                 vm_type=instance.vm_type |                 vm_type=instance.vm_type | ||||||
|             ).order_by('name') |             ).order_by('name') | ||||||
|         context['default_selected_template'] = ( |         context['instance'] = instance | ||||||
|             instance.default_selected_template |         context['min_ram'] = 0.5 if instance.enable_512mb_ram else 1 | ||||||
|         ) |  | ||||||
|         return context |         return context | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # Generated by Django 1.9.4 on 2018-09-29 05:36 | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import migrations, models | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [ | ||||||
|  |         ('datacenterlight', '0026_dclcalculatorpluginmodel_default_selected_template'), | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.AddField( | ||||||
|  |             model_name='dclcalculatorpluginmodel', | ||||||
|  |             name='enable_512mb_ram', | ||||||
|  |             field=models.BooleanField(default=False), | ||||||
|  |         ), | ||||||
|  |     ] | ||||||
|  | @ -5,6 +5,10 @@ | ||||||
|     /* --------------------------------------------- |     /* --------------------------------------------- | ||||||
|      Scripts initialization |      Scripts initialization | ||||||
|      --------------------------------------------- */ |      --------------------------------------------- */ | ||||||
|  |     var minRam = 1; | ||||||
|  |     if(window.minRam){ | ||||||
|  |         minRam = window.minRam; | ||||||
|  |     } | ||||||
|     var cardPricing = { |     var cardPricing = { | ||||||
|         'cpu': { |         'cpu': { | ||||||
|             'id': 'coreValue', |             'id': 'coreValue', | ||||||
|  | @ -16,7 +20,7 @@ | ||||||
|         'ram': { |         'ram': { | ||||||
|             'id': 'ramValue', |             'id': 'ramValue', | ||||||
|             'value': 2, |             'value': 2, | ||||||
|             'min': 1, |             'min': minRam, | ||||||
|             'max': 200, |             'max': 200, | ||||||
|             'interval': 1 |             'interval': 1 | ||||||
|         }, |         }, | ||||||
|  | @ -40,6 +44,7 @@ | ||||||
|         _initNavUrl(); |         _initNavUrl(); | ||||||
|         _initPricing(); |         _initPricing(); | ||||||
|         ajaxForms(); |         ajaxForms(); | ||||||
|  |         $('#ramValue').data('old-value', $('#ramValue').val()); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     $(window).resize(function() { |     $(window).resize(function() { | ||||||
|  | @ -144,21 +149,54 @@ | ||||||
|             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; |                 if(data === 'ram' && String(cardPricing[data].value) === "1" && minRam === 0.5){ | ||||||
|  |                     cardPricing[data].value = 0.5; | ||||||
|  |                     $('#ramValue').val('0.5'); | ||||||
|  |                     $("#ramValue").attr('step', 0.5); | ||||||
|  |                 } else { | ||||||
|  |                     cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             _fetchPricing(); |             _fetchPricing(); | ||||||
|  |             $('#ramValue').data('old-value', $('#ramValue').val()); | ||||||
|         }); |         }); | ||||||
|         $('.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; |                 if(data === 'ram' && String(cardPricing[data].value) === "0.5" && minRam === 0.5){ | ||||||
|  |                     cardPricing[data].value = 1; | ||||||
|  |                     $('#ramValue').val('1'); | ||||||
|  |                     $("#ramValue").attr('step', 1); | ||||||
|  |                 } else { | ||||||
|  |                     cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             _fetchPricing(); |             _fetchPricing(); | ||||||
|  |             $('#ramValue').data('old-value', $('#ramValue').val()); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         $('.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(); |             var input = $('input[name=' + data + ']'); | ||||||
|  |             var inputValue = input.val(); | ||||||
|  | 
 | ||||||
|  |             if(data === 'ram') { | ||||||
|  |                 var ramInput = $('#ramValue'); | ||||||
|  |                 if ($('#ramValue').data('old-value') < $('#ramValue').val()) { | ||||||
|  |                     if($('#ramValue').val() === '1' && minRam === 0.5) { | ||||||
|  |                         $("#ramValue").attr('step', 1); | ||||||
|  |                         $('#ramValue').val('1'); | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     if($('#ramValue').val() === '0' && minRam === 0.5) { | ||||||
|  |                         $("#ramValue").attr('step', 0.5); | ||||||
|  |                         $('#ramValue').val('0.5'); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 inputValue = $('#ramValue').val(); | ||||||
|  |                 $('#ramValue').data('old-value', $('#ramValue').val()); | ||||||
|  |             } | ||||||
|  |             cardPricing[data].value = inputValue; | ||||||
|             _fetchPricing(); |             _fetchPricing(); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -9,11 +9,14 @@ | ||||||
|         window.ssdUnitPrice = {{vm_pricing.ssd_unit_price|default:0}}; |         window.ssdUnitPrice = {{vm_pricing.ssd_unit_price|default:0}}; | ||||||
|         window.hddUnitPrice = {{vm_pricing.hdd_unit_price|default:0}}; |         window.hddUnitPrice = {{vm_pricing.hdd_unit_price|default:0}}; | ||||||
|         window.discountAmount = {{vm_pricing.discount_amount|default:0}}; |         window.discountAmount = {{vm_pricing.discount_amount|default:0}}; | ||||||
|  |         window.minRam = {{min_ram}}; | ||||||
|  |         window.minRamErr = '{% blocktrans with min_ram=min_ram %}Please enter a value in range {{min_ram}} - 200.{% endblocktrans %}'; | ||||||
|     </script> |     </script> | ||||||
| {% endif %} | {% endif %} | ||||||
| 
 | 
 | ||||||
| <form id="order_form" method="POST" action="{{calculator_form_url}}" data-toggle="validator" role="form"> | <form id="order_form" method="POST" action="{{calculator_form_url}}" data-toggle="validator" role="form"> | ||||||
|     {% csrf_token %} |     {% csrf_token %} | ||||||
|  |     <input type="hidden" name="pid" value="{{instance.id}}"> | ||||||
|     <div class="title"> |     <div class="title"> | ||||||
|         <h3>{% trans "VM hosting" %} </h3> |         <h3>{% trans "VM hosting" %} </h3> | ||||||
|     </div> |     </div> | ||||||
|  | @ -54,8 +57,8 @@ | ||||||
|         <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="1" max="200" name="ram" |                 <input id="ramValue" class="input-price select-number" type="number" min="{% if min_ram == 0.5 %}0{% else %}1{% endif %}" max="200" name="ram" | ||||||
|                        data-error="{% trans 'Please enter a value in range 1 - 200.' %}" required> |                        data-error="{% blocktrans with min_ram=min_ram %}Please enter a value in range {{min_ram}} - 200.{% endblocktrans %}" required step="1"> | ||||||
|                 <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> | ||||||
|  | @ -92,11 +95,11 @@ | ||||||
|             <select name="config"> |             <select name="config"> | ||||||
|                 {% for template in templates %} |                 {% for template in templates %} | ||||||
| 
 | 
 | ||||||
|                 <option value="{{template.opennebula_vm_template_id}}" {% if template.name|lower == default_selected_template|lower %}selected="selected"{% endif %}>{{template.name}}</option> |                 <option value="{{template.opennebula_vm_template_id}}" {% if template.name|lower == instance.default_selected_template|lower %}selected="selected"{% endif %}>{{template.name}}</option> | ||||||
|                 {% endfor %} |                 {% endfor %} | ||||||
|             </select> |             </select> | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
|     <input type="hidden" name="pricing_name" value="{% if vm_pricing.name %}{{vm_pricing.name}}{% else %}unknown{% endif%}"></input> |     <input type="hidden" name="pricing_name" value="{% if vm_pricing.name %}{{vm_pricing.name}}{% else %}unknown{% endif%}"></input> | ||||||
|     <input type="submit" class="btn btn-primary disabled" value="{% trans 'Continue' %}"></input> |     <input type="submit" class="btn btn-primary disabled" value="{% trans 'Continue' %}"></input> | ||||||
| </form> | </form> | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ from utils.forms import ( | ||||||
| from utils.hosting_utils import get_vm_price_with_vat | from utils.hosting_utils import get_vm_price_with_vat | ||||||
| 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 | ||||||
|  | from .cms_models import DCLCalculatorPluginModel | ||||||
| from .forms import ContactForm | from .forms import ContactForm | ||||||
| from .models import VMTemplate, VMPricing | from .models import VMTemplate, VMPricing | ||||||
| from .utils import get_cms_integration, create_vm, clear_all_session_vars | from .utils import get_cms_integration, create_vm, clear_all_session_vars | ||||||
|  | @ -89,7 +90,29 @@ class IndexView(CreateView): | ||||||
|             raise ValidationError(_('Invalid number of cores')) |             raise ValidationError(_('Invalid number of cores')) | ||||||
| 
 | 
 | ||||||
|     def validate_memory(self, value): |     def validate_memory(self, value): | ||||||
|         if (value > 200) or (value < 1): |         if 'pid' in self.request.POST: | ||||||
|  |             try: | ||||||
|  |                 plugin = DCLCalculatorPluginModel.objects.get( | ||||||
|  |                              id=self.request.POST['pid'] | ||||||
|  |                          ) | ||||||
|  |             except DCLCalculatorPluginModel.DoesNotExist as dne: | ||||||
|  |                 logger.error( | ||||||
|  |                     str(dne) + " plugin_id: " + self.request.POST['pid'] | ||||||
|  |                 ) | ||||||
|  |                 raise ValidationError(_('Invalid calculator properties')) | ||||||
|  |             if plugin.enable_512mb_ram: | ||||||
|  |                 if value % 1 == 0 or value == 0.5: | ||||||
|  |                     logger.debug( | ||||||
|  |                         "Given ram {value} is either 0.5 or a" | ||||||
|  |                         " whole number".format(value=value) | ||||||
|  |                     ) | ||||||
|  |                     if (value > 200) or (value < 0.5): | ||||||
|  |                         raise ValidationError(_('Invalid RAM size')) | ||||||
|  |                 else: | ||||||
|  |                     raise ValidationError(_('Invalid RAM size')) | ||||||
|  |             elif (value > 200) or (value < 1) or (value % 1 != 0): | ||||||
|  |                 raise ValidationError(_('Invalid RAM size')) | ||||||
|  |         else: | ||||||
|             raise ValidationError(_('Invalid RAM size')) |             raise ValidationError(_('Invalid RAM size')) | ||||||
| 
 | 
 | ||||||
|     def validate_storage(self, value): |     def validate_storage(self, value): | ||||||
|  | @ -105,7 +128,7 @@ class IndexView(CreateView): | ||||||
|         cores = request.POST.get('cpu') |         cores = request.POST.get('cpu') | ||||||
|         cores_field = forms.IntegerField(validators=[self.validate_cores]) |         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]) |         memory_field = forms.FloatField(validators=[self.validate_memory]) | ||||||
|         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')) | ||||||
|  | @ -174,7 +197,7 @@ class IndexView(CreateView): | ||||||
|             'vat': vat, |             'vat': vat, | ||||||
|             'vat_percent': vat_percent, |             'vat_percent': vat_percent, | ||||||
|             'discount': discount, |             'discount': discount, | ||||||
|             'total_price': price + vat - discount['amount'], |             'total_price': round(price + vat - discount['amount'], 2), | ||||||
|             'pricing_name': vm_pricing_name |             'pricing_name': vm_pricing_name | ||||||
|         } |         } | ||||||
|         request.session['specs'] = specs |         request.session['specs'] = specs | ||||||
|  |  | ||||||
|  | @ -157,6 +157,10 @@ $( document ).ready(function() { | ||||||
|     /* --------------------------------------------- |     /* --------------------------------------------- | ||||||
|      Scripts initialization |      Scripts initialization | ||||||
|      --------------------------------------------- */ |      --------------------------------------------- */ | ||||||
|  |     var minRam = 1; | ||||||
|  |     if(window.minRam){ | ||||||
|  |         minRam = window.minRam; | ||||||
|  |     } | ||||||
|     var cardPricing = { |     var cardPricing = { | ||||||
|         'cpu': { |         'cpu': { | ||||||
|             'id': 'coreValue', |             'id': 'coreValue', | ||||||
|  | @ -168,7 +172,7 @@ $( document ).ready(function() { | ||||||
|         'ram': { |         'ram': { | ||||||
|             'id': 'ramValue', |             'id': 'ramValue', | ||||||
|             'value': 2, |             'value': 2, | ||||||
|             'min': 1, |             'min': minRam, | ||||||
|             'max': 200, |             'max': 200, | ||||||
|             'interval': 1 |             'interval': 1 | ||||||
|         }, |         }, | ||||||
|  | @ -188,21 +192,54 @@ $( document ).ready(function() { | ||||||
|             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; |                 if(data === 'ram' && String(cardPricing[data].value) === "1" && minRam === 0.5){ | ||||||
|  |                     cardPricing[data].value = 0.5; | ||||||
|  |                     $('#ramValue').val('0.5'); | ||||||
|  |                     $("#ramValue").attr('step', 0.5); | ||||||
|  |                 } else { | ||||||
|  |                     cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             _fetchPricing(); |             _fetchPricing(); | ||||||
|  |             $('#ramValue').data('old-value', $('#ramValue').val()); | ||||||
|         }); |         }); | ||||||
|         $('.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; |                 if(data === 'ram' && String(cardPricing[data].value) === "0.5" && minRam === 0.5){ | ||||||
|  |                     cardPricing[data].value = 1; | ||||||
|  |                     $('#ramValue').val('1'); | ||||||
|  |                     $("#ramValue").attr('step', 1); | ||||||
|  |                 } else { | ||||||
|  |                     cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             _fetchPricing(); |             _fetchPricing(); | ||||||
|  |             $('#ramValue').data('old-value', $('#ramValue').val()); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         $('.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(); |             var input = $('input[name=' + data + ']'); | ||||||
|  |             var inputValue = input.val(); | ||||||
|  | 
 | ||||||
|  |             if(data === 'ram') { | ||||||
|  |                 var ramInput = $('#ramValue'); | ||||||
|  |                 if ($('#ramValue').data('old-value') < $('#ramValue').val()) { | ||||||
|  |                     if($('#ramValue').val() === '1' && minRam === 0.5) { | ||||||
|  |                         $("#ramValue").attr('step', 1); | ||||||
|  |                         $('#ramValue').val('1'); | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     if($('#ramValue').val() === '0' && minRam === 0.5) { | ||||||
|  |                         $("#ramValue").attr('step', 0.5); | ||||||
|  |                         $('#ramValue').val('0.5'); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 inputValue = $('#ramValue').val(); | ||||||
|  |                 $('#ramValue').data('old-value', $('#ramValue').val()); | ||||||
|  |             } | ||||||
|  |             cardPricing[data].value = inputValue; | ||||||
|             _fetchPricing(); |             _fetchPricing(); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  | @ -236,4 +273,5 @@ $( document ).ready(function() { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     _initPricing(); |     _initPricing(); | ||||||
| }); |     $('#ramValue').data('old-value', $('#ramValue').val()); | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | @ -32,6 +32,7 @@ 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.cms_models import DCLCalculatorPluginModel | ||||||
| from datacenterlight.models import VMTemplate, VMPricing | from datacenterlight.models import VMTemplate, VMPricing | ||||||
| from datacenterlight.utils import create_vm, get_cms_integration | from datacenterlight.utils import create_vm, get_cms_integration | ||||||
| from hosting.models import UserCardDetail | from hosting.models import UserCardDetail | ||||||
|  | @ -1198,7 +1199,29 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View): | ||||||
|             raise ValidationError(_('Invalid number of cores')) |             raise ValidationError(_('Invalid number of cores')) | ||||||
| 
 | 
 | ||||||
|     def validate_memory(self, value): |     def validate_memory(self, value): | ||||||
|         if (value > 200) or (value < 1): |         if 'pid' in self.request.POST: | ||||||
|  |             try: | ||||||
|  |                 plugin = DCLCalculatorPluginModel.objects.get( | ||||||
|  |                              id=self.request.POST['pid'] | ||||||
|  |                          ) | ||||||
|  |             except DCLCalculatorPluginModel.DoesNotExist as dne: | ||||||
|  |                 logger.error( | ||||||
|  |                     str(dne) + " plugin_id: " + self.request.POST['pid'] | ||||||
|  |                 ) | ||||||
|  |                 raise ValidationError(_('Invalid calculator properties')) | ||||||
|  |             if plugin.enable_512mb_ram: | ||||||
|  |                 if value % 1 == 0 or value == 0.5: | ||||||
|  |                     logger.debug( | ||||||
|  |                         "Given ram {value} is either 0.5 or a" | ||||||
|  |                         " whole number".format(value=value) | ||||||
|  |                     ) | ||||||
|  |                     if (value > 200) or (value < 0.5): | ||||||
|  |                         raise ValidationError(_('Invalid RAM size')) | ||||||
|  |                 else: | ||||||
|  |                     raise ValidationError(_('Invalid RAM size')) | ||||||
|  |             elif (value > 200) or (value < 1) or (value % 1 != 0): | ||||||
|  |                 raise ValidationError(_('Invalid RAM size')) | ||||||
|  |         else: | ||||||
|             raise ValidationError(_('Invalid RAM size')) |             raise ValidationError(_('Invalid RAM size')) | ||||||
| 
 | 
 | ||||||
|     def validate_storage(self, value): |     def validate_storage(self, value): | ||||||
|  | @ -1218,7 +1241,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View): | ||||||
|         cores = request.POST.get('cpu') |         cores = request.POST.get('cpu') | ||||||
|         cores_field = forms.IntegerField(validators=[self.validate_cores]) |         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]) |         memory_field = forms.FloatField(validators=[self.validate_memory]) | ||||||
|         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')) | ||||||
|  | @ -1282,7 +1305,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View): | ||||||
|             'price': price, |             'price': price, | ||||||
|             'vat': vat, |             'vat': vat, | ||||||
|             'vat_percent': vat_percent, |             'vat_percent': vat_percent, | ||||||
|             'total_price': price + vat - discount['amount'], |             'total_price': round(price + vat - discount['amount'], 2), | ||||||
|             'pricing_name': vm_pricing_name |             'pricing_name': vm_pricing_name | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -249,8 +249,8 @@ class OpenNebulaManager(): | ||||||
|             vm_specs = vm_specs_formatter.format( |             vm_specs = vm_specs_formatter.format( | ||||||
|                 vcpu=int(specs['cpu']), |                 vcpu=int(specs['cpu']), | ||||||
|                 cpu=0.1 * int(specs['cpu']), |                 cpu=0.1 * int(specs['cpu']), | ||||||
|                 memory=1024 * int(specs['memory']), |                 memory=(512 if specs['memory'] == 0.5 else | ||||||
| 
 |                         1024 * int(specs['memory'])), | ||||||
|             ) |             ) | ||||||
|             vm_specs += """<DISK> |             vm_specs += """<DISK> | ||||||
|                                   <TYPE>fs</TYPE> |                                   <TYPE>fs</TYPE> | ||||||
|  | @ -269,8 +269,8 @@ class OpenNebulaManager(): | ||||||
|             vm_specs = vm_specs_formatter.format( |             vm_specs = vm_specs_formatter.format( | ||||||
|                 vcpu=int(specs['cpu']), |                 vcpu=int(specs['cpu']), | ||||||
|                 cpu=0.1 * int(specs['cpu']), |                 cpu=0.1 * int(specs['cpu']), | ||||||
|                 memory=1024 * int(specs['memory']), |                 memory=(512 if specs['memory'] == 0.5 else | ||||||
| 
 |                         1024 * int(specs['memory'])), | ||||||
|             ) |             ) | ||||||
|             vm_specs += """<DISK> |             vm_specs += """<DISK> | ||||||
|                                   <TYPE>fs</TYPE> |                                   <TYPE>fs</TYPE> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue