2019-01-10 18:06:14 +00:00
|
|
|
from psycopg2.extras import (
|
|
|
|
|
DateRange, DateTimeRange, DateTimeTZRange, NumericRange,
|
|
|
|
|
)
|
|
|
|
|
|
2014-03-14 17:34:49 +00:00
|
|
|
from django.apps import AppConfig
|
2016-07-20 08:18:11 +00:00
|
|
|
from django.db import connections
|
2014-03-14 17:34:49 +00:00
|
|
|
from django.db.backends.signals import connection_created
|
2019-01-10 18:06:14 +00:00
|
|
|
from django.db.migrations.writer import MigrationWriter
|
2014-09-05 20:53:11 +00:00
|
|
|
from django.db.models import CharField, TextField
|
2018-11-12 16:15:48 +00:00
|
|
|
from django.test.signals import setting_changed
|
2017-01-26 19:58:33 +00:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
2014-03-14 17:34:49 +00:00
|
|
|
|
2015-06-05 16:37:48 +00:00
|
|
|
from .lookups import SearchLookup, TrigramSimilar, Unaccent
|
2019-01-10 18:06:14 +00:00
|
|
|
from .serializers import RangeSerializer
|
2017-05-03 05:25:30 +00:00
|
|
|
from .signals import register_type_handlers
|
2014-03-14 17:34:49 +00:00
|
|
|
|
2019-01-10 18:06:14 +00:00
|
|
|
RANGE_TYPES = (DateRange, DateTimeRange, DateTimeTZRange, NumericRange)
|
|
|
|
|
|
2014-03-14 17:34:49 +00:00
|
|
|
|
2018-11-12 16:15:48 +00:00
|
|
|
def uninstall_if_needed(setting, value, enter, **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
Undo the effects of PostgresConfig.ready() when django.contrib.postgres
|
|
|
|
|
is "uninstalled" by override_settings().
|
|
|
|
|
"""
|
|
|
|
|
if not enter and setting == 'INSTALLED_APPS' and 'django.contrib.postgres' not in set(value):
|
|
|
|
|
connection_created.disconnect(register_type_handlers)
|
|
|
|
|
CharField._unregister_lookup(Unaccent)
|
|
|
|
|
TextField._unregister_lookup(Unaccent)
|
|
|
|
|
CharField._unregister_lookup(SearchLookup)
|
|
|
|
|
TextField._unregister_lookup(SearchLookup)
|
|
|
|
|
CharField._unregister_lookup(TrigramSimilar)
|
|
|
|
|
TextField._unregister_lookup(TrigramSimilar)
|
|
|
|
|
# Disconnect this receiver until the next time this app is installed
|
|
|
|
|
# and ready() connects it again to prevent unnecessary processing on
|
|
|
|
|
# each setting change.
|
|
|
|
|
setting_changed.disconnect(uninstall_if_needed)
|
2019-01-10 18:06:14 +00:00
|
|
|
MigrationWriter.unregister_serializer(RANGE_TYPES)
|
2018-11-12 16:15:48 +00:00
|
|
|
|
|
|
|
|
|
2014-03-14 17:34:49 +00:00
|
|
|
class PostgresConfig(AppConfig):
|
|
|
|
|
name = 'django.contrib.postgres'
|
|
|
|
|
verbose_name = _('PostgreSQL extensions')
|
|
|
|
|
|
|
|
|
|
def ready(self):
|
2018-11-12 16:15:48 +00:00
|
|
|
setting_changed.connect(uninstall_if_needed)
|
2016-07-20 08:18:11 +00:00
|
|
|
# Connections may already exist before we are called.
|
|
|
|
|
for conn in connections.all():
|
2017-09-09 12:39:09 +00:00
|
|
|
if conn.vendor == 'postgresql':
|
|
|
|
|
conn.introspection.data_types_reverse.update({
|
2018-04-09 16:46:31 +00:00
|
|
|
3904: 'django.contrib.postgres.fields.IntegerRangeField',
|
2018-10-02 23:17:23 +00:00
|
|
|
3906: 'django.contrib.postgres.fields.DecimalRangeField',
|
2018-04-09 16:46:31 +00:00
|
|
|
3910: 'django.contrib.postgres.fields.DateTimeRangeField',
|
|
|
|
|
3912: 'django.contrib.postgres.fields.DateRangeField',
|
|
|
|
|
3926: 'django.contrib.postgres.fields.BigIntegerRangeField',
|
2017-09-09 12:39:09 +00:00
|
|
|
})
|
|
|
|
|
if conn.connection is not None:
|
|
|
|
|
register_type_handlers(conn)
|
2017-05-03 05:25:30 +00:00
|
|
|
connection_created.connect(register_type_handlers)
|
2014-09-05 20:53:11 +00:00
|
|
|
CharField.register_lookup(Unaccent)
|
|
|
|
|
TextField.register_lookup(Unaccent)
|
2015-05-31 21:45:03 +00:00
|
|
|
CharField.register_lookup(SearchLookup)
|
|
|
|
|
TextField.register_lookup(SearchLookup)
|
2015-06-05 16:37:48 +00:00
|
|
|
CharField.register_lookup(TrigramSimilar)
|
|
|
|
|
TextField.register_lookup(TrigramSimilar)
|
2019-01-10 18:06:14 +00:00
|
|
|
MigrationWriter.register_serializer(RANGE_TYPES, RangeSerializer)
|