Refactor show_vm_templates to DCLCalculatorPluginModel from VMPricing
This commit is contained in:
parent
b872777bda
commit
79e83b4480
5 changed files with 67 additions and 60 deletions
|
@ -2,6 +2,8 @@ from cms.extensions import PageExtension
|
||||||
from cms.extensions.extension_pool import extension_pool
|
from cms.extensions.extension_pool import extension_pool
|
||||||
from cms.models.fields import PlaceholderField
|
from cms.models.fields import PlaceholderField
|
||||||
from cms.models.pluginmodel import CMSPlugin
|
from cms.models.pluginmodel import CMSPlugin
|
||||||
|
from django import forms
|
||||||
|
from django.contrib.postgres.fields import ArrayField
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
@ -292,7 +294,35 @@ class DCLSectionPromoPluginModel(CMSPlugin):
|
||||||
return extra_classes
|
return extra_classes
|
||||||
|
|
||||||
|
|
||||||
|
class MultipleChoiceArrayField(ArrayField):
|
||||||
|
"""
|
||||||
|
A field that allows us to store an array of choices.
|
||||||
|
Uses Django's Postgres ArrayField
|
||||||
|
and a MultipleChoiceField for its formfield.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def formfield(self, **kwargs):
|
||||||
|
defaults = {
|
||||||
|
'form_class': forms.MultipleChoiceField,
|
||||||
|
'choices': self.base_field.choices,
|
||||||
|
}
|
||||||
|
defaults.update(kwargs)
|
||||||
|
# Skip our parent's formfield implementation completely as we don't
|
||||||
|
# care for it.
|
||||||
|
# pylint:disable=bad-super-call
|
||||||
|
return super(ArrayField, self).formfield(**defaults)
|
||||||
|
|
||||||
|
|
||||||
class DCLCalculatorPluginModel(CMSPlugin):
|
class DCLCalculatorPluginModel(CMSPlugin):
|
||||||
|
VMTemplateChoices = list(
|
||||||
|
(
|
||||||
|
str(obj.opennebula_vm_template_id),
|
||||||
|
(obj.name + ' - ' + VMTemplate.IPV6.title()
|
||||||
|
if obj.vm_type == VMTemplate.IPV6 else obj.name
|
||||||
|
)
|
||||||
|
)
|
||||||
|
for obj in VMTemplate.objects.all()
|
||||||
|
)
|
||||||
pricing = models.ForeignKey(
|
pricing = models.ForeignKey(
|
||||||
VMPricing,
|
VMPricing,
|
||||||
related_name="dcl_custom_pricing_vm_pricing",
|
related_name="dcl_custom_pricing_vm_pricing",
|
||||||
|
@ -303,3 +333,18 @@ class DCLCalculatorPluginModel(CMSPlugin):
|
||||||
max_length=50, choices=VMTemplate.VM_TYPE_CHOICES,
|
max_length=50, choices=VMTemplate.VM_TYPE_CHOICES,
|
||||||
default=VMTemplate.PUBLIC
|
default=VMTemplate.PUBLIC
|
||||||
)
|
)
|
||||||
|
vm_templates_to_show = MultipleChoiceArrayField(
|
||||||
|
base_field=models.CharField(
|
||||||
|
blank=True,
|
||||||
|
max_length=256,
|
||||||
|
choices=VMTemplateChoices
|
||||||
|
),
|
||||||
|
default=list,
|
||||||
|
blank=True,
|
||||||
|
help_text="Recommended: If you wish to show all templates of the "
|
||||||
|
"corresponding VM Type (public/ipv6only), please do not "
|
||||||
|
"select any of the items in the above field. "
|
||||||
|
"This will allow any new template(s) added "
|
||||||
|
"in the backend to be automatically listed in this "
|
||||||
|
"calculator instance."
|
||||||
|
)
|
||||||
|
|
|
@ -88,7 +88,7 @@ class DCLCalculatorPlugin(CMSPluginBase):
|
||||||
context = super(DCLCalculatorPlugin, self).render(
|
context = super(DCLCalculatorPlugin, self).render(
|
||||||
context, instance, placeholder
|
context, instance, placeholder
|
||||||
)
|
)
|
||||||
ids = instance.pricing.vm_templates_to_show
|
ids = instance.vm_templates_to_show
|
||||||
if ids:
|
if ids:
|
||||||
context['templates'] = VMTemplate.objects.filter(
|
context['templates'] = VMTemplate.objects.filter(
|
||||||
vm_type=instance.vm_type
|
vm_type=instance.vm_type
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2018-06-24 06:54
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import datacenterlight.cms_models
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('datacenterlight', '0023_auto_20180524_0349'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='dclcalculatorpluginmodel',
|
||||||
|
name='vm_templates_to_show',
|
||||||
|
field=datacenterlight.cms_models.MultipleChoiceArrayField(base_field=models.CharField(blank=True, choices=[('4', 'CentOS 7'), ('14', 'Debian 8'), ('25', 'Ubuntu 14.04'), ('26', 'Ubuntu 16.04'), ('36', 'Devuan Jessie'), ('65', 'Devuan Ascii'), ('69', 'FreeBSD 11.1')], max_length=256), blank=True, default=list, help_text='Recommended: If you wish to show all templates of the corresponding VM Type (public/ipv6only), please do not select any of the items in the above field. This will allow any new template(s) added in the backend to be automatically listed in this calculator instance.', size=None),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,21 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Generated by Django 1.9.4 on 2018-06-13 09:09
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
import datacenterlight.models
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('datacenterlight', '0023_auto_20180524_0349'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='vmpricing',
|
|
||||||
name='vm_templates_to_show',
|
|
||||||
field=datacenterlight.models.MultipleChoiceArrayField(base_field=models.CharField(blank=True, choices=[('4', 'CentOS 7'), ('14', 'Debian 8'), ('25', 'Ubuntu 14.04'), ('26', 'Ubuntu 16.04'), ('36', 'Devuan Jessie'), ('65', 'Devuan Ascii'), ('69', 'FreeBSD 11.1')], max_length=256), blank=True, default=list, help_text='Not selecting any items above will result in showing all templates', size=None),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,7 +1,5 @@
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from django import forms
|
|
||||||
from django.contrib.postgres.fields import ArrayField
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -34,31 +32,7 @@ class VMTemplate(models.Model):
|
||||||
return vm_template
|
return vm_template
|
||||||
|
|
||||||
|
|
||||||
class MultipleChoiceArrayField(ArrayField):
|
|
||||||
"""
|
|
||||||
A field that allows us to store an array of choices.
|
|
||||||
Uses Django's Postgres ArrayField
|
|
||||||
and a MultipleChoiceField for its formfield.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def formfield(self, **kwargs):
|
|
||||||
defaults = {
|
|
||||||
'form_class': forms.MultipleChoiceField,
|
|
||||||
'choices': self.base_field.choices,
|
|
||||||
'initial': [c[0] for c in self.base_field.choices],
|
|
||||||
}
|
|
||||||
defaults.update(kwargs)
|
|
||||||
# Skip our parent's formfield implementation completely as we don't
|
|
||||||
# care for it.
|
|
||||||
# pylint:disable=bad-super-call
|
|
||||||
return super(ArrayField, self).formfield(**defaults)
|
|
||||||
|
|
||||||
|
|
||||||
class VMPricing(models.Model):
|
class VMPricing(models.Model):
|
||||||
VMTemplateChoices = list(
|
|
||||||
(str(obj.opennebula_vm_template_id), obj.name)
|
|
||||||
for obj in VMTemplate.objects.all()
|
|
||||||
)
|
|
||||||
name = models.CharField(max_length=255, unique=True)
|
name = models.CharField(max_length=255, unique=True)
|
||||||
vat_inclusive = models.BooleanField(default=True)
|
vat_inclusive = models.BooleanField(default=True)
|
||||||
vat_percentage = models.DecimalField(
|
vat_percentage = models.DecimalField(
|
||||||
|
@ -81,18 +55,6 @@ class VMPricing(models.Model):
|
||||||
max_digits=6, decimal_places=2, default=0
|
max_digits=6, decimal_places=2, default=0
|
||||||
)
|
)
|
||||||
|
|
||||||
vm_templates_to_show = MultipleChoiceArrayField(
|
|
||||||
base_field=models.CharField(
|
|
||||||
blank=True,
|
|
||||||
max_length=256,
|
|
||||||
choices=VMTemplateChoices
|
|
||||||
),
|
|
||||||
default=list,
|
|
||||||
blank=True,
|
|
||||||
help_text="Not selecting any items above will result in showing all "
|
|
||||||
"templates"
|
|
||||||
)
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
display_str = self.name + ' => ' + ' - '.join([
|
display_str = self.name + ' => ' + ' - '.join([
|
||||||
'{}/Core'.format(self.cores_unit_price.normalize()),
|
'{}/Core'.format(self.cores_unit_price.normalize()),
|
||||||
|
|
Loading…
Reference in a new issue