calendar

A HTML/PHP project for a self-hosted (family)-calendar.
Log | Files | Refs | README

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