fields.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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. class ASNField(models.BigIntegerField):
  6. description = "32-bit ASN field"
  7. default_validators = [
  8. MinValueValidator(1),
  9. MaxValueValidator(4294967295),
  10. ]
  11. class mac_unix_expanded_uppercase(mac_unix_expanded):
  12. word_fmt = '%.2X'
  13. class MACAddressField(models.Field):
  14. description = "PostgreSQL MAC Address field"
  15. def python_type(self):
  16. return EUI
  17. def from_db_value(self, value, expression, connection):
  18. return self.to_python(value)
  19. def to_python(self, value):
  20. if value is None:
  21. return value
  22. try:
  23. return EUI(value, version=48, dialect=mac_unix_expanded_uppercase)
  24. except AddrFormatError as e:
  25. raise ValidationError("Invalid MAC address format: {}".format(value))
  26. def db_type(self, connection):
  27. return 'macaddr'
  28. def get_prep_value(self, value):
  29. if not value:
  30. return None
  31. return str(self.to_python(value))