From 5a7095495b371f6d2207102f48c280c9f936993a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 14:46:56 +0000 Subject: [PATCH 1/2] Initial plan From 77df9628c33ccff8756735a819911aeb7d32977b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Mar 2026 14:56:09 +0000 Subject: [PATCH 2/2] fix(migrations): guard migration 036 against missing user_profiles table Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com> --- .../036_add_document_translation_fields.py | 50 ++++++++++++++----- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/migrations/versions/036_add_document_translation_fields.py b/migrations/versions/036_add_document_translation_fields.py index f73eeb43..bb0f3686 100644 --- a/migrations/versions/036_add_document_translation_fields.py +++ b/migrations/versions/036_add_document_translation_fields.py @@ -24,21 +24,47 @@ depends_on: Union[str, None] = None def upgrade() -> None: """Add translation columns to files and user_profiles.""" - with op.batch_alter_table("files") as batch_op: - batch_op.add_column(sa.Column("detected_language", sa.String(10), nullable=True)) - batch_op.add_column(sa.Column("default_language_text", sa.Text(), nullable=True)) - batch_op.add_column(sa.Column("default_language_code", sa.String(10), nullable=True)) + conn = op.get_bind() + inspector = sa.inspect(conn) - with op.batch_alter_table("user_profiles") as batch_op: - batch_op.add_column(sa.Column("default_document_language", sa.String(10), nullable=True)) + if "files" in inspector.get_table_names(): + existing_file_cols = {col["name"] for col in inspector.get_columns("files")} + cols_to_add = {"detected_language", "default_language_text", "default_language_code"} - existing_file_cols + if cols_to_add: + with op.batch_alter_table("files") as batch_op: + if "detected_language" in cols_to_add: + batch_op.add_column(sa.Column("detected_language", sa.String(10), nullable=True)) + if "default_language_text" in cols_to_add: + batch_op.add_column(sa.Column("default_language_text", sa.Text(), nullable=True)) + if "default_language_code" in cols_to_add: + batch_op.add_column(sa.Column("default_language_code", sa.String(10), nullable=True)) + + if "user_profiles" in inspector.get_table_names(): + existing_profile_cols = {col["name"] for col in inspector.get_columns("user_profiles")} + if "default_document_language" not in existing_profile_cols: + with op.batch_alter_table("user_profiles") as batch_op: + batch_op.add_column(sa.Column("default_document_language", sa.String(10), nullable=True)) def downgrade() -> None: """Remove translation columns.""" - with op.batch_alter_table("user_profiles") as batch_op: - batch_op.drop_column("default_document_language") + conn = op.get_bind() + inspector = sa.inspect(conn) - with op.batch_alter_table("files") as batch_op: - batch_op.drop_column("default_language_code") - batch_op.drop_column("default_language_text") - batch_op.drop_column("detected_language") + if "user_profiles" in inspector.get_table_names(): + existing_profile_cols = {col["name"] for col in inspector.get_columns("user_profiles")} + if "default_document_language" in existing_profile_cols: + with op.batch_alter_table("user_profiles") as batch_op: + batch_op.drop_column("default_document_language") + + if "files" in inspector.get_table_names(): + existing_file_cols = {col["name"] for col in inspector.get_columns("files")} + cols_to_drop = {"detected_language", "default_language_text", "default_language_code"} & existing_file_cols + if cols_to_drop: + with op.batch_alter_table("files") as batch_op: + if "default_language_code" in cols_to_drop: + batch_op.drop_column("default_language_code") + if "default_language_text" in cols_to_drop: + batch_op.drop_column("default_language_text") + if "detected_language" in cols_to_drop: + batch_op.drop_column("detected_language")