Compare commits

...

31 Commits

Author SHA1 Message Date
nico14571 66538f7335 Merge branch 'master' into 'master'
Task #6038: Change datacenterlight.ch message form to send email to support@ungleich.ch

See merge request ungleich-public/dynamicweb!679
2018-11-11 18:49:55 +01:00
aatish 1bfb710ee6 Change datacenterlight.ch message form to send email to support@ungleich.ch 2018-11-11 17:01:19 +01:00
PCoder 2c674572c9 Update Changelog 2018-10-22 23:25:05 +02:00
pcoder116 b1a4ba6f0e Merge branch 'bugfix/use-correct-django-multisite-version' into 'master'
Use correct django-multisite version

See merge request ungleich-public/dynamicweb!676
2018-10-22 23:13:00 +02:00
PCoder e9cb303b09 Use correct django-multisite version
We had multiple versions of django-multisite in the
requirements.txt. This commit removes the wrong version that
caused server not to start with an error

File "/usr/local/lib/python3.5/site-packages/django/contrib/sites/models.py" in get_current
  65.             return self._get_site_by_id(site_id)

File "/usr/local/lib/python3.5/site-packages/django/contrib/sites/models.py" in _get_site_by_id
  37.         return SITE_CACHE[site_id]

File "/usr/local/lib/python3.5/site-packages/multisite/hacks.py" in __getitem__
  124.             raise KeyError(key)
2018-10-22 22:39:22 +02:00
PCoder bdf9f53648 Update Changelog for 2.4.1 2018-10-18 09:21:16 +02:00
Pcoder 8d6f2ed4ae
Merge pull request #674 from pcoder/bugfix/update-pycryptodome
Update pycryptodome
2018-10-18 09:15:14 +02:00
PCoder 062e81408d Update pycryptodome
From 3.4 to 3.6.6
2018-10-18 09:03:08 +02:00
PCoder 3a489f5be0 Update Changelog for 2.4 2018-10-18 07:44:07 +02:00
Pcoder 961bf2e46f
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
2018-10-18 07:21:40 +02:00
PCoder c36554b4d1 Round total_price also to 2 decimal places 2018-10-18 06:58:18 +02:00
PCoder 270c610111 Correct the min value of RAM
Based on what is set by the admin in the backend
2018-10-17 09:56:42 +02:00
PCoder 3ebf932422 Adjust hosting calculator form validation
For 512 MB RAM offer
2018-10-17 09:29:08 +02:00
PCoder 814163e58e Add minRAM js code for hosting also 2018-10-17 09:11:37 +02:00
PCoder 0d767e74a9 Merge branch 'master' into task/5681/offer-512mb-ram 2018-10-17 07:57:07 +02:00
PCoder 0e9f8ce906 Cleanup unnecessary code 2018-10-16 09:01:00 +02:00
PCoder b7cc7b08ce Update calculator min RAM input js validation 2018-10-16 08:58:12 +02:00
PCoder 26970ece92 Set default RAM step to 1
We later change this according to minRam set in the backend
2018-10-16 08:55:08 +02:00
PCoder 42d6f38f0c Merge branch 'master' into task/5681/offer-512mb-ram 2018-10-08 07:56:57 +02:00
PCoder f2f95c8559 Update min attribute according to minimum ram in the plugin 2018-10-01 08:56:45 +02:00
PCoder a93c900109 Pass 512 MB to memory parameter 2018-10-01 08:54:22 +02:00
PCoder c2dbbf0424 Update views.py to include 512mb ram case
RAM server side validation is as follows:
- pid is a mandatory parameter for a valid RAM, otherwise a
 validation error is raised
- check if enable_512mb_ram is enabled. In this case, validate
if the input ram is either a whole number or 0.5 and in the range
0.5 <= value <= 200
- otherwise check ram is a whole number in the range
1 <= value <= 200
2018-10-01 07:52:28 +02:00
PCoder f85ef714ab Pass instance context
Also POST plugin_id as a form parameter to check enable_512mb_ram
case
2018-10-01 07:50:18 +02:00
PCoder 24d719e4f1 Update migration 2018-09-29 07:37:23 +02:00
PCoder 5452c1c478 Merge master into task/5681/offer-512mb-ram 2018-09-28 08:36:35 +02:00
PCoder db20e3cbe7 Add plus minus ram handler for 512MB option 2018-09-28 08:07:12 +02:00
PCoder e1ce017ec8 Add migration 2018-09-27 22:48:23 +02:00
PCoder 21084cdc9f Initialize minRam js variable from what is passed from backend 2018-09-27 09:07:28 +02:00
PCoder 12f139976d Simplify logic to set min_ram in the calculator form 2018-09-27 09:06:39 +02:00
PCoder da21699212 Merge branch 'master' into task/5681/offer-512mb-ram 2018-09-26 23:10:17 +02:00
PCoder 76efc35324 Add enable_512mb_ram option in model/plugin 2018-09-22 06:44:37 +02:00
11 changed files with 179 additions and 29 deletions

View File

@ -1,3 +1,9 @@
Next:
* bugfix: Use correct version of django-multisite (MR #676)
2.4.1: 2018-10-18
* bugfix: Update pycryptodome module from 3.4 to 3.6.6 (PR #674)
2.4: 2018-10-18
* #5681: [hosting,dcl] Allow admin to lower minimum RAM to 512 MB (PR #672)
2.3.1: 2018-10-17
* bugfix: [hosting, dcl] Show VAT percent rounded to 2 decimal places in the order confirmation page (PR #673)
2.3: 2018-10-08

View File

@ -361,3 +361,4 @@ class DCLCalculatorPluginModel(CMSPlugin):
help_text="Write the name of the template that you need selected as"
" default when the calculator loads"
)
enable_512mb_ram = models.BooleanField(default=False)

View File

@ -99,9 +99,8 @@ class DCLCalculatorPlugin(CMSPluginBase):
context['templates'] = VMTemplate.objects.filter(
vm_type=instance.vm_type
).order_by('name')
context['default_selected_template'] = (
instance.default_selected_template
)
context['instance'] = instance
context['min_ram'] = 0.5 if instance.enable_512mb_ram else 1
return context

View File

@ -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),
),
]

View File

@ -5,6 +5,10 @@
/* ---------------------------------------------
Scripts initialization
--------------------------------------------- */
var minRam = 1;
if(window.minRam){
minRam = window.minRam;
}
var cardPricing = {
'cpu': {
'id': 'coreValue',
@ -16,7 +20,7 @@
'ram': {
'id': 'ramValue',
'value': 2,
'min': 1,
'min': minRam,
'max': 200,
'interval': 1
},
@ -40,6 +44,7 @@
_initNavUrl();
_initPricing();
ajaxForms();
$('#ramValue').data('old-value', $('#ramValue').val());
});
$(window).resize(function() {
@ -144,21 +149,54 @@
var data = $(this).data('minus');
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();
$('#ramValue').data('old-value', $('#ramValue').val());
});
$('.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;
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();
$('#ramValue').data('old-value', $('#ramValue').val());
});
$('.input-price').change(function() {
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();
});
}

View File

@ -9,11 +9,14 @@
window.ssdUnitPrice = {{vm_pricing.ssd_unit_price|default:0}};
window.hddUnitPrice = {{vm_pricing.hdd_unit_price|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>
{% endif %}
<form id="order_form" method="POST" action="{{calculator_form_url}}" data-toggle="validator" role="form">
{% csrf_token %}
<input type="hidden" name="pid" value="{{instance.id}}">
<div class="title">
<h3>{% trans "VM hosting" %} </h3>
</div>
@ -54,8 +57,8 @@
<div class="form-group">
<div class="description input">
<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"
data-error="{% trans 'Please enter a value in range 1 - 200.' %}" required>
<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="{% blocktrans with min_ram=min_ram %}Please enter a value in range {{min_ram}} - 200.{% endblocktrans %}" required step="1">
<span> GB RAM</span>
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
</div>
@ -92,11 +95,11 @@
<select name="config">
{% 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 %}
</select>
</div>
</div>
<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>
</form>
</form>

View File

@ -27,6 +27,7 @@ from utils.forms import (
from utils.hosting_utils import get_vm_price_with_vat
from utils.stripe_utils import StripeUtils
from utils.tasks import send_plain_email_task
from .cms_models import DCLCalculatorPluginModel
from .forms import ContactForm
from .models import VMTemplate, VMPricing
from .utils import get_cms_integration, create_vm, clear_all_session_vars
@ -63,7 +64,7 @@ class ContactUsView(FormView):
sender=form.cleaned_data.get('email')
),
'from_email': settings.DCL_SUPPORT_FROM_ADDRESS,
'to': [from_emails.get(from_page, 'info@ungleich.ch')],
'to': [from_emails.get(from_page, 'support@ungleich.ch')],
'body': "\n".join(
["%s=%s" % (k, v) for (k, v) in form.cleaned_data.items()]),
'reply_to': [form.cleaned_data.get('email')],
@ -89,7 +90,29 @@ class IndexView(CreateView):
raise ValidationError(_('Invalid number of cores'))
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'))
def validate_storage(self, value):
@ -105,7 +128,7 @@ class IndexView(CreateView):
cores = request.POST.get('cpu')
cores_field = forms.IntegerField(validators=[self.validate_cores])
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_field = forms.IntegerField(validators=[self.validate_storage])
template_id = int(request.POST.get('config'))
@ -174,7 +197,7 @@ class IndexView(CreateView):
'vat': vat,
'vat_percent': vat_percent,
'discount': discount,
'total_price': price + vat - discount['amount'],
'total_price': round(price + vat - discount['amount'], 2),
'pricing_name': vm_pricing_name
}
request.session['specs'] = specs

View File

@ -157,6 +157,10 @@ $( document ).ready(function() {
/* ---------------------------------------------
Scripts initialization
--------------------------------------------- */
var minRam = 1;
if(window.minRam){
minRam = window.minRam;
}
var cardPricing = {
'cpu': {
'id': 'coreValue',
@ -168,7 +172,7 @@ $( document ).ready(function() {
'ram': {
'id': 'ramValue',
'value': 2,
'min': 1,
'min': minRam,
'max': 200,
'interval': 1
},
@ -188,21 +192,54 @@ $( document ).ready(function() {
var data = $(this).data('minus');
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();
$('#ramValue').data('old-value', $('#ramValue').val());
});
$('.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;
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();
$('#ramValue').data('old-value', $('#ramValue').val());
});
$('.input-price').change(function() {
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();
});
}
@ -236,4 +273,5 @@ $( document ).ready(function() {
}
_initPricing();
});
$('#ramValue').data('old-value', $('#ramValue').val());
});

View File

@ -32,6 +32,7 @@ from stored_messages.api import mark_read
from stored_messages.models import Message
from stored_messages.settings import stored_messages_settings
from datacenterlight.cms_models import DCLCalculatorPluginModel
from datacenterlight.models import VMTemplate, VMPricing
from datacenterlight.utils import create_vm, get_cms_integration
from hosting.models import UserCardDetail
@ -1198,7 +1199,29 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
raise ValidationError(_('Invalid number of cores'))
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'))
def validate_storage(self, value):
@ -1218,7 +1241,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
cores = request.POST.get('cpu')
cores_field = forms.IntegerField(validators=[self.validate_cores])
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_field = forms.IntegerField(validators=[self.validate_storage])
template_id = int(request.POST.get('config'))
@ -1282,7 +1305,7 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
'price': price,
'vat': vat,
'vat_percent': vat_percent,
'total_price': price + vat - discount['amount'],
'total_price': round(price + vat - discount['amount'], 2),
'pricing_name': vm_pricing_name
}

View File

@ -249,8 +249,8 @@ class OpenNebulaManager():
vm_specs = vm_specs_formatter.format(
vcpu=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>
<TYPE>fs</TYPE>
@ -269,8 +269,8 @@ class OpenNebulaManager():
vm_specs = vm_specs_formatter.format(
vcpu=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>
<TYPE>fs</TYPE>

View File

@ -34,7 +34,6 @@ django-meta==1.2
django-meta-mixin==0.3.0
django-model-utils==2.5
django-mptt==0.8.4
django-multisite==1.4.1
django-parler==1.6.3
django-phonenumber-field==1.1.0
django-polymorphic==0.9.2
@ -69,7 +68,7 @@ model-mommy==1.2.6
phonenumbers==7.4.0
phonenumberslite==7.4.0
psycopg2==2.7.3.2
pycryptodome==3.4
pycryptodome==3.6.6
pylibmc==1.5.1
python-dateutil==2.5.3
python-slugify==1.2.0