Code

Ticket #399: bigint-patch-2008-04-25.diff

File bigint-patch-2008-04-25.diff, 8.7 KB (added by mwdiers <martin@…>, 6 years ago)

Restored tests to previously submitted patch

Line 
1Index: django/oldforms/__init__.py
2===================================================================
3--- django/oldforms/__init__.py (revision 7461)
4+++ django/oldforms/__init__.py (working copy)
5@@ -764,6 +764,14 @@
6         if not 0 <= int(field_data) <= 32767:
7             raise validators.CriticalValidationError, ugettext("Enter a whole number between 0 and 32,767.")
8 
9+class BigIntegerField(IntegerField):
10+    def __init__(self, field_name, length=20, maxlength=None, is_required=False, validator_list=None, member_name=None):
11+        if validator_list is None: validator_list = []
12+        validator_list = [self.isInteger] + validator_list
13+        if member_name is not None:
14+            self.member_name = member_name
15+        IntegerField.__init__(self, field_name, length, maxlength, is_required, validator_list)
16+
17 class FloatField(TextField):
18     def __init__(self, field_name, is_required=False, validator_list=None):
19         if validator_list is None: validator_list = []
20Index: django/db/models/fields/__init__.py
21===================================================================
22--- django/db/models/fields/__init__.py (revision 7461)
23+++ django/db/models/fields/__init__.py (working copy)
24@@ -923,6 +923,21 @@
25         defaults.update(kwargs)
26         return super(IntegerField, self).formfield(**defaults)
27 
28+class BigIntegerField(IntegerField):
29+    MAX_BIGINT = 9223372036854775807
30+    empty_strings_allowed = False
31+    def get_internal_type(self):
32+        return "BigIntegerField"
33+
34+    def get_manipulator_field_objs(self):
35+        return [oldforms.BigIntegerField]
36+
37+    def get_db_prep_save(self, value):
38+        if value > self.MAX_BIGINT or value < -self.MAX_BIGINT - 1:
39+            raise ValueError("Value is to small/large to fit this field")
40+        return super(BigIntegerField, self).get_db_prep_save(value)
41+
42+
43 class IPAddressField(Field):
44     empty_strings_allowed = False
45     def __init__(self, *args, **kwargs):
46Index: django/db/backends/postgresql/introspection.py
47===================================================================
48--- django/db/backends/postgresql/introspection.py      (revision 7461)
49+++ django/db/backends/postgresql/introspection.py      (working copy)
50@@ -71,6 +71,7 @@
51 # Maps type codes to Django Field types.
52 DATA_TYPES_REVERSE = {
53     16: 'BooleanField',
54+    20: 'BigIntegerField',
55     21: 'SmallIntegerField',
56     23: 'IntegerField',
57     25: 'TextField',
58Index: django/db/backends/postgresql/creation.py
59===================================================================
60--- django/db/backends/postgresql/creation.py   (revision 7461)
61+++ django/db/backends/postgresql/creation.py   (working copy)
62@@ -15,6 +15,7 @@
63     'FloatField':        'double precision',
64     'ImageField':        'varchar(%(max_length)s)',
65     'IntegerField':      'integer',
66+    'BigIntegerField':   'bigint',
67     'IPAddressField':    'inet',
68     'NullBooleanField':  'boolean',
69     'OneToOneField':     'integer',
70Index: django/db/backends/sqlite3/introspection.py
71===================================================================
72--- django/db/backends/sqlite3/introspection.py (revision 7461)
73+++ django/db/backends/sqlite3/introspection.py (working copy)
74@@ -64,6 +64,7 @@
75     'smallinteger': 'SmallIntegerField',
76     'int': 'IntegerField',
77     'integer': 'IntegerField',
78+    'bigint': 'BigIntegerField',
79     'text': 'TextField',
80     'char': 'CharField',
81     'date': 'DateField',
82Index: django/db/backends/sqlite3/creation.py
83===================================================================
84--- django/db/backends/sqlite3/creation.py      (revision 7461)
85+++ django/db/backends/sqlite3/creation.py      (working copy)
86@@ -14,6 +14,7 @@
87     'FloatField':                   'real',
88     'ImageField':                   'varchar(%(max_length)s)',
89     'IntegerField':                 'integer',
90+    'BigIntegerField':              'bigint',
91     'IPAddressField':               'char(15)',
92     'NullBooleanField':             'bool',
93     'OneToOneField':                'integer',
94Index: django/db/backends/mysql/introspection.py
95===================================================================
96--- django/db/backends/mysql/introspection.py   (revision 7461)
97+++ django/db/backends/mysql/introspection.py   (working copy)
98@@ -84,7 +84,7 @@
99     FIELD_TYPE.FLOAT: 'FloatField',
100     FIELD_TYPE.INT24: 'IntegerField',
101     FIELD_TYPE.LONG: 'IntegerField',
102-    FIELD_TYPE.LONGLONG: 'IntegerField',
103+    FIELD_TYPE.LONGLONG: 'BigIntegerField',
104     FIELD_TYPE.SHORT: 'IntegerField',
105     FIELD_TYPE.STRING: 'CharField',
106     FIELD_TYPE.TIMESTAMP: 'DateTimeField',
107Index: django/db/backends/mysql/creation.py
108===================================================================
109--- django/db/backends/mysql/creation.py        (revision 7461)
110+++ django/db/backends/mysql/creation.py        (working copy)
111@@ -15,6 +15,7 @@
112     'FloatField':        'double precision',
113     'ImageField':        'varchar(%(max_length)s)',
114     'IntegerField':      'integer',
115+    'BigIntegerField':   'bigint',
116     'IPAddressField':    'char(15)',
117     'NullBooleanField':  'bool',
118     'OneToOneField':     'integer',
119Index: django/db/backends/oracle/creation.py
120===================================================================
121--- django/db/backends/oracle/creation.py       (revision 7461)
122+++ django/db/backends/oracle/creation.py       (working copy)
123@@ -18,6 +18,7 @@
124     'FloatField':                   'DOUBLE PRECISION',
125     'ImageField':                   'NVARCHAR2(%(max_length)s)',
126     'IntegerField':                 'NUMBER(11)',
127+    'BigIntegerField':              'NUMBER(19)',
128     'IPAddressField':               'VARCHAR2(15)',
129     'NullBooleanField':             'NUMBER(1) CHECK ((%(column)s IN (0,1)) OR (%(column)s IS NULL))',
130     'OneToOneField':                'NUMBER(11)',
131Index: django/db/backends/postgresql_psycopg2/introspection.py
132===================================================================
133--- django/db/backends/postgresql_psycopg2/introspection.py     (revision 7461)
134+++ django/db/backends/postgresql_psycopg2/introspection.py     (working copy)
135@@ -68,6 +68,7 @@
136 # Maps type codes to Django Field types.
137 DATA_TYPES_REVERSE = {
138     16: 'BooleanField',
139+    20: 'BigIntegerField',
140     21: 'SmallIntegerField',
141     23: 'IntegerField',
142     25: 'TextField',
143Index: django/contrib/admin/views/doc.py
144===================================================================
145--- django/contrib/admin/views/doc.py   (revision 7461)
146+++ django/contrib/admin/views/doc.py   (working copy)
147@@ -304,6 +304,7 @@
148     'ForeignKey'                : _('Integer'),
149     'ImageField'                : _('File path'),
150     'IntegerField'              : _('Integer'),
151+    'BigIntegerField'           : _('Integer'),
152     'IPAddressField'            : _('IP address'),
153     'ManyToManyField'           : '',
154     'NullBooleanField'          : _('Boolean (Either True, False or None)'),
155Index: tests/modeltests/field_types/models.py
156===================================================================
157--- tests/modeltests/field_types/models.py      (revision 0)
158+++ tests/modeltests/field_types/models.py      (revision 0)
159@@ -0,0 +1,51 @@
160+"""
161+Tests for field type boundaries
162+"""
163+
164+from django.db import models
165+
166+class BigInt(models.Model):
167+    value = models.BigIntegerField()
168+
169+    def __unicode__(self):
170+        return unicode(self.value)
171+
172+__test__ = {'API_TESTS': """
173+>>> BigInt.objects.all()
174+[]
175+
176+>>> t = BigInt(value = 0)
177+>>> t.save()
178+>>> t.value
179+0
180+
181+>>> BigInt.objects.all()
182+[<BigInt: 0>]
183+
184+>>> t = BigInt(value = -9223372036854775808)
185+>>> t.value
186+-9223372036854775808
187+
188+>>> BigInt.objects.all().delete()
189+>>> t.save()
190+>>> BigInt.objects.all()[0]
191+<BigInt: -9223372036854775808>
192+
193+>>> BigInt(value = -9223372036854775809111111111111111111).save()
194+Traceback (most recent call last):
195+...
196+ValueError: Value is so small/large to fit to field
197+
198+>>> BigInt(value = 9223372036854775808).save()
199+Traceback (most recent call last):
200+...
201+ValueError: Value is so small/large to fit to field
202+
203+>>> BigInt(value = 9223372036854775807).save()
204+>>> BigInt.objects.all()
205+[<BigInt: -9223372036854775808>, <BigInt: 9223372036854775807>]
206+"""}
207+
208+def test():
209+    import doctest
210+    doctest.testmod()
211Index: docs/model-api.txt
212===================================================================
213--- docs/model-api.txt  (revision 7461)
214+++ docs/model-api.txt  (working copy)
215@@ -126,6 +126,16 @@
216 automatically be added to your model if you don't specify otherwise. See
217 `Automatic primary key fields`_.
218 
219+``BigIntegerField``
220+~~~~~~~~~~~~~~~~
221+
222+A big integer.
223+
224+The admin represents this as an ``<input type="text">`` (a single-line input).
225+
226+A 64 bit type like an ``IntegerField``, except that it fits numbers from
227+-9223372036854775808 to 9223372036854775807
228+
229 ``BooleanField``
230 ~~~~~~~~~~~~~~~~
231