fields.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from netaddr import IPAddress, IPNetwork, EUI
  2. from django.db import models
  3. from netfields.managers import NET_OPERATORS, NET_TEXT_OPERATORS
  4. from netfields.forms import InetAddressFormField, CidrAddressFormField, MACAddressFormField
  5. from netfields.mac import mac_unix_common
  6. class _NetAddressField(models.Field):
  7. empty_strings_allowed = False
  8. def __init__(self, *args, **kwargs):
  9. kwargs['max_length'] = self.max_length
  10. super(_NetAddressField, self).__init__(*args, **kwargs)
  11. def to_python(self, value):
  12. if not value:
  13. return value
  14. return self.python_type()(value)
  15. def get_prep_lookup(self, lookup_type, value):
  16. if not value:
  17. return None
  18. if (lookup_type in NET_OPERATORS and
  19. NET_OPERATORS[lookup_type] not in NET_TEXT_OPERATORS):
  20. return self.get_prep_value(value)
  21. return super(_NetAddressField, self).get_prep_lookup(
  22. lookup_type, value)
  23. def get_prep_value(self, value):
  24. if not value:
  25. return None
  26. return unicode(self.to_python(value))
  27. def get_db_prep_lookup(self, lookup_type, value, connection,
  28. prepared=False):
  29. if not value:
  30. return []
  31. if (lookup_type in NET_OPERATORS and
  32. NET_OPERATORS[lookup_type] not in NET_TEXT_OPERATORS):
  33. return [value] if prepared else [self.get_prep_value(value)]
  34. return super(_NetAddressField, self).get_db_prep_lookup(
  35. lookup_type, value, connection=connection, prepared=prepared)
  36. def formfield(self, **kwargs):
  37. defaults = {'form_class': self.form_class()}
  38. defaults.update(kwargs)
  39. return super(_NetAddressField, self).formfield(**defaults)
  40. class InetAddressField(_NetAddressField):
  41. description = "PostgreSQL INET field"
  42. max_length = 39
  43. __metaclass__ = models.SubfieldBase
  44. def db_type(self, connection):
  45. return 'inet'
  46. def python_type(self):
  47. return IPAddress
  48. def form_class(self):
  49. return InetAddressFormField
  50. class CidrAddressField(_NetAddressField):
  51. description = "PostgreSQL CIDR field"
  52. max_length = 43
  53. __metaclass__ = models.SubfieldBase
  54. def db_type(self, connection):
  55. return 'cidr'
  56. def python_type(self):
  57. return IPNetwork
  58. def form_class(self):
  59. return CidrAddressFormField
  60. class MACAddressField(models.Field):
  61. description = "PostgreSQL MACADDR field"
  62. def __init__(self, *args, **kwargs):
  63. kwargs['max_length'] = 17
  64. super(MACAddressField, self).__init__(*args, **kwargs)
  65. def db_type(self, connection):
  66. return 'macaddr'
  67. def to_python(self, value):
  68. if not value:
  69. return value
  70. return EUI(value, dialect=mac_unix_common)
  71. def get_prep_value(self, value):
  72. if not value:
  73. return None
  74. return unicode(self.to_python(value))
  75. def formfield(self, **kwargs):
  76. defaults = {'form_class': MACAddressFormField}
  77. defaults.update(kwargs)
  78. return super(MACAddressField, self).formfield(**defaults)
  79. try:
  80. from south.modelsinspector import add_introspection_rules
  81. add_introspection_rules([], [
  82. "^netfields\.fields\.InetAddressField",
  83. "^netfields\.fields\.CidrAddressField",
  84. "^netfields\.fields\.MACAddressField",
  85. ])
  86. except ImportError:
  87. pass