adamcik il y a 15 ans
Parent
commit
313f0106ee
1 fichiers modifiés avec 27 ajouts et 3 suppressions
  1. 27 3
      manager.py

+ 27 - 3
manager.py

@@ -1,3 +1,6 @@
+from IPy import IP
+
+from django.core.exceptions import ValidationError
 from django.db import models, connection
 from django.db.models import sql, query
 
@@ -22,25 +25,46 @@ class IPWhere(sql.where.WhereNode):
     def make_atom(self, child, qn):
         table_alias, name, db_type, lookup_type, value_annot, params = child
 
-        if db_type == 'inet' and lookup_type in INET_TERMS:
+        if lookup_type in INET_TERMS:
             return ('%s.%s %s inet %%s' % (table_alias, name, INET_TERMS[lookup_type]), params)
 
         return super(IPWhere, self).make_atom(child, qn)
 
 class IPManger(models.Manager):
-    use_for_related_fields = True
-
     def get_query_set(self):
         q = IPQuery(self.model, connection, IPWhere)
         return query.QuerySet(self.model, q)
 
 class IPAddressField(models.IPAddressField):
+    __metaclass__ = models.SubfieldBase
+
+    def db_type(self):
+        return 'inet'
+
+    def to_python(self, value):
+        if not value:
+            return None
+
+        try:
+            return IP(value)
+        except ValueError, e:
+            raise ValidationError(e)
+
+    def get_db_prep_value(self, value):
+        return unicode(self.to_python(value))
+
     def get_db_prep_lookup(self, lookup_type, value):
+        value = unicode(value)
+
         if lookup_type in INET_TERMS:
             return [value]
+
         return super(IPAddressField, self).get_db_prep_lookup(lookup_type, value)
 
 class Foo(models.Model):
     ip = IPAddressField()
 
     objects = IPManger()
+
+    def __unicode__(self):
+        return unicode(self.ip)