forms.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import re
  2. from IPy import IP
  3. from django import forms
  4. from django.utils.encoding import force_unicode
  5. from django.utils.safestring import mark_safe
  6. class NetInput(forms.Widget):
  7. input_type = 'text'
  8. def render(self, name, value, attrs=None):
  9. # Default forms.Widget compares value != '' which breaks IP...
  10. if value is None: value = ''
  11. final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
  12. if value:
  13. final_attrs['value'] = force_unicode(value)
  14. return mark_safe(u'<input%s />' % forms.util.flatatt(final_attrs))
  15. class NetAddressFormField(forms.Field):
  16. widget = NetInput
  17. default_error_messages = {
  18. 'invalid': u'Enter a valid IP Address.',
  19. }
  20. def __init__(self, *args, **kwargs):
  21. super(NetAddressFormField, self).__init__(*args, **kwargs)
  22. def clean(self, value):
  23. super(NetAddressFormField, self).clean(value)
  24. if value in (None, ''):
  25. return None
  26. if isinstance(value, IP):
  27. return value
  28. try:
  29. return IP(value)
  30. except ValueError, e:
  31. raise forms.ValidationError(e)
  32. mac_re = re.compile(r'^(([A-F0-9]{2}:){5}[A-F0-9]{2})$')
  33. class MACAddressFormField(forms.RegexField):
  34. default_error_messages = {
  35. 'invalid': u'Enter a valid MAC address.',
  36. }
  37. def __init__(self, *args, **kwargs):
  38. super(MACAddressFormField, self).__init__(mac_re, *args, **kwargs)