familytree

A self-hosted family tree builder.
Log | Files | Refs | README

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])