Ticket #399: bigint-patch-2009-11-23.diff

File bigint-patch-2009-11-23.diff, 9.8 KB (added by Tomáš Kopeček, 15 years ago)

updated patch, modelform, tests are back (removed typo in comments template)

  • django/db/models/fields/__init__.py

     
    714714        defaults.update(kwargs)
    715715        return super(IntegerField, self).formfield(**defaults)
    716716
     717class BigIntegerField(IntegerField):
     718    MAX_BIGINT = 9223372036854775807
     719    empty_strings_allowed = False
     720    def get_internal_type(self):
     721        return "BigIntegerField"
     722
     723    def get_db_prep_save(self, value):
     724        value = long(value)
     725        if value > BigIntegerField.MAX_BIGINT or value < -BigIntegerField.MAX_BIGINT - 1:
     726            raise ValueError("Value is to small/large to fit this field")
     727        return super(BigIntegerField, self).get_db_prep_save(value)
     728
     729    def formfield(self, **kwargs):
     730        defaults = {'min_value': -BigIntegerField.MAX_BIGINT - 1,
     731                    'max_value': BigIntegerField.MAX_BIGINT}
     732        defaults.update(kwargs)
     733        return super(BigIntegerField, self).formfield(**defaults)
     734
     735
    717736class IPAddressField(Field):
    718737    empty_strings_allowed = False
    719738    def __init__(self, *args, **kwargs):
  • django/db/backends/postgresql/introspection.py

     
    44    # Maps type codes to Django Field types.
    55    data_types_reverse = {
    66        16: 'BooleanField',
     7        20: 'BigIntegerField',
    78        21: 'SmallIntegerField',
    89        23: 'IntegerField',
    910        25: 'TextField',
  • django/db/backends/postgresql/creation.py

     
    1818        'FilePathField':     'varchar(%(max_length)s)',
    1919        'FloatField':        'double precision',
    2020        'IntegerField':      'integer',
     21        'BigIntegerField':   'bigint',
    2122        'IPAddressField':    'inet',
    2223        'NullBooleanField':  'boolean',
    2324        'OneToOneField':     'integer',
  • django/db/backends/sqlite3/introspection.py

     
    1616        'smallinteger': 'SmallIntegerField',
    1717        'int': 'IntegerField',
    1818        'integer': 'IntegerField',
     19        'bigint': 'BigIntegerField',
    1920        'integer unsigned': 'PositiveIntegerField',
    2021        'decimal': 'DecimalField',
    2122        'real': 'FloatField',
  • django/db/backends/sqlite3/creation.py

     
    1919        'FilePathField':                'varchar(%(max_length)s)',
    2020        'FloatField':                   'real',
    2121        'IntegerField':                 'integer',
     22        'IntegerField':                 'bigint',
    2223        'IPAddressField':               'char(15)',
    2324        'NullBooleanField':             'bool',
    2425        'OneToOneField':                'integer',
  • django/db/backends/mysql/introspection.py

     
    1717        FIELD_TYPE.FLOAT: 'FloatField',
    1818        FIELD_TYPE.INT24: 'IntegerField',
    1919        FIELD_TYPE.LONG: 'IntegerField',
    20         FIELD_TYPE.LONGLONG: 'IntegerField',
     20        FIELD_TYPE.LONGLONG: 'BigIntegerField',
    2121        FIELD_TYPE.SHORT: 'IntegerField',
    2222        FIELD_TYPE.STRING: 'CharField',
    2323        FIELD_TYPE.TIMESTAMP: 'DateTimeField',
  • django/db/backends/mysql/creation.py

     
    1818        'FilePathField':     'varchar(%(max_length)s)',
    1919        'FloatField':        'double precision',
    2020        'IntegerField':      'integer',
     21        'BigIntegerField':   'bigint',
    2122        'IPAddressField':    'char(15)',
    2223        'NullBooleanField':  'bool',
    2324        'OneToOneField':     'integer',
     
    6364                field.rel.to._meta.db_table, field.rel.to._meta.pk.column)
    6465            ]
    6566        return table_output, deferred
    66        
    67  No newline at end of file
     67       
  • django/db/backends/oracle/creation.py

     
    2727        'FilePathField':                'NVARCHAR2(%(max_length)s)',
    2828        'FloatField':                   'DOUBLE PRECISION',
    2929        'IntegerField':                 'NUMBER(11)',
     30        'BigIntegerField':              'NUMBER(19)',
    3031        'IPAddressField':               'VARCHAR2(15)',
    3132        'NullBooleanField':             'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL))',
    3233        'OneToOneField':                'NUMBER(11)',
  • django/contrib/admin/options.py

     
    4141        'form_class': forms.SplitDateTimeField,
    4242        'widget': widgets.AdminSplitDateTime
    4343    },
    44     models.DateField:    {'widget': widgets.AdminDateWidget},
    45     models.TimeField:    {'widget': widgets.AdminTimeWidget},
    46     models.TextField:    {'widget': widgets.AdminTextareaWidget},
    47     models.URLField:     {'widget': widgets.AdminURLFieldWidget},
    48     models.IntegerField: {'widget': widgets.AdminIntegerFieldWidget},
    49     models.CharField:    {'widget': widgets.AdminTextInputWidget},
    50     models.ImageField:   {'widget': widgets.AdminFileWidget},
    51     models.FileField:    {'widget': widgets.AdminFileWidget},
     44    models.DateField:       {'widget': widgets.AdminDateWidget},
     45    models.TimeField:       {'widget': widgets.AdminTimeWidget},
     46    models.TextField:       {'widget': widgets.AdminTextareaWidget},
     47    models.URLField:        {'widget': widgets.AdminURLFieldWidget},
     48    models.IntegerField:    {'widget': widgets.AdminIntegerFieldWidget},
     49    models.BigIntegerField: {'widget': widgets.AdminIntegerFieldWidget},
     50    models.CharField:       {'widget': widgets.AdminTextInputWidget},
     51    models.ImageField:      {'widget': widgets.AdminFileWidget},
     52    models.FileField:       {'widget': widgets.AdminFileWidget},
    5253}
    5354
    5455
  • tests/regressiontests/model_fields/tests.py

     
    66from django.db import models
    77from django.core.exceptions import ValidationError
    88
    9 from models import Foo, Bar, Whiz, BigD, BigS, Image
     9from models import Foo, Bar, Whiz, BigD, BigS, Image, BigInt
    1010
    1111try:
    1212    from decimal import Decimal
     
    144144        bs = BigS.objects.create(s = 'slug'*50)
    145145        bs = BigS.objects.get(pk=bs.pk)
    146146        self.assertEqual(bs.s, 'slug'*50)
     147
     148class BigIntegerFieldTests(django.test.TestCase):
     149    def test_existence(self):
     150        self.assertEqual(len(BigInt.objects.all()), 0)
     151
     152    def test_limits(self):
     153        self.assertRaises(ValueError, BigInt(value = 9223372036854775809111111111111111111).save)
     154        self.assertRaises(ValueError, BigInt(value = -9223372036854775809111111111111111111).save)
     155        self.assertRaises(ValueError, BigInt(value = 9223372036854775808).save)
     156        self.assertRaises(ValueError, BigInt(value = -9223372036854775809).save)
     157        self.assertEqual(BigInt(value = -9223372036854775808).save(), None)
     158        self.assertEqual(BigInt(value = 9223372036854775807).save(), None)
     159        self.assertEqual(BigInt(value = 0).save(), None)
     160
     161    def test_types(self):
     162        b = BigInt(value = 0)
     163        self.assertEqual(int, type(b.value))
     164        b.save()
     165        self.assertEqual(int, type(b.value))
     166        b = BigInt.objects.all()[0]
     167        self.assertEqual(int, type(b.value))
     168
     169    def test_coercing(self):
     170        b = BigInt(value = 10)
     171        b.save()
     172        self.assertEqual(b.value, 10)
     173        self.assertEqual(unicode(b), unicode(10))
  • tests/regressiontests/model_fields/models.py

     
    5151class BigS(models.Model):
    5252    s = models.SlugField(max_length=255)
    5353
     54class BigInt(models.Model):
     55    value = models.BigIntegerField()
    5456
     57    def __unicode__(self):
     58        return unicode(self.value)
     59
    5560###############################################################################
    5661# ImageField
    5762
  • docs/ref/models/fields.txt

     
    641641An integer. The admin represents this as an ``<input type="text">`` (a
    642642single-line input).
    643643
     644``bigintegerfield``
     645~~~~~~~~~~~~~~~~
     646
     647.. class:: BigIntegerField([**options])
     648
     649A big integer. The admin represents this as an ``<input type="text">``
     650(a single-line input).
     651
     652a 64 bit type like an ``integerfield``, except that it fits numbers from
     653-9223372036854775808 to 9223372036854775807
     654 
     655
    644656``IPAddressField``
    645657------------------
    646658
Back to Top