1
+ import re
1
2
from IPy import IP
2
3
3
4
from django .db import models , connection
4
5
from django .db .models import sql , query
5
6
from django .db .models .query_utils import QueryWrapper
7
+ from django import forms
6
8
7
9
NET_OPERATORS = {
8
10
'lt' : '<' ,
@@ -83,6 +85,36 @@ def get_query_set(self):
83
85
q = NetQuery (self .model , connection , NetWhere )
84
86
return query .QuerySet (self .model , q )
85
87
88
+ class NetAddressFormField (forms .Field ):
89
+ default_error_messages = {
90
+ 'invalid' : u'Enter a valid IP Address.' ,
91
+ }
92
+
93
+ def __init__ (self , * args , ** kwargs ):
94
+ super (DateTimeField , self ).__init__ (* args , ** kwargs )
95
+
96
+ def clean (self , value ):
97
+ super (NetAddressFormField , self ).clean (value )
98
+
99
+ if value in (None , '' ):
100
+ return None
101
+ if isinstance (value , IP ):
102
+ return value
103
+ try :
104
+ return IP (value )
105
+ except ValueError :
106
+ raise forms .ValidationError (self .error_messages ['invalid' ])
107
+
108
+ mac_re = re .compile (r'^(([A-F0-9]:){5}[A-F0-9])$' )
109
+
110
+ class MACAddressFormField (forms .RegexField ):
111
+ default_error_messages = {
112
+ 'invalid' : u'Enter a valid MAC address.' ,
113
+ }
114
+
115
+ def __init__ (self , * args , ** kwargs ):
116
+ super (IPAddressField , self ).__init__ (mac_re , * args , ** kwargs )
117
+
86
118
class _NetAddressField (models .Field ):
87
119
empty_strings_allowed = False
88
120
@@ -116,6 +148,11 @@ def get_db_prep_lookup(self, lookup_type, value):
116
148
return super (_NetAddressField , self ).get_db_prep_lookup (
117
149
lookup_type , value )
118
150
151
+ def formfield (self , ** kwargs ):
152
+ defaults = {'form_class' : NetAddressFormField }
153
+ defaults .update (kwargs )
154
+ return super (_NetAddressField , self ).formfield (** defaults )
155
+
119
156
class InetAddressField (_NetAddressField ):
120
157
description = "PostgreSQL INET field"
121
158
max_length = 39
@@ -133,7 +170,6 @@ def db_type(self):
133
170
return 'cidr'
134
171
135
172
class MACAddressField (models .Field ):
136
- # FIXME does this need proper validation?
137
173
description = "PostgreSQL MACADDR field"
138
174
139
175
def __init__ (self , * args , ** kwargs ):
@@ -143,6 +179,11 @@ def __init__(self, *args, **kwargs):
143
179
def db_type (self ):
144
180
return 'macaddr'
145
181
182
+ def formfield (self , ** kwargs ):
183
+ defaults = {'form_class' : MACAddressFormField }
184
+ defaults .update (kwargs )
185
+ return super (MACAddressField , self ).formfield (** defaults )
186
+
146
187
class InetTestModel (models .Model ):
147
188
'''
148
189
>>> cursor = connection.cursor()
0 commit comments