Code

Ticket #399: patch.diff

File patch.diff, 9.2 KB (added by permon, 7 years ago)

Updated, added constraint checking

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