models.py (4025B)
1 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, CheckConstraint 2 from sqlalchemy.orm import relationship 3 from .database import Base 4 5 6 class UserProfile(Base): 7 __tablename__ = "user_profiles" 8 9 username = Column(String, primary_key=True) 10 display_name = Column(String, nullable=False, default="") 11 12 13 class Tree(Base): 14 __tablename__ = "trees" 15 16 id = Column(Integer, primary_key=True) 17 name = Column(String, nullable=False) 18 owner_username = Column(String, nullable=False) 19 20 memberships = relationship("TreeMembership", back_populates="tree", cascade="all, delete-orphan") 21 pending_invitations = relationship("PendingInvitation", back_populates="tree", cascade="all, delete-orphan") 22 people = relationship("Person", back_populates="tree", cascade="all, delete-orphan") 23 partnerships = relationship("Partnership", back_populates="tree", cascade="all, delete-orphan") 24 25 26 class TreeMembership(Base): 27 __tablename__ = "tree_memberships" 28 29 id = Column(Integer, primary_key=True) 30 tree_id = Column(Integer, ForeignKey("trees.id"), nullable=False) 31 username = Column(String, nullable=False) 32 role = Column(String, nullable=False, default="viewer") # owner | editor | viewer 33 34 __table_args__ = (UniqueConstraint("tree_id", "username"),) 35 36 tree = relationship("Tree", back_populates="memberships") 37 38 39 class PendingInvitation(Base): 40 __tablename__ = "pending_invitations" 41 42 id = Column(Integer, primary_key=True) 43 tree_id = Column(Integer, ForeignKey("trees.id"), nullable=False) 44 invitee_email = Column(String, nullable=False) 45 role = Column(String, nullable=False, default="viewer") 46 47 __table_args__ = (UniqueConstraint("tree_id", "invitee_email"),) 48 49 tree = relationship("Tree", back_populates="pending_invitations") 50 51 52 class Person(Base): 53 __tablename__ = "people" 54 55 id = Column(Integer, primary_key=True) 56 tree_id = Column(Integer, ForeignKey("trees.id"), nullable=False) 57 first_name = Column(String, nullable=False) 58 last_name = Column(String, nullable=True) 59 birth_date = Column(String, nullable=True) 60 death_date = Column(String, nullable=True) 61 birth_place = Column(String, nullable=True) 62 burial_place = Column(String, nullable=True) 63 bio = Column(String, nullable=True) 64 65 tree = relationship("Tree", back_populates="people") 66 parent_links = relationship("ParentLink", foreign_keys="ParentLink.child_id", back_populates="child", cascade="all, delete-orphan") 67 68 69 class Partnership(Base): 70 __tablename__ = "partnerships" 71 72 id = Column(Integer, primary_key=True) 73 tree_id = Column(Integer, ForeignKey("trees.id"), nullable=False) 74 person1_id = Column(Integer, ForeignKey("people.id"), nullable=False) 75 person2_id = Column(Integer, ForeignKey("people.id"), nullable=False) 76 union_date = Column(String, nullable=True) 77 union_end_date = Column(String, nullable=True) 78 union_type = Column(String, nullable=False, default="partnered") # married | partnered | separated 79 80 __table_args__ = (UniqueConstraint("person1_id", "person2_id"),) 81 82 tree = relationship("Tree", back_populates="partnerships") 83 person1 = relationship("Person", foreign_keys=[person1_id]) 84 person2 = relationship("Person", foreign_keys=[person2_id]) 85 parent_links = relationship("ParentLink", foreign_keys="ParentLink.partnership_id", back_populates="partnership", cascade="all, delete-orphan") 86 87 88 class ParentLink(Base): 89 __tablename__ = "parent_links" 90 91 id = Column(Integer, primary_key=True) 92 child_id = Column(Integer, ForeignKey("people.id"), nullable=False) 93 partnership_id = Column(Integer, ForeignKey("partnerships.id"), nullable=True) 94 parent_id = Column(Integer, ForeignKey("people.id"), nullable=True) 95 96 child = relationship("Person", foreign_keys=[child_id], back_populates="parent_links") 97 partnership = relationship("Partnership", foreign_keys=[partnership_id], back_populates="parent_links") 98 parent = relationship("Person", foreign_keys=[parent_id])