Skip to content

Commit a0a21af

Browse files
committed
Add form fields
1 parent 25dcc6d commit a0a21af

File tree

1 file changed

+42
-1
lines changed

1 file changed

+42
-1
lines changed

manager.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import re
12
from IPy import IP
23

34
from django.db import models, connection
45
from django.db.models import sql, query
56
from django.db.models.query_utils import QueryWrapper
7+
from django import forms
68

79
NET_OPERATORS = {
810
'lt': '<',
@@ -83,6 +85,36 @@ def get_query_set(self):
8385
q = NetQuery(self.model, connection, NetWhere)
8486
return query.QuerySet(self.model, q)
8587

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+
86118
class _NetAddressField(models.Field):
87119
empty_strings_allowed = False
88120

@@ -116,6 +148,11 @@ def get_db_prep_lookup(self, lookup_type, value):
116148
return super(_NetAddressField, self).get_db_prep_lookup(
117149
lookup_type, value)
118150

151+
def formfield(self, **kwargs):
152+
defaults = {'form_class': NetAddressFormField}
153+
defaults.update(kwargs)
154+
return super(_NetAddressField, self).formfield(**defaults)
155+
119156
class InetAddressField(_NetAddressField):
120157
description = "PostgreSQL INET field"
121158
max_length = 39
@@ -133,7 +170,6 @@ def db_type(self):
133170
return 'cidr'
134171

135172
class MACAddressField(models.Field):
136-
# FIXME does this need proper validation?
137173
description = "PostgreSQL MACADDR field"
138174

139175
def __init__(self, *args, **kwargs):
@@ -143,6 +179,11 @@ def __init__(self, *args, **kwargs):
143179
def db_type(self):
144180
return 'macaddr'
145181

182+
def formfield(self, **kwargs):
183+
defaults = {'form_class': MACAddressFormField}
184+
defaults.update(kwargs)
185+
return super(MACAddressField, self).formfield(**defaults)
186+
146187
class InetTestModel(models.Model):
147188
'''
148189
>>> cursor = connection.cursor()

0 commit comments

Comments
 (0)