mirror of https://github.com/stijndcl/didier
80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import Column, Integer, Text, ForeignKey, Boolean, DateTime
|
|
from sqlalchemy.orm import declarative_base, relationship
|
|
|
|
Base = declarative_base()
|
|
|
|
|
|
class CustomCommand(Base):
|
|
"""Custom commands to fill the hole Dyno couldn't"""
|
|
|
|
__tablename__ = "custom_commands"
|
|
|
|
command_id: int = Column(Integer, primary_key=True)
|
|
name: str = Column(Text, nullable=False, unique=True)
|
|
indexed_name: str = Column(Text, nullable=False, index=True)
|
|
response: str = Column(Text, nullable=False)
|
|
|
|
aliases: list[CustomCommandAlias] = relationship(
|
|
"CustomCommandAlias", back_populates="command", uselist=True, cascade="all, delete-orphan", lazy="selectin"
|
|
)
|
|
|
|
|
|
class CustomCommandAlias(Base):
|
|
"""Aliases for custom commands"""
|
|
|
|
__tablename__ = "custom_command_aliases"
|
|
|
|
alias_id: int = Column(Integer, primary_key=True)
|
|
alias: str = Column(Text, nullable=False, unique=True)
|
|
indexed_alias: str = Column(Text, nullable=False, index=True)
|
|
command_id: int = Column(Integer, ForeignKey("custom_commands.command_id"))
|
|
|
|
command: CustomCommand = relationship("CustomCommand", back_populates="aliases", uselist=False, lazy="selectin")
|
|
|
|
|
|
class UforaCourse(Base):
|
|
"""A course on Ufora"""
|
|
|
|
__tablename__ = "ufora_courses"
|
|
|
|
course_id: int = Column(Integer, primary_key=True)
|
|
name: str = Column(Text, nullable=False, unique=True)
|
|
code: str = Column(Text, nullable=False, unique=True)
|
|
year: int = Column(Integer, nullable=False)
|
|
log_announcements: bool = Column(Boolean, default=False, nullable=False)
|
|
|
|
announcements: list[UforaAnnouncement] = relationship(
|
|
"UforaAnnouncement", back_populates="course", cascade="all, delete-orphan", lazy="selectin"
|
|
)
|
|
aliases: list[UforaCourseAlias] = relationship(
|
|
"UforaCourseAlias", back_populates="course", cascade="all, delete-orphan", lazy="selectin"
|
|
)
|
|
|
|
|
|
class UforaCourseAlias(Base):
|
|
"""An alias for a course on Ufora that we use to refer to them"""
|
|
|
|
__tablename__ = "ufora_course_aliases"
|
|
|
|
alias_id: int = Column(Integer, primary_key=True)
|
|
alias: str = Column(Text, nullable=False, unique=True)
|
|
course_id: int = Column(Integer, ForeignKey("ufora_courses.course_id"))
|
|
|
|
course: UforaCourse = relationship("UforaCourse", back_populates="aliases", uselist=False, lazy="selectin")
|
|
|
|
|
|
class UforaAnnouncement(Base):
|
|
"""An announcement sent on Ufora"""
|
|
|
|
__tablename__ = "ufora_announcements"
|
|
|
|
announcement_id = Column(Integer, primary_key=True)
|
|
course_id = Column(Integer, ForeignKey("ufora_courses.course_id"))
|
|
publication_date: datetime = Column(DateTime(timezone=True))
|
|
|
|
course: UforaCourse = relationship("UforaCourse", back_populates="announcements", uselist=False, lazy="selectin")
|