# Generated by Django 5.2.9 on 2025-12-13 07:00 from django.db import migrations def fix_task_shares_table(apps, schema_editor): """ Fix the task_shares table to reference the correct 'tags' table instead of the old 'task_groups' table. """ db_alias = schema_editor.connection.alias # Check database type is_postgres = schema_editor.connection.vendor == 'postgresql' is_mysql = schema_editor.connection.vendor == 'mysql' # Drop and recreate the task_shares table with correct foreign keys schema_editor.execute( "DROP TABLE IF EXISTS task_shares CASCADE;" if is_postgres else "DROP TABLE IF EXISTS task_shares;" ) if is_postgres: # PostgreSQL syntax schema_editor.execute( """ CREATE TABLE task_shares ( id UUID NOT NULL PRIMARY KEY, permission VARCHAR(20) NOT NULL, sync_id UUID NOT NULL UNIQUE, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, owner_id UUID NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED, shared_with_id UUID NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED, task_id UUID NULL REFERENCES tasks(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, tag_id UUID NULL REFERENCES tags(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, CONSTRAINT share_task_or_tag_not_both CHECK ( (tag_id IS NULL AND task_id IS NOT NULL) OR (tag_id IS NOT NULL AND task_id IS NULL) ) ); """ ) elif is_mysql: # MySQL/MariaDB syntax schema_editor.execute( """ CREATE TABLE task_shares ( id CHAR(32) NOT NULL PRIMARY KEY, permission VARCHAR(20) NOT NULL, sync_id CHAR(32) NOT NULL UNIQUE, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, owner_id CHAR(32) NOT NULL, shared_with_id CHAR(32) NOT NULL, task_id CHAR(32) NULL, tag_id CHAR(32) NULL, CONSTRAINT share_task_or_tag_not_both CHECK ( (tag_id IS NULL AND task_id IS NOT NULL) OR (tag_id IS NOT NULL AND task_id IS NULL) ), FOREIGN KEY (owner_id) REFERENCES users(id), FOREIGN KEY (shared_with_id) REFERENCES users(id), FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE ); """ ) else: # SQLite syntax (default) schema_editor.execute( """ CREATE TABLE task_shares ( id CHAR(32) NOT NULL PRIMARY KEY, permission VARCHAR(20) NOT NULL, sync_id CHAR(32) NOT NULL UNIQUE, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, owner_id CHAR(32) NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED, shared_with_id CHAR(32) NOT NULL REFERENCES users(id) DEFERRABLE INITIALLY DEFERRED, task_id CHAR(32) NULL REFERENCES tasks(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, tag_id CHAR(32) NULL REFERENCES tags(id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, CONSTRAINT share_task_or_tag_not_both CHECK ( (tag_id IS NULL AND task_id IS NOT NULL) OR (tag_id IS NOT NULL AND task_id IS NULL) ) ); """ ) # Create indexes for foreign keys schema_editor.execute( "CREATE INDEX task_shares_owner_id_idx ON task_shares(owner_id);" ) schema_editor.execute( "CREATE INDEX task_shares_shared_with_id_idx ON task_shares(shared_with_id);" ) schema_editor.execute( "CREATE INDEX task_shares_task_id_idx ON task_shares(task_id);" ) schema_editor.execute( "CREATE INDEX task_shares_tag_id_idx ON task_shares(tag_id);" ) class Migration(migrations.Migration): dependencies = [ ('tasks', '0005_fix_tasks_tags_table'), ] operations = [ migrations.RunPython(fix_task_shares_table, migrations.RunPython.noop), ]