mirror of https://github.com/stijndcl/didier
Update all dependencies, move to pydantic 2.x and sqlalchemy 2.x
parent
ee6013da5d
commit
c2a2fee50f
|
@ -3,12 +3,12 @@ default_language_version:
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/ambv/black
|
- repo: https://github.com/ambv/black
|
||||||
rev: 22.3.0
|
rev: 23.3.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v4.3.0
|
rev: v4.4.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: check-json
|
- id: check-json
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
|
@ -21,7 +21,7 @@ repos:
|
||||||
- id: isort
|
- id: isort
|
||||||
|
|
||||||
- repo: https://github.com/PyCQA/autoflake
|
- repo: https://github.com/PyCQA/autoflake
|
||||||
rev: v1.4
|
rev: v2.2.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: autoflake
|
- id: autoflake
|
||||||
name: autoflake (python)
|
name: autoflake (python)
|
||||||
|
@ -31,7 +31,7 @@ repos:
|
||||||
- "--ignore-init-module-imports"
|
- "--ignore-init-module-imports"
|
||||||
|
|
||||||
- repo: https://github.com/PyCQA/flake8
|
- repo: https://github.com/PyCQA/flake8
|
||||||
rev: 4.0.1
|
rev: 6.0.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: flake8
|
- id: flake8
|
||||||
exclude: ^(alembic|.github)
|
exclude: ^(alembic|.github)
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
from urllib.parse import quote_plus
|
from urllib.parse import quote_plus
|
||||||
|
|
||||||
from sqlalchemy.engine import URL
|
from sqlalchemy.engine import URL
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
|
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
|
||||||
from sqlalchemy.orm import sessionmaker
|
|
||||||
|
|
||||||
import settings
|
import settings
|
||||||
|
|
||||||
|
@ -22,6 +21,4 @@ postgres_engine = create_async_engine(
|
||||||
future=True,
|
future=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
DBSession = sessionmaker(
|
DBSession = async_sessionmaker(autocommit=False, autoflush=False, bind=postgres_engine, expire_on_commit=False)
|
||||||
autocommit=False, autoflush=False, bind=postgres_engine, class_=AsyncSession, expire_on_commit=False
|
|
||||||
)
|
|
||||||
|
|
|
@ -1,27 +1,14 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from datetime import date, datetime
|
from datetime import date, datetime
|
||||||
from typing import Optional
|
from typing import List, Optional
|
||||||
|
|
||||||
from sqlalchemy import (
|
from sqlalchemy import BigInteger, ForeignKey, UniqueConstraint
|
||||||
BigInteger,
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
|
||||||
Boolean,
|
from sqlalchemy.types import DateTime
|
||||||
Column,
|
|
||||||
Date,
|
|
||||||
DateTime,
|
|
||||||
Enum,
|
|
||||||
ForeignKey,
|
|
||||||
Integer,
|
|
||||||
Text,
|
|
||||||
UniqueConstraint,
|
|
||||||
)
|
|
||||||
from sqlalchemy.orm import declarative_base, relationship
|
|
||||||
|
|
||||||
from database import enums
|
from database import enums
|
||||||
|
|
||||||
Base = declarative_base()
|
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"Base",
|
"Base",
|
||||||
"Bank",
|
"Bank",
|
||||||
|
@ -48,27 +35,34 @@ __all__ = [
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class Base(DeclarativeBase):
|
||||||
|
"""Required base class for all tables"""
|
||||||
|
|
||||||
|
# Make all DateTimes timezone-aware
|
||||||
|
type_annotation_map = {datetime: DateTime(timezone=True)}
|
||||||
|
|
||||||
|
|
||||||
class Bank(Base):
|
class Bank(Base):
|
||||||
"""A user's currency information"""
|
"""A user's currency information"""
|
||||||
|
|
||||||
__tablename__ = "bank"
|
__tablename__ = "bank"
|
||||||
|
|
||||||
bank_id: int = Column(Integer, primary_key=True)
|
bank_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
user_id: int = Column(BigInteger, ForeignKey("users.user_id"))
|
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.user_id"))
|
||||||
|
|
||||||
dinks: int = Column(BigInteger, server_default="0", nullable=False)
|
dinks: Mapped[int] = mapped_column(BigInteger, server_default="0", nullable=False)
|
||||||
invested: int = Column(BigInteger, server_default="0", nullable=False)
|
invested: Mapped[int] = mapped_column(BigInteger, server_default="0", nullable=False)
|
||||||
|
|
||||||
# Interest rate
|
# Interest rate
|
||||||
interest_level: int = Column(Integer, server_default="1", nullable=False)
|
interest_level: Mapped[int] = mapped_column(server_default="1", nullable=False)
|
||||||
|
|
||||||
# Maximum amount that can be stored in the bank
|
# Maximum amount that can be stored in the bank
|
||||||
capacity_level: int = Column(Integer, server_default="1", nullable=False)
|
capacity_level: Mapped[int] = mapped_column(server_default="1", nullable=False)
|
||||||
|
|
||||||
# Maximum amount that can be robbed
|
# Maximum amount that can be robbed
|
||||||
rob_level: int = Column(Integer, server_default="1", nullable=False)
|
rob_level: Mapped[int] = mapped_column(server_default="1", nullable=False)
|
||||||
|
|
||||||
user: User = relationship("User", uselist=False, back_populates="bank", lazy="selectin")
|
user: Mapped[User] = relationship(uselist=False, back_populates="bank", lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class Birthday(Base):
|
class Birthday(Base):
|
||||||
|
@ -76,11 +70,11 @@ class Birthday(Base):
|
||||||
|
|
||||||
__tablename__ = "birthdays"
|
__tablename__ = "birthdays"
|
||||||
|
|
||||||
birthday_id: int = Column(Integer, primary_key=True)
|
birthday_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
user_id: int = Column(BigInteger, ForeignKey("users.user_id"))
|
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.user_id"))
|
||||||
birthday: date = Column(Date, nullable=False)
|
birthday: Mapped[date] = mapped_column(nullable=False)
|
||||||
|
|
||||||
user: User = relationship("User", uselist=False, back_populates="birthday", lazy="selectin")
|
user: Mapped[User] = relationship(uselist=False, back_populates="birthday", lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class Bookmark(Base):
|
class Bookmark(Base):
|
||||||
|
@ -89,26 +83,26 @@ class Bookmark(Base):
|
||||||
__tablename__ = "bookmarks"
|
__tablename__ = "bookmarks"
|
||||||
__table_args__ = (UniqueConstraint("user_id", "label"),)
|
__table_args__ = (UniqueConstraint("user_id", "label"),)
|
||||||
|
|
||||||
bookmark_id: int = Column(Integer, primary_key=True)
|
bookmark_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
label: str = Column(Text, nullable=False)
|
label: Mapped[str] = mapped_column(nullable=False)
|
||||||
jump_url: str = Column(Text, nullable=False)
|
jump_url: Mapped[str] = mapped_column(nullable=False)
|
||||||
user_id: int = Column(BigInteger, ForeignKey("users.user_id"))
|
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.user_id"))
|
||||||
|
|
||||||
user: User = relationship("User", back_populates="bookmarks", uselist=False, lazy="selectin")
|
user: Mapped[User] = relationship(back_populates="bookmarks", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class CommandStats(Base):
|
class CommandStats(Base):
|
||||||
"""Metrics on how often commands are used"""
|
"""Metrics on how often commands are used"""
|
||||||
|
|
||||||
__tablename__ = "command_stats"
|
__tablename__ = "command_stats"
|
||||||
command_stats_id: int = Column(Integer, primary_key=True)
|
command_stats_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
command: str = Column(Text, nullable=False)
|
command: Mapped[str] = mapped_column(nullable=False)
|
||||||
timestamp: datetime = Column(DateTime(timezone=True), nullable=False)
|
timestamp: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
user_id: int = Column(BigInteger, ForeignKey("users.user_id"))
|
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.user_id"))
|
||||||
slash: bool = Column(Boolean, nullable=False)
|
slash: Mapped[bool] = mapped_column(nullable=False)
|
||||||
context_menu: bool = Column(Boolean, nullable=False)
|
context_menu: Mapped[bool] = mapped_column(nullable=False)
|
||||||
|
|
||||||
user: User = relationship("User", back_populates="command_stats", uselist=False, lazy="selectin")
|
user: Mapped[User] = relationship(back_populates="command_stats", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class CustomCommand(Base):
|
class CustomCommand(Base):
|
||||||
|
@ -116,13 +110,13 @@ class CustomCommand(Base):
|
||||||
|
|
||||||
__tablename__ = "custom_commands"
|
__tablename__ = "custom_commands"
|
||||||
|
|
||||||
command_id: int = Column(Integer, primary_key=True)
|
command_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
name: str = Column(Text, nullable=False, unique=True)
|
name: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||||
indexed_name: str = Column(Text, nullable=False, index=True)
|
indexed_name: Mapped[str] = mapped_column(nullable=False, index=True)
|
||||||
response: str = Column(Text, nullable=False)
|
response: Mapped[str] = mapped_column(nullable=False)
|
||||||
|
|
||||||
aliases: list[CustomCommandAlias] = relationship(
|
aliases: Mapped[List[CustomCommandAlias]] = relationship(
|
||||||
"CustomCommandAlias", back_populates="command", uselist=True, cascade="all, delete-orphan", lazy="selectin"
|
back_populates="command", uselist=True, cascade="all, delete-orphan", lazy="selectin"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,12 +125,12 @@ class CustomCommandAlias(Base):
|
||||||
|
|
||||||
__tablename__ = "custom_command_aliases"
|
__tablename__ = "custom_command_aliases"
|
||||||
|
|
||||||
alias_id: int = Column(Integer, primary_key=True)
|
alias_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
alias: str = Column(Text, nullable=False, unique=True)
|
alias: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||||
indexed_alias: str = Column(Text, nullable=False, index=True)
|
indexed_alias: Mapped[str] = mapped_column(nullable=False, index=True)
|
||||||
command_id: int = Column(Integer, ForeignKey("custom_commands.command_id"))
|
command_id: Mapped[int] = mapped_column(ForeignKey("custom_commands.command_id"))
|
||||||
|
|
||||||
command: CustomCommand = relationship("CustomCommand", back_populates="aliases", uselist=False, lazy="selectin")
|
command: Mapped[CustomCommand] = relationship(back_populates="aliases", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class DadJoke(Base):
|
class DadJoke(Base):
|
||||||
|
@ -144,8 +138,8 @@ class DadJoke(Base):
|
||||||
|
|
||||||
__tablename__ = "dad_jokes"
|
__tablename__ = "dad_jokes"
|
||||||
|
|
||||||
dad_joke_id: int = Column(Integer, primary_key=True)
|
dad_joke_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
joke: str = Column(Text, nullable=False)
|
joke: Mapped[str] = mapped_column(nullable=False)
|
||||||
|
|
||||||
|
|
||||||
class Deadline(Base):
|
class Deadline(Base):
|
||||||
|
@ -153,12 +147,12 @@ class Deadline(Base):
|
||||||
|
|
||||||
__tablename__ = "deadlines"
|
__tablename__ = "deadlines"
|
||||||
|
|
||||||
deadline_id: int = Column(Integer, primary_key=True)
|
deadline_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
course_id: int = Column(Integer, ForeignKey("ufora_courses.course_id"))
|
course_id: Mapped[int] = mapped_column(ForeignKey("ufora_courses.course_id"))
|
||||||
name: str = Column(Text, nullable=False)
|
name: Mapped[str] = mapped_column(nullable=False)
|
||||||
deadline: datetime = Column(DateTime(timezone=True), nullable=False)
|
deadline: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
|
|
||||||
course: UforaCourse = relationship("UforaCourse", back_populates="deadlines", uselist=False, lazy="selectin")
|
course: Mapped[UforaCourse] = relationship(back_populates="deadlines", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class EasterEgg(Base):
|
class EasterEgg(Base):
|
||||||
|
@ -166,11 +160,11 @@ class EasterEgg(Base):
|
||||||
|
|
||||||
__tablename__ = "easter_eggs"
|
__tablename__ = "easter_eggs"
|
||||||
|
|
||||||
easter_egg_id: int = Column(Integer, primary_key=True)
|
easter_egg_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
match: str = Column(Text, nullable=False)
|
match: Mapped[str] = mapped_column(nullable=False)
|
||||||
response: str = Column(Text, nullable=False)
|
response: Mapped[str] = mapped_column(nullable=False)
|
||||||
exact: bool = Column(Boolean, nullable=False, server_default="1")
|
exact: Mapped[bool] = mapped_column(nullable=False, server_default="1")
|
||||||
startswith: bool = Column(Boolean, nullable=False, server_default="1")
|
startswith: Mapped[bool] = mapped_column(nullable=False, server_default="1")
|
||||||
|
|
||||||
|
|
||||||
class Event(Base):
|
class Event(Base):
|
||||||
|
@ -178,11 +172,11 @@ class Event(Base):
|
||||||
|
|
||||||
__tablename__ = "events"
|
__tablename__ = "events"
|
||||||
|
|
||||||
event_id: int = Column(Integer, primary_key=True)
|
event_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
name: str = Column(Text, nullable=False)
|
name: Mapped[str] = mapped_column(nullable=False)
|
||||||
description: Optional[str] = Column(Text, nullable=True)
|
description: Mapped[Optional[str]] = mapped_column(nullable=True)
|
||||||
notification_channel: int = Column(BigInteger, nullable=False)
|
notification_channel: Mapped[int] = mapped_column(BigInteger, nullable=False)
|
||||||
timestamp: datetime = Column(DateTime(timezone=True), nullable=False)
|
timestamp: Mapped[datetime] = mapped_column(nullable=False)
|
||||||
|
|
||||||
|
|
||||||
class FreeGame(Base):
|
class FreeGame(Base):
|
||||||
|
@ -190,7 +184,7 @@ class FreeGame(Base):
|
||||||
|
|
||||||
__tablename__ = "free_games"
|
__tablename__ = "free_games"
|
||||||
|
|
||||||
free_game_id: int = Column(Integer, primary_key=True)
|
free_game_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
|
||||||
|
|
||||||
class GitHubLink(Base):
|
class GitHubLink(Base):
|
||||||
|
@ -198,11 +192,11 @@ class GitHubLink(Base):
|
||||||
|
|
||||||
__tablename__ = "github_links"
|
__tablename__ = "github_links"
|
||||||
|
|
||||||
github_link_id: int = Column(Integer, primary_key=True)
|
github_link_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
url: str = Column(Text, nullable=False, unique=True)
|
url: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||||
user_id: int = Column(BigInteger, ForeignKey("users.user_id"))
|
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.user_id"))
|
||||||
|
|
||||||
user: User = relationship("User", back_populates="github_links", uselist=False, lazy="selectin")
|
user: Mapped[User] = relationship(back_populates="github_links", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class Link(Base):
|
class Link(Base):
|
||||||
|
@ -210,9 +204,9 @@ class Link(Base):
|
||||||
|
|
||||||
__tablename__ = "links"
|
__tablename__ = "links"
|
||||||
|
|
||||||
link_id: int = Column(Integer, primary_key=True)
|
link_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
name: str = Column(Text, nullable=False, unique=True)
|
name: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||||
url: str = Column(Text, nullable=False)
|
url: Mapped[str] = mapped_column(nullable=False)
|
||||||
|
|
||||||
|
|
||||||
class MemeTemplate(Base):
|
class MemeTemplate(Base):
|
||||||
|
@ -220,10 +214,10 @@ class MemeTemplate(Base):
|
||||||
|
|
||||||
__tablename__ = "meme"
|
__tablename__ = "meme"
|
||||||
|
|
||||||
meme_id: int = Column(Integer, primary_key=True)
|
meme_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
name: str = Column(Text, nullable=False, unique=True)
|
name: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||||
template_id: int = Column(Integer, nullable=False, unique=True)
|
template_id: Mapped[int] = mapped_column(nullable=False, unique=True)
|
||||||
field_count: int = Column(Integer, nullable=False)
|
field_count: Mapped[int] = mapped_column(nullable=False)
|
||||||
|
|
||||||
|
|
||||||
class NightlyData(Base):
|
class NightlyData(Base):
|
||||||
|
@ -231,12 +225,12 @@ class NightlyData(Base):
|
||||||
|
|
||||||
__tablename__ = "nightly_data"
|
__tablename__ = "nightly_data"
|
||||||
|
|
||||||
nightly_id: int = Column(Integer, primary_key=True)
|
nightly_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
user_id: int = Column(BigInteger, ForeignKey("users.user_id"))
|
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.user_id"))
|
||||||
last_nightly: Optional[date] = Column(Date, nullable=True)
|
last_nightly: Mapped[Optional[date]] = mapped_column(nullable=True)
|
||||||
count: int = Column(Integer, server_default="0", nullable=False)
|
count: Mapped[int] = mapped_column(server_default="0", nullable=False)
|
||||||
|
|
||||||
user: User = relationship("User", back_populates="nightly_data", uselist=False, lazy="selectin")
|
user: Mapped[User] = relationship(back_populates="nightly_data", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class Reminder(Base):
|
class Reminder(Base):
|
||||||
|
@ -244,11 +238,11 @@ class Reminder(Base):
|
||||||
|
|
||||||
__tablename__ = "reminders"
|
__tablename__ = "reminders"
|
||||||
|
|
||||||
reminder_id: int = Column(Integer, primary_key=True)
|
reminder_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
user_id: int = Column(BigInteger, ForeignKey("users.user_id"))
|
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("users.user_id"))
|
||||||
category: enums.ReminderCategory = Column(Enum(enums.ReminderCategory), nullable=False)
|
category: Mapped[enums.ReminderCategory] = mapped_column(nullable=False)
|
||||||
|
|
||||||
user: User = relationship("User", back_populates="reminders", uselist=False, lazy="selectin")
|
user: Mapped[User] = relationship(back_populates="reminders", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class Task(Base):
|
class Task(Base):
|
||||||
|
@ -256,9 +250,9 @@ class Task(Base):
|
||||||
|
|
||||||
__tablename__ = "tasks"
|
__tablename__ = "tasks"
|
||||||
|
|
||||||
task_id: int = Column(Integer, primary_key=True)
|
task_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
task: enums.TaskType = Column(Enum(enums.TaskType), nullable=False, unique=True)
|
task: Mapped[enums.TaskType] = mapped_column(nullable=False, unique=True)
|
||||||
previous_run: datetime = Column(DateTime(timezone=True), nullable=True)
|
previous_run: Mapped[datetime] = mapped_column(nullable=True)
|
||||||
|
|
||||||
|
|
||||||
class UforaCourse(Base):
|
class UforaCourse(Base):
|
||||||
|
@ -266,25 +260,25 @@ class UforaCourse(Base):
|
||||||
|
|
||||||
__tablename__ = "ufora_courses"
|
__tablename__ = "ufora_courses"
|
||||||
|
|
||||||
course_id: int = Column(Integer, primary_key=True)
|
course_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
name: str = Column(Text, nullable=False, unique=True)
|
name: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||||
code: str = Column(Text, nullable=False, unique=True)
|
code: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||||
year: int = Column(Integer, nullable=False)
|
year: Mapped[int] = mapped_column(nullable=False)
|
||||||
compulsory: bool = Column(Boolean, server_default="1", nullable=False)
|
compulsory: Mapped[bool] = mapped_column(server_default="1", nullable=False)
|
||||||
role_id: Optional[int] = Column(BigInteger, nullable=True, unique=False)
|
role_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, unique=False)
|
||||||
overarching_role_id: Optional[int] = Column(BigInteger, nullable=True, unique=False)
|
overarching_role_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, unique=False)
|
||||||
# This is not the greatest fix, but there can only ever be two, so it will do the job
|
# This is not the greatest fix, but there can only ever be two, so it will do the job
|
||||||
alternative_overarching_role_id: Optional[int] = Column(BigInteger, nullable=True, unique=False)
|
alternative_overarching_role_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, unique=False)
|
||||||
log_announcements: bool = Column(Boolean, server_default="0", nullable=False)
|
log_announcements: Mapped[bool] = mapped_column(server_default="0", nullable=False)
|
||||||
|
|
||||||
announcements: list[UforaAnnouncement] = relationship(
|
announcements: Mapped[List[UforaAnnouncement]] = relationship(
|
||||||
"UforaAnnouncement", back_populates="course", cascade="all, delete-orphan", lazy="selectin"
|
back_populates="course", cascade="all, delete-orphan", lazy="selectin"
|
||||||
)
|
)
|
||||||
aliases: list[UforaCourseAlias] = relationship(
|
aliases: Mapped[List[UforaCourseAlias]] = relationship(
|
||||||
"UforaCourseAlias", back_populates="course", cascade="all, delete-orphan", lazy="selectin"
|
back_populates="course", cascade="all, delete-orphan", lazy="selectin"
|
||||||
)
|
)
|
||||||
deadlines: list[Deadline] = relationship(
|
deadlines: Mapped[List[Deadline]] = relationship(
|
||||||
"Deadline", back_populates="course", cascade="all, delete-orphan", lazy="selectin"
|
back_populates="course", cascade="all, delete-orphan", lazy="selectin"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -293,11 +287,11 @@ class UforaCourseAlias(Base):
|
||||||
|
|
||||||
__tablename__ = "ufora_course_aliases"
|
__tablename__ = "ufora_course_aliases"
|
||||||
|
|
||||||
alias_id: int = Column(Integer, primary_key=True)
|
alias_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
alias: str = Column(Text, nullable=False, unique=True)
|
alias: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||||
course_id: int = Column(Integer, ForeignKey("ufora_courses.course_id"))
|
course_id: Mapped[int] = mapped_column(ForeignKey("ufora_courses.course_id"))
|
||||||
|
|
||||||
course: UforaCourse = relationship("UforaCourse", back_populates="aliases", uselist=False, lazy="selectin")
|
course: Mapped[UforaCourse] = relationship(back_populates="aliases", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class UforaAnnouncement(Base):
|
class UforaAnnouncement(Base):
|
||||||
|
@ -305,11 +299,11 @@ class UforaAnnouncement(Base):
|
||||||
|
|
||||||
__tablename__ = "ufora_announcements"
|
__tablename__ = "ufora_announcements"
|
||||||
|
|
||||||
announcement_id: int = Column(Integer, primary_key=True)
|
announcement_id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
course_id: int = Column(Integer, ForeignKey("ufora_courses.course_id"))
|
course_id: Mapped[int] = mapped_column(ForeignKey("ufora_courses.course_id"))
|
||||||
publication_date: date = Column(Date)
|
publication_date: Mapped[date] = mapped_column()
|
||||||
|
|
||||||
course: UforaCourse = relationship("UforaCourse", back_populates="announcements", uselist=False, lazy="selectin")
|
course: Mapped[UforaCourse] = relationship(back_populates="announcements", uselist=False, lazy="selectin")
|
||||||
|
|
||||||
|
|
||||||
class User(Base):
|
class User(Base):
|
||||||
|
@ -317,26 +311,26 @@ class User(Base):
|
||||||
|
|
||||||
__tablename__ = "users"
|
__tablename__ = "users"
|
||||||
|
|
||||||
user_id: int = Column(BigInteger, primary_key=True)
|
user_id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
|
||||||
|
|
||||||
bank: Bank = relationship(
|
bank: Mapped[Bank] = relationship(
|
||||||
"Bank", back_populates="user", uselist=False, lazy="selectin", cascade="all, delete-orphan"
|
back_populates="user", uselist=False, lazy="selectin", cascade="all, delete-orphan"
|
||||||
)
|
)
|
||||||
birthday: Optional[Birthday] = relationship(
|
birthday: Mapped[Optional[Birthday]] = relationship(
|
||||||
"Birthday", back_populates="user", uselist=False, lazy="selectin", cascade="all, delete-orphan"
|
back_populates="user", uselist=False, lazy="selectin", cascade="all, delete-orphan"
|
||||||
)
|
)
|
||||||
bookmarks: list[Bookmark] = relationship(
|
bookmarks: Mapped[List[Bookmark]] = relationship(
|
||||||
"Bookmark", back_populates="user", uselist=True, lazy="selectin", cascade="all, delete-orphan"
|
back_populates="user", uselist=True, lazy="selectin", cascade="all, delete-orphan"
|
||||||
)
|
)
|
||||||
command_stats: list[CommandStats] = relationship(
|
command_stats: Mapped[List[CommandStats]] = relationship(
|
||||||
"CommandStats", back_populates="user", uselist=True, lazy="selectin", cascade="all, delete-orphan"
|
back_populates="user", uselist=True, lazy="selectin", cascade="all, delete-orphan"
|
||||||
)
|
)
|
||||||
github_links: list[GitHubLink] = relationship(
|
github_links: Mapped[List[GitHubLink]] = relationship(
|
||||||
"GitHubLink", back_populates="user", uselist=True, lazy="selectin", cascade="all, delete-orphan"
|
back_populates="user", uselist=True, lazy="selectin", cascade="all, delete-orphan"
|
||||||
)
|
)
|
||||||
nightly_data: NightlyData = relationship(
|
nightly_data: Mapped[NightlyData] = relationship(
|
||||||
"NightlyData", back_populates="user", uselist=False, lazy="selectin", cascade="all, delete-orphan"
|
back_populates="user", uselist=False, lazy="selectin", cascade="all, delete-orphan"
|
||||||
)
|
)
|
||||||
reminders: list[Reminder] = relationship(
|
reminders: Mapped[List[Reminder]] = relationship(
|
||||||
"Reminder", back_populates="user", uselist=True, lazy="selectin", cascade="all, delete-orphan"
|
back_populates="user", uselist=True, lazy="selectin", cascade="all, delete-orphan"
|
||||||
)
|
)
|
||||||
|
|
|
@ -19,7 +19,7 @@ async def get_country_info(http_session: ClientSession, country: str) -> CovidDa
|
||||||
yesterday = response
|
yesterday = response
|
||||||
|
|
||||||
data = {"today": today, "yesterday": yesterday}
|
data = {"today": today, "yesterday": yesterday}
|
||||||
return CovidData.parse_obj(data)
|
return CovidData.model_validate(data)
|
||||||
|
|
||||||
|
|
||||||
async def get_global_info(http_session: ClientSession) -> CovidData:
|
async def get_global_info(http_session: ClientSession) -> CovidData:
|
||||||
|
@ -35,4 +35,4 @@ async def get_global_info(http_session: ClientSession) -> CovidData:
|
||||||
yesterday = response
|
yesterday = response
|
||||||
|
|
||||||
data = {"today": today, "yesterday": yesterday}
|
data = {"today": today, "yesterday": yesterday}
|
||||||
return CovidData.parse_obj(data)
|
return CovidData.model_validate(data)
|
||||||
|
|
|
@ -12,4 +12,4 @@ async def fetch_menu(http_session: ClientSession, day_dt: date) -> Menu:
|
||||||
"""Fetch the menu for a given day"""
|
"""Fetch the menu for a given day"""
|
||||||
endpoint = f"https://hydra.ugent.be/api/2.0/resto/menu/nl/{day_dt.year}/{day_dt.month}/{day_dt.day}.json"
|
endpoint = f"https://hydra.ugent.be/api/2.0/resto/menu/nl/{day_dt.year}/{day_dt.month}/{day_dt.day}.json"
|
||||||
async with ensure_get(http_session, endpoint, log_exceptions=False) as response:
|
async with ensure_get(http_session, endpoint, log_exceptions=False) as response:
|
||||||
return Menu.parse_obj(response)
|
return Menu.model_validate(response)
|
||||||
|
|
|
@ -14,4 +14,4 @@ async def lookup(http_session: ClientSession, query: str) -> list[Definition]:
|
||||||
url = "https://api.urbandictionary.com/v0/define"
|
url = "https://api.urbandictionary.com/v0/define"
|
||||||
|
|
||||||
async with ensure_get(http_session, url, params={"term": query}) as response:
|
async with ensure_get(http_session, url, params={"term": query}) as response:
|
||||||
return list(map(Definition.parse_obj, response["list"]))
|
return list(map(Definition.model_validate, response["list"]))
|
||||||
|
|
|
@ -13,4 +13,4 @@ async def fetch_xkcd_post(http_session: ClientSession, *, num: Optional[int] = N
|
||||||
url = "https://xkcd.com" + (f"/{num}" if num is not None else "") + "/info.0.json"
|
url = "https://xkcd.com" + (f"/{num}" if num is not None else "") + "/info.0.json"
|
||||||
|
|
||||||
async with ensure_get(http_session, url) as response:
|
async with ensure_get(http_session, url) as response:
|
||||||
return XKCDPost.parse_obj(response)
|
return XKCDPost.model_validate(response)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import discord
|
import discord
|
||||||
from overrides import overrides
|
from overrides import overrides
|
||||||
from pydantic import BaseModel, Field, validator
|
from pydantic import BaseModel, Field, field_validator
|
||||||
|
|
||||||
from didier.data.embeds.base import EmbedPydantic
|
from didier.data.embeds.base import EmbedPydantic
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ class _CovidNumbers(BaseModel):
|
||||||
active: int
|
active: int
|
||||||
tests: int
|
tests: int
|
||||||
|
|
||||||
@validator("updated")
|
@field_validator("updated")
|
||||||
def updated_to_seconds(cls, value: int) -> int:
|
def updated_to_seconds(cls, value: int) -> int:
|
||||||
"""Turn the updated field into seconds instead of milliseconds"""
|
"""Turn the updated field into seconds instead of milliseconds"""
|
||||||
return int(value) // 1000
|
return int(value) // 1000
|
||||||
|
|
|
@ -4,18 +4,17 @@ from typing import Optional
|
||||||
import discord
|
import discord
|
||||||
from aiohttp import ClientSession
|
from aiohttp import ClientSession
|
||||||
from overrides import overrides
|
from overrides import overrides
|
||||||
from pydantic import validator
|
from pydantic import field_validator
|
||||||
|
|
||||||
from didier.data.embeds.base import EmbedPydantic
|
from didier.data.embeds.base import EmbedPydantic
|
||||||
from didier.data.scrapers.common import GameStorePage
|
from didier.data.scrapers.common import GameStorePage
|
||||||
from didier.data.scrapers.steam import get_steam_webpage_info
|
from didier.data.scrapers.steam import get_steam_webpage_info
|
||||||
from didier.utils.discord import colours
|
from didier.utils.discord import colours
|
||||||
|
|
||||||
__all__ = ["SEPARATOR", "FreeGameEmbed"]
|
|
||||||
|
|
||||||
from didier.utils.discord.constants import Limits
|
from didier.utils.discord.constants import Limits
|
||||||
from didier.utils.types.string import abbreviate
|
from didier.utils.types.string import abbreviate
|
||||||
|
|
||||||
|
__all__ = ["SEPARATOR", "FreeGameEmbed"]
|
||||||
|
|
||||||
SEPARATOR = " • Free • "
|
SEPARATOR = " • Free • "
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,7 +57,7 @@ class FreeGameEmbed(EmbedPydantic):
|
||||||
|
|
||||||
store_page: Optional[GameStorePage] = None
|
store_page: Optional[GameStorePage] = None
|
||||||
|
|
||||||
@validator("title")
|
@field_validator("title")
|
||||||
def _clean_title(cls, value: str) -> str:
|
def _clean_title(cls, value: str) -> str:
|
||||||
return html.unescape(value)
|
return html.unescape(value)
|
||||||
|
|
||||||
|
@ -107,7 +106,6 @@ class FreeGameEmbed(EmbedPydantic):
|
||||||
embed.add_field(name="Open in browser", value=f"[{self.link}]({self.link})")
|
embed.add_field(name="Open in browser", value=f"[{self.link}]({self.link})")
|
||||||
|
|
||||||
if self.store_page.xdg_open_url is not None:
|
if self.store_page.xdg_open_url is not None:
|
||||||
|
|
||||||
embed.add_field(
|
embed.add_field(
|
||||||
name="Open in app", value=f"[{self.store_page.xdg_open_url}]({self.store_page.xdg_open_url})"
|
name="Open in app", value=f"[{self.store_page.xdg_open_url}]({self.store_page.xdg_open_url})"
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,7 +2,7 @@ from datetime import datetime
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from overrides import overrides
|
from overrides import overrides
|
||||||
from pydantic import validator
|
from pydantic import field_validator
|
||||||
|
|
||||||
from didier.data.embeds.base import EmbedPydantic
|
from didier.data.embeds.base import EmbedPydantic
|
||||||
from didier.utils.discord import colours
|
from didier.utils.discord import colours
|
||||||
|
@ -39,8 +39,8 @@ class Definition(EmbedPydantic):
|
||||||
total_votes = self.thumbs_up + self.thumbs_down
|
total_votes = self.thumbs_up + self.thumbs_down
|
||||||
return round(100 * self.thumbs_up / total_votes, 2)
|
return round(100 * self.thumbs_up / total_votes, 2)
|
||||||
|
|
||||||
@validator("definition", "example")
|
@field_validator("definition", "example")
|
||||||
def modify_long_text(cls, field):
|
def modify_long_text(cls, field: str):
|
||||||
"""Remove brackets from fields & cut them off if they are too long"""
|
"""Remove brackets from fields & cut them off if they are too long"""
|
||||||
field = field.replace("[", "").replace("]", "")
|
field = field.replace("[", "").replace("]", "")
|
||||||
return string_utils.abbreviate(field, max_length=Limits.EMBED_FIELD_VALUE_LENGTH)
|
return string_utils.abbreviate(field, max_length=Limits.EMBED_FIELD_VALUE_LENGTH)
|
||||||
|
|
|
@ -32,7 +32,7 @@ async def fetch_free_games(http_session: ClientSession, database_session: AsyncS
|
||||||
if SEPARATOR not in entry["title"]:
|
if SEPARATOR not in entry["title"]:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
game = FreeGameEmbed.parse_obj(entry)
|
game = FreeGameEmbed.model_validate(entry)
|
||||||
games.append(game)
|
games.append(game)
|
||||||
game_ids.append(game.dc_identifier)
|
game_ids.append(game.dc_identifier)
|
||||||
|
|
||||||
|
|
|
@ -1,22 +1,21 @@
|
||||||
black==22.3.0
|
black==23.3.0
|
||||||
coverage[toml]==6.4.1
|
coverage[toml]==7.2.7
|
||||||
freezegun==1.2.1
|
freezegun==1.2.2
|
||||||
isort==5.12.0
|
isort==5.12.0
|
||||||
mypy==0.961
|
mypy==1.4.1
|
||||||
pre-commit==2.20.0
|
pre-commit==3.3.3
|
||||||
pytest==7.1.2
|
pytest==7.4.0
|
||||||
pytest-asyncio==0.18.3
|
pytest-asyncio==0.21.0
|
||||||
pytest-env==0.6.2
|
pytest-env==0.8.2
|
||||||
sqlalchemy2-stubs==0.0.2a23
|
types-beautifulsoup4==4.12.0.5
|
||||||
types-beautifulsoup4==4.11.3
|
types-python-dateutil==2.8.19.13
|
||||||
types-python-dateutil==2.8.19
|
|
||||||
|
|
||||||
# Flake8 + plugins
|
# Flake8 + plugins
|
||||||
flake8==4.0.1
|
flake8==6.0.0
|
||||||
flake8-bandit==3.0.0
|
flake8-bandit==4.1.1
|
||||||
flake8-bugbear==22.7.1
|
flake8-bugbear==23.6.5
|
||||||
flake8-docstrings==1.6.0
|
flake8-docstrings==1.7.0
|
||||||
flake8-dunder-all==0.2.1
|
flake8-dunder-all==0.3.0
|
||||||
flake8-eradicate==1.2.1
|
flake8-eradicate==1.5.0
|
||||||
flake8-isort==4.1.1
|
flake8-isort==6.0.0
|
||||||
flake8-simplify==0.19.2
|
flake8-simplify==0.20.0
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
aiohttp==3.8.1
|
aiohttp==3.8.4
|
||||||
alembic==1.8.0
|
alembic==1.11.1
|
||||||
asyncpg==0.25.0
|
asyncpg==0.28.0
|
||||||
beautifulsoup4==4.11.1
|
beautifulsoup4==4.12.2
|
||||||
discord.py==2.0.1
|
discord.py==2.3.1
|
||||||
environs==9.5.0
|
environs==9.5.0
|
||||||
feedparser==6.0.10
|
feedparser==6.0.10
|
||||||
ics==0.7.2
|
ics==0.7.2
|
||||||
markdownify==0.11.2
|
markdownify==0.11.6
|
||||||
overrides==6.1.0
|
overrides==7.3.1
|
||||||
pydantic==1.9.1
|
pydantic==2.0.2
|
||||||
python-dateutil==2.8.2
|
python-dateutil==2.8.2
|
||||||
sqlalchemy[asyncio]==1.4.37
|
sqlalchemy[asyncio]==2.0.18
|
||||||
|
|
Loading…
Reference in New Issue