Statistics
| Branch: | Tag: | Revision:

root / snf-common / synnefo / lib / db / intdecimalfield.py @ 26e15cff

History | View | Annotate | Download (1.6 kB)

1 c11dc0ce Giorgos Korfiatis
from django.core import exceptions
2 c11dc0ce Giorgos Korfiatis
from django.db.models import DecimalField, SubfieldBase
3 c11dc0ce Giorgos Korfiatis
from django.utils.translation import ugettext_lazy as _
4 c11dc0ce Giorgos Korfiatis
import decimal
5 c11dc0ce Giorgos Korfiatis
6 c11dc0ce Giorgos Korfiatis
class IntDecimalField(DecimalField):
7 c11dc0ce Giorgos Korfiatis
8 c11dc0ce Giorgos Korfiatis
    __metaclass__ = SubfieldBase
9 c11dc0ce Giorgos Korfiatis
10 c11dc0ce Giorgos Korfiatis
    description = _("Integer number as decimal")
11 c11dc0ce Giorgos Korfiatis
12 c11dc0ce Giorgos Korfiatis
    def to_python(self, value):
13 c11dc0ce Giorgos Korfiatis
        if value is None:
14 c11dc0ce Giorgos Korfiatis
            return value
15 c11dc0ce Giorgos Korfiatis
        try:
16 c11dc0ce Giorgos Korfiatis
            return long(value)
17 c11dc0ce Giorgos Korfiatis
        except (ValueError, TypeError):
18 c11dc0ce Giorgos Korfiatis
            raise exceptions.ValidationError(self.error_messages['invalid'])
19 c11dc0ce Giorgos Korfiatis
20 c11dc0ce Giorgos Korfiatis
    def _to_decimal(self, value):
21 c11dc0ce Giorgos Korfiatis
        if value is None:
22 c11dc0ce Giorgos Korfiatis
            return value
23 c11dc0ce Giorgos Korfiatis
        try:
24 c11dc0ce Giorgos Korfiatis
            return decimal.Decimal(value)
25 c11dc0ce Giorgos Korfiatis
        except decimal.InvalidOperation:
26 c11dc0ce Giorgos Korfiatis
            raise exceptions.ValidationError(self.error_messages['invalid'])
27 c11dc0ce Giorgos Korfiatis
28 c11dc0ce Giorgos Korfiatis
    def get_db_prep_save(self, value, connection):
29 c11dc0ce Giorgos Korfiatis
        return connection.ops.value_to_db_decimal(self._to_decimal(value),
30 c11dc0ce Giorgos Korfiatis
                self.max_digits, self.decimal_places)
31 c11dc0ce Giorgos Korfiatis
32 c11dc0ce Giorgos Korfiatis
    def get_prep_value(self, value):
33 c11dc0ce Giorgos Korfiatis
        return self._to_decimal(value)
34 c11dc0ce Giorgos Korfiatis
35 c11dc0ce Giorgos Korfiatis
    def formfield(self, **kwargs):
36 c11dc0ce Giorgos Korfiatis
        defaults = {'form_class': forms.IntegerField}
37 c11dc0ce Giorgos Korfiatis
        defaults.update(kwargs)
38 c11dc0ce Giorgos Korfiatis
        return super(IntegerField, self).formfield(**defaults)
39 c11dc0ce Giorgos Korfiatis
40 c11dc0ce Giorgos Korfiatis
from south.modelsinspector import add_introspection_rules
41 c11dc0ce Giorgos Korfiatis
add_introspection_rules([], ["^synnefo\.lib\.db\.intdecimalfield\.IntDecimalField"])
42 c11dc0ce Giorgos Korfiatis
43 c11dc0ce Giorgos Korfiatis
DECIMAL_DIGITS  =   38
44 c11dc0ce Giorgos Korfiatis
45 0f0dd7df Giorgos Korfiatis
def intDecimalField(verbose_name=None, name=None, **kwargs):
46 c11dc0ce Giorgos Korfiatis
    # decimal_places is set here instead of the object constructor
47 c11dc0ce Giorgos Korfiatis
    # in order to convince south
48 0f0dd7df Giorgos Korfiatis
    return IntDecimalField(verbose_name, name, max_digits=DECIMAL_DIGITS, decimal_places=0, **kwargs)