fields.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. if lookup_type.startswith('net_contained') and value is not None:
  21. # Argument will be CIDR
  22. return unicode(value)
  23. return self.get_prep_value(value)
  24. return super(_NetAddressField, self).get_prep_lookup(
  25. lookup_type, value)
  26. def get_prep_value(self, value):
  27. if not value:
  28. return None
  29. return unicode(self.to_python(value))
  30. def get_db_prep_lookup(self, lookup_type, value, connection,
  31. prepared=False):
  32. if not value:
  33. return []
  34. if (lookup_type in NET_OPERATORS and
  35. NET_OPERATORS[lookup_type] not in NET_TEXT_OPERATORS):
  36. return [value] if prepared else [self.get_prep_value(value)]
  37. return super(_NetAddressField, self).get_db_prep_lookup(
  38. lookup_type, value, connection=connection, prepared=prepared)
  39. def formfield(self, **kwargs):
  40. defaults = {'form_class': self.form_class()}
  41. defaults.update(kwargs)
  42. return super(_NetAddressField, self).formfield(**defaults)
  43. class InetAddressField(_NetAddressField):
  44. description = "PostgreSQL INET field"
  45. max_length = 39
  46. __metaclass__ = models.SubfieldBase
  47. def db_type(self, connection):
  48. return 'inet'
  49. def python_type(self):
  50. return IPAddress
  51. def form_class(self):
  52. return InetAddressFormField
  53. class CidrAddressField(_NetAddressField):
  54. description = "PostgreSQL CIDR field"
  55. max_length = 43
  56. __metaclass__ = models.SubfieldBase
  57. def db_type(self, connection):
  58. return 'cidr'
  59. def python_type(self):
  60. return IPNetwork
  61. def form_class(self):
  62. return CidrAddressFormField
  63. class MACAddressField(models.Field):
  64. description = "PostgreSQL MACADDR field"
  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