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. 
    
  7. from django.db import models
    
  8. 
    
  9. try:
    
  10.     from django.contrib.postgres.fields import (
    
  11.         ArrayField,
    
  12.         BigIntegerRangeField,
    
  13.         CICharField,
    
  14.         CIEmailField,
    
  15.         CITextField,
    
  16.         DateRangeField,
    
  17.         DateTimeRangeField,
    
  18.         DecimalRangeField,
    
  19.         HStoreField,
    
  20.         IntegerRangeField,
    
  21.     )
    
  22.     from django.contrib.postgres.search import SearchVector, SearchVectorField
    
  23. except ImportError:
    
  24. 
    
  25.     class DummyArrayField(models.Field):
    
  26.         def __init__(self, base_field, size=None, **kwargs):
    
  27.             super().__init__(**kwargs)
    
  28. 
    
  29.         def deconstruct(self):
    
  30.             name, path, args, kwargs = super().deconstruct()
    
  31.             kwargs.update(
    
  32.                 {
    
  33.                     "base_field": "",
    
  34.                     "size": 1,
    
  35.                 }
    
  36.             )
    
  37.             return name, path, args, kwargs
    
  38. 
    
  39.     class DummyContinuousRangeField(models.Field):
    
  40.         def __init__(self, *args, default_bounds="[)", **kwargs):
    
  41.             super().__init__(**kwargs)
    
  42. 
    
  43.         def deconstruct(self):
    
  44.             name, path, args, kwargs = super().deconstruct()
    
  45.             kwargs["default_bounds"] = "[)"
    
  46.             return name, path, args, kwargs
    
  47. 
    
  48.     ArrayField = DummyArrayField
    
  49.     BigIntegerRangeField = models.Field
    
  50.     CICharField = models.Field
    
  51.     CIEmailField = models.Field
    
  52.     CITextField = models.Field
    
  53.     DateRangeField = models.Field
    
  54.     DateTimeRangeField = DummyContinuousRangeField
    
  55.     DecimalRangeField = DummyContinuousRangeField
    
  56.     HStoreField = models.Field
    
  57.     IntegerRangeField = models.Field
    
  58.     SearchVector = models.Expression
    
  59.     SearchVectorField = models.Field
    
  60. 
    
  61. 
    
  62. class EnumField(models.CharField):
    
  63.     def get_prep_value(self, value):
    
  64.         return value.value if isinstance(value, enum.Enum) else value