fields.py 1.4 KB

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