Browse Source

Fix null handling and force length

Thomas Adamcik 15 years ago
parent
commit
25dcc6d108
1 changed files with 37 additions and 46 deletions
  1. 37 46
      manager.py

+ 37 - 46
manager.py

@@ -1,10 +1,8 @@
 from IPy import IP
 from IPy import IP
 
 
-from django.core.exceptions import ValidationError
 from django.db import models, connection
 from django.db import models, connection
 from django.db.models import sql, query
 from django.db.models import sql, query
 from django.db.models.query_utils import QueryWrapper
 from django.db.models.query_utils import QueryWrapper
-from django.utils.translation import ugettext_lazy
 
 
 NET_OPERATORS = {
 NET_OPERATORS = {
     'lt': '<',
     'lt': '<',
@@ -86,16 +84,20 @@ class NetManger(models.Manager):
         return query.QuerySet(self.model, q)
         return query.QuerySet(self.model, q)
 
 
 class _NetAddressField(models.Field):
 class _NetAddressField(models.Field):
-    # FIXME init empty object
-    # FIXME null and blank handling needs to be done right.
+    empty_strings_allowed = False
+
+    def __init__(self, *args, **kwargs):
+        kwargs['max_length'] = self.max_length
+        super(_NetAddressField, self).__init__(*args, **kwargs)
+
     def to_python(self, value):
     def to_python(self, value):
+        if not value:
+            value = None
+
         if value is None:
         if value is None:
             return value
             return value
 
 
-        try:
-            return IP(value)
-        except ValueError, e:
-            raise ValidationError(e)
+        return IP(value)
 
 
     def get_db_prep_value(self, value):
     def get_db_prep_value(self, value):
         if value is None:
         if value is None:
@@ -116,6 +118,7 @@ class _NetAddressField(models.Field):
 
 
 class InetAddressField(_NetAddressField):
 class InetAddressField(_NetAddressField):
     description = "PostgreSQL INET field"
     description = "PostgreSQL INET field"
+    max_length = 39
     __metaclass__ = models.SubfieldBase
     __metaclass__ = models.SubfieldBase
 
 
     def db_type(self):
     def db_type(self):
@@ -123,6 +126,7 @@ class InetAddressField(_NetAddressField):
 
 
 class CidrAddressField(_NetAddressField):
 class CidrAddressField(_NetAddressField):
     description = "PostgreSQL CIDR field"
     description = "PostgreSQL CIDR field"
+    max_length = 43
     __metaclass__ = models.SubfieldBase
     __metaclass__ = models.SubfieldBase
 
 
     def db_type(self):
     def db_type(self):
@@ -141,15 +145,40 @@ class MACAddressField(models.Field):
 
 
 class InetTestModel(models.Model):
 class InetTestModel(models.Model):
     '''
     '''
+    >>> cursor = connection.cursor()
+
     >>> InetTestModel(inet='10.0.0.1').save()
     >>> InetTestModel(inet='10.0.0.1').save()
 
 
     >>> InetTestModel(inet=IP('10.0.0.1')).save()
     >>> InetTestModel(inet=IP('10.0.0.1')).save()
 
 
     >>> InetTestModel(inet='').save()
     >>> InetTestModel(inet='').save()
+    Traceback (most recent call last):
+        ...
+    IntegrityError: null value in column "inet" violates not-null constraint
+    <BLANKLINE>
+
+    >>> cursor.execute('ROLLBACK')
+
+    >>> InetTestModel(inet='az').save()
+    Traceback (most recent call last):
+        ...
+    ValueError: invalid literal for int() with base 10: 'az'
 
 
     >>> InetTestModel(inet=None).save()
     >>> InetTestModel(inet=None).save()
+    Traceback (most recent call last):
+        ...
+    IntegrityError: null value in column "inet" violates not-null constraint
+    <BLANKLINE>
+
+    >>> cursor.execute('ROLLBACK')
 
 
     >>> InetTestModel().save()
     >>> InetTestModel().save()
+    Traceback (most recent call last):
+        ...
+    IntegrityError: null value in column "inet" violates not-null constraint
+    <BLANKLINE>
+
+    >>> cursor.execute('ROLLBACK')
 
 
     >>> InetTestModel.objects.filter(inet='10.0.0.1').query.as_sql()
     >>> InetTestModel.objects.filter(inet='10.0.0.1').query.as_sql()
     ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" = %s ', (u'10.0.0.1',))
     ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" = %s ', (u'10.0.0.1',))
@@ -241,25 +270,6 @@ class InetTestModel(models.Model):
     class Meta:
     class Meta:
         db_table = 'inet'
         db_table = 'inet'
 
 
-class BlankInetTestModel(models.Model):
-    '''
-    >>> BlankInetTestModel(inet='10.0.0.1').save()
-
-    >>> BlankInetTestModel(inet=IP('10.0.0.1')).save()
-
-    >>> BlankInetTestModel(inet='').save()
-
-    >>> BlankInetTestModel(inet=None).save()
-
-    >>> BlankInetTestModel().save()
-    '''
-
-    inet = InetAddressField(blank=True)
-    objects = NetManger()
-
-    class Meta:
-        db_table = 'blankinet'
-
 class NullInetTestModel(models.Model):
 class NullInetTestModel(models.Model):
     '''
     '''
     >>> NullInetTestModel(inet='10.0.0.1').save()
     >>> NullInetTestModel(inet='10.0.0.1').save()
@@ -279,25 +289,6 @@ class NullInetTestModel(models.Model):
     class Meta:
     class Meta:
         db_table = 'nullinet'
         db_table = 'nullinet'
 
 
-class BlankNullInetTestModel(models.Model):
-    '''
-    >>> BlankNullInetTestModel(inet='10.0.0.1').save()
-
-    >>> BlankNullInetTestModel(inet=IP('10.0.0.1')).save()
-
-    >>> BlankNullInetTestModel(inet='').save()
-
-    >>> BlankNullInetTestModel(inet=None).save()
-
-    >>> BlankNullInetTestModel().save()
-    '''
-
-    inet = InetAddressField(blank=True, null=True)
-    objects = NetManger()
-
-    class Meta:
-        db_table = 'blanknullinet'
-
 class CidrTestModel(models.Model):
 class CidrTestModel(models.Model):
     '''
     '''
     >>> CidrTestModel.objects.filter(cidr='10.0.0.1').query.as_sql()
     >>> CidrTestModel.objects.filter(cidr='10.0.0.1').query.as_sql()