forms.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from IPy import IP
  2. from netaddr import EUI, AddrFormatError
  3. from django import forms
  4. from django.utils.encoding import force_unicode
  5. from django.utils.safestring import mark_safe
  6. from django.core.exceptions import ValidationError
  7. from netfields.mac import mac_unix_common
  8. class NetInput(forms.Widget):
  9. input_type = 'text'
  10. def render(self, name, value, attrs=None):
  11. # Default forms.Widget compares value != '' which breaks IP...
  12. if value is None:
  13. value = ''
  14. final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
  15. if value:
  16. final_attrs['value'] = force_unicode(value)
  17. return mark_safe(u'<input%s />' % forms.util.flatatt(final_attrs))
  18. class NetAddressFormField(forms.Field):
  19. widget = NetInput
  20. default_error_messages = {
  21. 'invalid': u'Enter a valid IP Address.',
  22. }
  23. def __init__(self, *args, **kwargs):
  24. super(NetAddressFormField, self).__init__(*args, **kwargs)
  25. def to_python(self, value):
  26. if not value:
  27. return None
  28. if isinstance(value, IP):
  29. return value
  30. try:
  31. return IP(value)
  32. except ValueError, e:
  33. raise ValidationError(str(e))
  34. class MACAddressFormField(forms.Field):
  35. default_error_messages = {
  36. 'invalid': u'Enter a valid MAC address.',
  37. }
  38. def __init__(self, *args, **kwargs):
  39. super(MACAddressFormField, self).__init__(*args, **kwargs)
  40. def to_python(self, value):
  41. if not value:
  42. return None
  43. if isinstance(value, EUI):
  44. return value
  45. try:
  46. return EUI(value, dialect=mac_unix_common)
  47. except AddrFormatError:
  48. raise ValidationError(self.error_messages['invalid'])