Statistics
| Branch: | Tag: | Revision:

root / snf-django-lib / snf_django / lib / db / fields.py @ b052f360

History | View | Annotate | Download (3.2 kB)

1
# Copyright 2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from django.core import exceptions
35
from django.db.models import DecimalField, SubfieldBase
36
from django.utils.translation import ugettext_lazy as _
37
from south.modelsinspector import add_introspection_rules
38
import decimal
39

    
40
DECIMAL_DIGITS = 38
41

    
42

    
43
class IntDecimalField(DecimalField):
44

    
45
    __metaclass__ = SubfieldBase
46

    
47
    description = _("Integer number as decimal")
48

    
49
    def to_python(self, value):
50
        if value is None:
51
            return value
52
        try:
53
            return long(value)
54
        except (ValueError, TypeError):
55
            raise exceptions.ValidationError(self.error_messages['invalid'])
56

    
57
    def _to_decimal(self, value):
58
        if value is None:
59
            return value
60
        try:
61
            return decimal.Decimal(value)
62
        except decimal.InvalidOperation:
63
            raise exceptions.ValidationError(self.error_messages['invalid'])
64

    
65
    def get_db_prep_save(self, value, connection):
66
        return connection.ops.value_to_db_decimal(
67
            self._to_decimal(value), self.max_digits, self.decimal_places)
68

    
69
    def get_prep_value(self, value):
70
        return self._to_decimal(value)
71

    
72
    def formfield(self, **kwargs):
73
        defaults = {'form_class': forms.IntegerField}
74
        defaults.update(kwargs)
75
        return super(IntegerField, self).formfield(**defaults)
76

    
77
add_introspection_rules(
78
    [], ["^snf_django\.lib\.db\.fields\.IntDecimalField"])
79

    
80

    
81
def intDecimalField(verbose_name=None, name=None, **kwargs):
82
    # decimal_places is set here instead of the object constructor
83
    # in order to convince south
84
    return IntDecimalField(verbose_name, name,
85
                           max_digits=DECIMAL_DIGITS, decimal_places=0,
86
                           **kwargs)