Plain is headed towards 1.0! Subscribe for development updates →

 1import sys
 2
 3from psycopg import errors
 4
 5from plain.exceptions import ImproperlyConfigured
 6from plain.models.backends.base.creation import BaseDatabaseCreation
 7
 8
 9class DatabaseCreation(BaseDatabaseCreation):
10    def _quote_name(self, name):
11        return self.connection.ops.quote_name(name)
12
13    def _get_database_create_suffix(self, encoding=None, template=None):
14        suffix = ""
15        if encoding:
16            suffix += f" ENCODING '{encoding}'"
17        if template:
18            suffix += f" TEMPLATE {self._quote_name(template)}"
19        return suffix and "WITH" + suffix
20
21    def sql_table_creation_suffix(self):
22        test_settings = self.connection.settings_dict["TEST"]
23        if test_settings.get("COLLATION") is not None:
24            raise ImproperlyConfigured(
25                "PostgreSQL does not support collation setting at database "
26                "creation time."
27            )
28        return self._get_database_create_suffix(
29            encoding=test_settings["CHARSET"],
30            template=test_settings.get("TEMPLATE"),
31        )
32
33    def _execute_create_test_db(self, cursor, parameters):
34        try:
35            super()._execute_create_test_db(cursor, parameters)
36        except Exception as e:
37            cause = e.__cause__
38            if cause and not isinstance(cause, errors.DuplicateDatabase):
39                # All errors except "database already exists" cancel tests.
40                self.log(f"Got an error creating the test database: {e}")
41                sys.exit(2)
42            else:
43                raise