Skip to content

Commit 0a3673a

Browse files
authored
String to text migration (#62)
## Notion ticket link <!-- Please replace with your ticket's URL --> [Bug on Intake Submission](https://www.notion.so/Bug-on-Intake-Submission-27b10f3fb1dc80e0aa99d55f96f41fe6?pvs=5) <!-- Give a quick summary of the implementation details, provide design justifications if necessary --> ## Implementation description * Changed all string fields to text to bypass too many characters database validation (validation should be done on frontend or backend level) <!-- What should the reviewer do to verify your changes? Describe expected results and include screenshots when appropriate --> ## Steps to test 1. Run the migrations 2. Verify the type of the columns are TEXT instead of STRING <!-- Draw attention to the substantial parts of your PR or anything you'd like a second opinion on --> ## What should reviewers focus on? * N/A ## Checklist - [x] My PR name is descriptive and in imperative tense - [x] My commit messages are descriptive and in imperative tense. My commits are atomic and trivial commits are squashed or fixup'd into non-trivial commits - [x] I have run the appropriate linter(s) - [x] I have requested a review from the PL, as well as other devs who have background knowledge on this PR or who will be building on top of this PR
1 parent 27d6155 commit 0a3673a

File tree

9 files changed

+189
-35
lines changed

9 files changed

+189
-35
lines changed

backend/app/models/Experience.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy import Column, Enum, Integer, String
1+
from sqlalchemy import Column, Enum, Integer, Text
22
from sqlalchemy.orm import relationship
33

44
from .Base import Base
@@ -7,7 +7,7 @@
77
class Experience(Base):
88
__tablename__ = "experiences"
99
id = Column(Integer, primary_key=True)
10-
name = Column(String, unique=True, nullable=False) # 'PTSD', 'Relapse', etc.
10+
name = Column(Text, unique=True, nullable=False) # 'PTSD', 'Relapse', etc.
1111
scope = Column(Enum("patient", "caregiver", "both", "none", name="scope"), nullable=False)
1212

1313
# Back reference for many-to-many relationship

backend/app/models/Form.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import uuid
22

3-
from sqlalchemy import Column, Enum, Integer, String
3+
from sqlalchemy import Column, Enum, Integer, Text
44
from sqlalchemy.dialects.postgresql import UUID
55

66
from .Base import Base
@@ -10,7 +10,7 @@ class Form(Base):
1010
__tablename__ = "forms"
1111

1212
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
13-
name = Column(String, nullable=False) # 'Intake - Participant Caregiver'
13+
name = Column(Text, nullable=False) # 'Intake - Participant Caregiver'
1414
version = Column(Integer, default=1, nullable=False)
1515
type = Column(
1616
Enum("intake", "ranking", "secondary", "become_volunteer", "become_participant", name="form_type"),

backend/app/models/MatchStatus.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from sqlalchemy import Column, Integer, String
1+
from sqlalchemy import Column, Integer, Text
22

33
from .Base import Base
44

55

66
class MatchStatus(Base):
77
__tablename__ = "match_status"
88
id = Column(Integer, primary_key=True)
9-
name = Column(String(80), nullable=False)
9+
name = Column(Text, nullable=False)

backend/app/models/Quality.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from sqlalchemy import Column, Integer, String
1+
from sqlalchemy import Column, Integer, Text
22

33
from .Base import Base
44

55

66
class Quality(Base):
77
__tablename__ = "qualities"
88
id = Column(Integer, primary_key=True)
9-
slug = Column(String, unique=True, nullable=False) # 'same_age', 'same_diagnosis', etc.
10-
label = Column(String, nullable=False) # human-readable description
9+
slug = Column(Text, unique=True, nullable=False) # 'same_age', 'same_diagnosis', etc.
10+
label = Column(Text, nullable=False) # human-readable description

backend/app/models/Role.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from sqlalchemy import Column, Integer, String
1+
from sqlalchemy import Column, Integer, Text
22

33
from .Base import Base
44

55

66
class Role(Base):
77
__tablename__ = "roles"
88
id = Column(Integer, primary_key=True)
9-
name = Column(String(80), nullable=False)
9+
name = Column(Text, nullable=False)

backend/app/models/Treatment.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy import Column, Integer, String
1+
from sqlalchemy import Column, Integer, Text
22
from sqlalchemy.orm import relationship
33

44
from .Base import Base
@@ -7,7 +7,7 @@
77
class Treatment(Base):
88
__tablename__ = "treatments"
99
id = Column(Integer, primary_key=True)
10-
name = Column(String, unique=True, nullable=False) # 'Chemotherapy', 'Immunotherapy', etc.
10+
name = Column(Text, unique=True, nullable=False) # 'Chemotherapy', 'Immunotherapy', etc.
1111

1212
# Back reference for many-to-many relationship
1313
users = relationship("UserData", secondary="user_treatments", back_populates="treatments")

backend/app/models/User.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import uuid
22
from enum import Enum as PyEnum
33

4-
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
4+
from sqlalchemy import Boolean, Column, ForeignKey, Integer, Text
55
from sqlalchemy import Enum as SQLEnum
66
from sqlalchemy.dialects.postgresql import UUID
77
from sqlalchemy.orm import relationship
@@ -23,11 +23,11 @@ class FormStatus(str, PyEnum):
2323
class User(Base):
2424
__tablename__ = "users"
2525
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
26-
first_name = Column(String(80), nullable=True)
27-
last_name = Column(String(80), nullable=True)
28-
email = Column(String(120), unique=True, nullable=False)
26+
first_name = Column(Text, nullable=True)
27+
last_name = Column(Text, nullable=True)
28+
email = Column(Text, unique=True, nullable=False)
2929
role_id = Column(Integer, ForeignKey("roles.id"), nullable=False)
30-
auth_id = Column(String, nullable=False)
30+
auth_id = Column(Text, nullable=False)
3131
approved = Column(Boolean, default=False)
3232
active = Column(Boolean, nullable=False, default=True)
3333
form_status = Column(

backend/app/models/UserData.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import uuid
22

3-
from sqlalchemy import JSON, Column, Date, ForeignKey, Integer, String, Table, Text
3+
from sqlalchemy import JSON, Column, Date, ForeignKey, Integer, Table, Text
44
from sqlalchemy.dialects.postgresql import UUID
55
from sqlalchemy.orm import relationship
66

@@ -44,40 +44,40 @@ class UserData(Base):
4444
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
4545

4646
# Personal Information
47-
first_name = Column(String(80), nullable=True)
48-
last_name = Column(String(80), nullable=True)
47+
first_name = Column(Text, nullable=True)
48+
last_name = Column(Text, nullable=True)
4949
date_of_birth = Column(Date, nullable=True)
50-
email = Column(String(120), nullable=True)
51-
phone = Column(String(20), nullable=True)
52-
city = Column(String(100), nullable=True)
53-
province = Column(String(50), nullable=True)
54-
postal_code = Column(String(10), nullable=True)
50+
email = Column(Text, nullable=True)
51+
phone = Column(Text, nullable=True)
52+
city = Column(Text, nullable=True)
53+
province = Column(Text, nullable=True)
54+
postal_code = Column(Text, nullable=True)
5555

5656
# Demographics
57-
gender_identity = Column(String(50), nullable=True)
57+
gender_identity = Column(Text, nullable=True)
5858
pronouns = Column(JSON, nullable=True) # Array of strings
5959
ethnic_group = Column(JSON, nullable=True) # Array of strings
60-
marital_status = Column(String(50), nullable=True)
61-
has_kids = Column(String(10), nullable=True)
60+
marital_status = Column(Text, nullable=True)
61+
has_kids = Column(Text, nullable=True)
6262

6363
# Cancer Experience
64-
diagnosis = Column(String(100), nullable=True)
64+
diagnosis = Column(Text, nullable=True)
6565
date_of_diagnosis = Column(Date, nullable=True)
6666

6767
# "Other" text fields for custom entries
6868
other_ethnic_group = Column(Text, nullable=True)
6969
gender_identity_custom = Column(Text, nullable=True)
7070

7171
# Flow control fields
72-
has_blood_cancer = Column(String(10), nullable=True)
73-
caring_for_someone = Column(String(10), nullable=True)
72+
has_blood_cancer = Column(Text, nullable=True)
73+
caring_for_someone = Column(Text, nullable=True)
7474

7575
# Loved One Demographics
76-
loved_one_gender_identity = Column(String(50), nullable=True)
77-
loved_one_age = Column(String(10), nullable=True)
76+
loved_one_gender_identity = Column(Text, nullable=True)
77+
loved_one_age = Column(Text, nullable=True)
7878

7979
# Loved One Cancer Experience
80-
loved_one_diagnosis = Column(String(100), nullable=True)
80+
loved_one_diagnosis = Column(Text, nullable=True)
8181
loved_one_date_of_diagnosis = Column(Date, nullable=True)
8282

8383
# Many-to-many relationships
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
"""convert_all_string_columns_to_text
2+
3+
Revision ID: ba215810568b
4+
Revises: 0fb019b7af03
5+
Create Date: 2025-10-03 21:21:07.692875
6+
7+
"""
8+
9+
from typing import Sequence, Union
10+
11+
import sqlalchemy as sa
12+
from alembic import op
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = "ba215810568b"
16+
down_revision: Union[str, None] = "0fb019b7af03"
17+
branch_labels: Union[str, Sequence[str], None] = None
18+
depends_on: Union[str, Sequence[str], None] = None
19+
20+
21+
def upgrade() -> None:
22+
# ### commands auto generated by Alembic - please adjust! ###
23+
op.alter_column("experiences", "name", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False)
24+
op.alter_column("forms", "name", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False)
25+
op.alter_column(
26+
"match_status", "name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=False
27+
)
28+
op.alter_column("qualities", "slug", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False)
29+
op.alter_column("qualities", "label", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False)
30+
op.alter_column("roles", "name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=False)
31+
op.alter_column("treatments", "name", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False)
32+
op.alter_column(
33+
"user_data", "first_name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=True
34+
)
35+
op.alter_column(
36+
"user_data", "last_name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=True
37+
)
38+
op.alter_column("user_data", "email", existing_type=sa.VARCHAR(length=120), type_=sa.Text(), existing_nullable=True)
39+
op.alter_column("user_data", "phone", existing_type=sa.VARCHAR(length=20), type_=sa.Text(), existing_nullable=True)
40+
op.alter_column("user_data", "city", existing_type=sa.VARCHAR(length=100), type_=sa.Text(), existing_nullable=True)
41+
op.alter_column(
42+
"user_data", "province", existing_type=sa.VARCHAR(length=50), type_=sa.Text(), existing_nullable=True
43+
)
44+
op.alter_column(
45+
"user_data", "postal_code", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True
46+
)
47+
op.alter_column(
48+
"user_data", "gender_identity", existing_type=sa.VARCHAR(length=50), type_=sa.Text(), existing_nullable=True
49+
)
50+
op.alter_column(
51+
"user_data", "marital_status", existing_type=sa.VARCHAR(length=50), type_=sa.Text(), existing_nullable=True
52+
)
53+
op.alter_column(
54+
"user_data", "has_kids", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True
55+
)
56+
op.alter_column(
57+
"user_data", "diagnosis", existing_type=sa.VARCHAR(length=100), type_=sa.Text(), existing_nullable=True
58+
)
59+
op.alter_column(
60+
"user_data", "has_blood_cancer", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True
61+
)
62+
op.alter_column(
63+
"user_data", "caring_for_someone", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True
64+
)
65+
op.alter_column(
66+
"user_data",
67+
"loved_one_gender_identity",
68+
existing_type=sa.VARCHAR(length=50),
69+
type_=sa.Text(),
70+
existing_nullable=True,
71+
)
72+
op.alter_column(
73+
"user_data", "loved_one_age", existing_type=sa.VARCHAR(length=10), type_=sa.Text(), existing_nullable=True
74+
)
75+
op.alter_column(
76+
"user_data",
77+
"loved_one_diagnosis",
78+
existing_type=sa.VARCHAR(length=100),
79+
type_=sa.Text(),
80+
existing_nullable=True,
81+
)
82+
op.alter_column("users", "first_name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=True)
83+
op.alter_column("users", "last_name", existing_type=sa.VARCHAR(length=80), type_=sa.Text(), existing_nullable=True)
84+
op.alter_column("users", "email", existing_type=sa.VARCHAR(length=120), type_=sa.Text(), existing_nullable=False)
85+
op.alter_column("users", "auth_id", existing_type=sa.VARCHAR(), type_=sa.Text(), existing_nullable=False)
86+
# ### end Alembic commands ###
87+
88+
89+
def downgrade() -> None:
90+
# ### commands auto generated by Alembic - please adjust! ###
91+
op.alter_column("users", "auth_id", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False)
92+
op.alter_column("users", "email", existing_type=sa.Text(), type_=sa.VARCHAR(length=120), existing_nullable=False)
93+
op.alter_column("users", "last_name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=True)
94+
op.alter_column("users", "first_name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=True)
95+
op.alter_column(
96+
"user_data",
97+
"loved_one_diagnosis",
98+
existing_type=sa.Text(),
99+
type_=sa.VARCHAR(length=100),
100+
existing_nullable=True,
101+
)
102+
op.alter_column(
103+
"user_data", "loved_one_age", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True
104+
)
105+
op.alter_column(
106+
"user_data",
107+
"loved_one_gender_identity",
108+
existing_type=sa.Text(),
109+
type_=sa.VARCHAR(length=50),
110+
existing_nullable=True,
111+
)
112+
op.alter_column(
113+
"user_data", "caring_for_someone", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True
114+
)
115+
op.alter_column(
116+
"user_data", "has_blood_cancer", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True
117+
)
118+
op.alter_column(
119+
"user_data", "diagnosis", existing_type=sa.Text(), type_=sa.VARCHAR(length=100), existing_nullable=True
120+
)
121+
op.alter_column(
122+
"user_data", "has_kids", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True
123+
)
124+
op.alter_column(
125+
"user_data", "marital_status", existing_type=sa.Text(), type_=sa.VARCHAR(length=50), existing_nullable=True
126+
)
127+
op.alter_column(
128+
"user_data", "gender_identity", existing_type=sa.Text(), type_=sa.VARCHAR(length=50), existing_nullable=True
129+
)
130+
op.alter_column(
131+
"user_data", "postal_code", existing_type=sa.Text(), type_=sa.VARCHAR(length=10), existing_nullable=True
132+
)
133+
op.alter_column(
134+
"user_data", "province", existing_type=sa.Text(), type_=sa.VARCHAR(length=50), existing_nullable=True
135+
)
136+
op.alter_column("user_data", "city", existing_type=sa.Text(), type_=sa.VARCHAR(length=100), existing_nullable=True)
137+
op.alter_column("user_data", "phone", existing_type=sa.Text(), type_=sa.VARCHAR(length=20), existing_nullable=True)
138+
op.alter_column("user_data", "email", existing_type=sa.Text(), type_=sa.VARCHAR(length=120), existing_nullable=True)
139+
op.alter_column(
140+
"user_data", "last_name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=True
141+
)
142+
op.alter_column(
143+
"user_data", "first_name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=True
144+
)
145+
op.alter_column("treatments", "name", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False)
146+
op.alter_column("roles", "name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=False)
147+
op.alter_column("qualities", "label", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False)
148+
op.alter_column("qualities", "slug", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False)
149+
op.alter_column(
150+
"match_status", "name", existing_type=sa.Text(), type_=sa.VARCHAR(length=80), existing_nullable=False
151+
)
152+
op.alter_column("forms", "name", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False)
153+
op.alter_column("experiences", "name", existing_type=sa.Text(), type_=sa.VARCHAR(), existing_nullable=False)
154+
# ### end Alembic commands ###

0 commit comments

Comments
 (0)