fields.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 .constants import *
  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 = {'min_value': BGP_ASN_MIN, 'max_value': BGP_ASN_MAX}
  14. defaults.update(**kwargs)
  15. return super().formfield(**defaults)
  16. class mac_unix_expanded_uppercase(mac_unix_expanded):
  17. word_fmt = '%.2X'
  18. class MACAddressField(models.Field):
  19. description = "PostgreSQL MAC Address field"
  20. def python_type(self):
  21. return EUI
  22. def from_db_value(self, value, expression, connection, context):
  23. return self.to_python(value)
  24. def to_python(self, value):
  25. if value is None:
  26. return value
  27. try:
  28. return EUI(value, version=48, dialect=mac_unix_expanded_uppercase)
  29. except AddrFormatError as e:
  30. raise ValidationError("Invalid MAC address format: {}".format(value))
  31. def db_type(self, connection):
  32. return 'macaddr'
  33. def get_prep_value(self, value):
  34. if not value:
  35. return None
  36. return str(self.to_python(value))