def add_db_default_forward_func()

in phones/migrations/0024_add_country_code.py [0:0]


def add_db_default_forward_func(apps, schema_editor):
    """
    Add a database default of 'US' for country_code, for PostgreSQL and SQLite3

    Using `./manage.py sqlmigrate` for the SQL, and the technique from:
    https://stackoverflow.com/a/45232678/10612
    """
    if schema_editor.connection.vendor.startswith("postgres"):
        schema_editor.execute(
            'ALTER TABLE "phones_realphone"'
            " ALTER COLUMN \"country_code\" SET DEFAULT 'US';"
        )
        schema_editor.execute(
            'ALTER TABLE "phones_relaynumber"'
            " ALTER COLUMN \"country_code\" SET DEFAULT 'US';"
        )
    elif schema_editor.connection.vendor.startswith("sqlite"):
        # Add default 'US' to phone_realnumber.country_code
        schema_editor.execute(
            'CREATE TABLE "new__phones_realphone"'
            ' ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,'
            " \"country_code\" varchar(2) NOT NULL DEFAULT 'US',"
            ' "number" varchar(15) NOT NULL,'
            ' "verification_code" varchar(8) NOT NULL,'
            ' "verified" bool NOT NULL,'
            ' "verified_date" datetime NULL,'
            ' "user_id" integer NOT NULL REFERENCES "auth_user" ("id")'
            "  DEFERRABLE INITIALLY DEFERRED,"
            ' "verification_sent_date" datetime NULL);'
        )
        schema_editor.execute(
            'INSERT INTO "new__phones_realphone"'
            ' ("id", "number", "verification_code", "verified", "verified_date",'
            ' "user_id", "verification_sent_date", "country_code")'
            ' SELECT "id", "number", "verification_code", "verified", "verified_date",'
            ' "user_id", "verification_sent_date", \'US\' FROM "phones_realphone";'
        )
        schema_editor.execute('DROP TABLE "phones_realphone";')
        schema_editor.execute(
            'ALTER TABLE "new__phones_realphone" RENAME TO "phones_realphone";'
        )
        schema_editor.execute(
            'CREATE UNIQUE INDEX "unique_verified_number" ON "phones_realphone"'
            ' ("number", "verified") WHERE "verified";'
        )
        schema_editor.execute(
            'CREATE INDEX "phones_realphone_user_id_194ddf70" ON "phones_realphone"'
            ' ("user_id");'
        )

        # Add default 'US' to phone_relaynumber.country_code
        schema_editor.execute(
            'CREATE TABLE "new__phones_relaynumber"'
            ' ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,'
            ' "number" varchar(15) NOT NULL,'
            ' "location" varchar(255) NOT NULL,'
            ' "user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED,'  # noqa: E501
            ' "vcard_lookup_key" varchar(6) NOT NULL UNIQUE,'
            ' "enabled" bool NOT NULL,'
            ' "calls_blocked" integer NOT NULL,'
            ' "calls_forwarded" integer NOT NULL,'
            ' "remaining_texts" integer NOT NULL,'
            ' "texts_blocked" integer NOT NULL,'
            ' "texts_forwarded" integer NOT NULL,'
            ' "remaining_seconds" integer NOT NULL DEFAULT 3000,'
            ' "remaining_minutes" integer NULL,'
            " \"country_code\" varchar(2) NOT NULL DEFAULT 'US');"
        )
        schema_editor.execute(
            'INSERT INTO "new__phones_relaynumber"'
            ' ("id", "number", "location", "user_id", "vcard_lookup_key", "enabled",'
            ' "calls_blocked", "calls_forwarded", "remaining_texts", "texts_blocked",'
            ' "texts_forwarded", "remaining_seconds", "remaining_minutes",'
            ' "country_code")'
            ' SELECT "id", "number", "location", "user_id", "vcard_lookup_key",'
            ' "enabled", "calls_blocked", "calls_forwarded", "remaining_texts",'
            ' "texts_blocked", "texts_forwarded", "remaining_seconds",'
            ' "remaining_minutes", \'US\' FROM "phones_relaynumber";'
        )
        schema_editor.execute('DROP TABLE "phones_relaynumber";')
        schema_editor.execute(
            'ALTER TABLE "new__phones_relaynumber" RENAME TO "phones_relaynumber";'
        )
        schema_editor.execute(
            'CREATE INDEX "phones_relaynumber_number_742e5d6b" ON "phones_relaynumber"'
            ' ("number");'
        )
        schema_editor.execute(
            'CREATE INDEX "phones_relaynumber_user_id_62c65ede" ON "phones_relaynumber"'
            ' ("user_id");'
        )