phones/migrations/0022_relaynumber_remaining_seconds_20220921_1829.py (85 lines of code) (raw):

# Generated by Django 3.2.15 on 2022-09-21 18:29 # ruff: noqa: E501 from django.db import migrations, models def migrate_existing_data(apps, schema_editor): """ After creating the remaining_seconds column, populate it with the value of remaining_mintes*60. """ if schema_editor.connection.vendor.startswith("postgres"): schema_editor.execute( 'UPDATE "phones_relaynumber" SET remaining_seconds = remaining_minutes*60;' ) elif schema_editor.connection.vendor.startswith("sqlite"): schema_editor.execute( 'UPDATE "phones_relaynumber" SET remaining_seconds = remaining_minutes*60;' ) else: raise Exception(f'Unknown database vendor "{schema_editor.connection.vendor}"') def add_db_default_forward_func(apps, schema_editor): """ Add a database default of 3000 for remaining_seconds, 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_relaynumber"' ' ALTER COLUMN "remaining_seconds" SET DEFAULT 3000;' ) elif schema_editor.connection.vendor.startswith("sqlite"): schema_editor.execute( 'CREATE TABLE "new__phones_relaynumber"' ' ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,' ' "remaining_minutes" integer NOT NULL DEFAULT 50,' ' "remaining_seconds" integer NOT NULL DEFAULT 3000,' ' "remaining_texts" integer NOT NULL DEFAULT 75,' ' "calls_forwarded" integer NOT NULL DEFAULT 0,' ' "calls_blocked" integer NOT NULL DEFAULT 0,' ' "texts_forwarded" integer NOT NULL DEFAULT 0,' ' "texts_blocked" integer NOT NULL DEFAULT 0,' ' "enabled" bool NOT NULL DEFAULT 1,' ' "number" varchar(15) NOT NULL,' ' "location" varchar(255) NOT NULL,' ' "user_id" integer NOT NULL REFERENCES "auth_user" ("id")' " DEFERRABLE INITIALLY DEFERRED," ' "vcard_lookup_key" varchar(6) NOT NULL UNIQUE);' ) schema_editor.execute( 'INSERT INTO "new__phones_relaynumber"' ' ("id", "number", "location", "user_id", "vcard_lookup_key", "enabled",' ' "remaining_texts", "remaining_minutes", "calls_forwarded", "calls_blocked", ' ' "texts_forwarded", "texts_blocked", "remaining_seconds") ' ' SELECT "id", "number", "location", "user_id", "vcard_lookup_key", "enabled", ' ' "remaining_texts", "remaining_minutes", "calls_forwarded", "calls_blocked", ' ' "texts_forwarded", "texts_blocked", 3000 ' ' 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");' ) else: raise Exception(f'Unknown database vendor "{schema_editor.connection.vendor}"') class Migration(migrations.Migration): dependencies = [ ("phones", "0021_add_relaynumber_stats_20220913_1959"), ] operations = [ migrations.AddField( model_name="relaynumber", name="remaining_seconds", field=models.IntegerField(default=3000), ), migrations.RunPython( code=migrate_existing_data, reverse_code=migrations.RunPython.noop, elidable=True, ), migrations.RemoveField( model_name="relaynumber", name="remaining_minutes", ), migrations.RunPython( code=add_db_default_forward_func, reverse_code=migrations.RunPython.noop, elidable=True, ), ]