root / snf-common / synnefo / lib / db / intdecimalfield.py @ c11dc0ce
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 | c11dc0ce | Giorgos Korfiatis | def intDecimalField(**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 | c11dc0ce | Giorgos Korfiatis | return IntDecimalField(max_digits=DECIMAL_DIGITS, decimal_places=0, **kwargs) |