fields.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from netaddr import IPNetwork
  2. from django.core.exceptions import ValidationError
  3. from django.db import models
  4. from django.utils.six import with_metaclass
  5. from .formfields import IPFormField
  6. from .lookups import EndsWith, IEndsWith, StartsWith, IStartsWith, Regex, IRegex, NetContained, NetContainedOrEqual, \
  7. NetContains, NetContainsOrEquals, NetHost
  8. class _BaseIPField(models.Field):
  9. def python_type(self):
  10. return IPNetwork
  11. def to_python(self, value):
  12. if not value:
  13. return value
  14. try:
  15. return IPNetwork(value)
  16. except ValueError as e:
  17. raise ValidationError(e)
  18. def get_prep_value(self, value):
  19. if not value:
  20. return None
  21. return str(self.to_python(value))
  22. def form_class(self):
  23. return IPFormField
  24. def formfield(self, **kwargs):
  25. defaults = {'form_class': self.form_class()}
  26. defaults.update(kwargs)
  27. return super(_BaseIPField, self).formfield(**defaults)
  28. class IPNetworkField(with_metaclass(models.SubfieldBase, _BaseIPField)):
  29. """
  30. IP prefix (network and mask)
  31. """
  32. description = "PostgreSQL CIDR field"
  33. def db_type(self, connection):
  34. return 'cidr'
  35. IPNetworkField.register_lookup(EndsWith)
  36. IPNetworkField.register_lookup(IEndsWith)
  37. IPNetworkField.register_lookup(StartsWith)
  38. IPNetworkField.register_lookup(IStartsWith)
  39. IPNetworkField.register_lookup(Regex)
  40. IPNetworkField.register_lookup(IRegex)
  41. IPNetworkField.register_lookup(NetContained)
  42. IPNetworkField.register_lookup(NetContainedOrEqual)
  43. IPNetworkField.register_lookup(NetContains)
  44. IPNetworkField.register_lookup(NetContainsOrEquals)
  45. IPNetworkField.register_lookup(NetHost)
  46. class IPAddressField(with_metaclass(models.SubfieldBase, _BaseIPField)):
  47. """
  48. IP address (host address and mask)
  49. """
  50. description = "PostgreSQL INET field"
  51. def db_type(self, connection):
  52. return 'inet'
  53. IPAddressField.register_lookup(EndsWith)
  54. IPAddressField.register_lookup(IEndsWith)
  55. IPAddressField.register_lookup(StartsWith)
  56. IPAddressField.register_lookup(IStartsWith)
  57. IPAddressField.register_lookup(Regex)
  58. IPAddressField.register_lookup(IRegex)
  59. IPAddressField.register_lookup(NetContained)
  60. IPAddressField.register_lookup(NetContainedOrEqual)
  61. IPAddressField.register_lookup(NetContains)
  62. IPAddressField.register_lookup(NetContainsOrEquals)
  63. IPAddressField.register_lookup(NetHost)