Merge pull request #669 from SchrodingersGat/round-fix

Implement auto-rounding decimal field
This commit is contained in:
Oliver 2020-03-19 08:47:29 +11:00 committed by GitHub
commit daa8496157
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 80 additions and 3 deletions

View File

@ -8,6 +8,8 @@ from .validators import allowable_url_schemes
from django.forms.fields import URLField as FormURLField from django.forms.fields import URLField as FormURLField
from django.db import models as models from django.db import models as models
from django.core import validators from django.core import validators
from django import forms
from decimal import Decimal
class InvenTreeURLFormField(FormURLField): class InvenTreeURLFormField(FormURLField):
@ -25,3 +27,33 @@ class InvenTreeURLField(models.URLField):
return super().formfield(**{ return super().formfield(**{
'form_class': InvenTreeURLFormField 'form_class': InvenTreeURLFormField
}) })
def round_decimal(value, places):
"""
Round value to the specified number of places.
"""
if value is not None:
# see https://docs.python.org/2/library/decimal.html#decimal.Decimal.quantize for options
return value.quantize(Decimal(10) ** -places)
return value
class RoundingDecimalFormField(forms.DecimalField):
def to_python(self, value):
value = super(RoundingDecimalFormField, self).to_python(value)
return round_decimal(value, self.decimal_places)
class RoundingDecimalField(models.DecimalField):
def to_python(self, value):
value = super(RoundingDecimalField, self).to_python(value)
return round_decimal(value, self.decimal_places)
def formfield(self, **kwargs):
defaults = {
'form_class': RoundingDecimalFormField
}
defaults.update(kwargs)
return super(RoundingDecimalField, self).formfield(**kwargs)

View File

@ -6,6 +6,7 @@ Django Forms for interacting with Company app
from __future__ import unicode_literals from __future__ import unicode_literals
from InvenTree.forms import HelperForm from InvenTree.forms import HelperForm
from InvenTree.fields import RoundingDecimalFormField
from .models import Company from .models import Company
from .models import SupplierPart from .models import SupplierPart
@ -64,6 +65,10 @@ class EditSupplierPartForm(HelperForm):
class EditPriceBreakForm(HelperForm): class EditPriceBreakForm(HelperForm):
""" Form for creating / editing a supplier price break """ """ Form for creating / editing a supplier price break """
quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
cost = RoundingDecimalFormField(max_digits=10, decimal_places=5)
class Meta: class Meta:
model = SupplierPriceBreak model = SupplierPriceBreak
fields = [ fields = [

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.9 on 2020-03-18 11:14
import InvenTree.fields
import django.core.validators
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('company', '0010_auto_20200201_1231'),
]
operations = [
migrations.AlterField(
model_name='supplierpricebreak',
name='cost',
field=InvenTree.fields.RoundingDecimalField(decimal_places=5, max_digits=10, validators=[django.core.validators.MinValueValidator(0)]),
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.9 on 2020-03-18 11:14
import InvenTree.fields
import django.core.validators
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('company', '0011_auto_20200318_1114'),
]
operations = [
migrations.AlterField(
model_name='supplierpricebreak',
name='quantity',
field=InvenTree.fields.RoundingDecimalField(decimal_places=5, default=1, max_digits=15, validators=[django.core.validators.MinValueValidator(1)]),
),
]

View File

@ -21,7 +21,7 @@ from django.conf import settings
from markdownx.models import MarkdownxField from markdownx.models import MarkdownxField
from InvenTree.fields import InvenTreeURLField from InvenTree.fields import InvenTreeURLField, RoundingDecimalField
from InvenTree.status_codes import OrderStatus from InvenTree.status_codes import OrderStatus
from common.models import Currency from common.models import Currency
@ -381,9 +381,9 @@ class SupplierPriceBreak(models.Model):
part = models.ForeignKey(SupplierPart, on_delete=models.CASCADE, related_name='pricebreaks') part = models.ForeignKey(SupplierPart, on_delete=models.CASCADE, related_name='pricebreaks')
quantity = models.DecimalField(max_digits=15, decimal_places=5, default=1, validators=[MinValueValidator(1)]) quantity = RoundingDecimalField(max_digits=15, decimal_places=5, default=1, validators=[MinValueValidator(1)])
cost = models.DecimalField(max_digits=10, decimal_places=5, validators=[MinValueValidator(0)]) cost = RoundingDecimalField(max_digits=10, decimal_places=5, validators=[MinValueValidator(0)])
currency = models.ForeignKey(Currency, blank=True, null=True, on_delete=models.SET_NULL) currency = models.ForeignKey(Currency, blank=True, null=True, on_delete=models.SET_NULL)