From 75666a021d2c14406eee31d4cdbabe3babea974c Mon Sep 17 00:00:00 2001 From: TriHard Date: Thu, 15 Feb 2024 14:50:18 -0700 Subject: [PATCH] Use type aliases for common columns --- files/classes/alts.py | 6 +++--- files/classes/award.py | 10 +++++----- files/classes/badges.py | 5 +++-- files/classes/casino_game.py | 6 +++--- files/classes/clients.py | 7 ++++--- files/classes/comment.py | 15 ++++++++------- files/classes/domains.py | 3 ++- files/classes/emoji.py | 8 ++++---- files/classes/follows.py | 6 +++--- files/classes/group.py | 8 ++++---- files/classes/group_membership.py | 4 ++-- files/classes/hats.py | 5 +++-- files/classes/hole_logs.py | 11 ++++++----- files/classes/ip_logs.py | 8 ++++---- files/classes/lottery.py | 6 +++--- files/classes/media.py | 10 +++++----- files/classes/mod_logs.py | 14 +++++++------- files/classes/notifications.py | 6 +++--- files/classes/orgy.py | 4 ++-- files/classes/polls.py | 17 +++++++++-------- files/classes/post.py | 9 +++++---- files/classes/push_subscriptions.py | 8 ++++---- files/classes/reports.py | 12 ++++++------ files/classes/saves.py | 12 ++++++------ files/classes/subscriptions.py | 8 ++++---- files/classes/transactions.py | 5 +++-- files/classes/user.py | 16 ++++++++-------- files/classes/userblock.py | 8 ++++---- files/classes/usermute.py | 8 ++++---- files/classes/views.py | 8 ++++---- files/classes/votes.py | 10 +++++----- files/helpers/types.py | 14 ++++++++++++++ 32 files changed, 150 insertions(+), 127 deletions(-) create mode 100644 files/helpers/types.py diff --git a/files/classes/alts.py b/files/classes/alts.py index cf4448c81..d70f76193 100644 --- a/files/classes/alts.py +++ b/files/classes/alts.py @@ -1,17 +1,17 @@ import time from typing import Optional -from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import user_id_fk_pk class Alt(Base): __tablename__ = "alts" - user1: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) - user2: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + user1: Mapped[user_id_fk_pk] + user2: Mapped[user_id_fk_pk] is_manual: Mapped[bool] = mapped_column(default=False) created_utc: Mapped[Optional[int]] diff --git a/files/classes/award.py b/files/classes/award.py index 0a72ee9da..440c3a3b9 100644 --- a/files/classes/award.py +++ b/files/classes/award.py @@ -1,13 +1,13 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.config.awards import AWARDS, HOUSE_AWARDS from files.helpers.lazy import lazy +from files.helpers.types import comment_id_fk, int_pk, post_id_fk, user_id_fk if TYPE_CHECKING: from files.classes import Comment, Post, User @@ -16,10 +16,10 @@ if TYPE_CHECKING: class AwardRelationship(Base): __tablename__ = "award_relationships" - id: Mapped[int] = mapped_column(primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) - post_id: Mapped[Optional[int]] = mapped_column(ForeignKey("posts.id")) - comment_id: Mapped[Optional[int]] = mapped_column(ForeignKey("comments.id")) + id: Mapped[int_pk] + user_id: Mapped[user_id_fk] + post_id: Mapped[Optional[post_id_fk]] + comment_id: Mapped[Optional[comment_id_fk]] kind: Mapped[str] awarded_utc: Mapped[Optional[int]] created_utc: Mapped[Optional[int]] diff --git a/files/classes/badges.py b/files/classes/badges.py index 3ecbff807..a755421a3 100644 --- a/files/classes/badges.py +++ b/files/classes/badges.py @@ -8,6 +8,7 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.config.const import * from files.helpers.lazy import lazy +from files.helpers.types import int_pk, user_id_fk_pk if TYPE_CHECKING: from files.classes import User @@ -16,7 +17,7 @@ if TYPE_CHECKING: class BadgeDef(Base): __tablename__ = "badge_defs" - id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) + id: Mapped[int_pk] = mapped_column(autoincrement=True) name: Mapped[str] description: Mapped[Optional[str]] created_utc: Mapped[int] @@ -37,7 +38,7 @@ class Badge(Base): __tablename__ = "badges" - user_id: Mapped[int] = mapped_column(ForeignKey('users.id'), primary_key=True) + user_id: Mapped[user_id_fk_pk] badge_id: Mapped[int] = mapped_column(ForeignKey('badge_defs.id'), primary_key=True) description: Mapped[Optional[str]] url: Mapped[Optional[str]] diff --git a/files/classes/casino_game.py b/files/classes/casino_game.py index fdf8a8d39..9d5233619 100644 --- a/files/classes/casino_game.py +++ b/files/classes/casino_game.py @@ -2,12 +2,12 @@ import json import time from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import lazy +from files.helpers.types import int_pk, user_id_fk if TYPE_CHECKING: from files.classes import User @@ -17,8 +17,8 @@ CASINO_GAME_KINDS = ['blackjack', 'slots', 'roulette'] class CasinoGame(Base): __tablename__ = "casino_games" - id: Mapped[int] = mapped_column(primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + id: Mapped[int_pk] + user_id: Mapped[user_id_fk] created_utc: Mapped[int] active: Mapped[bool] = mapped_column(default=True) currency: Mapped[str] diff --git a/files/classes/clients.py b/files/classes/clients.py index 1788a0867..a7ccac0f7 100644 --- a/files/classes/clients.py +++ b/files/classes/clients.py @@ -9,6 +9,7 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.config.const import * from files.helpers.lazy import lazy +from files.helpers.types import int_pk, user_id_fk, user_id_fk_pk from .comment import Comment from .post import Post @@ -20,12 +21,12 @@ if TYPE_CHECKING: class OauthApp(Base): __tablename__ = "oauth_apps" - id: Mapped[int] = mapped_column(primary_key=True) + id: Mapped[int_pk] client_id: Mapped[Optional[Annotated[str, 64]]] app_name: Mapped[str] redirect_uri: Mapped[str] description: Mapped[str] - author_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + author_id: Mapped[user_id_fk] created_utc: Mapped[Optional[int]] author: Mapped["User"] = relationship(back_populates="apps") @@ -56,7 +57,7 @@ class OauthApp(Base): class ClientAuth(Base): __tablename__ = "client_auths" - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + user_id: Mapped[user_id_fk_pk] oauth_client: Mapped[int] = mapped_column(ForeignKey("oauth_apps.id"), primary_key=True) access_token: Mapped[str] created_utc: Mapped[Optional[int]] diff --git a/files/classes/comment.py b/files/classes/comment.py index 6ae808aa4..156d7fef2 100644 --- a/files/classes/comment.py +++ b/files/classes/comment.py @@ -18,6 +18,7 @@ from files.helpers.slurs_and_profanities import * from files.helpers.lazy import lazy from files.helpers.regex import * from files.helpers.sorting_and_time import * +from files.helpers.types import comment_id_fk, int_pk, post_id_fk, user_id_fk from files.helpers.bleach_body import * from .saves import CommentSaveRelationship @@ -176,10 +177,10 @@ def add_options(self, body, v): class Comment(Base): __tablename__ = "comments" - id: Mapped[int] = mapped_column(primary_key=True) - author_id: Mapped[int] = mapped_column(ForeignKey("users.id")) - parent_post: Mapped[Optional[int]] = mapped_column(ForeignKey("posts.id")) - wall_user_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + id: Mapped[int_pk] + author_id: Mapped[user_id_fk] + parent_post: Mapped[Optional[post_id_fk]] + wall_user_id: Mapped[Optional[user_id_fk]] created_utc: Mapped[int] edited_utc: Mapped[int] = mapped_column(default=0) is_banned: Mapped[bool] = mapped_column(default=False) @@ -188,15 +189,15 @@ class Comment(Base): chuddedfor: Mapped[Optional[str]] distinguished: Mapped[bool] = mapped_column(default=False) deleted_utc: Mapped[int] = mapped_column(default=0) - is_approved: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + is_approved: Mapped[Optional[user_id_fk]] level: Mapped[int] = mapped_column(default=1) - parent_comment_id: Mapped[Optional[int]] = mapped_column(ForeignKey("comments.id")) + parent_comment_id: Mapped[Optional[comment_id_fk]] top_comment_id: Mapped[Optional[int]] is_bot: Mapped[bool] = mapped_column(default=False) stickied: Mapped[Optional[str]] stickied_utc: Mapped[Optional[int]] num_of_pinned_children: Mapped[int] = mapped_column(default=0) - sentto: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + sentto: Mapped[Optional[user_id_fk]] app_id: Mapped[Optional[int]] = mapped_column(ForeignKey("oauth_apps.id")) upvotes: Mapped[int] = mapped_column(default=1) downvotes: Mapped[int] = mapped_column(default=0) diff --git a/files/classes/domains.py b/files/classes/domains.py index 9e728e98d..af586a55d 100644 --- a/files/classes/domains.py +++ b/files/classes/domains.py @@ -5,10 +5,11 @@ from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import str_pk class BannedDomain(Base): __tablename__ = "banneddomains" - domain: Mapped[str] = mapped_column(primary_key=True) + domain: Mapped[str_pk] reason: Mapped[str] created_utc: Mapped[Optional[int]] diff --git a/files/classes/emoji.py b/files/classes/emoji.py index bffe31260..04f95e40c 100644 --- a/files/classes/emoji.py +++ b/files/classes/emoji.py @@ -1,21 +1,21 @@ import time from typing import Optional -from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import str_pk, user_id_fk class Emoji(Base): __tablename__ = "emojis" - name: Mapped[str] = mapped_column(primary_key=True) + name: Mapped[str_pk] kind: Mapped[str] - author_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + author_id: Mapped[user_id_fk] tags: Mapped[str] count: Mapped[int] = mapped_column(default=0) - submitter_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + submitter_id: Mapped[Optional[user_id_fk]] created_utc: Mapped[int] nsfw: Mapped[bool] = mapped_column(default=False) diff --git a/files/classes/follows.py b/files/classes/follows.py index 0a8e7cc7c..ba9b6169d 100644 --- a/files/classes/follows.py +++ b/files/classes/follows.py @@ -1,11 +1,11 @@ import time from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import user_id_fk_pk if TYPE_CHECKING: from files.classes import User @@ -13,8 +13,8 @@ if TYPE_CHECKING: 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) + target_id: Mapped[user_id_fk_pk] + user_id: Mapped[user_id_fk_pk] created_utc: Mapped[int] user: Mapped["User"] = relationship(uselist=False, primaryjoin="User.id==Follow.user_id", back_populates="following") diff --git a/files/classes/group.py b/files/classes/group.py index d3a2a4109..a7ea4f3c3 100644 --- a/files/classes/group.py +++ b/files/classes/group.py @@ -1,12 +1,12 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy.orm import Mapped, mapped_column, relationship -from sqlalchemy.types import Integer +from sqlalchemy.orm import Mapped, relationship from files.classes import Base from files.helpers.lazy import lazy from files.helpers.config.const import * +from files.helpers.types import str_pk, user_id_fk from .group_membership import * @@ -16,9 +16,9 @@ if TYPE_CHECKING: class Group(Base): __tablename__ = "groups" - name: Mapped[str] = mapped_column(primary_key=True) + name: Mapped[str_pk] created_utc: Mapped[int] - owner_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + owner_id: Mapped[Optional[user_id_fk]] description: Mapped[Optional[str]] description_html: Mapped[Optional[str]] diff --git a/files/classes/group_membership.py b/files/classes/group_membership.py index b5153c974..c50b74eae 100644 --- a/files/classes/group_membership.py +++ b/files/classes/group_membership.py @@ -3,9 +3,9 @@ from typing import Optional, TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship -from sqlalchemy.types import Integer, String, Boolean from files.classes import Base +from files.helpers.types import user_id_fk_pk if TYPE_CHECKING: from files.classes.user import User @@ -13,7 +13,7 @@ if TYPE_CHECKING: class GroupMembership(Base): __tablename__ = "group_memberships" - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + user_id: Mapped[user_id_fk_pk] group_name: Mapped[str] = mapped_column(ForeignKey("groups.name"), primary_key=True) created_utc: Mapped[int] approved_utc: Mapped[Optional[int]] diff --git a/files/classes/hats.py b/files/classes/hats.py index 0aef7d14d..a24e3c556 100644 --- a/files/classes/hats.py +++ b/files/classes/hats.py @@ -9,6 +9,7 @@ from flask import g from files.classes import Base from files.helpers.lazy import lazy from files.helpers.slurs_and_profanities import censor_slurs_profanities +from files.helpers.types import int_pk, user_id_fk if TYPE_CHECKING: from files.classes import User @@ -17,12 +18,12 @@ if TYPE_CHECKING: class HatDef(Base): __tablename__ = "hat_defs" - id: Mapped[int] = mapped_column(primary_key=True) + id: Mapped[int_pk] name: Mapped[str] description: Mapped[str] author_id: Mapped[int] = mapped_column(ForeignKey('users.id')) price: Mapped[int] - submitter_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + submitter_id: Mapped[Optional[user_id_fk]] created_utc: Mapped[int] author: Mapped["User"] = relationship(primaryjoin="HatDef.author_id == User.id", back_populates="designed_hats") diff --git a/files/classes/hole_logs.py b/files/classes/hole_logs.py index 2c1398570..a2e6957ac 100644 --- a/files/classes/hole_logs.py +++ b/files/classes/hole_logs.py @@ -11,6 +11,7 @@ from files.helpers.config.const import * 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 +from files.helpers.types import comment_id_fk, int_pk, post_id_fk, user_id_fk if TYPE_CHECKING: from files.classes import Comment, Post, User @@ -18,13 +19,13 @@ if TYPE_CHECKING: class HoleAction(Base): __tablename__ = "hole_actions" - id: Mapped[int] = mapped_column(primary_key=True) + id: Mapped[int_pk] hole: Mapped[str] = mapped_column(ForeignKey("holes.name")) - user_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + user_id: Mapped[Optional[user_id_fk]] kind: Mapped[Optional[str]] - target_user_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) - target_post_id: Mapped[Optional[int]] = mapped_column(ForeignKey("posts.id")) - target_comment_id: Mapped[Optional[int]] = mapped_column(ForeignKey("comments.id")) + target_user_id: Mapped[Optional[user_id_fk]] + target_post_id: Mapped[Optional[post_id_fk]] + target_comment_id: Mapped[Optional[comment_id_fk]] _note: Mapped[Optional[str]] created_utc: Mapped[int] diff --git a/files/classes/ip_logs.py b/files/classes/ip_logs.py index 7fb965aff..a37af0018 100644 --- a/files/classes/ip_logs.py +++ b/files/classes/ip_logs.py @@ -1,11 +1,11 @@ import time from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import str_pk, user_id_fk_pk if TYPE_CHECKING: from files.classes import User @@ -13,8 +13,8 @@ if TYPE_CHECKING: class IPLog(Base): __tablename__ = "ip_logs" - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) - ip: Mapped[str] = mapped_column(primary_key=True) + user_id: Mapped[user_id_fk_pk] + ip: Mapped[str_pk] created_utc: Mapped[int] last_used: Mapped[int] diff --git a/files/classes/lottery.py b/files/classes/lottery.py index 090ce49d4..0e1850f9d 100644 --- a/files/classes/lottery.py +++ b/files/classes/lottery.py @@ -1,23 +1,23 @@ import time from typing import Optional -from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.config.const import * from files.helpers.lazy import lazy +from files.helpers.types import int_pk, user_id_fk class Lottery(Base): __tablename__ = "lotteries" - id: Mapped[int] = mapped_column(primary_key=True) + id: Mapped[int_pk] is_active: Mapped[bool] = mapped_column(default=False) ends_at: Mapped[int] prize: Mapped[int] = mapped_column(default=0) tickets_sold: Mapped[int] = mapped_column(default=0) - winner_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + winner_id: Mapped[Optional[user_id_fk]] created_utc: Mapped[Optional[int]] def __init__(self, *args, **kwargs): diff --git a/files/classes/media.py b/files/classes/media.py index 0e144ad4f..939a4a3b4 100644 --- a/files/classes/media.py +++ b/files/classes/media.py @@ -1,15 +1,15 @@ import time -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import str_pk, user_id_fk class Media(Base): __tablename__ = "media" - kind: Mapped[str] = mapped_column(primary_key=True) - filename: Mapped[str] = mapped_column(primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + kind: Mapped[str_pk] + filename: Mapped[str_pk] + user_id: Mapped[user_id_fk] created_utc: Mapped[int] size: Mapped[int] diff --git a/files/classes/mod_logs.py b/files/classes/mod_logs.py index 41fba0839..fefe904c3 100644 --- a/files/classes/mod_logs.py +++ b/files/classes/mod_logs.py @@ -1,8 +1,7 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, relationship from sqlalchemy.sql.sqltypes import * from flask import g @@ -11,6 +10,7 @@ from files.helpers.config.const import * 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 +from files.helpers.types import comment_id_fk, int_pk, post_id_fk, user_id_fk if TYPE_CHECKING: from files.classes import Comment, Post, User @@ -18,12 +18,12 @@ if TYPE_CHECKING: class ModAction(Base): __tablename__ = "modactions" - id: Mapped[int] = mapped_column(primary_key=True) - user_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + id: Mapped[int_pk] + user_id: Mapped[Optional[user_id_fk]] kind: Mapped[Optional[str]] - target_user_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) - target_post_id: Mapped[Optional[int]] = mapped_column(ForeignKey("posts.id")) - target_comment_id: Mapped[Optional[int]] = mapped_column(ForeignKey("comments.id")) + target_user_id: Mapped[Optional[user_id_fk]] + target_post_id: Mapped[Optional[post_id_fk]] + target_comment_id: Mapped[Optional[comment_id_fk]] _note: Mapped[Optional[str]] created_utc: Mapped[int] diff --git a/files/classes/notifications.py b/files/classes/notifications.py index c0a2ca651..5986b106a 100644 --- a/files/classes/notifications.py +++ b/files/classes/notifications.py @@ -1,11 +1,11 @@ import time from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import comment_id_fk_pk, user_id_fk_pk if TYPE_CHECKING: from files.classes import Comment, User @@ -14,8 +14,8 @@ if TYPE_CHECKING: class Notification(Base): __tablename__ = "notifications" - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) - comment_id: Mapped[int] = mapped_column(ForeignKey("comments.id"), primary_key=True) + user_id: Mapped[user_id_fk_pk] + comment_id: Mapped[comment_id_fk_pk] read: Mapped[bool] = mapped_column(default=False) created_utc: Mapped[int] diff --git a/files/classes/orgy.py b/files/classes/orgy.py index 819f73e31..6f6b795c5 100644 --- a/files/classes/orgy.py +++ b/files/classes/orgy.py @@ -3,11 +3,11 @@ from flask import g, abort import requests from typing import Optional -from sqlalchemy import or_ from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import int_pk from files.helpers.lazy import lazy from files.helpers.config.const import * @@ -15,7 +15,7 @@ from files.helpers.config.const import * class Orgy(Base): __tablename__ = "orgies" - created_utc: Mapped[int] = mapped_column(primary_key=True) + created_utc: Mapped[int_pk] type: Mapped[str] data: Mapped[str] title: Mapped[str] diff --git a/files/classes/polls.py b/files/classes/polls.py index 470765e0d..a5636f3c5 100644 --- a/files/classes/polls.py +++ b/files/classes/polls.py @@ -7,6 +7,7 @@ from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import lazy +from files.helpers.types import comment_id_fk, int_pk, post_id_fk, user_id_fk_pk if TYPE_CHECKING: from files.classes import Comment, Post, User @@ -15,8 +16,8 @@ if TYPE_CHECKING: class PostOption(Base): __tablename__ = "post_options" - id: Mapped[int] = mapped_column(primary_key=True) - parent_id: Mapped[int] = mapped_column(ForeignKey("posts.id")) + id: Mapped[int_pk] + parent_id: Mapped[post_id_fk] body_html: Mapped[str] = mapped_column(Text) exclusive: Mapped[int] created_utc: Mapped[Optional[int]] @@ -46,9 +47,9 @@ class PostOptionVote(Base): __tablename__ = "post_option_votes" option_id: Mapped[int] = mapped_column(ForeignKey("post_options.id"), primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + user_id: Mapped[user_id_fk_pk] created_utc: Mapped[int] - post_id: Mapped[Optional[int]] = mapped_column(ForeignKey("posts.id")) + post_id: Mapped[Optional[post_id_fk]] user: Mapped["User"] = relationship() @@ -64,8 +65,8 @@ class CommentOption(Base): __tablename__ = "comment_options" - id: Mapped[int] = mapped_column(primary_key=True) - parent_id: Mapped[int] = mapped_column(ForeignKey("comments.id")) + id: Mapped[int_pk] + parent_id: Mapped[comment_id_fk] body_html: Mapped[str] = mapped_column(Text) exclusive: Mapped[int] created_utc: Mapped[Optional[int]] @@ -95,9 +96,9 @@ class CommentOptionVote(Base): __tablename__ = "comment_option_votes" option_id: Mapped[int] = mapped_column(ForeignKey("comment_options.id"), primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + user_id: Mapped[user_id_fk_pk] created_utc: Mapped[int] - comment_id: Mapped[Optional[int]] = mapped_column(ForeignKey("comments.id")) + comment_id: Mapped[Optional[comment_id_fk]] user: Mapped["User"] = relationship() diff --git a/files/classes/post.py b/files/classes/post.py index 17757da47..dd09ed11b 100644 --- a/files/classes/post.py +++ b/files/classes/post.py @@ -4,7 +4,7 @@ from typing import Optional, TYPE_CHECKING from urllib.parse import urlparse from flask import g -from sqlalchemy import FetchedValue, ForeignKey +from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql.sqltypes import * @@ -15,6 +15,7 @@ from files.helpers.slurs_and_profanities import * from files.helpers.lazy import lazy from files.helpers.regex import * from files.helpers.sorting_and_time import make_age_string +from files.helpers.types import int_pk, user_id_fk from files.helpers.bleach_body import * from .comment import * @@ -30,8 +31,8 @@ if TYPE_CHECKING: class Post(Base): __tablename__ = "posts" - id: Mapped[int] = mapped_column(primary_key=True) - author_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + id: Mapped[int_pk] + author_id: Mapped[user_id_fk] edited_utc: Mapped[int] = mapped_column(default=0) created_utc: Mapped[int] thumburl: Mapped[Optional[str]] @@ -51,7 +52,7 @@ class Post(Base): is_pinned: Mapped[bool] = mapped_column(default=False) private: Mapped[bool] = mapped_column(default=False) comment_count: Mapped[int] = mapped_column(default=0) - is_approved: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + is_approved: Mapped[Optional[user_id_fk]] is_bot: Mapped[bool] = mapped_column(default=False) upvotes: Mapped[int] = mapped_column(default=1) downvotes: Mapped[int] = mapped_column(default=0) diff --git a/files/classes/push_subscriptions.py b/files/classes/push_subscriptions.py index ca1d91c54..24eda989f 100644 --- a/files/classes/push_subscriptions.py +++ b/files/classes/push_subscriptions.py @@ -1,15 +1,15 @@ import time -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import str_pk, user_id_fk_pk class PushSubscription(Base): __tablename__ = "push_subscriptions" - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) - subscription_json: Mapped[str] = mapped_column(primary_key=True) + user_id: Mapped[user_id_fk_pk] + subscription_json: Mapped[str_pk] created_utc: Mapped[int] def __init__(self, *args, **kwargs): diff --git a/files/classes/reports.py b/files/classes/reports.py index 900c6bc75..b99e8d5b1 100644 --- a/files/classes/reports.py +++ b/files/classes/reports.py @@ -1,13 +1,13 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import lazy from files.helpers.slurs_and_profanities import censor_slurs_profanities +from files.helpers.types import comment_id_fk_pk, post_id_fk_pk, user_id_fk_pk if TYPE_CHECKING: from files.classes import User @@ -16,8 +16,8 @@ if TYPE_CHECKING: class Report(Base): __tablename__ = "reports" - post_id: Mapped[int] = mapped_column(ForeignKey("posts.id"), primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + post_id: Mapped[post_id_fk_pk] + user_id: Mapped[user_id_fk_pk] reason: Mapped[Optional[str]] created_utc: Mapped[int] @@ -44,8 +44,8 @@ class Report(Base): class CommentReport(Base): __tablename__ = "commentreports" - comment_id: Mapped[int] = mapped_column(ForeignKey("comments.id"), primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + comment_id: Mapped[comment_id_fk_pk] + user_id: Mapped[user_id_fk_pk] reason: Mapped[Optional[str]] created_utc: Mapped[int] diff --git a/files/classes/saves.py b/files/classes/saves.py index 00b28169f..186f8bf4a 100644 --- a/files/classes/saves.py +++ b/files/classes/saves.py @@ -1,11 +1,11 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import comment_id_fk_pk, post_id_fk_pk, user_id_fk_pk if TYPE_CHECKING: from files.classes.comment import Comment @@ -15,8 +15,8 @@ if TYPE_CHECKING: class SaveRelationship(Base): __tablename__ = "save_relationship" - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) - post_id: Mapped[int] = mapped_column(ForeignKey("posts.id"), primary_key=True) + user_id: Mapped[user_id_fk_pk] + post_id: Mapped[post_id_fk_pk] created_utc: Mapped[Optional[int]] post: Mapped["Post"] = relationship(uselist=False) @@ -33,8 +33,8 @@ class CommentSaveRelationship(Base): __tablename__ = "comment_save_relationship" - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) - comment_id: Mapped[int] = mapped_column(ForeignKey("comments.id"), primary_key=True) + user_id: Mapped[user_id_fk_pk] + comment_id: Mapped[comment_id_fk_pk] created_utc: Mapped[Optional[int]] comment: Mapped["Comment"] = relationship(uselist=False) diff --git a/files/classes/subscriptions.py b/files/classes/subscriptions.py index b3531231e..f1d581567 100644 --- a/files/classes/subscriptions.py +++ b/files/classes/subscriptions.py @@ -1,11 +1,11 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import post_id_fk_pk, user_id_fk_pk if TYPE_CHECKING: from files.classes import Post, User @@ -13,8 +13,8 @@ if TYPE_CHECKING: 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) + user_id: Mapped[user_id_fk_pk] + post_id: Mapped[post_id_fk_pk] created_utc: Mapped[Optional[int]] user: Mapped["User"] = relationship(uselist=False) diff --git a/files/classes/transactions.py b/files/classes/transactions.py index 9ae47620f..1cbed3108 100644 --- a/files/classes/transactions.py +++ b/files/classes/transactions.py @@ -1,13 +1,14 @@ from typing import Optional -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import str_pk class Transaction(Base): __tablename__ = "transactions" - id: Mapped[str] = mapped_column(primary_key=True) + id: Mapped[str_pk] created_utc: Mapped[int] type: Mapped[str] amount: Mapped[int] diff --git a/files/classes/user.py b/files/classes/user.py index e3f63f44b..e651f5723 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -3,8 +3,7 @@ from operator import * from typing import Optional import pyotp -from sqlalchemy import ForeignKey, FetchedValue -from sqlalchemy.orm import DynamicMapped, Mapped, Query, aliased, deferred, mapped_column +from sqlalchemy.orm import DynamicMapped, Mapped, aliased, mapped_column from sqlalchemy.sql import case, func, literal from sqlalchemy.sql.expression import not_, and_, or_ from sqlalchemy.sql.sqltypes import * @@ -21,6 +20,7 @@ from files.helpers.config.awards import AWARDS_ENABLED, HOUSE_AWARDS from files.helpers.media import * from files.helpers.security import * from files.helpers.sorting_and_time import * +from files.helpers.types import int_pk, user_id_fk from files.helpers.can_see import * from .alts import Alt @@ -50,7 +50,7 @@ else: class User(Base): __tablename__ = "users" - id: Mapped[int] = mapped_column(primary_key=True) + id: Mapped[int_pk] username: Mapped[str] namecolor: Mapped[str] = mapped_column(default=DEFAULT_COLOR) background: Mapped[Optional[str]] @@ -91,8 +91,8 @@ class User(Base): queen: Mapped[Optional[int]] = mapped_column(default=0) chud_phrase: Mapped[Optional[str]] email_verified: Mapped[bool] = mapped_column(default=False) - shadowbanned: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) - chudded_by: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + shadowbanned: Mapped[Optional[user_id_fk]] + chudded_by: Mapped[Optional[user_id_fk]] slurreplacer: Mapped[int] = mapped_column(default=1) profanityreplacer: Mapped[int] = mapped_column(default=1) flairchanged: Mapped[Optional[int]] = mapped_column(default=0) @@ -111,7 +111,7 @@ class User(Base): friends_html: Mapped[Optional[str]] = mapped_column(deferred=True) enemies: Mapped[Optional[str]] = mapped_column(deferred=True) enemies_html: Mapped[Optional[str]] = mapped_column(deferred=True) - is_banned: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + is_banned: Mapped[Optional[user_id_fk]] unban_utc: Mapped[Optional[int]] ban_reason: Mapped[Optional[str]] = mapped_column(deferred=True) shadowban_reason: Mapped[Optional[str]] = mapped_column(deferred=True) @@ -130,7 +130,7 @@ class User(Base): original_username: Mapped[Optional[str]] extra_username: Mapped[Optional[str]] prelock_username: Mapped[Optional[str]] - referred_by: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + referred_by: Mapped[Optional[user_id_fk]] currently_held_lottery_tickets: Mapped[int] = mapped_column(default=0) total_held_lottery_tickets: Mapped[int] = mapped_column(default=0) total_lottery_winnings: Mapped[int] = mapped_column(default=0) @@ -146,7 +146,7 @@ class User(Base): spider: Mapped[Optional[int]] = mapped_column(default=0) lifetimedonated: Mapped[int] = mapped_column(default=0) lifetimedonated_visible: Mapped[bool] = mapped_column(default=False) - blacklisted_by: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id")) + blacklisted_by: Mapped[Optional[user_id_fk]] grinch: Mapped[bool] = mapped_column(default=SITE_NAME != 'rDrama') #don't put in an if condition, it will cause an error bc it has a not-null constraint group_creation_notifs: Mapped[bool] = mapped_column(default=False) effortpost_notifs: Mapped[bool] = mapped_column(default=False) diff --git a/files/classes/userblock.py b/files/classes/userblock.py index dbec17558..e25694259 100644 --- a/files/classes/userblock.py +++ b/files/classes/userblock.py @@ -1,11 +1,11 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import user_id_fk_pk if TYPE_CHECKING: from files.classes import User @@ -13,8 +13,8 @@ if TYPE_CHECKING: 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) + user_id: Mapped[user_id_fk_pk] + target_id: Mapped[user_id_fk_pk] created_utc: Mapped[Optional[int]] user: Mapped["User"] = relationship(primaryjoin="User.id==UserBlock.user_id", back_populates="blocking") diff --git a/files/classes/usermute.py b/files/classes/usermute.py index bdec375cd..af5ad1741 100644 --- a/files/classes/usermute.py +++ b/files/classes/usermute.py @@ -1,11 +1,11 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base +from files.helpers.types import user_id_fk_pk if TYPE_CHECKING: from files.classes import User @@ -13,8 +13,8 @@ if TYPE_CHECKING: 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) + user_id: Mapped[user_id_fk_pk] + target_id: Mapped[user_id_fk_pk] created_utc: Mapped[Optional[int]] user: Mapped["User"] = relationship(primaryjoin="User.id==UserMute.user_id") diff --git a/files/classes/views.py b/files/classes/views.py index 74940d901..725d64313 100644 --- a/files/classes/views.py +++ b/files/classes/views.py @@ -1,13 +1,13 @@ import time from typing import Optional, TYPE_CHECKING -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import * from files.helpers.sorting_and_time import make_age_string +from files.helpers.types import user_id_fk_pk if TYPE_CHECKING: from files.classes import User @@ -16,8 +16,8 @@ if TYPE_CHECKING: class ViewerRelationship(Base): __tablename__ = "viewers" - user_id: Mapped[int] = mapped_column(ForeignKey('users.id'), primary_key=True) - viewer_id: Mapped[int] = mapped_column(ForeignKey('users.id'), primary_key=True) + user_id: Mapped[user_id_fk_pk] + viewer_id: Mapped[user_id_fk_pk] last_view_utc: Mapped[int] created_utc: Mapped[Optional[int]] diff --git a/files/classes/votes.py b/files/classes/votes.py index 4c8a079e4..6f987afdc 100644 --- a/files/classes/votes.py +++ b/files/classes/votes.py @@ -1,12 +1,12 @@ import time from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql.sqltypes import * from files.classes import Base from files.helpers.lazy import lazy +from files.helpers.types import comment_id_fk_pk, post_id_fk_pk, user_id_fk_pk if TYPE_CHECKING: from files.classes import User @@ -15,8 +15,8 @@ if TYPE_CHECKING: class Vote(Base): __tablename__ = "votes" - post_id: Mapped[int] = mapped_column(ForeignKey("posts.id"), primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + post_id: Mapped[post_id_fk_pk] + user_id: Mapped[user_id_fk_pk] vote_type: Mapped[int] real: Mapped[bool] = mapped_column(default=True) coins: Mapped[int] = mapped_column(default=1) @@ -45,8 +45,8 @@ class CommentVote(Base): __tablename__ = "commentvotes" - comment_id: Mapped[int] = mapped_column(ForeignKey("comments.id"), primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), primary_key=True) + comment_id: Mapped[comment_id_fk_pk] + user_id: Mapped[user_id_fk_pk] vote_type: Mapped[int] real: Mapped[bool] = mapped_column(default=True) coins: Mapped[int] = mapped_column(default=1) diff --git a/files/helpers/types.py b/files/helpers/types.py new file mode 100644 index 000000000..085070483 --- /dev/null +++ b/files/helpers/types.py @@ -0,0 +1,14 @@ +from typing import Annotated + +from sqlalchemy.sql.schema import ForeignKey +from sqlalchemy.orm import mapped_column + +int_pk = Annotated[int, mapped_column(primary_key=True)] +str_pk = Annotated[str, mapped_column(primary_key=True)] + +user_id_fk = Annotated[int, mapped_column(ForeignKey("users.id"))] +user_id_fk_pk = Annotated[int, mapped_column(ForeignKey("users.id"), primary_key=True)] +post_id_fk = Annotated[int, mapped_column(ForeignKey("posts.id"))] +post_id_fk_pk = Annotated[int, mapped_column(ForeignKey("posts.id"), primary_key=True)] +comment_id_fk = Annotated[int, mapped_column(ForeignKey("comments.id"))] +comment_id_fk_pk = Annotated[int, mapped_column(ForeignKey("comments.id"), primary_key=True)] \ No newline at end of file