fields.py 2.4 KB

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