diff --git a/files/classes/award.py b/files/classes/award.py index 8f658226d..f472c51b2 100644 --- a/files/classes/award.py +++ b/files/classes/award.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -8,6 +9,9 @@ from files.classes import Base from files.helpers.config.awards import AWARDS, HOUSE_AWARDS from files.helpers.lazy import lazy +if TYPE_CHECKING: + from files.classes import Comment, Post, User + class AwardRelationship(Base): __tablename__ = "award_relationships" @@ -22,9 +26,9 @@ class AwardRelationship(Base): price_paid: Mapped[int] = mapped_column(default = 0) note: Mapped[str] - user = relationship("User", primaryjoin="AwardRelationship.user_id==User.id", back_populates="awards") - post = relationship("Post", primaryjoin="AwardRelationship.post_id==Post.id", back_populates="awards") - comment = relationship("Comment", primaryjoin="AwardRelationship.comment_id==Comment.id", back_populates="awards") + user: Mapped["User"] = relationship(primaryjoin="AwardRelationship.user_id==User.id", back_populates="awards") + post: Mapped["Post"] = relationship(primaryjoin="AwardRelationship.post_id==Post.id", back_populates="awards") + comment: Mapped["Comment"] = relationship(primaryjoin="AwardRelationship.comment_id==Comment.id", back_populates="awards") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/badges.py b/files/classes/badges.py index 4bce446a4..5f139d749 100644 --- a/files/classes/badges.py +++ b/files/classes/badges.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -8,6 +9,10 @@ from files.classes import Base from files.helpers.config.const import * from files.helpers.lazy import lazy +if TYPE_CHECKING: + from files.classes import User + + class BadgeDef(Base): __tablename__ = "badge_defs" @@ -38,8 +43,8 @@ class Badge(Base): url: Mapped[str] created_utc: Mapped[int] - user = relationship("User", back_populates="badges") - badge = relationship("BadgeDef", primaryjoin="Badge.badge_id == BadgeDef.id", lazy="joined", innerjoin=True) + user: Mapped["User"] = relationship(back_populates="badges") + badge: Mapped["BadgeDef"] = relationship(primaryjoin="Badge.badge_id == BadgeDef.id", lazy="joined", innerjoin=True) def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: diff --git a/files/classes/casino_game.py b/files/classes/casino_game.py index 23380d0e5..fdf8a8d39 100644 --- a/files/classes/casino_game.py +++ b/files/classes/casino_game.py @@ -1,5 +1,6 @@ import json import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -8,6 +9,9 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import lazy +if TYPE_CHECKING: + from files.classes import User + CASINO_GAME_KINDS = ['blackjack', 'slots', 'roulette'] class CasinoGame(Base): @@ -23,7 +27,7 @@ class CasinoGame(Base): kind: Mapped[str] game_state: Mapped[str] = mapped_column(JSON) - user = relationship("User") + user: Mapped["User"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: diff --git a/files/classes/clients.py b/files/classes/clients.py index 8034cd697..37271968e 100644 --- a/files/classes/clients.py +++ b/files/classes/clients.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from flask import g from sqlalchemy import ForeignKey @@ -12,6 +13,10 @@ from files.helpers.lazy import lazy from .comment import Comment from .post import Post +if TYPE_CHECKING: + from files.classes import User + + class OauthApp(Base): __tablename__ = "oauth_apps" @@ -23,7 +28,7 @@ class OauthApp(Base): author_id: Mapped[int] = mapped_column(ForeignKey("users.id")) created_utc: Mapped[int] - author = relationship("User", back_populates="apps") + author: Mapped["User"] = relationship(back_populates="apps") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -56,8 +61,8 @@ class ClientAuth(Base): access_token: Mapped[str] created_utc: Mapped[int] - user = relationship("User") - application = relationship("OauthApp") + user: Mapped["User"] = relationship() + application: Mapped["OauthApp"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/comment.py b/files/classes/comment.py index a275f04c4..f4c6e2ad0 100644 --- a/files/classes/comment.py +++ b/files/classes/comment.py @@ -1,6 +1,7 @@ import time from math import floor from random import randint +from typing import TYPE_CHECKING from urllib.parse import parse_qs, urlencode, urlparse from flask import g @@ -21,6 +22,9 @@ from files.helpers.bleach_body import * from .saves import CommentSaveRelationship +if TYPE_CHECKING: + from files.classes import AwardRelationship, CasinoGame, CommentOption, CommentReport, OauthApp, Post, User + def get_emoji_awards_emojis(obj, v, kind, NSFW_EMOJIS): if g.show_nsfw: emojis = [x.note for x in obj.awards if x.kind == kind] @@ -216,16 +220,16 @@ class Comment(Base): else: nsfw = False - oauth_app = relationship("OauthApp") - post = relationship("Post", back_populates="comments") - author = relationship("User", primaryjoin="User.id==Comment.author_id") - senttouser = relationship("User", primaryjoin="User.id==Comment.sentto") - parent_comment = relationship("Comment", remote_side=[id]) - awards = relationship("AwardRelationship", order_by="AwardRelationship.awarded_utc.desc()", back_populates="comment") - reports = relationship("CommentReport", order_by="CommentReport.created_utc") - options = relationship("CommentOption", order_by="CommentOption.id") - casino_game = relationship("CasinoGame") - wall_user = relationship("User", primaryjoin="User.id==Comment.wall_user_id") + oauth_app: Mapped["OauthApp"] = relationship() + post: Mapped["Post"] = relationship(back_populates="comments") + author: Mapped["User"] = relationship(primaryjoin="User.id==Comment.author_id") + senttouser: Mapped["User"] = relationship(primaryjoin="User.id==Comment.sentto") + parent_comment: Mapped["Comment"] = relationship(remote_side=[id]) + awards: Mapped[list["AwardRelationship"]] = relationship(order_by="AwardRelationship.awarded_utc.desc()", back_populates="comment") + reports: Mapped[list["CommentReport"]] = relationship(order_by="CommentReport.created_utc") + options: Mapped[list["CommentOption"]] = relationship(order_by="CommentOption.id") + casino_game: Mapped["CasinoGame"] = relationship() + wall_user: Mapped["User"] = relationship(primaryjoin="User.id==Comment.wall_user_id") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: diff --git a/files/classes/follows.py b/files/classes/follows.py index 0229a86bb..0a8e7cc7c 100644 --- a/files/classes/follows.py +++ b/files/classes/follows.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -6,14 +7,18 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base +if TYPE_CHECKING: + from files.classes import User + + class Follow(Base): __tablename__ = "follows" target_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) created_utc: Mapped[int] - user = relationship("User", uselist=False, primaryjoin="User.id==Follow.user_id", back_populates="following") - target = relationship("User", uselist=False, primaryjoin="User.id==Follow.target_id", back_populates="followers") + user: Mapped["User"] = relationship(uselist=False, primaryjoin="User.id==Follow.user_id", back_populates="following") + target: Mapped["User"] = relationship(uselist=False, primaryjoin="User.id==Follow.target_id", back_populates="followers") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/group.py b/files/classes/group.py index cae7a3768..52c2e00a7 100644 --- a/files/classes/group.py +++ b/files/classes/group.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.types import Integer @@ -9,6 +10,10 @@ from files.helpers.config.const import * from .group_membership import * +if TYPE_CHECKING: + from files.classes import User + + class Group(Base): __tablename__ = "groups" name: Mapped[str] = mapped_column(primary_key=True) @@ -17,8 +22,8 @@ class Group(Base): description: Mapped[str] description_html: Mapped[str] - memberships = relationship("GroupMembership", primaryjoin="GroupMembership.group_name==Group.name", order_by="GroupMembership.approved_utc") - owner = relationship("User", primaryjoin="Group.owner_id==User.id") + memberships: Mapped[list["GroupMembership"]] = relationship(primaryjoin="GroupMembership.group_name==Group.name", order_by="GroupMembership.approved_utc") + owner: Mapped["User"] = relationship(primaryjoin="Group.owner_id==User.id") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/group_membership.py b/files/classes/group_membership.py index 733158be1..127ef7dce 100644 --- a/files/classes/group_membership.py +++ b/files/classes/group_membership.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -6,6 +7,10 @@ from sqlalchemy.types import Integer, String, Boolean from files.classes import Base +if TYPE_CHECKING: + from files.classes.user import User + + class GroupMembership(Base): __tablename__ = "group_memberships" user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) @@ -14,7 +19,7 @@ class GroupMembership(Base): approved_utc: Mapped[int] is_mod: Mapped[bool] = mapped_column(default=False) - user = relationship("User", uselist=False) + user: Mapped["User"] = relationship(uselist=False) def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/hats.py b/files/classes/hats.py index 2e7bd9f42..024c132da 100644 --- a/files/classes/hats.py +++ b/files/classes/hats.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -9,6 +10,10 @@ from files.classes import Base from files.helpers.lazy import lazy from files.helpers.slurs_and_profanities import censor_slurs_profanities +if TYPE_CHECKING: + from files.classes import User + + class HatDef(Base): __tablename__ = "hat_defs" @@ -20,8 +25,8 @@ class HatDef(Base): submitter_id: Mapped[int] = mapped_column(ForeignKey("users.id")) created_utc: Mapped[int] - author = relationship("User", primaryjoin="HatDef.author_id == User.id", back_populates="designed_hats") - submitter = relationship("User", primaryjoin="HatDef.submitter_id == User.id") + author: Mapped["User"] = relationship(primaryjoin="HatDef.author_id == User.id", back_populates="designed_hats") + submitter: Mapped["User"] = relationship(primaryjoin="HatDef.submitter_id == User.id") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -53,8 +58,8 @@ class Hat(Base): equipped: Mapped[bool] = mapped_column(default=False) created_utc: Mapped[int] - hat_def = relationship("HatDef") - owners = relationship("User", back_populates="owned_hats") + hat_def: Mapped["HatDef"] = relationship() + owners: Mapped[list["User"]] = relationship(back_populates="owned_hats") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/hole.py b/files/classes/hole.py index 3e9ae7958..b1a6d77e9 100644 --- a/files/classes/hole.py +++ b/files/classes/hole.py @@ -3,7 +3,7 @@ import time from typing import Annotated from sqlalchemy.ext.mutable import MutableList -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import DynamicMapped, Mapped, mapped_column, relationship from sqlalchemy.dialects.postgresql import ARRAY from files.classes import Base @@ -29,9 +29,9 @@ class Hole(Base): else: snappy_quotes: Mapped[Annotated[str, HOLE_SNAPPY_QUOTES_LENGTH]] = mapped_column(deferred=True) - blocks = relationship("HoleBlock", primaryjoin="HoleBlock.hole==Hole.name") - followers = relationship("HoleFollow", primaryjoin="HoleFollow.hole==Hole.name") - stealth_hole_unblocks = relationship("StealthHoleUnblock", lazy="dynamic", primaryjoin="StealthHoleUnblock.hole==Hole.name") + blocks: Mapped[list["HoleBlock"]] = relationship(primaryjoin="HoleBlock.hole==Hole.name") + followers: Mapped[list["HoleFollow"]] = relationship(primaryjoin="HoleFollow.hole==Hole.name") + stealth_hole_unblocks: DynamicMapped["StealthHoleUnblock"] = relationship(primaryjoin="StealthHoleUnblock.hole==Hole.name") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/hole_logs.py b/files/classes/hole_logs.py index 1c7bf7233..1488c27bd 100644 --- a/files/classes/hole_logs.py +++ b/files/classes/hole_logs.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -11,6 +12,10 @@ from files.helpers.lazy import lazy from files.helpers.slurs_and_profanities import censor_slurs_profanities from files.helpers.sorting_and_time import make_age_string +if TYPE_CHECKING: + from files.classes import Comment, Post, User + + class HoleAction(Base): __tablename__ = "hole_actions" id: Mapped[int] = mapped_column(primary_key=True) @@ -23,10 +28,10 @@ class HoleAction(Base): _note: Mapped[str] created_utc: Mapped[int] - user = relationship("User", primaryjoin="User.id==HoleAction.user_id") - target_user = relationship("User", primaryjoin="User.id==HoleAction.target_user_id") - target_post = relationship("Post") - target_comment = relationship("Comment") + user: Mapped["User"] = relationship(primaryjoin="User.id==HoleAction.user_id") + target_user: Mapped["User"] = relationship(primaryjoin="User.id==HoleAction.target_user_id") + target_post: Mapped["Post"] = relationship() + target_comment: Mapped["Comment"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/hole_relationship.py b/files/classes/hole_relationship.py index 07b70031f..e581992c8 100644 --- a/files/classes/hole_relationship.py +++ b/files/classes/hole_relationship.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, relationship, mapped_column @@ -6,6 +7,10 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base +if TYPE_CHECKING: + from files.classes import User + + class HoleRelationship(Base): __tablename__ = NotImplemented __abstract__ = True @@ -36,4 +41,4 @@ class Mod(HoleRelationship): class Exile(HoleRelationship): __tablename__ = "exiles" exiler_id: Mapped[int] = mapped_column(ForeignKey("users.id")) - exiler = relationship("User", primaryjoin="User.id==Exile.exiler_id") + exiler: Mapped["User"] = relationship(primaryjoin="User.id==Exile.exiler_id") diff --git a/files/classes/ip_logs.py b/files/classes/ip_logs.py index d19941df0..7fb965aff 100644 --- a/files/classes/ip_logs.py +++ b/files/classes/ip_logs.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -6,6 +7,10 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base +if TYPE_CHECKING: + from files.classes import User + + class IPLog(Base): __tablename__ = "ip_logs" user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) @@ -13,7 +18,7 @@ class IPLog(Base): created_utc: Mapped[int] last_used: Mapped[int] - user = relationship("User") + user: Mapped["User"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: diff --git a/files/classes/mod_logs.py b/files/classes/mod_logs.py index 747fbe79b..f8c1f3725 100644 --- a/files/classes/mod_logs.py +++ b/files/classes/mod_logs.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -11,6 +12,10 @@ from files.helpers.lazy import lazy from files.helpers.slurs_and_profanities import censor_slurs_profanities from files.helpers.sorting_and_time import make_age_string +if TYPE_CHECKING: + from files.classes import Comment, Post, User + + class ModAction(Base): __tablename__ = "modactions" id: Mapped[int] = mapped_column(primary_key=True) @@ -22,10 +27,10 @@ class ModAction(Base): _note: Mapped[str] created_utc: Mapped[int] - user = relationship("User", primaryjoin="User.id==ModAction.user_id") - target_user = relationship("User", primaryjoin="User.id==ModAction.target_user_id") - target_post = relationship("Post") - target_comment = relationship("Comment") + user: Mapped["User"] = relationship(primaryjoin="User.id==ModAction.user_id") + target_user: Mapped["User"] = relationship(primaryjoin="User.id==ModAction.target_user_id") + target_post: Mapped["Post"] = relationship() + target_comment: Mapped["Comment"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/notifications.py b/files/classes/notifications.py index 4e50e63b1..c0a2ca651 100644 --- a/files/classes/notifications.py +++ b/files/classes/notifications.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -6,6 +7,10 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base +if TYPE_CHECKING: + from files.classes import Comment, User + + class Notification(Base): __tablename__ = "notifications" @@ -14,8 +19,8 @@ class Notification(Base): read: Mapped[bool] = mapped_column(default=False) created_utc: Mapped[int] - comment = relationship("Comment") - user = relationship("User") + comment: Mapped["Comment"] = relationship() + user: Mapped["User"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/polls.py b/files/classes/polls.py index d0b297100..847745f23 100644 --- a/files/classes/polls.py +++ b/files/classes/polls.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -7,6 +8,10 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import lazy +if TYPE_CHECKING: + from files.classes import Comment, Post, User + + class PostOption(Base): __tablename__ = "post_options" @@ -16,8 +21,8 @@ class PostOption(Base): exclusive: Mapped[int] created_utc: Mapped[int] - votes = relationship("PostOptionVote") - parent = relationship("Post", back_populates="options") + votes: Mapped[list["PostOptionVote"]] = relationship() + parent: Mapped["Post"] = relationship(back_populates="options") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -45,7 +50,7 @@ class PostOptionVote(Base): created_utc: Mapped[int] post_id: Mapped[int] = mapped_column(ForeignKey("posts.id")) - user = relationship("User") + user: Mapped["User"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -65,8 +70,8 @@ class CommentOption(Base): exclusive: Mapped[int] created_utc: Mapped[int] - votes = relationship("CommentOptionVote") - parent = relationship("Comment", back_populates="options") + votes: Mapped[list["CommentOptionVote"]] = relationship() + parent: Mapped["Comment"] = relationship(back_populates="options") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -94,7 +99,7 @@ class CommentOptionVote(Base): created_utc: Mapped[int] comment_id: Mapped[int] = mapped_column(ForeignKey("comments.id")) - user = relationship("User") + user: Mapped["User"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/post.py b/files/classes/post.py index af110938e..dfc596d47 100644 --- a/files/classes/post.py +++ b/files/classes/post.py @@ -1,5 +1,6 @@ import random import time +from typing import TYPE_CHECKING from urllib.parse import urlparse from flask import g @@ -22,6 +23,10 @@ from .hole import * from .subscriptions import * from .saves import SaveRelationship +if TYPE_CHECKING: + from files.classes import OauthApp, Report + + class Post(Base): __tablename__ = "posts" @@ -77,14 +82,14 @@ class Post(Base): if SITE_NAME == 'WPD': cw: Mapped[bool] = mapped_column(default=False) - author = relationship("User", primaryjoin="Post.author_id==User.id") - oauth_app = relationship("OauthApp") - approved_by = relationship("User", uselist=False, primaryjoin="Post.is_approved==User.id") - awards = relationship("AwardRelationship", order_by="AwardRelationship.awarded_utc.desc()", back_populates="post") - reports = relationship("Report", order_by="Report.created_utc") - comments = relationship("Comment", primaryjoin="Comment.parent_post==Post.id", back_populates="post") - hole_obj = relationship("Hole", primaryjoin="foreign(Post.hole)==remote(Hole.name)") - options = relationship("PostOption", order_by="PostOption.id") + author: Mapped["User"] = relationship(primaryjoin="Post.author_id==User.id") + oauth_app: Mapped["OauthApp"] = relationship() + approved_by: Mapped["User"] = relationship(uselist=False, primaryjoin="Post.is_approved==User.id") + awards: Mapped[list["AwardRelationship"]] = relationship(order_by="AwardRelationship.awarded_utc.desc()", back_populates="post") + reports: Mapped[list["Report"]] = relationship(order_by="Report.created_utc") + comments: Mapped[list["Comment"]] = relationship(primaryjoin="Comment.parent_post==Post.id", back_populates="post") + hole_obj: Mapped["Hole"] = relationship(primaryjoin="foreign(Post.hole)==remote(Hole.name)") + options: Mapped[list["PostOption"]] = relationship(order_by="PostOption.id") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: diff --git a/files/classes/reports.py b/files/classes/reports.py index 877804473..d1b512a40 100644 --- a/files/classes/reports.py +++ b/files/classes/reports.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -8,6 +9,10 @@ from files.classes import Base from files.helpers.lazy import lazy from files.helpers.slurs_and_profanities import censor_slurs_profanities +if TYPE_CHECKING: + from files.classes import User + + class Report(Base): __tablename__ = "reports" @@ -16,7 +21,7 @@ class Report(Base): reason: Mapped[str] created_utc: Mapped[int] - user = relationship("User", primaryjoin = "Report.user_id == User.id", uselist = False) + user: Mapped["User"] = relationship(primaryjoin = "Report.user_id == User.id", uselist = False) def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -44,7 +49,7 @@ class CommentReport(Base): reason: Mapped[str] created_utc: Mapped[int] - user = relationship("User", primaryjoin = "CommentReport.user_id == User.id", uselist = False) + user: Mapped["User"] = relationship(primaryjoin = "CommentReport.user_id == User.id", uselist = False) def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/saves.py b/files/classes/saves.py index 4d02a50d8..2a072e5d3 100644 --- a/files/classes/saves.py +++ b/files/classes/saves.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -6,6 +7,11 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base +if TYPE_CHECKING: + from files.classes.comment import Comment + from files.classes.post import Post + + class SaveRelationship(Base): __tablename__ = "save_relationship" @@ -13,7 +19,7 @@ class SaveRelationship(Base): post_id: Mapped[int] = mapped_column(ForeignKey("posts.id"), primary_key=True) created_utc: Mapped[int] - post = relationship("Post", uselist=False) + post: Mapped["Post"] = relationship(uselist=False) def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -31,7 +37,7 @@ class CommentSaveRelationship(Base): comment_id: Mapped[int] = mapped_column(ForeignKey("comments.id"), primary_key=True) created_utc: Mapped[int] - comment = relationship("Comment", uselist=False) + comment: Mapped["Comment"] = relationship(uselist=False) def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/subscriptions.py b/files/classes/subscriptions.py index aa7b0b034..5c579d3d5 100644 --- a/files/classes/subscriptions.py +++ b/files/classes/subscriptions.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -6,14 +7,18 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base +if TYPE_CHECKING: + from files.classes import Post, User + + class Subscription(Base): __tablename__ = "subscriptions" user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) post_id: Mapped[int] = mapped_column(ForeignKey("posts.id"), primary_key=True) created_utc: Mapped[int] - user = relationship("User", uselist=False) - post = relationship("Post", uselist=False) + user: Mapped["User"] = relationship(uselist=False) + post: Mapped["Post"] = relationship(uselist=False) def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/user.py b/files/classes/user.py index eefc857e2..d64bac889 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -3,7 +3,7 @@ from operator import * import pyotp from sqlalchemy import ForeignKey, FetchedValue -from sqlalchemy.orm import Mapped, Query, aliased, deferred, mapped_column +from sqlalchemy.orm import DynamicMapped, Mapped, Query, aliased, deferred, mapped_column from sqlalchemy.sql import case, func, literal from sqlalchemy.sql.expression import not_, and_, or_ from sqlalchemy.sql.sqltypes import * @@ -175,20 +175,20 @@ class User(Base): zombie: Mapped[int] = mapped_column(default=0) # > 0 vaxxed; < 0 zombie jumpscare: Mapped[int] = mapped_column(default=0) - badges = relationship("Badge", order_by="Badge.created_utc", back_populates="user") - subscriptions = relationship("Subscription", back_populates="user") - following = relationship("Follow", primaryjoin="Follow.user_id==User.id", back_populates="user") - followers = relationship("Follow", primaryjoin="Follow.target_id==User.id", back_populates="target") - blocking = relationship("UserBlock", lazy="dynamic", primaryjoin="User.id==UserBlock.user_id", back_populates="user") - blocked = relationship("UserBlock", lazy="dynamic", primaryjoin="User.id==UserBlock.target_id", back_populates="target") - authorizations = relationship("ClientAuth", back_populates="user") - apps = relationship("OauthApp", back_populates="author") - awards = relationship("AwardRelationship", primaryjoin="User.id==AwardRelationship.user_id", back_populates="user") - referrals = relationship("User", primaryjoin="User.id==User.referred_by", order_by="User.created_utc") - designed_hats = relationship("HatDef", primaryjoin="User.id==HatDef.author_id", back_populates="author") - owned_hats = relationship("Hat", back_populates="owners") - hats_equipped = relationship("Hat", lazy="raise", viewonly=True) - hole_mods = relationship("Mod", primaryjoin="User.id == Mod.user_id", lazy="raise") + badges: Mapped[list["Badge"]] = relationship(order_by="Badge.created_utc", back_populates="user") + subscriptions: Mapped[list["Subscription"]] = relationship(back_populates="user") + following: Mapped[list["Follow"]] = relationship(primaryjoin="Follow.user_id==User.id", back_populates="user") + followers: Mapped[list["Follow"]] = relationship(primaryjoin="Follow.target_id==User.id", back_populates="target") + blocking: DynamicMapped["UserBlock"] = relationship(primaryjoin="User.id==UserBlock.user_id", back_populates="user") + blocked: DynamicMapped["UserBlock"] = relationship(primaryjoin="User.id==UserBlock.target_id", back_populates="target") + authorizations: Mapped[list["ClientAuth"]] = relationship(back_populates="user") + apps: Mapped[list["OauthApp"]] = relationship(back_populates="author") + awards: Mapped[list["AwardRelationship"]] = relationship(primaryjoin="User.id==AwardRelationship.user_id", back_populates="user") + referrals: Mapped[list["User"]] = relationship(primaryjoin="User.id==User.referred_by", order_by="User.created_utc") + designed_hats: Mapped[list["HatDef"]] = relationship(primaryjoin="User.id==HatDef.author_id", back_populates="author") + owned_hats: Mapped[list["Hat"]] = relationship(back_populates="owners") + hats_equipped: Mapped[list["Hat"]] = relationship(lazy="raise", viewonly=True) + hole_mods: Mapped[list["Mod"]] = relationship(primaryjoin="User.id == Mod.user_id", lazy="raise") def __init__(self, **kwargs): diff --git a/files/classes/userblock.py b/files/classes/userblock.py index 5d815179d..139e6c255 100644 --- a/files/classes/userblock.py +++ b/files/classes/userblock.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -6,14 +7,18 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base +if TYPE_CHECKING: + from files.classes import User + + class UserBlock(Base): __tablename__ = "userblocks" user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) target_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) created_utc: Mapped[int] - user = relationship("User", primaryjoin="User.id==UserBlock.user_id", back_populates="blocking") - target = relationship("User", primaryjoin="User.id==UserBlock.target_id", back_populates="blocked") + user: Mapped["User"] = relationship(primaryjoin="User.id==UserBlock.user_id", back_populates="blocking") + target: Mapped["User"] = relationship(primaryjoin="User.id==UserBlock.target_id", back_populates="blocked") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/usermute.py b/files/classes/usermute.py index 48c0d1566..2a8da2b3e 100644 --- a/files/classes/usermute.py +++ b/files/classes/usermute.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -6,14 +7,18 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base +if TYPE_CHECKING: + from files.classes import User + + class UserMute(Base): __tablename__ = "usermutes" user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) target_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) created_utc: Mapped[int] - user = relationship("User", primaryjoin="User.id==UserMute.user_id") - target = relationship("User", primaryjoin="User.id==UserMute.target_id") + user: Mapped["User"] = relationship(primaryjoin="User.id==UserMute.user_id") + target: Mapped["User"] = relationship(primaryjoin="User.id==UserMute.target_id") def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/views.py b/files/classes/views.py index 654eeee93..d914276a0 100644 --- a/files/classes/views.py +++ b/files/classes/views.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -8,6 +9,10 @@ from files.classes import Base from files.helpers.lazy import * from files.helpers.sorting_and_time import make_age_string +if TYPE_CHECKING: + from files.classes import User + + class ViewerRelationship(Base): __tablename__ = "viewers" @@ -16,7 +21,7 @@ class ViewerRelationship(Base): last_view_utc: Mapped[int] created_utc: Mapped[int] - viewer = relationship("User", primaryjoin="ViewerRelationship.viewer_id == User.id") + viewer: Mapped["User"] = relationship(primaryjoin="ViewerRelationship.viewer_id == User.id") def __init__(self, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) diff --git a/files/classes/votes.py b/files/classes/votes.py index 7d19add0b..4c8a079e4 100644 --- a/files/classes/votes.py +++ b/files/classes/votes.py @@ -1,4 +1,5 @@ import time +from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -7,6 +8,10 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import lazy +if TYPE_CHECKING: + from files.classes import User + + class Vote(Base): __tablename__ = "votes" @@ -17,7 +22,7 @@ class Vote(Base): coins: Mapped[int] = mapped_column(default=1) created_utc: Mapped[int] - user = relationship("User") + user: Mapped["User"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) @@ -47,7 +52,7 @@ class CommentVote(Base): coins: Mapped[int] = mapped_column(default=1) created_utc: Mapped[int] - user = relationship("User") + user: Mapped["User"] = relationship() def __init__(self, *args, **kwargs): if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())