Browse Source

Add form fields

Thomas Adamcik 15 years ago
parent
commit
a0a21afed7
1 changed files with 42 additions and 1 deletions
  1. 42 1
      manager.py

+ 42 - 1
manager.py

@@ -1,8 +1,10 @@
+import re
 from IPy import IP
 from IPy import IP
 
 
 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 import forms
 
 
 NET_OPERATORS = {
 NET_OPERATORS = {
     'lt': '<',
     'lt': '<',
@@ -83,6 +85,36 @@ class NetManger(models.Manager):
         q = NetQuery(self.model, connection, NetWhere)
         q = NetQuery(self.model, connection, NetWhere)
         return query.QuerySet(self.model, q)
         return query.QuerySet(self.model, q)
 
 
+class NetAddressFormField(forms.Field):
+    default_error_messages = {
+        'invalid': u'Enter a valid IP Address.',
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(DateTimeField, self).__init__(*args, **kwargs)
+
+    def clean(self, value):
+        super(NetAddressFormField, self).clean(value)
+
+        if value in (None, ''):
+            return None
+        if isinstance(value, IP):
+            return value
+        try:
+            return IP(value)
+        except ValueError:
+            raise forms.ValidationError(self.error_messages['invalid'])
+
+mac_re = re.compile(r'^(([A-F0-9]:){5}[A-F0-9])$')
+
+class MACAddressFormField(forms.RegexField):
+    default_error_messages = {
+        'invalid': u'Enter a valid MAC address.',
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(IPAddressField, self).__init__(mac_re, *args, **kwargs)
+
 class _NetAddressField(models.Field):
 class _NetAddressField(models.Field):
     empty_strings_allowed = False
     empty_strings_allowed = False
 
 
@@ -116,6 +148,11 @@ class _NetAddressField(models.Field):
         return super(_NetAddressField, self).get_db_prep_lookup(
         return super(_NetAddressField, self).get_db_prep_lookup(
             lookup_type, value)
             lookup_type, value)
 
 
+    def formfield(self, **kwargs):
+        defaults = {'form_class': NetAddressFormField}
+        defaults.update(kwargs)
+        return super(_NetAddressField, self).formfield(**defaults)
+
 class InetAddressField(_NetAddressField):
 class InetAddressField(_NetAddressField):
     description = "PostgreSQL INET field"
     description = "PostgreSQL INET field"
     max_length = 39
     max_length = 39
@@ -133,7 +170,6 @@ class CidrAddressField(_NetAddressField):
         return 'cidr'
         return 'cidr'
 
 
 class MACAddressField(models.Field):
 class MACAddressField(models.Field):
-    # FIXME does this need proper validation?
     description = "PostgreSQL MACADDR field"
     description = "PostgreSQL MACADDR field"
 
 
     def __init__(self, *args, **kwargs):
     def __init__(self, *args, **kwargs):
@@ -143,6 +179,11 @@ class MACAddressField(models.Field):
     def db_type(self):
     def db_type(self):
         return 'macaddr'
         return 'macaddr'
 
 
+    def formfield(self, **kwargs):
+        defaults = {'form_class': MACAddressFormField}
+        defaults.update(kwargs)
+        return super(MACAddressField, self).formfield(**defaults)
+
 class InetTestModel(models.Model):
 class InetTestModel(models.Model):
     '''
     '''
     >>> cursor = connection.cursor()
     >>> cursor = connection.cursor()