fields.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from django.core.exceptions import ValidationError
  2. from django.core.validators import MinValueValidator, MaxValueValidator
  3. from django.db import models
  4. from netaddr import AddrFormatError, EUI, mac_unix_expanded
  5. from ipam.constants import BGP_ASN_MAX, BGP_ASN_MIN
  6. class ASNField(models.BigIntegerField):
  7. description = "32-bit ASN field"
  8. default_validators = [
  9. MinValueValidator(BGP_ASN_MIN),
  10. MaxValueValidator(BGP_ASN_MAX),
  11. ]
  12. def formfield(self, **kwargs):
  13. defaults = {
  14. 'min_value': BGP_ASN_MIN,
  15. 'max_value': BGP_ASN_MAX,
  16. }
  17. defaults.update(**kwargs)
  18. return super().formfield(**defaults)
  19. class mac_unix_expanded_uppercase(mac_unix_expanded):
  20. word_fmt = '%.2X'
  21. class MACAddressField(models.Field):
  22. description = "PostgreSQL MAC Address field"
  23. def python_type(self):
  24. return EUI
  25. def from_db_value(self, value, expression, connection):
  26. return self.to_python(value)
  27. def to_python(self, value):
  28. if value is None:
  29. return value
  30. try:
  31. return EUI(value, version=48, dialect=mac_unix_expanded_uppercase)
  32. except AddrFormatError as e:
  33. raise ValidationError("Invalid MAC address format: {}".format(value))
  34. def db_type(self, connection):
  35. return 'macaddr'
  36. def get_prep_value(self, value):
  37. if not value:
  38. return None
  39. return str(self.to_python(value))