fields.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.contrib.postgres.fields import ArrayField
  2. from django.contrib.postgres.validators import ArrayMaxLengthValidator
  3. from django.core.exceptions import ValidationError
  4. from django.core.validators import MinValueValidator, MaxValueValidator
  5. from django.db import models
  6. from netaddr import AddrFormatError, EUI, mac_unix_expanded
  7. from ipam.constants import BGP_ASN_MAX, BGP_ASN_MIN
  8. class ASNField(models.BigIntegerField):
  9. description = "32-bit ASN field"
  10. default_validators = [
  11. MinValueValidator(BGP_ASN_MIN),
  12. MaxValueValidator(BGP_ASN_MAX),
  13. ]
  14. def formfield(self, **kwargs):
  15. defaults = {
  16. 'min_value': BGP_ASN_MIN,
  17. 'max_value': BGP_ASN_MAX,
  18. }
  19. defaults.update(**kwargs)
  20. return super().formfield(**defaults)
  21. class mac_unix_expanded_uppercase(mac_unix_expanded):
  22. word_fmt = '%.2X'
  23. class MACAddressField(models.Field):
  24. description = "PostgreSQL MAC Address field"
  25. def python_type(self):
  26. return EUI
  27. def from_db_value(self, value, expression, connection):
  28. return self.to_python(value)
  29. def to_python(self, value):
  30. if value is None:
  31. return value
  32. try:
  33. return EUI(value, version=48, dialect=mac_unix_expanded_uppercase)
  34. except AddrFormatError as e:
  35. raise ValidationError("Invalid MAC address format: {}".format(value))
  36. def db_type(self, connection):
  37. return 'macaddr'
  38. def get_prep_value(self, value):
  39. if not value:
  40. return None
  41. return str(self.to_python(value))
  42. class PathField(ArrayField):
  43. """
  44. An ArrayField which holds a set of objects, each identified by a (type, ID) tuple.
  45. """
  46. def __init__(self, **kwargs):
  47. kwargs['base_field'] = models.CharField(max_length=40)
  48. super().__init__(**kwargs)