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 django.db import models, connection
 from django.db.models import sql, query
 from django.db.models.query_utils import QueryWrapper
+from django import forms
 
 NET_OPERATORS = {
     'lt': '<',
@@ -83,6 +85,36 @@ class NetManger(models.Manager):
         q = NetQuery(self.model, connection, NetWhere)
         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):
     empty_strings_allowed = False
 
@@ -116,6 +148,11 @@ class _NetAddressField(models.Field):
         return super(_NetAddressField, self).get_db_prep_lookup(
             lookup_type, value)
 
+    def formfield(self, **kwargs):
+        defaults = {'form_class': NetAddressFormField}
+        defaults.update(kwargs)
+        return super(_NetAddressField, self).formfield(**defaults)
+
 class InetAddressField(_NetAddressField):
     description = "PostgreSQL INET field"
     max_length = 39
@@ -133,7 +170,6 @@ class CidrAddressField(_NetAddressField):
         return 'cidr'
 
 class MACAddressField(models.Field):
-    # FIXME does this need proper validation?
     description = "PostgreSQL MACADDR field"
 
     def __init__(self, *args, **kwargs):
@@ -143,6 +179,11 @@ class MACAddressField(models.Field):
     def db_type(self):
         return 'macaddr'
 
+    def formfield(self, **kwargs):
+        defaults = {'form_class': MACAddressFormField}
+        defaults.update(kwargs)
+        return super(MACAddressField, self).formfield(**defaults)
+
 class InetTestModel(models.Model):
     '''
     >>> cursor = connection.cursor()