def add_db_default_forward_func()

in emails/migrations/0051_add_email_size_per_day_and_num_email_forwarded_per_day_fields.py [0:0]


def add_db_default_forward_func(apps, schema_editor):
    """
    Add field forwarded_email_size_per_day and num_email_forwarded_per_day to abusemetrics

    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 "emails_abusemetrics"'
            ' ALTER COLUMN "forwarded_email_size_per_day" SET DEFAULT 0,'
            ' ALTER COLUMN "num_email_forwarded_per_day" SET DEFAULT 0'
        )
    elif schema_editor.connection.vendor.startswith("sqlite"):
        schema_editor.execute(
            'CREATE TABLE "new__emails_abusemetrics" ('
            ' "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,'
            ' "first_recorded" datetime NOT NULL,'
            ' "last_recorded" datetime NOT NULL,'
            ' "num_address_created_per_day" smallint unsigned NOT NULL CHECK ("num_address_created_per_day" >= 0),'
            ' "num_replies_per_day" smallint unsigned NOT NULL CHECK ("num_replies_per_day" >= 0),'
            ' "user_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED,'
            ' "forwarded_email_size_per_day" bigint unsigned NOT NULL DEFAULT 0 CHECK ("forwarded_email_size_per_day" >= 0),'
            ' "num_email_forwarded_per_day" smallint unsigned NOT NULL DEFAULT 0 CHECK ("num_email_forwarded_per_day" >= 0));'
        )
        schema_editor.execute(
            'INSERT INTO "new__emails_abusemetrics" ('
            ' "id",'
            ' "first_recorded",'
            ' "last_recorded",'
            ' "num_address_created_per_day",'
            ' "num_replies_per_day",'
            ' "user_id",'
            ' "forwarded_email_size_per_day",'
            ' "num_email_forwarded_per_day") SELECT "id",'
            ' "first_recorded",'
            ' "last_recorded",'
            ' "num_address_created_per_day",'
            ' "num_replies_per_day",'
            ' "user_id",'
            " 0,"
            ' 0 FROM "emails_abusemetrics";'
        )
        schema_editor.execute('DROP TABLE "emails_abusemetrics";')
        schema_editor.execute(
            'ALTER TABLE "new__emails_abusemetrics" RENAME TO "emails_abusemetrics";'
        )
        schema_editor.execute(
            'CREATE UNIQUE INDEX "emails_abusemetrics_user_id_first_recorded_e22d0d1c_uniq" ON "emails_abusemetrics" ("user_id", "first_recorded");'
        )
        schema_editor.execute(
            'CREATE INDEX "emails_abusemetrics_first_recorded_640bb4fd" ON "emails_abusemetrics" ("first_recorded");'
        )
        schema_editor.execute(
            'CREATE INDEX "emails_abusemetrics_last_recorded_d592fe63" ON "emails_abusemetrics" ("last_recorded");'
        )
        schema_editor.execute(
            'CREATE INDEX "emails_abusemetrics_user_id_cf2800c3" ON "emails_abusemetrics" ("user_id");'
        )
    else:
        raise Exception(f'Unknown database vendor "{schema_editor.connection.vendor}"')