Loading django/contrib/postgres/operations.py +2 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,8 @@ class CreateExtension(Operation): pass def database_forwards(self, app_label, schema_editor, from_state, to_state): if schema_editor.connection.vendor != 'postgresql': return schema_editor.execute("CREATE EXTENSION IF NOT EXISTS %s" % self.name) def database_backwards(self, app_label, schema_editor, from_state, to_state): Loading tests/postgres_tests/__init__.py +9 −0 Original line number Diff line number Diff line import unittest from django.db import connection from django.test import TestCase @unittest.skipUnless(connection.vendor == 'postgresql', "PostgreSQL specific tests") class PostgresSQLTestCase(TestCase): pass tests/postgres_tests/fields.py 0 → 100644 +31 −0 Original line number Diff line number Diff line """ Indirection layer for PostgreSQL-specific fields, so the tests don't fail when run with a backend other than PostgreSQL. """ from django.db import models try: from django.contrib.postgres.fields import ( ArrayField, BigIntegerRangeField, DateRangeField, DateTimeRangeField, FloatRangeField, HStoreField, IntegerRangeField, ) except ImportError: class DummyArrayField(models.Field): def __init__(self, base_field, size=None, **kwargs): super(DummyArrayField, self).__init__(**kwargs) def deconstruct(self): name, path, args, kwargs = super(DummyArrayField, self).deconstruct() kwargs.update({ 'base_field': '', 'size': 1, }) return name, path, args, kwargs ArrayField = DummyArrayField BigIntegerRangeField = models.Field DateRangeField = models.Field DateTimeRangeField = models.Field FloatRangeField = models.Field HStoreField = models.Field IntegerRangeField = models.Field tests/postgres_tests/migrations/0001_setup_extensions.py +9 −3 Original line number Diff line number Diff line # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations try: from django.contrib.postgres.operations import ( HStoreExtension, UnaccentExtension, ) from django.db import migrations except ImportError: from django.test import mock HStoreExtension = mock.Mock() UnaccentExtension = mock.Mock() class Migration(migrations.Migration): Loading tests/postgres_tests/migrations/0002_create_test_models.py +33 −21 Original line number Diff line number Diff line # -*- coding: utf-8 -*- from __future__ import unicode_literals import django.contrib.postgres.fields import django.contrib.postgres.fields.hstore from django.db import migrations, models from ..fields import * # NOQA class Migration(migrations.Migration): Loading @@ -17,9 +17,10 @@ class Migration(migrations.Migration): name='CharArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.ArrayField(models.CharField(max_length=10), size=None)), ('field', ArrayField(models.CharField(max_length=10), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -27,11 +28,12 @@ class Migration(migrations.Migration): name='DateTimeArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('datetimes', django.contrib.postgres.fields.ArrayField(models.DateTimeField(), size=None)), ('dates', django.contrib.postgres.fields.ArrayField(models.DateField(), size=None)), ('times', django.contrib.postgres.fields.ArrayField(models.TimeField(), size=None)), ('datetimes', ArrayField(models.DateTimeField(), size=None)), ('dates', ArrayField(models.DateField(), size=None)), ('times', ArrayField(models.TimeField(), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -39,9 +41,10 @@ class Migration(migrations.Migration): name='HStoreModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.hstore.HStoreField(blank=True, null=True)), ('field', HStoreField(blank=True, null=True)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -49,11 +52,12 @@ class Migration(migrations.Migration): name='OtherTypesArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('ips', django.contrib.postgres.fields.ArrayField(models.GenericIPAddressField(), size=None)), ('uuids', django.contrib.postgres.fields.ArrayField(models.UUIDField(), size=None)), ('decimals', django.contrib.postgres.fields.ArrayField(models.DecimalField(max_digits=5, decimal_places=2), size=None)), ('ips', ArrayField(models.GenericIPAddressField(), size=None)), ('uuids', ArrayField(models.UUIDField(), size=None)), ('decimals', ArrayField(models.DecimalField(max_digits=5, decimal_places=2), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -61,9 +65,10 @@ class Migration(migrations.Migration): name='IntegerArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None)), ('field', ArrayField(models.IntegerField(), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -71,9 +76,10 @@ class Migration(migrations.Migration): name='NestedIntegerArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.ArrayField(django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None), size=None)), ('field', ArrayField(ArrayField(models.IntegerField(), size=None), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -81,9 +87,10 @@ class Migration(migrations.Migration): name='NullableIntegerArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None, null=True, blank=True)), ('field', ArrayField(models.IntegerField(), size=None, null=True, blank=True)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading Loading @@ -130,20 +137,25 @@ class Migration(migrations.Migration): name='RangesModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('ints', django.contrib.postgres.fields.IntegerRangeField(null=True, blank=True)), ('bigints', django.contrib.postgres.fields.BigIntegerRangeField(null=True, blank=True)), ('floats', django.contrib.postgres.fields.FloatRangeField(null=True, blank=True)), ('timestamps', django.contrib.postgres.fields.DateTimeRangeField(null=True, blank=True)), ('dates', django.contrib.postgres.fields.DateRangeField(null=True, blank=True)), ('ints', IntegerRangeField(null=True, blank=True)), ('bigints', BigIntegerRangeField(null=True, blank=True)), ('floats', FloatRangeField(null=True, blank=True)), ('timestamps', DateTimeRangeField(null=True, blank=True)), ('dates', DateRangeField(null=True, blank=True)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), ] def apply(self, project_state, schema_editor, collect_sql=False): try: PG_VERSION = schema_editor.connection.pg_version except AttributeError: pass # We are probably not on PostgreSQL else: if PG_VERSION >= 90200: self.operations = self.operations + self.pg_92_operations return super(Migration, self).apply(project_state, schema_editor, collect_sql) Loading
django/contrib/postgres/operations.py +2 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,8 @@ class CreateExtension(Operation): pass def database_forwards(self, app_label, schema_editor, from_state, to_state): if schema_editor.connection.vendor != 'postgresql': return schema_editor.execute("CREATE EXTENSION IF NOT EXISTS %s" % self.name) def database_backwards(self, app_label, schema_editor, from_state, to_state): Loading
tests/postgres_tests/__init__.py +9 −0 Original line number Diff line number Diff line import unittest from django.db import connection from django.test import TestCase @unittest.skipUnless(connection.vendor == 'postgresql', "PostgreSQL specific tests") class PostgresSQLTestCase(TestCase): pass
tests/postgres_tests/fields.py 0 → 100644 +31 −0 Original line number Diff line number Diff line """ Indirection layer for PostgreSQL-specific fields, so the tests don't fail when run with a backend other than PostgreSQL. """ from django.db import models try: from django.contrib.postgres.fields import ( ArrayField, BigIntegerRangeField, DateRangeField, DateTimeRangeField, FloatRangeField, HStoreField, IntegerRangeField, ) except ImportError: class DummyArrayField(models.Field): def __init__(self, base_field, size=None, **kwargs): super(DummyArrayField, self).__init__(**kwargs) def deconstruct(self): name, path, args, kwargs = super(DummyArrayField, self).deconstruct() kwargs.update({ 'base_field': '', 'size': 1, }) return name, path, args, kwargs ArrayField = DummyArrayField BigIntegerRangeField = models.Field DateRangeField = models.Field DateTimeRangeField = models.Field FloatRangeField = models.Field HStoreField = models.Field IntegerRangeField = models.Field
tests/postgres_tests/migrations/0001_setup_extensions.py +9 −3 Original line number Diff line number Diff line # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations try: from django.contrib.postgres.operations import ( HStoreExtension, UnaccentExtension, ) from django.db import migrations except ImportError: from django.test import mock HStoreExtension = mock.Mock() UnaccentExtension = mock.Mock() class Migration(migrations.Migration): Loading
tests/postgres_tests/migrations/0002_create_test_models.py +33 −21 Original line number Diff line number Diff line # -*- coding: utf-8 -*- from __future__ import unicode_literals import django.contrib.postgres.fields import django.contrib.postgres.fields.hstore from django.db import migrations, models from ..fields import * # NOQA class Migration(migrations.Migration): Loading @@ -17,9 +17,10 @@ class Migration(migrations.Migration): name='CharArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.ArrayField(models.CharField(max_length=10), size=None)), ('field', ArrayField(models.CharField(max_length=10), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -27,11 +28,12 @@ class Migration(migrations.Migration): name='DateTimeArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('datetimes', django.contrib.postgres.fields.ArrayField(models.DateTimeField(), size=None)), ('dates', django.contrib.postgres.fields.ArrayField(models.DateField(), size=None)), ('times', django.contrib.postgres.fields.ArrayField(models.TimeField(), size=None)), ('datetimes', ArrayField(models.DateTimeField(), size=None)), ('dates', ArrayField(models.DateField(), size=None)), ('times', ArrayField(models.TimeField(), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -39,9 +41,10 @@ class Migration(migrations.Migration): name='HStoreModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.hstore.HStoreField(blank=True, null=True)), ('field', HStoreField(blank=True, null=True)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -49,11 +52,12 @@ class Migration(migrations.Migration): name='OtherTypesArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('ips', django.contrib.postgres.fields.ArrayField(models.GenericIPAddressField(), size=None)), ('uuids', django.contrib.postgres.fields.ArrayField(models.UUIDField(), size=None)), ('decimals', django.contrib.postgres.fields.ArrayField(models.DecimalField(max_digits=5, decimal_places=2), size=None)), ('ips', ArrayField(models.GenericIPAddressField(), size=None)), ('uuids', ArrayField(models.UUIDField(), size=None)), ('decimals', ArrayField(models.DecimalField(max_digits=5, decimal_places=2), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -61,9 +65,10 @@ class Migration(migrations.Migration): name='IntegerArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None)), ('field', ArrayField(models.IntegerField(), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -71,9 +76,10 @@ class Migration(migrations.Migration): name='NestedIntegerArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.ArrayField(django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None), size=None)), ('field', ArrayField(ArrayField(models.IntegerField(), size=None), size=None)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading @@ -81,9 +87,10 @@ class Migration(migrations.Migration): name='NullableIntegerArrayModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('field', django.contrib.postgres.fields.ArrayField(models.IntegerField(), size=None, null=True, blank=True)), ('field', ArrayField(models.IntegerField(), size=None, null=True, blank=True)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), Loading Loading @@ -130,20 +137,25 @@ class Migration(migrations.Migration): name='RangesModel', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('ints', django.contrib.postgres.fields.IntegerRangeField(null=True, blank=True)), ('bigints', django.contrib.postgres.fields.BigIntegerRangeField(null=True, blank=True)), ('floats', django.contrib.postgres.fields.FloatRangeField(null=True, blank=True)), ('timestamps', django.contrib.postgres.fields.DateTimeRangeField(null=True, blank=True)), ('dates', django.contrib.postgres.fields.DateRangeField(null=True, blank=True)), ('ints', IntegerRangeField(null=True, blank=True)), ('bigints', BigIntegerRangeField(null=True, blank=True)), ('floats', FloatRangeField(null=True, blank=True)), ('timestamps', DateTimeRangeField(null=True, blank=True)), ('dates', DateRangeField(null=True, blank=True)), ], options={ 'required_db_vendor': 'postgresql', }, bases=(models.Model,), ), ] def apply(self, project_state, schema_editor, collect_sql=False): try: PG_VERSION = schema_editor.connection.pg_version except AttributeError: pass # We are probably not on PostgreSQL else: if PG_VERSION >= 90200: self.operations = self.operations + self.pg_92_operations return super(Migration, self).apply(project_state, schema_editor, collect_sql)