fields.py 2.7 KB

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