forms.py 2.3 KB

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