Skip to content

Commit 636b8ce

Browse files
committed
Fix form handling
1 parent a0a21af commit 636b8ce

File tree

1 file changed

+31
-6
lines changed

1 file changed

+31
-6
lines changed

manager.py

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import re
22
from IPy import IP
33

4+
from django import forms
45
from django.db import models, connection
56
from django.db.models import sql, query
67
from django.db.models.query_utils import QueryWrapper
7-
from django import forms
8+
from django.utils.encoding import force_unicode
9+
from django.utils.safestring import mark_safe
810

911
NET_OPERATORS = {
1012
'lt': '<',
@@ -40,6 +42,7 @@ def add_filter(self, (filter_string, value), *args, **kwargs):
4042
return super(NetQuery, self).add_filter(
4143
(filter_string, value), *args, **kwargs)
4244

45+
4346
class NetWhere(sql.where.WhereNode):
4447
def make_atom(self, child, qn):
4548
table_alias, name, db_type, lookup_type, value_annot, params = child
@@ -78,20 +81,35 @@ def make_atom(self, child, qn):
7881

7982
raise ValueError('Invalid lookup type "%s"' % lookup_type)
8083

84+
8185
class NetManger(models.Manager):
8286
use_for_related_fields = True
8387

8488
def get_query_set(self):
8589
q = NetQuery(self.model, connection, NetWhere)
8690
return query.QuerySet(self.model, q)
8791

92+
93+
class NetInput(forms.Widget):
94+
input_type = 'text'
95+
96+
def render(self, name, value, attrs=None):
97+
# Default forms.Widget compares value != '' which breaks IP...
98+
if value is None: value = ''
99+
final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
100+
if value:
101+
final_attrs['value'] = force_unicode(value)
102+
return mark_safe(u'<input%s />' % forms.util.flatatt(final_attrs))
103+
104+
88105
class NetAddressFormField(forms.Field):
106+
widget = NetInput
89107
default_error_messages = {
90108
'invalid': u'Enter a valid IP Address.',
91109
}
92110

93111
def __init__(self, *args, **kwargs):
94-
super(DateTimeField, self).__init__(*args, **kwargs)
112+
super(NetAddressFormField, self).__init__(*args, **kwargs)
95113

96114
def clean(self, value):
97115
super(NetAddressFormField, self).clean(value)
@@ -102,18 +120,20 @@ def clean(self, value):
102120
return value
103121
try:
104122
return IP(value)
105-
except ValueError:
106-
raise forms.ValidationError(self.error_messages['invalid'])
123+
except ValueError, e:
124+
raise forms.ValidationError(e)
125+
107126

108-
mac_re = re.compile(r'^(([A-F0-9]:){5}[A-F0-9])$')
127+
mac_re = re.compile(r'^(([A-F0-9]{2}:){5}[A-F0-9]{2})$')
109128

110129
class MACAddressFormField(forms.RegexField):
111130
default_error_messages = {
112131
'invalid': u'Enter a valid MAC address.',
113132
}
114133

115134
def __init__(self, *args, **kwargs):
116-
super(IPAddressField, self).__init__(mac_re, *args, **kwargs)
135+
super(MACAddressFormField, self).__init__(mac_re, *args, **kwargs)
136+
117137

118138
class _NetAddressField(models.Field):
119139
empty_strings_allowed = False
@@ -153,6 +173,7 @@ def formfield(self, **kwargs):
153173
defaults.update(kwargs)
154174
return super(_NetAddressField, self).formfield(**defaults)
155175

176+
156177
class InetAddressField(_NetAddressField):
157178
description = "PostgreSQL INET field"
158179
max_length = 39
@@ -161,6 +182,7 @@ class InetAddressField(_NetAddressField):
161182
def db_type(self):
162183
return 'inet'
163184

185+
164186
class CidrAddressField(_NetAddressField):
165187
description = "PostgreSQL CIDR field"
166188
max_length = 43
@@ -169,6 +191,7 @@ class CidrAddressField(_NetAddressField):
169191
def db_type(self):
170192
return 'cidr'
171193

194+
172195
class MACAddressField(models.Field):
173196
description = "PostgreSQL MACADDR field"
174197

@@ -184,6 +207,8 @@ def formfield(self, **kwargs):
184207
defaults.update(kwargs)
185208
return super(MACAddressField, self).formfield(**defaults)
186209

210+
211+
# ---- TESTS ----
187212
class InetTestModel(models.Model):
188213
'''
189214
>>> cursor = connection.cursor()

0 commit comments

Comments
 (0)