models.py (2694B)
1 from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, UniqueConstraint, DateTime 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 Calendar(Base): 14 __tablename__ = "calendars" 15 16 id = Column(Integer, primary_key=True) 17 name = Column(String, nullable=False) 18 color = Column(String, nullable=False, default="#88C0D0") 19 owner_username = Column(String, nullable=False) 20 is_personal = Column(Boolean, default=False, nullable=False) 21 22 memberships = relationship( 23 "CalendarMembership", back_populates="calendar", cascade="all, delete-orphan" 24 ) 25 pending_invitations = relationship( 26 "PendingInvitation", back_populates="calendar", cascade="all, delete-orphan" 27 ) 28 29 30 class CalendarMembership(Base): 31 __tablename__ = "calendar_memberships" 32 33 id = Column(Integer, primary_key=True) 34 calendar_id = Column(Integer, ForeignKey("calendars.id"), nullable=False) 35 username = Column(String, nullable=False) 36 is_visible = Column(Boolean, default=True, nullable=False) 37 38 __table_args__ = (UniqueConstraint("calendar_id", "username"),) 39 40 calendar = relationship("Calendar", back_populates="memberships") 41 42 43 class PendingInvitation(Base): 44 __tablename__ = "pending_invitations" 45 46 id = Column(Integer, primary_key=True) 47 calendar_id = Column(Integer, ForeignKey("calendars.id"), nullable=False) 48 invitee_email = Column(String, nullable=False) 49 50 __table_args__ = (UniqueConstraint("calendar_id", "invitee_email"),) 51 52 calendar = relationship("Calendar", back_populates="pending_invitations") 53 54 55 class Event(Base): 56 __tablename__ = "events" 57 58 id = Column(Integer, primary_key=True) 59 calendar_id = Column(Integer, ForeignKey("calendars.id"), nullable=False) 60 title = Column(String, nullable=False) 61 start_dt = Column(DateTime, nullable=False) 62 end_dt = Column(DateTime, nullable=False) 63 description = Column(String, nullable=True) 64 all_day = Column(Boolean, nullable=False, default=False) 65 66 calendar = relationship("Calendar") 67 attendees = relationship( 68 "EventAttendee", back_populates="event", cascade="all, delete-orphan" 69 ) 70 71 72 class EventAttendee(Base): 73 __tablename__ = "event_attendees" 74 75 id = Column(Integer, primary_key=True) 76 event_id = Column(Integer, ForeignKey("events.id"), nullable=False) 77 username = Column(String, nullable=False) 78 79 __table_args__ = (UniqueConstraint("event_id", "username"),) 80 81 event = relationship("Event", back_populates="attendees")