fields.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from __future__ import unicode_literals
  2. from django.core.exceptions import ValidationError
  3. from django.db import models
  4. from netaddr import IPNetwork
  5. from .formfields import IPFormField
  6. from . import lookups
  7. def prefix_validator(prefix):
  8. if prefix.ip != prefix.cidr.ip:
  9. raise ValidationError("{} is not a valid prefix. Did you mean {}?".format(prefix, prefix.cidr))
  10. class BaseIPField(models.Field):
  11. def python_type(self):
  12. return IPNetwork
  13. def from_db_value(self, value, expression, connection, context):
  14. return self.to_python(value)
  15. def to_python(self, value):
  16. if not value:
  17. return value
  18. try:
  19. return IPNetwork(value)
  20. except ValueError as e:
  21. raise ValidationError(e)
  22. def get_prep_value(self, value):
  23. if not value:
  24. return None
  25. return str(self.to_python(value))
  26. def form_class(self):
  27. return IPFormField
  28. def formfield(self, **kwargs):
  29. defaults = {'form_class': self.form_class()}
  30. defaults.update(kwargs)
  31. return super(BaseIPField, self).formfield(**defaults)
  32. class IPNetworkField(BaseIPField):
  33. """
  34. IP prefix (network and mask)
  35. """
  36. description = "PostgreSQL CIDR field"
  37. default_validators = [prefix_validator]
  38. def db_type(self, connection):
  39. return 'cidr'
  40. IPNetworkField.register_lookup(lookups.IExact)
  41. IPNetworkField.register_lookup(lookups.EndsWith)
  42. IPNetworkField.register_lookup(lookups.IEndsWith)
  43. IPNetworkField.register_lookup(lookups.StartsWith)
  44. IPNetworkField.register_lookup(lookups.IStartsWith)
  45. IPNetworkField.register_lookup(lookups.Regex)
  46. IPNetworkField.register_lookup(lookups.IRegex)
  47. IPNetworkField.register_lookup(lookups.NetContained)
  48. IPNetworkField.register_lookup(lookups.NetContainedOrEqual)
  49. IPNetworkField.register_lookup(lookups.NetContains)
  50. IPNetworkField.register_lookup(lookups.NetContainsOrEquals)
  51. IPNetworkField.register_lookup(lookups.NetMaskLength)
  52. class IPAddressField(BaseIPField):
  53. """
  54. IP address (host address and mask)
  55. """
  56. description = "PostgreSQL INET field"
  57. def db_type(self, connection):
  58. return 'inet'
  59. IPAddressField.register_lookup(lookups.IExact)
  60. IPAddressField.register_lookup(lookups.EndsWith)
  61. IPAddressField.register_lookup(lookups.IEndsWith)
  62. IPAddressField.register_lookup(lookups.StartsWith)
  63. IPAddressField.register_lookup(lookups.IStartsWith)
  64. IPAddressField.register_lookup(lookups.Regex)
  65. IPAddressField.register_lookup(lookups.IRegex)
  66. IPAddressField.register_lookup(lookups.NetContained)
  67. IPAddressField.register_lookup(lookups.NetContainedOrEqual)
  68. IPAddressField.register_lookup(lookups.NetContains)
  69. IPAddressField.register_lookup(lookups.NetContainsOrEquals)
  70. IPAddressField.register_lookup(lookups.NetHost)
  71. IPAddressField.register_lookup(lookups.NetHostContained)
  72. IPAddressField.register_lookup(lookups.NetMaskLength)