From 1b11f74a40ede40b1c197661b112f856b4334a2e Mon Sep 17 00:00:00 2001 From: PCoder Date: Tue, 24 Dec 2019 16:25:05 +0530 Subject: [PATCH 1/3] Fix spelling --- Changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 208d2d7a..d9ae2b70 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,5 @@ 2.8.1: 2019-12-24 - * [dcl cms navbar plugin]: Provide an option to show non transparent navar always + * [dcl cms navbar plugin]: Provide an option to show non transparent navbar always 2.8: 2019-12-20 * ldap_migration: Migrate django users to Ldap Notes for deployment: From ff07cab96c4d689a82ee854f219d0a003b344fa7 Mon Sep 17 00:00:00 2001 From: PCoder Date: Tue, 24 Dec 2019 16:57:35 +0530 Subject: [PATCH 2/3] Move validation of calculator to plugin --- datacenterlight/cms_plugins.py | 158 +++++++++++++++++++++++++++++---- hosting/views.py | 34 ------- 2 files changed, 142 insertions(+), 50 deletions(-) diff --git a/datacenterlight/cms_plugins.py b/datacenterlight/cms_plugins.py index c3ec974f..ff03878f 100644 --- a/datacenterlight/cms_plugins.py +++ b/datacenterlight/cms_plugins.py @@ -1,5 +1,14 @@ +import logging + from cms.plugin_base import CMSPluginBase from cms.plugin_pool import plugin_pool +from django import forms +from django.conf import settings +from django.contrib import messages +from django.core.exceptions import ValidationError +from django.shortcuts import redirect +from django.utils.translation import ugettext_lazy as _ +from django.core.urlresolvers import reverse from .cms_models import ( DCLBannerItemPluginModel, DCLBannerListPluginModel, DCLContactPluginModel, @@ -8,8 +17,11 @@ from .cms_models import ( DCLSectionPluginModel, DCLNavbarPluginModel, DCLSectionPromoPluginModel, DCLCalculatorPluginModel ) -from .models import VMTemplate +from .models import VMTemplate, VMPricing from datacenterlight.utils import clear_all_session_vars +from opennebula_api.serializers import VMTemplateSerializer + +logger = logging.getLogger(__name__) @plugin_pool.register_plugin @@ -87,22 +99,136 @@ class DCLCalculatorPlugin(CMSPluginBase): def render(self, context, instance, placeholder): clear_all_session_vars(context['request']) - context = super(DCLCalculatorPlugin, self).render( - context, instance, placeholder - ) - ids = instance.vm_templates_to_show - if ids: - context['templates'] = VMTemplate.objects.filter( - vm_type=instance.vm_type - ).filter(opennebula_vm_template_id__in=ids).order_by('name') - else: - context['templates'] = VMTemplate.objects.filter( - vm_type=instance.vm_type - ).order_by('name') - context['instance'] = instance - context['min_ram'] = 0.5 if instance.enable_512mb_ram else 1 - return context + if instance and instance.template: + self.render_template = instance.template + + if self.request.method == "POST" and "order_form" in self.request.POST.keys(): + cores = self.request.POST.get('cpu') + cores_field = forms.IntegerField(validators=[self.validate_cores]) + memory = self.request.POST.get('ram') + memory_field = forms.FloatField(validators=[self.validate_memory]) + storage = self.request.POST.get('storage') + storage_field = forms.IntegerField( + validators=[self.validate_storage]) + template_id = int(self.request.POST.get('config')) + pricing_name = self.request.POST.get('pricing_name') + vm_pricing = VMPricing.get_vm_pricing_by_name(pricing_name) + template = VMTemplate.objects.filter( + opennebula_vm_template_id=template_id).first() + 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(self) + else: + vm_pricing_name = vm_pricing.name + + try: + cores = cores_field.clean(cores) + except ValidationError as err: + msg = '{} : {}.'.format(cores, str(err)) + messages.add_message(self.request, messages.ERROR, msg, + extra_tags='cores') + return redirect(self) + + try: + memory = memory_field.clean(memory) + except ValidationError as err: + msg = '{} : {}.'.format(memory, str(err)) + messages.add_message(self.request, messages.ERROR, msg, + extra_tags='memory') + return redirect(self) + + try: + storage = storage_field.clean(storage) + except ValidationError as err: + msg = '{} : {}.'.format(storage, str(err)) + messages.add_message(self.request, messages.ERROR, msg, + extra_tags='storage') + return redirect(self) + + price, vat, vat_percent, discount = get_vm_price_with_vat( + cpu=cores, + memory=memory, + ssd_size=storage, + pricing_name=vm_pricing_name + ) + + specs = { + 'cpu': cores, + 'memory': memory, + 'disk_size': storage, + 'discount': discount, + 'price': price, + 'vat': vat, + 'vat_percent': vat_percent, + 'total_price': round(price + vat - discount['amount'], 2), + 'pricing_name': vm_pricing_name + } + + self.request.session['specs'] = specs + self.request.session['template'] = template_data + return redirect(reverse('datacenterlight:payment')) + else: + context = super(DCLCalculatorPlugin, self).render( + context, instance, placeholder + ) + ids = instance.vm_templates_to_show + if ids: + context['templates'] = VMTemplate.objects.filter( + vm_type=instance.vm_type + ).filter(opennebula_vm_template_id__in=ids).order_by('name') + else: + context['templates'] = VMTemplate.objects.filter( + vm_type=instance.vm_type + ).order_by('name') + context['instance'] = instance + context['min_ram'] = 0.5 if instance.enable_512mb_ram else 1 + return context + + def validate_cores(self, value): + if (value > 48) or (value < 1): + raise ValidationError(_('Invalid number of cores')) + + def validate_memory(self, value): + 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')) + + def validate_storage(self, value): + if (value > 2000) or (value < 10): + raise ValidationError(_('Invalid storage size')) @plugin_pool.register_plugin class DCLBannerListPlugin(CMSPluginBase): diff --git a/hosting/views.py b/hosting/views.py index 83995ac4..c53a20cc 100644 --- a/hosting/views.py +++ b/hosting/views.py @@ -1439,40 +1439,6 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View): template_name = "hosting/create_virtual_machine.html" login_url = reverse_lazy('hosting:login') - def validate_cores(self, value): - if (value > 48) or (value < 1): - raise ValidationError(_('Invalid number of cores')) - - def validate_memory(self, value): - 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')) - - def validate_storage(self, value): - if (value > 2000) or (value < 10): - raise ValidationError(_('Invalid storage size')) - @method_decorator(decorators) def get(self, request, *args, **kwargs): context = { From 610dc6ecc1c67db6d0a3d8287ce618c9f18c3cf2 Mon Sep 17 00:00:00 2001 From: PCoder Date: Tue, 24 Dec 2019 17:15:38 +0530 Subject: [PATCH 3/3] Fix bugs --- datacenterlight/cms_plugins.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/datacenterlight/cms_plugins.py b/datacenterlight/cms_plugins.py index ff03878f..34bdee52 100644 --- a/datacenterlight/cms_plugins.py +++ b/datacenterlight/cms_plugins.py @@ -100,19 +100,19 @@ class DCLCalculatorPlugin(CMSPluginBase): def render(self, context, instance, placeholder): clear_all_session_vars(context['request']) - if instance and instance.template: + if instance and hasattr(instance, 'template'): self.render_template = instance.template - - if self.request.method == "POST" and "order_form" in self.request.POST.keys(): - cores = self.request.POST.get('cpu') + request = context['request'] + if request.method == "POST" and "order_form" in request.POST.keys(): + cores = request.POST.get('cpu') cores_field = forms.IntegerField(validators=[self.validate_cores]) - memory = self.request.POST.get('ram') + memory = request.POST.get('ram') memory_field = forms.FloatField(validators=[self.validate_memory]) - storage = self.request.POST.get('storage') + storage = request.POST.get('storage') storage_field = forms.IntegerField( validators=[self.validate_storage]) - template_id = int(self.request.POST.get('config')) - pricing_name = self.request.POST.get('pricing_name') + 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( opennebula_vm_template_id=template_id).first() @@ -126,7 +126,7 @@ class DCLCalculatorPlugin(CMSPluginBase): ) ) messages.add_message( - self.request, messages.ERROR, vm_pricing_name_msg, + request, messages.ERROR, vm_pricing_name_msg, extra_tags='pricing' ) return redirect(self) @@ -137,7 +137,7 @@ class DCLCalculatorPlugin(CMSPluginBase): cores = cores_field.clean(cores) except ValidationError as err: msg = '{} : {}.'.format(cores, str(err)) - messages.add_message(self.request, messages.ERROR, msg, + messages.add_message(request, messages.ERROR, msg, extra_tags='cores') return redirect(self) @@ -145,7 +145,7 @@ class DCLCalculatorPlugin(CMSPluginBase): memory = memory_field.clean(memory) except ValidationError as err: msg = '{} : {}.'.format(memory, str(err)) - messages.add_message(self.request, messages.ERROR, msg, + messages.add_message(request, messages.ERROR, msg, extra_tags='memory') return redirect(self) @@ -153,7 +153,7 @@ class DCLCalculatorPlugin(CMSPluginBase): storage = storage_field.clean(storage) except ValidationError as err: msg = '{} : {}.'.format(storage, str(err)) - messages.add_message(self.request, messages.ERROR, msg, + messages.add_message(request, messages.ERROR, msg, extra_tags='storage') return redirect(self) @@ -176,8 +176,8 @@ class DCLCalculatorPlugin(CMSPluginBase): 'pricing_name': vm_pricing_name } - self.request.session['specs'] = specs - self.request.session['template'] = template_data + request.session['specs'] = specs + request.session['template'] = template_data return redirect(reverse('datacenterlight:payment')) else: context = super(DCLCalculatorPlugin, self).render( @@ -201,14 +201,14 @@ class DCLCalculatorPlugin(CMSPluginBase): raise ValidationError(_('Invalid number of cores')) def validate_memory(self, value): - if 'pid' in self.request.POST: + if 'pid' in request.POST: try: plugin = DCLCalculatorPluginModel.objects.get( - id=self.request.POST['pid'] + id=request.POST['pid'] ) except DCLCalculatorPluginModel.DoesNotExist as dne: logger.error( - str(dne) + " plugin_id: " + self.request.POST['pid'] + str(dne) + " plugin_id: " + request.POST['pid'] ) raise ValidationError(_('Invalid calculator properties')) if plugin.enable_512mb_ram: