fields.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """
  2. Indirection layer for PostgreSQL-specific fields, so the tests don't fail when
  3. run with a backend other than PostgreSQL.
  4. """
  5. import enum
  6. from django.db import models
  7. try:
  8. from django.contrib.postgres.fields import (
  9. ArrayField,
  10. BigIntegerRangeField,
  11. DateRangeField,
  12. DateTimeRangeField,
  13. DecimalRangeField,
  14. HStoreField,
  15. IntegerRangeField,
  16. )
  17. from django.contrib.postgres.search import SearchVector, SearchVectorField
  18. except ImportError:
  19. class DummyArrayField(models.Field):
  20. def __init__(self, base_field, size=None, **kwargs):
  21. super().__init__(**kwargs)
  22. def deconstruct(self):
  23. name, path, args, kwargs = super().deconstruct()
  24. kwargs.update(
  25. {
  26. "base_field": "",
  27. "size": 1,
  28. }
  29. )
  30. return name, path, args, kwargs
  31. class DummyContinuousRangeField(models.Field):
  32. def __init__(self, *args, default_bounds="[)", **kwargs):
  33. super().__init__(**kwargs)
  34. def deconstruct(self):
  35. name, path, args, kwargs = super().deconstruct()
  36. kwargs["default_bounds"] = "[)"
  37. return name, path, args, kwargs
  38. ArrayField = DummyArrayField
  39. BigIntegerRangeField = models.Field
  40. DateRangeField = models.Field
  41. DateTimeRangeField = DummyContinuousRangeField
  42. DecimalRangeField = DummyContinuousRangeField
  43. HStoreField = models.Field
  44. IntegerRangeField = models.Field
  45. SearchVector = models.Expression
  46. SearchVectorField = models.Field
  47. class EnumField(models.CharField):
  48. def get_prep_value(self, value):
  49. return value.value if isinstance(value, enum.Enum) else value