|
1 | 1 | import uuid |
2 | | -from sqlalchemy import Column, Date, String, Table, ForeignKey, Integer |
| 2 | +from sqlalchemy import Column, Date, String, Table, ForeignKey, Integer, Text, JSON |
3 | 3 | from sqlalchemy.dialects.postgresql import UUID |
4 | 4 | from sqlalchemy.orm import relationship |
5 | 5 |
|
|
20 | 20 | Column("experience_id", Integer, ForeignKey("experiences.id")) |
21 | 21 | ) |
22 | 22 |
|
| 23 | +# Bridge tables for loved one many-to-many relationships |
| 24 | +user_loved_one_treatments = Table( |
| 25 | + "user_loved_one_treatments", |
| 26 | + Base.metadata, |
| 27 | + Column("user_data_id", UUID(as_uuid=True), ForeignKey("user_data.id")), |
| 28 | + Column("treatment_id", Integer, ForeignKey("treatments.id")) |
| 29 | +) |
| 30 | + |
| 31 | +user_loved_one_experiences = Table( |
| 32 | + "user_loved_one_experiences", |
| 33 | + Base.metadata, |
| 34 | + Column("user_data_id", UUID(as_uuid=True), ForeignKey("user_data.id")), |
| 35 | + Column("experience_id", Integer, ForeignKey("experiences.id")) |
| 36 | +) |
| 37 | + |
23 | 38 |
|
24 | 39 | class UserData(Base): |
25 | 40 | __tablename__ = "user_data" |
26 | 41 |
|
27 | 42 | id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
28 | | - # Single-valued fields |
| 43 | + |
| 44 | + # Personal Information |
| 45 | + first_name = Column(String(80), nullable=True) |
| 46 | + last_name = Column(String(80), nullable=True) |
29 | 47 | date_of_birth = Column(Date, nullable=True) |
30 | 48 | email = Column(String(120), nullable=True) |
31 | 49 | phone = Column(String(20), nullable=True) |
| 50 | + city = Column(String(100), nullable=True) |
| 51 | + province = Column(String(50), nullable=True) |
| 52 | + postal_code = Column(String(10), nullable=True) |
| 53 | + |
| 54 | + # Demographics |
| 55 | + gender_identity = Column(String(50), nullable=True) |
| 56 | + pronouns = Column(JSON, nullable=True) # Array of strings |
| 57 | + ethnic_group = Column(JSON, nullable=True) # Array of strings |
| 58 | + marital_status = Column(String(50), nullable=True) |
| 59 | + has_kids = Column(String(10), nullable=True) |
| 60 | + |
| 61 | + # Cancer Experience |
| 62 | + diagnosis = Column(String(100), nullable=True) |
| 63 | + date_of_diagnosis = Column(Date, nullable=True) |
| 64 | + |
| 65 | + # "Other" text fields for custom entries |
| 66 | + other_treatment = Column(Text, nullable=True) |
| 67 | + other_experience = Column(Text, nullable=True) |
| 68 | + other_ethnic_group = Column(Text, nullable=True) |
| 69 | + gender_identity_custom = Column(Text, nullable=True) |
| 70 | + |
| 71 | + # Flow control fields |
| 72 | + has_blood_cancer = Column(String(10), nullable=True) |
| 73 | + caring_for_someone = Column(String(10), nullable=True) |
| 74 | + |
| 75 | + # Loved One Demographics |
| 76 | + loved_one_gender_identity = Column(String(50), nullable=True) |
| 77 | + loved_one_age = Column(String(10), nullable=True) |
| 78 | + |
| 79 | + # Loved One Cancer Experience |
| 80 | + loved_one_diagnosis = Column(String(100), nullable=True) |
| 81 | + loved_one_date_of_diagnosis = Column(Date, nullable=True) |
| 82 | + loved_one_other_treatment = Column(Text, nullable=True) |
| 83 | + loved_one_other_experience = Column(Text, nullable=True) |
32 | 84 |
|
33 | 85 | # Many-to-many relationships |
34 | 86 | treatments = relationship("Treatment", secondary=user_treatments, back_populates="users") |
35 | | - experiences = relationship("Experience", secondary=user_experiences, back_populates="users") |
| 87 | + experiences = relationship("Experience", secondary=user_experiences, back_populates="users") |
| 88 | + |
| 89 | + # Loved one many-to-many relationships |
| 90 | + loved_one_treatments = relationship("Treatment", secondary=user_loved_one_treatments) |
| 91 | + loved_one_experiences = relationship("Experience", secondary=user_loved_one_experiences) |
0 commit comments