diff --git a/backend/app/models/Experience.py b/backend/app/models/Experience.py index 5e89d9a7..9cd64507 100644 --- a/backend/app/models/Experience.py +++ b/backend/app/models/Experience.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Enum, Integer, String +from sqlalchemy import Column, Enum, Integer, Text from sqlalchemy.orm import relationship from .Base import Base @@ -7,7 +7,7 @@ class Experience(Base): __tablename__ = "experiences" id = Column(Integer, primary_key=True) - name = Column(String, unique=True, nullable=False) # 'PTSD', 'Relapse', etc. + name = Column(Text, unique=True, nullable=False) # 'PTSD', 'Relapse', etc. scope = Column(Enum("patient", "caregiver", "both", "none", name="scope"), nullable=False) # Back reference for many-to-many relationship diff --git a/backend/app/models/Form.py b/backend/app/models/Form.py index 81410dad..66e881b9 100644 --- a/backend/app/models/Form.py +++ b/backend/app/models/Form.py @@ -1,6 +1,6 @@ import uuid -from sqlalchemy import Column, Enum, Integer, String +from sqlalchemy import Column, Enum, Integer, Text from sqlalchemy.dialects.postgresql import UUID from .Base import Base @@ -10,7 +10,7 @@ class Form(Base): __tablename__ = "forms" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - name = Column(String, nullable=False) # 'Intake - Participant Caregiver' + name = Column(Text, nullable=False) # 'Intake - Participant Caregiver' version = Column(Integer, default=1, nullable=False) type = Column( Enum("intake", "ranking", "secondary", "become_volunteer", "become_participant", name="form_type"), diff --git a/backend/app/models/MatchStatus.py b/backend/app/models/MatchStatus.py index 54b69eec..93d76faa 100644 --- a/backend/app/models/MatchStatus.py +++ b/backend/app/models/MatchStatus.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, String +from sqlalchemy import Column, Integer, Text from .Base import Base @@ -6,4 +6,4 @@ class MatchStatus(Base): __tablename__ = "match_status" id = Column(Integer, primary_key=True) - name = Column(String(80), nullable=False) + name = Column(Text, nullable=False) diff --git a/backend/app/models/Quality.py b/backend/app/models/Quality.py index 1f063bbf..dcad9fa1 100644 --- a/backend/app/models/Quality.py +++ b/backend/app/models/Quality.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, String +from sqlalchemy import Column, Integer, Text from .Base import Base @@ -6,5 +6,5 @@ class Quality(Base): __tablename__ = "qualities" id = Column(Integer, primary_key=True) - slug = Column(String, unique=True, nullable=False) # 'same_age', 'same_diagnosis', etc. - label = Column(String, nullable=False) # human-readable description + slug = Column(Text, unique=True, nullable=False) # 'same_age', 'same_diagnosis', etc. + label = Column(Text, nullable=False) # human-readable description diff --git a/backend/app/models/Role.py b/backend/app/models/Role.py index 6d950d69..489d8a13 100644 --- a/backend/app/models/Role.py +++ b/backend/app/models/Role.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, String +from sqlalchemy import Column, Integer, Text from .Base import Base @@ -6,4 +6,4 @@ class Role(Base): __tablename__ = "roles" id = Column(Integer, primary_key=True) - name = Column(String(80), nullable=False) + name = Column(Text, nullable=False) diff --git a/backend/app/models/Treatment.py b/backend/app/models/Treatment.py index 0cb00774..53946cec 100644 --- a/backend/app/models/Treatment.py +++ b/backend/app/models/Treatment.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, String +from sqlalchemy import Column, Integer, Text from sqlalchemy.orm import relationship from .Base import Base @@ -7,7 +7,7 @@ class Treatment(Base): __tablename__ = "treatments" id = Column(Integer, primary_key=True) - name = Column(String, unique=True, nullable=False) # 'Chemotherapy', 'Immunotherapy', etc. + name = Column(Text, unique=True, nullable=False) # 'Chemotherapy', 'Immunotherapy', etc. # Back reference for many-to-many relationship users = relationship("UserData", secondary="user_treatments", back_populates="treatments") diff --git a/backend/app/models/User.py b/backend/app/models/User.py index 373f5f1c..e605edd7 100644 --- a/backend/app/models/User.py +++ b/backend/app/models/User.py @@ -1,7 +1,7 @@ import uuid from enum import Enum as PyEnum -from sqlalchemy import Boolean, Column, ForeignKey, Integer, String +from sqlalchemy import Boolean, Column, ForeignKey, Integer, Text from sqlalchemy import Enum as SQLEnum from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship @@ -23,11 +23,11 @@ class FormStatus(str, PyEnum): class User(Base): __tablename__ = "users" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - first_name = Column(String(80), nullable=True) - last_name = Column(String(80), nullable=True) - email = Column(String(120), unique=True, nullable=False) + first_name = Column(Text, nullable=True) + last_name = Column(Text, nullable=True) + email = Column(Text, unique=True, nullable=False) role_id = Column(Integer, ForeignKey("roles.id"), nullable=False) - auth_id = Column(String, nullable=False) + auth_id = Column(Text, nullable=False) approved = Column(Boolean, default=False) active = Column(Boolean, nullable=False, default=True) form_status = Column( diff --git a/backend/app/models/UserData.py b/backend/app/models/UserData.py index 93c45f64..ee8d17f4 100644 --- a/backend/app/models/UserData.py +++ b/backend/app/models/UserData.py @@ -1,6 +1,6 @@ import uuid -from sqlalchemy import JSON, Column, Date, ForeignKey, Integer, String, Table, Text +from sqlalchemy import JSON, Column, Date, ForeignKey, Integer, Table, Text from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship @@ -44,24 +44,24 @@ class UserData(Base): user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) # Personal Information - first_name = Column(String(80), nullable=True) - last_name = Column(String(80), nullable=True) + first_name = Column(Text, nullable=True) + last_name = Column(Text, nullable=True) date_of_birth = Column(Date, nullable=True) - email = Column(String(120), nullable=True) - phone = Column(String(20), nullable=True) - city = Column(String(100), nullable=True) - province = Column(String(50), nullable=True) - postal_code = Column(String(10), nullable=True) + email = Column(Text, nullable=True) + phone = Column(Text, nullable=True) + city = Column(Text, nullable=True) + province = Column(Text, nullable=True) + postal_code = Column(Text, nullable=True) # Demographics - gender_identity = Column(String(50), nullable=True) + gender_identity = Column(Text, nullable=True) pronouns = Column(JSON, nullable=True) # Array of strings ethnic_group = Column(JSON, nullable=True) # Array of strings - marital_status = Column(String(50), nullable=True) - has_kids = Column(String(10), nullable=True) + marital_status = Column(Text, nullable=True) + has_kids = Column(Text, nullable=True) # Cancer Experience - diagnosis = Column(String(100), nullable=True) + diagnosis = Column(Text, nullable=True) date_of_diagnosis = Column(Date, nullable=True) # "Other" text fields for custom entries @@ -69,15 +69,15 @@ class UserData(Base): gender_identity_custom = Column(Text, nullable=True) # Flow control fields - has_blood_cancer = Column(String(10), nullable=True) - caring_for_someone = Column(String(10), nullable=True) + has_blood_cancer = Column(Text, nullable=True) + caring_for_someone = Column(Text, nullable=True) # Loved One Demographics - loved_one_gender_identity = Column(String(50), nullable=True) - loved_one_age = Column(String(10), nullable=True) + loved_one_gender_identity = Column(Text, nullable=True) + loved_one_age = Column(Text, nullable=True) # Loved One Cancer Experience - loved_one_diagnosis = Column(String(100), nullable=True) + loved_one_diagnosis = Column(Text, nullable=True) loved_one_date_of_diagnosis = Column(Date, nullable=True) # Many-to-many relationships diff --git a/backend/migrations/versions/ba215810568b_convert_all_string_columns_to_text.py b/backend/migrations/versions/ba215810568b_convert_all_string_columns_to_text.py new file mode 100644 index 00000000..6c776ab3 --- /dev/null +++ b/backend/migrations/versions/ba215810568b_convert_all_string_columns_to_text.py @@ -0,0 +1,154 @@ +"""convert_all_string_columns_to_text + +Revision ID: ba215810568b +Revises: 0fb019b7af03 +Create Date: 2025-10-03 21:21:07.692875 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "ba215810568b" +down_revision: Union[str, None] = "0fb019b7af03" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column("experiences", "name", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False) + op.alter_column("forms", "name", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False) + op.alter_column( + "match_status", "name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=False + ) + op.alter_column("qualities", "slug", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False) + op.alter_column("qualities", "label", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False) + op.alter_column("roles", "name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=False) + op.alter_column("treatments", "name", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False) + op.alter_column( + "user_data", "first_name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", "last_name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=True + ) + op.alter_column("user_data", "email", existing_type=sa.VARCHAR(length=120), type_=sa.Text(), existing_nullable=True) + op.alter_column("user_data", "phone", existing_type=sa.VARCHAR(length=20), type_=sa.Text(), existing_nullable=True) + op.alter_column("user_data", "city", existing_type=sa.VARCHAR(length=100), type_=sa.Text(), existing_nullable=True) + op.alter_column( + "user_data", "province", existing_type=sa.VARCHAR(length=50), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", "postal_code", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", "gender_identity", existing_type=sa.VARCHAR(length=50), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", "marital_status", existing_type=sa.VARCHAR(length=50), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", "has_kids", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", "diagnosis", existing_type=sa.VARCHAR(length=100), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", "has_blood_cancer", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", "caring_for_someone", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", + "loved_one_gender_identity", + existing_type=sa.VARCHAR(length=50), + type_=sa.Text(), + existing_nullable=True, + ) + op.alter_column( + "user_data", "loved_one_age", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True + ) + op.alter_column( + "user_data", + "loved_one_diagnosis", + existing_type=sa.VARCHAR(length=100), + type_=sa.Text(), + existing_nullable=True, + ) + op.alter_column("users", "first_name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=True) + op.alter_column("users", "last_name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=True) + op.alter_column("users", "email", existing_type=sa.VARCHAR(length=120), type_=sa.Text(), existing_nullable=False) + op.alter_column("users", "auth_id", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column("users", "auth_id", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False) + op.alter_column("users", "email", existing_type=sa.Text(), type_=sa.VARCHAR(length=120), existing_nullable=False) + op.alter_column("users", "last_name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=True) + op.alter_column("users", "first_name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=True) + op.alter_column( + "user_data", + "loved_one_diagnosis", + existing_type=sa.Text(), + type_=sa.VARCHAR(length=100), + existing_nullable=True, + ) + op.alter_column( + "user_data", "loved_one_age", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True + ) + op.alter_column( + "user_data", + "loved_one_gender_identity", + existing_type=sa.Text(), + type_=sa.VARCHAR(length=50), + existing_nullable=True, + ) + op.alter_column( + "user_data", "caring_for_someone", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True + ) + op.alter_column( + "user_data", "has_blood_cancer", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True + ) + op.alter_column( + "user_data", "diagnosis", existing_type=sa.Text(), type_=sa.VARCHAR(length=100), existing_nullable=True + ) + op.alter_column( + "user_data", "has_kids", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True + ) + op.alter_column( + "user_data", "marital_status", existing_type=sa.Text(), type_=sa.VARCHAR(length=50), existing_nullable=True + ) + op.alter_column( + "user_data", "gender_identity", existing_type=sa.Text(), type_=sa.VARCHAR(length=50), existing_nullable=True + ) + op.alter_column( + "user_data", "postal_code", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True + ) + op.alter_column( + "user_data", "province", existing_type=sa.Text(), type_=sa.VARCHAR(length=50), existing_nullable=True + ) + op.alter_column("user_data", "city", existing_type=sa.Text(), type_=sa.VARCHAR(length=100), existing_nullable=True) + op.alter_column("user_data", "phone", existing_type=sa.Text(), type_=sa.VARCHAR(length=20), existing_nullable=True) + op.alter_column("user_data", "email", existing_type=sa.Text(), type_=sa.VARCHAR(length=120), existing_nullable=True) + op.alter_column( + "user_data", "last_name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=True + ) + op.alter_column( + "user_data", "first_name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=True + ) + op.alter_column("treatments", "name", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False) + op.alter_column("roles", "name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=False) + op.alter_column("qualities", "label", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False) + op.alter_column("qualities", "slug", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False) + op.alter_column( + "match_status", "name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=False + ) + op.alter_column("forms", "name", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False) + op.alter_column("experiences", "name", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False) + # ### end Alembic commands ###