rename submissions to posts

master
Aevann 2023-06-08 02:26:32 +03:00
parent bf078e2f1a
commit 32fa466e6a
55 changed files with 401 additions and 389 deletions

View File

@ -4290,7 +4290,7 @@ small, .small {
text-decoration: none; text-decoration: none;
} }
.post-meta-domain { .post-meta-domain {
/* fixes very long domains overflowing submission_listing */ /* fixes very long domains overflowing post_listing */
display: inline-block; display: inline-block;
max-width: 20em; max-width: 20em;
overflow: hidden; overflow: hidden;
@ -4868,10 +4868,10 @@ ul.comment-section {
width: 100% !important; width: 100% !important;
} }
} }
.submission .body { .post .body {
padding: 1rem; padding: 1rem;
} }
.submission .footer { .post .footer {
background-color: transparent; background-color: transparent;
padding: 1rem; padding: 1rem;
border-bottom-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem;
@ -5149,13 +5149,13 @@ pre .com, code .com {
#thread .post-title { #thread .post-title {
font-size: 16px; font-size: 16px;
} }
#submit .submission { #submit .post {
border: none; border: none;
} }
#submit .submission .body { #submit .post .body {
padding: 0; padding: 0;
} }
#submit .submission .footer { #submit .post .footer {
background: transparent; background: transparent;
padding: 1rem 0; padding: 1rem 0;
} }

View File

@ -11,7 +11,7 @@ from .flags import *
from .user import * from .user import *
from .badges import * from .badges import *
from .userblock import * from .userblock import *
from .submission import * from .post import *
from .votes import * from .votes import *
from .domains import * from .domains import *
from .subscriptions import * from .subscriptions import *

View File

@ -14,7 +14,7 @@ class AwardRelationship(Base):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id")) user_id = Column(Integer, ForeignKey("users.id"))
submission_id = Column(Integer, ForeignKey("submissions.id")) post_id = Column(Integer, ForeignKey("posts.id"))
comment_id = Column(Integer, ForeignKey("comments.id")) comment_id = Column(Integer, ForeignKey("comments.id"))
kind = Column(String, nullable=False) kind = Column(String, nullable=False)
awarded_utc = Column(Integer) awarded_utc = Column(Integer)
@ -22,7 +22,7 @@ class AwardRelationship(Base):
price_paid = Column(Integer, default = 0, nullable=False) price_paid = Column(Integer, default = 0, nullable=False)
user = relationship("User", primaryjoin="AwardRelationship.user_id==User.id", back_populates="awards") user = relationship("User", primaryjoin="AwardRelationship.user_id==User.id", back_populates="awards")
post = relationship("Submission", primaryjoin="AwardRelationship.submission_id==Submission.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") comment = relationship("Comment", primaryjoin="AwardRelationship.comment_id==Comment.id", back_populates="awards")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@ -9,7 +9,7 @@ from files.helpers.config.const import *
from files.helpers.lazy import lazy from files.helpers.lazy import lazy
from .comment import Comment from .comment import Comment
from .submission import Submission from .post import Post
class OauthApp(Base): class OauthApp(Base):
__tablename__ = "oauth_apps" __tablename__ = "oauth_apps"

View File

@ -105,7 +105,7 @@ class Comment(Base):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
author_id = Column(Integer, ForeignKey("users.id")) author_id = Column(Integer, ForeignKey("users.id"))
parent_submission = Column(Integer, ForeignKey("submissions.id")) parent_submission = Column(Integer, ForeignKey("posts.id"))
wall_user_id = Column(Integer, ForeignKey("users.id")) wall_user_id = Column(Integer, ForeignKey("users.id"))
created_utc = Column(Integer) created_utc = Column(Integer)
edited_utc = Column(Integer, default=0) edited_utc = Column(Integer, default=0)
@ -139,7 +139,7 @@ class Comment(Base):
casino_game_id = Column(Integer, ForeignKey("casino_games.id")) casino_game_id = Column(Integer, ForeignKey("casino_games.id"))
oauth_app = relationship("OauthApp") oauth_app = relationship("OauthApp")
post = relationship("Submission", back_populates="comments") post = relationship("Post", back_populates="comments")
author = relationship("User", primaryjoin="User.id==Comment.author_id") author = relationship("User", primaryjoin="User.id==Comment.author_id")
senttouser = relationship("User", primaryjoin="User.id==Comment.sentto") senttouser = relationship("User", primaryjoin="User.id==Comment.sentto")
parent_comment = relationship("Comment", remote_side=[id]) parent_comment = relationship("Comment", remote_side=[id])

View File

@ -11,7 +11,7 @@ from files.helpers.regex import censor_slurs
class Flag(Base): class Flag(Base):
__tablename__ = "flags" __tablename__ = "flags"
post_id = Column(Integer, ForeignKey("submissions.id"), primary_key=True) post_id = Column(Integer, ForeignKey("posts.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True) user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
reason = Column(String) reason = Column(String)
created_utc = Column(Integer) created_utc = Column(Integer)

View File

@ -16,14 +16,14 @@ class ModAction(Base):
user_id = Column(Integer, ForeignKey("users.id")) user_id = Column(Integer, ForeignKey("users.id"))
kind = Column(String) kind = Column(String)
target_user_id = Column(Integer, ForeignKey("users.id")) target_user_id = Column(Integer, ForeignKey("users.id"))
target_submission_id = Column(Integer, ForeignKey("submissions.id")) target_post_id = Column(Integer, ForeignKey("posts.id"))
target_comment_id = Column(Integer, ForeignKey("comments.id")) target_comment_id = Column(Integer, ForeignKey("comments.id"))
_note=Column(String) _note=Column(String)
created_utc = Column(Integer) created_utc = Column(Integer)
user = relationship("User", primaryjoin="User.id==ModAction.user_id") user = relationship("User", primaryjoin="User.id==ModAction.user_id")
target_user = relationship("User", primaryjoin="User.id==ModAction.target_user_id") target_user = relationship("User", primaryjoin="User.id==ModAction.target_user_id")
target_post = relationship("Submission") target_post = relationship("Post")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())

View File

@ -7,17 +7,17 @@ from sqlalchemy.sql.sqltypes import *
from files.classes import Base from files.classes import Base
from files.helpers.lazy import lazy from files.helpers.lazy import lazy
class SubmissionOption(Base): class PostOption(Base):
__tablename__ = "submission_options" __tablename__ = "post_options"
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey("submissions.id")) parent_id = Column(Integer, ForeignKey("posts.id"))
body_html = Column(Text) body_html = Column(Text)
exclusive = Column(Integer) exclusive = Column(Integer)
created_utc = Column(Integer) created_utc = Column(Integer)
votes = relationship("SubmissionOptionVote") votes = relationship("PostOptionVote")
parent = relationship("Submission", back_populates="options") parent = relationship("Post", back_populates="options")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
@ -37,14 +37,14 @@ class SubmissionOption(Base):
return v.id in [x.user_id for x in self.votes] return v.id in [x.user_id for x in self.votes]
class SubmissionOptionVote(Base): class PostOptionVote(Base):
__tablename__ = "submission_option_votes" __tablename__ = "post_option_votes"
option_id = Column(Integer, ForeignKey("submission_options.id"), primary_key=True) option_id = Column(Integer, ForeignKey("post_options.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True) user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
created_utc = Column(Integer) created_utc = Column(Integer)
submission_id = Column(Integer, ForeignKey("submissions.id")) post_id = Column(Integer, ForeignKey("posts.id"))
user = relationship("User") user = relationship("User")

View File

@ -19,8 +19,8 @@ from .sub import *
from .subscriptions import * from .subscriptions import *
from .saves import SaveRelationship from .saves import SaveRelationship
class Submission(Base): class Post(Base):
__tablename__ = "submissions" __tablename__ = "posts"
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
author_id = Column(Integer, ForeignKey("users.id")) author_id = Column(Integer, ForeignKey("users.id"))
@ -60,14 +60,14 @@ class Submission(Base):
new = Column(Boolean) new = Column(Boolean)
notify = Column(Boolean) notify = Column(Boolean)
author = relationship("User", primaryjoin="Submission.author_id==User.id") author = relationship("User", primaryjoin="Post.author_id==User.id")
oauth_app = relationship("OauthApp") oauth_app = relationship("OauthApp")
approved_by = relationship("User", uselist=False, primaryjoin="Submission.is_approved==User.id") approved_by = relationship("User", uselist=False, primaryjoin="Post.is_approved==User.id")
awards = relationship("AwardRelationship", order_by="AwardRelationship.awarded_utc.desc()", back_populates="post") awards = relationship("AwardRelationship", order_by="AwardRelationship.awarded_utc.desc()", back_populates="post")
flags = relationship("Flag", order_by="Flag.created_utc") flags = relationship("Flag", order_by="Flag.created_utc")
comments = relationship("Comment", primaryjoin="Comment.parent_submission==Submission.id", back_populates="post") comments = relationship("Comment", primaryjoin="Comment.parent_submission==Post.id", back_populates="post")
subr = relationship("Sub", primaryjoin="foreign(Submission.sub)==remote(Sub.name)") subr = relationship("Sub", primaryjoin="foreign(Post.sub)==remote(Sub.name)")
options = relationship("SubmissionOption", order_by="SubmissionOption.id") options = relationship("PostOption", order_by="PostOption.id")
bump_utc = deferred(Column(Integer, server_default=FetchedValue())) bump_utc = deferred(Column(Integer, server_default=FetchedValue()))
@ -372,9 +372,9 @@ class Submission(Base):
@property @property
@lazy @lazy
def num_subscribers(self): def num_subscribers(self):
return g.db.query(Subscription).filter_by(submission_id=self.id).count() return g.db.query(Subscription).filter_by(post_id=self.id).count()
@property @property
@lazy @lazy
def num_savers(self): def num_savers(self):
return g.db.query(SaveRelationship).filter_by(submission_id=self.id).count() return g.db.query(SaveRelationship).filter_by(post_id=self.id).count()

View File

@ -10,17 +10,17 @@ class SaveRelationship(Base):
__tablename__="save_relationship" __tablename__="save_relationship"
user_id=Column(Integer, ForeignKey("users.id"), primary_key=True) user_id=Column(Integer, ForeignKey("users.id"), primary_key=True)
submission_id=Column(Integer, ForeignKey("submissions.id"), primary_key=True) post_id=Column(Integer, ForeignKey("posts.id"), primary_key=True)
created_utc = Column(Integer) created_utc = Column(Integer)
post = relationship("Submission", uselist=False) post = relationship("Post", uselist=False)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def __repr__(self): def __repr__(self):
return f"<{self.__class__.__name__}(user_id={self.user_id}, submission_id={self.submission_id})>" return f"<{self.__class__.__name__}(user_id={self.user_id}, post_id={self.post_id})>"
class CommentSaveRelationship(Base): class CommentSaveRelationship(Base):

View File

@ -17,14 +17,14 @@ class SubAction(Base):
user_id = Column(Integer, ForeignKey("users.id")) user_id = Column(Integer, ForeignKey("users.id"))
kind = Column(String) kind = Column(String)
target_user_id = Column(Integer, ForeignKey("users.id")) target_user_id = Column(Integer, ForeignKey("users.id"))
target_submission_id = Column(Integer, ForeignKey("submissions.id")) target_post_id = Column(Integer, ForeignKey("posts.id"))
target_comment_id = Column(Integer, ForeignKey("comments.id")) target_comment_id = Column(Integer, ForeignKey("comments.id"))
_note=Column(String) _note=Column(String)
created_utc = Column(Integer) created_utc = Column(Integer)
user = relationship("User", primaryjoin="User.id==SubAction.user_id") user = relationship("User", primaryjoin="User.id==SubAction.user_id")
target_user = relationship("User", primaryjoin="User.id==SubAction.target_user_id") target_user = relationship("User", primaryjoin="User.id==SubAction.target_user_id")
target_post = relationship("Submission") target_post = relationship("Post")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())

View File

@ -9,11 +9,11 @@ from files.classes import Base
class Subscription(Base): class Subscription(Base):
__tablename__ = "subscriptions" __tablename__ = "subscriptions"
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True) user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
submission_id = Column(Integer, ForeignKey("submissions.id"), primary_key=True) post_id = Column(Integer, ForeignKey("posts.id"), primary_key=True)
created_utc = Column(Integer) created_utc = Column(Integer)
user = relationship("User", uselist=False) user = relationship("User", uselist=False)
post = relationship("Submission", uselist=False) post = relationship("Post", uselist=False)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time()) if "created_utc" not in kwargs: kwargs["created_utc"] = int(time.time())

View File

@ -460,10 +460,10 @@ class User(Base):
return self.offsitementions or self.admin_level >= PERMS['NOTIFICATIONS_REDDIT'] return self.offsitementions or self.admin_level >= PERMS['NOTIFICATIONS_REDDIT']
@lazy @lazy
def can_edit(self, target:Union[Submission, Comment]) -> bool: def can_edit(self, target:Union[Post, Comment]) -> bool:
if isinstance(target, Comment) and not target.post: return False if isinstance(target, Comment) and not target.post: return False
if self.id == target.author_id: return True if self.id == target.author_id: return True
if not isinstance(target, Submission): return False if not isinstance(target, Post): return False
return bool(self.admin_level >= PERMS['POST_EDITING']) return bool(self.admin_level >= PERMS['POST_EDITING'])
@property @property
@ -475,7 +475,7 @@ class User(Base):
return_value.append(HOUSE_AWARDS[self.house]) return_value.append(HOUSE_AWARDS[self.house])
awards_owned = g.db.query(AwardRelationship.kind, func.count()) \ awards_owned = g.db.query(AwardRelationship.kind, func.count()) \
.filter_by(user_id=self.id, submission_id=None, comment_id=None) \ .filter_by(user_id=self.id, post_id=None, comment_id=None) \
.group_by(AwardRelationship.kind).all() .group_by(AwardRelationship.kind).all()
awards_owned = dict(awards_owned) awards_owned = dict(awards_owned)
@ -603,7 +603,7 @@ class User(Base):
awards = {} awards = {}
post_awards = g.db.query(AwardRelationship).join(AwardRelationship.post).filter(Submission.author_id == self.id).all() post_awards = g.db.query(AwardRelationship).join(AwardRelationship.post).filter(Post.author_id == self.id).all()
comment_awards = g.db.query(AwardRelationship).join(AwardRelationship.comment).filter(Comment.author_id == self.id).all() comment_awards = g.db.query(AwardRelationship).join(AwardRelationship.comment).filter(Comment.author_id == self.id).all()
total_awards = post_awards + comment_awards total_awards = post_awards + comment_awards
@ -687,19 +687,19 @@ class User(Base):
@property @property
@lazy @lazy
def post_notifications_count(self): def post_notifications_count(self):
return g.db.query(Submission).filter( return g.db.query(Post).filter(
or_( or_(
Submission.author_id.in_(self.followed_users), Post.author_id.in_(self.followed_users),
Submission.sub.in_(self.followed_subs) Post.sub.in_(self.followed_subs)
), ),
Submission.created_utc > self.last_viewed_post_notifs, Post.created_utc > self.last_viewed_post_notifs,
Submission.deleted_utc == 0, Post.deleted_utc == 0,
Submission.is_banned == False, Post.is_banned == False,
Submission.private == False, Post.private == False,
Submission.notify == True, Post.notify == True,
Submission.author_id != self.id, Post.author_id != self.id,
Submission.ghost == False, Post.ghost == False,
Submission.author_id.notin_(self.userblocks) Post.author_id.notin_(self.userblocks)
).count() ).count()
@property @property
@ -932,9 +932,9 @@ class User(Base):
def get_relationship_count(self, relationship_cls): def get_relationship_count(self, relationship_cls):
# TODO: deduplicate (see routes/users.py) # TODO: deduplicate (see routes/users.py)
if relationship_cls in {SaveRelationship, Subscription}: if relationship_cls in {SaveRelationship, Subscription}:
query = relationship_cls.submission_id query = relationship_cls.post_id
join = relationship_cls.post join = relationship_cls.post
cls = Submission cls = Post
elif relationship_cls is CommentSaveRelationship: elif relationship_cls is CommentSaveRelationship:
query = relationship_cls.comment_id query = relationship_cls.comment_id
join = relationship_cls.comment join = relationship_cls.comment
@ -950,7 +950,7 @@ class User(Base):
@property @property
@lazy @lazy
def saved_idlist(self): def saved_idlist(self):
posts = g.db.query(SaveRelationship.submission_id).filter_by(user_id=self.id).all() posts = g.db.query(SaveRelationship.post_id).filter_by(user_id=self.id).all()
return [x[0] for x in posts] return [x[0] for x in posts]
@property @property
@ -962,7 +962,7 @@ class User(Base):
@property @property
@lazy @lazy
def subscribed_idlist(self): def subscribed_idlist(self):
posts = g.db.query(Subscription.submission_id).filter_by(user_id=self.id).all() posts = g.db.query(Subscription.post_id).filter_by(user_id=self.id).all()
return [x[0] for x in posts] return [x[0] for x in posts]
@ -1006,14 +1006,14 @@ class User(Base):
return f'{tier_name} - Donates ${tier_money}/month' return f'{tier_name} - Donates ${tier_money}/month'
@classmethod @classmethod
def can_see_content(cls, user:Optional["User"], other:Union[Submission, Comment, Sub]) -> bool: def can_see_content(cls, user:Optional["User"], other:Union[Post, Comment, Sub]) -> bool:
''' '''
Whether a user can see this item (be it a submission or comment)'s content. Whether a user can see this item (be it a post or comment)'s content.
If False, they won't be able to view its content. If False, they won't be able to view its content.
''' '''
if not cls.can_see(user, other): return False if not cls.can_see(user, other): return False
if user and user.admin_level >= PERMS["POST_COMMENT_MODERATION"]: return True if user and user.admin_level >= PERMS["POST_COMMENT_MODERATION"]: return True
if isinstance(other, (Submission, Comment)): if isinstance(other, (Post, Comment)):
if user and user.id == other.author_id: return True if user and user.id == other.author_id: return True
if other.is_banned: return False if other.is_banned: return False
if other.deleted_utc: return False if other.deleted_utc: return False
@ -1023,15 +1023,15 @@ class User(Base):
return True return True
@classmethod @classmethod
def can_see(cls, user:Optional["User"], other:Union[Submission, Comment, Sub, "User"]) -> bool: def can_see(cls, user:Optional["User"], other:Union[Post, Comment, Sub, "User"]) -> bool:
''' '''
Whether a user can strictly see this item. can_see_content is used where Whether a user can strictly see this item. can_see_content is used where
content of a thing can be hidden from view content of a thing can be hidden from view
''' '''
if isinstance(other, (Submission, Comment)): if isinstance(other, (Post, Comment)):
if not cls.can_see(user, other.author): return False if not cls.can_see(user, other.author): return False
if user and user.id == other.author_id: return True if user and user.id == other.author_id: return True
if isinstance(other, Submission): if isinstance(other, Post):
if not (user and user.patron) and (other.title.lower().startswith('[paypigs]') or other.title.lower().startswith('[patrons]')): if not (user and user.patron) and (other.title.lower().startswith('[paypigs]') or other.title.lower().startswith('[patrons]')):
return False return False
if other.sub and not cls.can_see(user, other.subr): if other.sub and not cls.can_see(user, other.subr):

View File

@ -10,7 +10,7 @@ from files.helpers.lazy import lazy
class Vote(Base): class Vote(Base):
__tablename__ = "votes" __tablename__ = "votes"
submission_id = Column(Integer, ForeignKey("submissions.id"), primary_key=True) post_id = Column(Integer, ForeignKey("posts.id"), primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"), primary_key=True) user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
vote_type = Column(Integer) vote_type = Column(Integer)
app_id = Column(Integer, ForeignKey("oauth_apps.id")) app_id = Column(Integer, ForeignKey("oauth_apps.id"))
@ -32,7 +32,7 @@ class Vote(Base):
def json(self): def json(self):
return { return {
"user_id": self.user_id, "user_id": self.user_id,
"submission_id": self.submission_id, "post_id": self.post_id,
"vote_type": self.vote_type, "vote_type": self.vote_type,
"user": self.user.json, "user": self.user.json,
} }
@ -63,7 +63,7 @@ class CommentVote(Base):
def json(self): def json(self):
return { return {
"user_id": self.user_id, "user_id": self.user_id,
"submission_id": self.submission_id, "post_id": self.post_id,
"vote_type": self.vote_type, "vote_type": self.vote_type,
"user": self.user.json, "user": self.user.json,
} }

View File

@ -10,7 +10,7 @@ from flask import g
from files.classes.flags import Flag from files.classes.flags import Flag
from files.classes.mod_logs import ModAction from files.classes.mod_logs import ModAction
from files.classes.notifications import Notification from files.classes.notifications import Notification
from files.classes.polls import CommentOption, SubmissionOption from files.classes.polls import CommentOption, PostOption
from files.classes.award import AwardRelationship from files.classes.award import AwardRelationship
from files.helpers.alerts import send_repeatable_notification, push_notif from files.helpers.alerts import send_repeatable_notification, push_notif
@ -23,7 +23,7 @@ from files.helpers.sanitize import *
from files.helpers.settings import get_setting from files.helpers.settings import get_setting
from files.helpers.slots import check_slots_command from files.helpers.slots import check_slots_command
post_target_type = Union[Submission, User] post_target_type = Union[Post, User]
def _archiveorg(url): def _archiveorg(url):
try: try:
@ -51,7 +51,7 @@ def snappy_report(post, reason):
message = f'@Snappy reported [{post.title}]({post.shortlink})\n\n> {reason}' message = f'@Snappy reported [{post.title}]({post.shortlink})\n\n> {reason}'
send_repeatable_notification(post.author_id, message) send_repeatable_notification(post.author_id, message)
def execute_snappy(post:Submission, v:User): def execute_snappy(post:Post, v:User):
group_members = [] group_members = []
ghost = post.ghost ghost = post.ghost
@ -92,7 +92,7 @@ def execute_snappy(post:Submission, v:User):
if body.startswith(''): body = body[1:] if body.startswith(''): body = body[1:]
vote = Vote(user_id=SNAPPY_ID, vote = Vote(user_id=SNAPPY_ID,
vote_type=-1, vote_type=-1,
submission_id=post.id, post_id=post.id,
real = True real = True
) )
g.db.add(vote) g.db.add(vote)
@ -105,7 +105,7 @@ def execute_snappy(post:Submission, v:User):
if body.startswith(''): body = body[1:] if body.startswith(''): body = body[1:]
vote = Vote(user_id=SNAPPY_ID, vote = Vote(user_id=SNAPPY_ID,
vote_type=1, vote_type=1,
submission_id=post.id, post_id=post.id,
real = True real = True
) )
g.db.add(vote) g.db.add(vote)
@ -132,7 +132,7 @@ def execute_snappy(post:Submission, v:User):
award_object = AwardRelationship( award_object = AwardRelationship(
user_id=snappy.id, user_id=snappy.id,
kind="glowie", kind="glowie",
submission_id=post.id, post_id=post.id,
) )
g.db.add(award_object) g.db.add(award_object)
@ -256,7 +256,7 @@ def execute_snappy(post:Submission, v:User):
def execute_zozbot(c:Comment, level:int, post_target:post_target_type, v): def execute_zozbot(c:Comment, level:int, post_target:post_target_type, v):
if SITE_NAME != 'rDrama': return if SITE_NAME != 'rDrama': return
posting_to_submission = isinstance(post_target, Submission) posting_to_submission = isinstance(post_target, Post)
if random.random() >= 0.001: return if random.random() >= 0.001: return
c2 = Comment(author_id=ZOZBOT_ID, c2 = Comment(author_id=ZOZBOT_ID,
parent_submission=post_target.id if posting_to_submission else None, parent_submission=post_target.id if posting_to_submission else None,
@ -321,7 +321,7 @@ def execute_zozbot(c:Comment, level:int, post_target:post_target_type, v):
def execute_longpostbot(c:Comment, level:int, body, body_html, post_target:post_target_type, v:User): def execute_longpostbot(c:Comment, level:int, body, body_html, post_target:post_target_type, v:User):
if SITE_NAME != 'rDrama': return if SITE_NAME != 'rDrama': return
posting_to_submission = isinstance(post_target, Submission) posting_to_submission = isinstance(post_target, Post)
if not len(c.body.split()) >= 200: return if not len(c.body.split()) >= 200: return
if "</blockquote>" in body_html: return if "</blockquote>" in body_html: return
body = random.choice(LONGPOST_REPLIES) body = random.choice(LONGPOST_REPLIES)
@ -369,17 +369,17 @@ def execute_antispam_submission_check(title, v, url):
now = int(time.time()) now = int(time.time())
cutoff = now - 60 * 60 * 24 cutoff = now - 60 * 60 * 24
similar_posts = g.db.query(Submission).filter( similar_posts = g.db.query(Post).filter(
Submission.author_id == v.id, Post.author_id == v.id,
Submission.title.op('<->')(title) < SPAM_SIMILARITY_THRESHOLD, Post.title.op('<->')(title) < SPAM_SIMILARITY_THRESHOLD,
Submission.created_utc > cutoff Post.created_utc > cutoff
).all() ).all()
if url: if url:
similar_urls = g.db.query(Submission).filter( similar_urls = g.db.query(Post).filter(
Submission.author_id == v.id, Post.author_id == v.id,
Submission.url.op('<->')(url) < SPAM_URL_SIMILARITY_THRESHOLD, Post.url.op('<->')(url) < SPAM_URL_SIMILARITY_THRESHOLD,
Submission.created_utc > cutoff Post.created_utc > cutoff
).all() ).all()
else: similar_urls = [] else: similar_urls = []
@ -400,7 +400,7 @@ def execute_antispam_submission_check(title, v, url):
g.db.add(post) g.db.add(post)
ma=ModAction( ma=ModAction(
user_id=AUTOJANNY_ID, user_id=AUTOJANNY_ID,
target_submission_id=post.id, target_post_id=post.id,
kind="ban_post", kind="ban_post",
_note="Spam" _note="Spam"
) )
@ -466,7 +466,7 @@ def execute_antispam_comment_check(body:str, v:User):
g.db.commit() g.db.commit()
abort(403, "Too much spam!") abort(403, "Too much spam!")
def execute_under_siege(v:User, target:Optional[Union[Submission, Comment]], body, kind:str) -> bool: def execute_under_siege(v:User, target:Optional[Union[Post, Comment]], body, kind:str) -> bool:
if not get_setting("under_siege"): return if not get_setting("under_siege"): return
if v.shadowbanned: return if v.shadowbanned: return
if v.admin_level >= PERMS['SITE_BYPASS_UNDER_SIEGE_MODE']: return if v.admin_level >= PERMS['SITE_BYPASS_UNDER_SIEGE_MODE']: return
@ -486,7 +486,7 @@ def execute_under_siege(v:User, target:Optional[Union[Submission, Comment]], bod
g.db.add(v) g.db.add(v)
if kind == "report": if kind == "report":
if isinstance(target, Submission): if isinstance(target, Post):
reason = f'report on <a href="{target.permalink}">post</a>' reason = f'report on <a href="{target.permalink}">post</a>'
else: else:
reason = f'report on <a href="{target.permalink}">comment</a>' reason = f'report on <a href="{target.permalink}">comment</a>'
@ -508,7 +508,7 @@ def execute_under_siege(v:User, target:Optional[Union[Submission, Comment]], bod
g.db.add(n) g.db.add(n)
def execute_lawlz_actions(v:User, p:Submission): def execute_lawlz_actions(v:User, p:Post):
if v.id != LAWLZ_ID: return if v.id != LAWLZ_ID: return
if SITE_NAME != 'rDrama': return if SITE_NAME != 'rDrama': return
if not FEATURES['PINS']: return if not FEATURES['PINS']: return
@ -519,18 +519,18 @@ def execute_lawlz_actions(v:User, p:Submission):
ma_1=ModAction( ma_1=ModAction(
kind="pin_post", kind="pin_post",
user_id=AUTOJANNY_ID, user_id=AUTOJANNY_ID,
target_submission_id=p.id, target_post_id=p.id,
_note='for 1 day' _note='for 1 day'
) )
ma_2=ModAction( ma_2=ModAction(
kind="distinguish_post", kind="distinguish_post",
user_id=AUTOJANNY_ID, user_id=AUTOJANNY_ID,
target_submission_id=p.id target_post_id=p.id
) )
ma_3=ModAction( ma_3=ModAction(
kind="flair_post", kind="flair_post",
user_id=AUTOJANNY_ID, user_id=AUTOJANNY_ID,
target_submission_id=p.id, target_post_id=p.id,
_note=f'"{p.flair}"' _note=f'"{p.flair}"'
) )
g.db.add(p) g.db.add(p)
@ -539,7 +539,7 @@ def execute_lawlz_actions(v:User, p:Submission):
g.db.add(ma_3) g.db.add(ma_3)
def process_poll_options(v:User, target:Union[Submission, Comment]): def process_poll_options(v:User, target:Union[Post, Comment]):
patterns = [(poll_regex, 0), (choice_regex, 1)] patterns = [(poll_regex, 0), (choice_regex, 1)]
@ -562,8 +562,8 @@ def process_poll_options(v:User, target:Union[Submission, Comment]):
if len(body) > 500: if len(body) > 500:
abort(400, f"Poll option body too long! (Max 500 characters)") abort(400, f"Poll option body too long! (Max 500 characters)")
if isinstance(target, Submission): if isinstance(target, Post):
cls = SubmissionOption cls = PostOption
else: else:
cls = CommentOption cls = CommentOption

View File

@ -70,10 +70,10 @@ def _sub_inactive_purge_task():
return False return False
one_week_ago = time.time() - 604800 one_week_ago = time.time() - 604800
active_holes = [x[0] for x in g.db.query(Submission.sub).distinct() \ active_holes = [x[0] for x in g.db.query(Post.sub).distinct() \
.filter(Submission.sub != None, Submission.created_utc > one_week_ago, .filter(Post.sub != None, Post.created_utc > one_week_ago,
Submission.private == False, Submission.is_banned == False, Post.private == False, Post.is_banned == False,
Submission.deleted_utc == 0).all()] Post.deleted_utc == 0).all()]
active_holes.extend(['changelog','countryclub','museumofrdrama']) # holes immune from deletion active_holes.extend(['changelog','countryclub','museumofrdrama']) # holes immune from deletion
dead_holes = g.db.query(Sub).filter(Sub.name.notin_(active_holes)).all() dead_holes = g.db.query(Sub).filter(Sub.name.notin_(active_holes)).all()
@ -99,7 +99,7 @@ def _sub_inactive_purge_task():
for admin in admins: for admin in admins:
send_repeatable_notification(admin, f":marseyrave: /h/{name} has been deleted for inactivity after one week without new posts. All posts in it have been moved to the main feed :marseyrave:") send_repeatable_notification(admin, f":marseyrave: /h/{name} has been deleted for inactivity after one week without new posts. All posts in it have been moved to the main feed :marseyrave:")
posts = g.db.query(Submission).filter(Submission.sub.in_(names)).all() posts = g.db.query(Post).filter(Post.sub.in_(names)).all()
for post in posts: for post in posts:
if post.sub == 'programming': if post.sub == 'programming':
post.sub = 'slackernews' post.sub = 'slackernews'
@ -158,7 +158,7 @@ def _leaderboard_task():
cache.set("users13_1", list(users13_1)) cache.set("users13_1", list(users13_1))
cache.set("users13_2", list(users13_2)) cache.set("users13_2", list(users13_2))
votes1 = g.db.query(Submission.author_id, func.count(Submission.author_id)).join(Vote).filter(Vote.vote_type==-1).group_by(Submission.author_id).order_by(func.count(Submission.author_id).desc()).all() votes1 = g.db.query(Post.author_id, func.count(Post.author_id)).join(Vote).filter(Vote.vote_type==-1).group_by(Post.author_id).order_by(func.count(Post.author_id).desc()).all()
votes2 = g.db.query(Comment.author_id, func.count(Comment.author_id)).join(CommentVote).filter(CommentVote.vote_type==-1).group_by(Comment.author_id).order_by(func.count(Comment.author_id).desc()).all() votes2 = g.db.query(Comment.author_id, func.count(Comment.author_id)).join(CommentVote).filter(CommentVote.vote_type==-1).group_by(Comment.author_id).order_by(func.count(Comment.author_id).desc()).all()
votes3 = Counter(dict(votes1)) + Counter(dict(votes2)) votes3 = Counter(dict(votes1)) + Counter(dict(votes2))
users8 = g.db.query(User.id).filter(User.id.in_(votes3.keys())).all() users8 = g.db.query(User.id).filter(User.id.in_(votes3.keys())).all()

View File

@ -4,7 +4,7 @@ from flask import *
from sqlalchemy import and_, any_, or_ from sqlalchemy import and_, any_, or_
from sqlalchemy.orm import joinedload, selectinload, Query from sqlalchemy.orm import joinedload, selectinload, Query
from files.classes import Comment, CommentVote, Hat, Sub, Submission, User, UserBlock, Vote from files.classes import Comment, CommentVote, Hat, Sub, Post, User, UserBlock, Vote
from files.helpers.config.const import * from files.helpers.config.const import *
from files.__main__ import cache from files.__main__ import cache
@ -121,7 +121,7 @@ def get_accounts_dict(ids:Union[Iterable[str], Iterable[int]], v:Optional[User]=
if len(users) != len(ids) and not graceful: abort(404) if len(users) != len(ids) and not graceful: abort(404)
return {u.id:u for u in users} return {u.id:u for u in users}
def get_post(i:Union[str, int], v:Optional[User]=None, graceful=False) -> Optional[Submission]: def get_post(i:Union[str, int], v:Optional[User]=None, graceful=False) -> Optional[Post]:
try: i = int(i) try: i = int(i)
except: except:
if graceful: return None if graceful: return None
@ -132,22 +132,22 @@ def get_post(i:Union[str, int], v:Optional[User]=None, graceful=False) -> Option
else: abort(404) else: abort(404)
if v: if v:
vt = g.db.query(Vote).filter_by(user_id=v.id, submission_id=i).subquery() vt = g.db.query(Vote).filter_by(user_id=v.id, post_id=i).subquery()
blocking = v.blocking.subquery() blocking = v.blocking.subquery()
post = g.db.query( post = g.db.query(
Submission, Post,
vt.c.vote_type, vt.c.vote_type,
blocking.c.target_id, blocking.c.target_id,
) )
post=post.filter(Submission.id == i post=post.filter(Post.id == i
).outerjoin( ).outerjoin(
vt, vt,
vt.c.submission_id == Submission.id, vt.c.post_id == Post.id,
).outerjoin( ).outerjoin(
blocking, blocking,
blocking.c.target_id == Submission.author_id, blocking.c.target_id == Post.author_id,
) )
post=post.one_or_none() post=post.one_or_none()
@ -160,7 +160,7 @@ def get_post(i:Union[str, int], v:Optional[User]=None, graceful=False) -> Option
x.voted = post[1] or 0 x.voted = post[1] or 0
x.is_blocking = post[2] or 0 x.is_blocking = post[2] or 0
else: else:
post = g.db.get(Submission, i) post = g.db.get(Post, i)
if not post: if not post:
if graceful: return None if graceful: return None
else: abort(404) else: abort(404)
@ -169,12 +169,12 @@ def get_post(i:Union[str, int], v:Optional[User]=None, graceful=False) -> Option
return x return x
def get_posts(pids:Iterable[int], v:Optional[User]=None, eager:bool=False, extra:Optional[Callable[[Query], Query]]=None) -> List[Submission]: def get_posts(pids:Iterable[int], v:Optional[User]=None, eager:bool=False, extra:Optional[Callable[[Query], Query]]=None) -> List[Post]:
if not pids: return [] if not pids: return []
if v: if v:
vt = g.db.query(Vote.vote_type, Vote.submission_id).filter( vt = g.db.query(Vote.vote_type, Vote.post_id).filter(
Vote.submission_id.in_(pids), Vote.post_id.in_(pids),
Vote.user_id==v.id Vote.user_id==v.id
).subquery() ).subquery()
@ -182,38 +182,38 @@ def get_posts(pids:Iterable[int], v:Optional[User]=None, eager:bool=False, extra
blocked = v.blocked.subquery() blocked = v.blocked.subquery()
query = g.db.query( query = g.db.query(
Submission, Post,
vt.c.vote_type, vt.c.vote_type,
blocking.c.target_id, blocking.c.target_id,
blocked.c.target_id, blocked.c.target_id,
).filter( ).filter(
Submission.id.in_(pids) Post.id.in_(pids)
).outerjoin( ).outerjoin(
vt, vt.c.submission_id==Submission.id vt, vt.c.post_id==Post.id
).outerjoin( ).outerjoin(
blocking, blocking,
blocking.c.target_id == Submission.author_id, blocking.c.target_id == Post.author_id,
).outerjoin( ).outerjoin(
blocked, blocked,
blocked.c.user_id == Submission.author_id, blocked.c.user_id == Post.author_id,
) )
else: else:
query = g.db.query(Submission).filter(Submission.id.in_(pids)) query = g.db.query(Post).filter(Post.id.in_(pids))
if extra: query = extra(query) if extra: query = extra(query)
if eager: if eager:
query = query.options( query = query.options(
selectinload(Submission.author).options( selectinload(Post.author).options(
selectinload(User.hats_equipped.and_(Hat.equipped == True)) \ selectinload(User.hats_equipped.and_(Hat.equipped == True)) \
.joinedload(Hat.hat_def, innerjoin=True), .joinedload(Hat.hat_def, innerjoin=True),
selectinload(User.badges), selectinload(User.badges),
selectinload(User.sub_mods), selectinload(User.sub_mods),
selectinload(User.sub_exiles), selectinload(User.sub_exiles),
), ),
selectinload(Submission.flags), selectinload(Post.flags),
selectinload(Submission.awards), selectinload(Post.awards),
selectinload(Submission.options), selectinload(Post.options),
) )
results = query.all() results = query.all()
@ -246,16 +246,16 @@ def get_comment(i:Union[str, int], v:Optional[User]=None, graceful=False) -> Opt
return add_vote_and_block_props(comment, v, CommentVote) return add_vote_and_block_props(comment, v, CommentVote)
def add_block_props(target:Union[Submission, Comment, User], v:Optional[User]): def add_block_props(target:Union[Post, Comment, User], v:Optional[User]):
if not v: return target if not v: return target
id = None id = None
if any(isinstance(target, cls) for cls in {Submission, Comment}): if any(isinstance(target, cls) for cls in {Post, Comment}):
id = target.author_id id = target.author_id
elif isinstance(target, User): elif isinstance(target, User):
id = target.id id = target.id
else: else:
raise TypeError("add_block_props only supports non-None submissions, comments, and users") raise TypeError("add_block_props only supports non-None posts, comments, and users")
if hasattr(target, 'is_blocking') and hasattr(target, 'is_blocked'): if hasattr(target, 'is_blocking') and hasattr(target, 'is_blocked'):
return target return target
@ -281,12 +281,12 @@ def add_block_props(target:Union[Submission, Comment, User], v:Optional[User]):
target.is_blocked = block and block.target_id == v.id target.is_blocked = block and block.target_id == v.id
return target return target
def add_vote_props(target:Union[Submission, Comment], v:Optional[User], vote_cls): def add_vote_props(target:Union[Post, Comment], v:Optional[User], vote_cls):
if hasattr(target, 'voted'): return target if hasattr(target, 'voted'): return target
vt = g.db.query(vote_cls.vote_type).filter_by(user_id=v.id) vt = g.db.query(vote_cls.vote_type).filter_by(user_id=v.id)
if vote_cls == Vote: if vote_cls == Vote:
vt = vt.filter_by(submission_id=target.id) vt = vt.filter_by(post_id=target.id)
elif vote_cls == CommentVote: elif vote_cls == CommentVote:
vt = vt.filter_by(comment_id=target.id) vt = vt.filter_by(comment_id=target.id)
else: else:
@ -295,7 +295,7 @@ def add_vote_props(target:Union[Submission, Comment], v:Optional[User], vote_cls
target.voted = vt.vote_type if vt else 0 target.voted = vt.vote_type if vt else 0
return target return target
def add_vote_and_block_props(target:Union[Submission, Comment], v:Optional[User], vote_cls): def add_vote_and_block_props(target:Union[Post, Comment], v:Optional[User], vote_cls):
if not v: return target if not v: return target
target = add_block_props(target, v) target = add_block_props(target, v)
return add_vote_props(target, v, vote_cls) return add_vote_props(target, v, vote_cls)

View File

@ -33,7 +33,7 @@ def offsite_mentions_task(cache:Cache):
g.db.commit() # commit early otherwise localhost testing fails to commit g.db.commit() # commit early otherwise localhost testing fails to commit
def get_mentions(cache:Cache, queries:Iterable[str], reddit_notifs_users=False): def get_mentions(cache:Cache, queries:Iterable[str], reddit_notifs_users=False):
kinds = ['submission', 'comment'] kinds = ['post', 'comment']
mentions = [] mentions = []
exclude_subreddits = ['PokemonGoRaids', 'SubSimulatorGPT2', 'SubSimGPT2Interactive'] exclude_subreddits = ['PokemonGoRaids', 'SubSimulatorGPT2', 'SubSimGPT2Interactive']
try: try:

View File

@ -690,7 +690,7 @@ def complies_with_chud(obj):
#check for cases where u should leave #check for cases where u should leave
if not obj.author.agendaposter: return True if not obj.author.agendaposter: return True
if obj.author.marseyawarded: return True if obj.author.marseyawarded: return True
if isinstance(obj, Submission): if isinstance(obj, Post):
if obj.id in ADMIGGER_THREADS: return True if obj.id in ADMIGGER_THREADS: return True
if obj.sub == "chudrama": return True if obj.sub == "chudrama": return True
elif obj.parent_submission: elif obj.parent_submission:
@ -709,7 +709,7 @@ def complies_with_chud(obj):
obj.body_html = str(soup).replace('<html><body>','').replace('</body></html>','') obj.body_html = str(soup).replace('<html><body>','').replace('</body></html>','')
#torture title_html and check for agendaposter_phrase in plain title and leave if it's there #torture title_html and check for agendaposter_phrase in plain title and leave if it's there
if isinstance(obj, Submission): if isinstance(obj, Post):
obj.title_html = torture_ap(obj.title_html, obj.author.username) obj.title_html = torture_ap(obj.title_html, obj.author.username)
if obj.author.agendaposter_phrase in obj.title.lower(): if obj.author.agendaposter_phrase in obj.title.lower():
return True return True

View File

@ -29,25 +29,25 @@ def sort_objects(sort, objects, cls):
if sort == 'hot': if sort == 'hot':
ti = int(time.time()) + 3600 ti = int(time.time()) + 3600
metric = cls.realupvotes metric = cls.realupvotes
if cls.__name__ == "Submission": metric += cls.comment_count/5 if cls.__name__ == "Post": metric += cls.comment_count/5
return objects.order_by(-1000000*(metric + 1)/(func.power(((ti - cls.created_utc)/1000), 1.35)), cls.created_utc.desc()) return objects.order_by(-1000000*(metric + 1)/(func.power(((ti - cls.created_utc)/1000), 1.35)), cls.created_utc.desc())
elif sort == "views" and cls.__name__ == "Submission": elif sort == "views" and cls.__name__ == "Post":
return objects.order_by(cls.views.desc(), cls.created_utc.desc()) return objects.order_by(cls.views.desc(), cls.created_utc.desc())
elif sort == "bump" and cls.__name__ == "Submission": elif sort == "bump" and cls.__name__ == "Post":
return objects.filter(cls.comment_count > 1).order_by(cls.bump_utc.desc(), cls.created_utc.desc()) return objects.filter(cls.comment_count > 1).order_by(cls.bump_utc.desc(), cls.created_utc.desc())
elif sort == "comments" and cls.__name__ == "Submission": elif sort == "comments" and cls.__name__ == "Post":
return objects.order_by(cls.comment_count.desc(), cls.created_utc.desc()) return objects.order_by(cls.comment_count.desc(), cls.created_utc.desc())
elif sort == "subscriptions" and cls.__name__ == "Submission": elif sort == "subscriptions" and cls.__name__ == "Post":
return objects.outerjoin(Subscription, Subscription.submission_id == cls.id).group_by(cls.id).order_by(func.count(Subscription.submission_id).desc(), cls.created_utc.desc()) return objects.outerjoin(Subscription, Subscription.post_id == cls.id).group_by(cls.id).order_by(func.count(Subscription.post_id).desc(), cls.created_utc.desc())
elif sort == "saves" and cls.__name__ == "Submission": elif sort == "saves" and cls.__name__ == "Post":
return objects.outerjoin(SaveRelationship, SaveRelationship.submission_id == cls.id).group_by(cls.id).order_by(func.count(SaveRelationship.submission_id).desc(), cls.created_utc.desc()) return objects.outerjoin(SaveRelationship, SaveRelationship.post_id == cls.id).group_by(cls.id).order_by(func.count(SaveRelationship.post_id).desc(), cls.created_utc.desc())
elif sort == "saves" and cls.__name__ == "Comment": elif sort == "saves" and cls.__name__ == "Comment":
return objects.outerjoin(CommentSaveRelationship, CommentSaveRelationship.comment_id == cls.id).group_by(cls.id).order_by(func.count(CommentSaveRelationship.comment_id).desc(), cls.created_utc.desc()) return objects.outerjoin(CommentSaveRelationship, CommentSaveRelationship.comment_id == cls.id).group_by(cls.id).order_by(func.count(CommentSaveRelationship.comment_id).desc(), cls.created_utc.desc())
elif sort == "new": elif sort == "new":
return objects.order_by(cls.created_utc.desc()) return objects.order_by(cls.created_utc.desc())
elif sort == "old": elif sort == "old":
return objects.order_by(cls.created_utc) return objects.order_by(cls.created_utc)
elif sort == "controversial" and cls.__name__ == "Submission": elif sort == "controversial" and cls.__name__ == "Post":
return objects.order_by((cls.upvotes+1)/(cls.downvotes+1) + (cls.downvotes+1)/(cls.upvotes+1) - cls.comment_count/500, cls.downvotes.desc(), cls.created_utc.desc()) return objects.order_by((cls.upvotes+1)/(cls.downvotes+1) + (cls.downvotes+1)/(cls.upvotes+1) - cls.comment_count/500, cls.downvotes.desc(), cls.created_utc.desc())
elif sort == "controversial": elif sort == "controversial":
return objects.order_by((cls.upvotes+1)/(cls.downvotes+1) + (cls.downvotes+1)/(cls.upvotes+1), cls.downvotes.desc(), cls.created_utc.desc()) return objects.order_by((cls.upvotes+1)/(cls.downvotes+1) + (cls.downvotes+1)/(cls.upvotes+1), cls.downvotes.desc(), cls.created_utc.desc())

View File

@ -5,7 +5,7 @@ import matplotlib.pyplot as plt
from sqlalchemy import * from sqlalchemy import *
from files.classes.user import User from files.classes.user import User
from files.classes.submission import Submission from files.classes.post import Post
from files.classes.comment import Comment from files.classes.comment import Comment
from files.classes.votes import Vote, CommentVote from files.classes.votes import Vote, CommentVote
from files.classes.emoji import * from files.classes.emoji import *
@ -42,10 +42,10 @@ def chart(kind, site):
User.created_utc > day_cutoffs[i + 1]).count() User.created_utc > day_cutoffs[i + 1]).count()
for i in range(len(day_cutoffs) - 1)][::-1] for i in range(len(day_cutoffs) - 1)][::-1]
post_stats = [g.db.query(Submission).filter( post_stats = [g.db.query(Post).filter(
Submission.created_utc < day_cutoffs[i], Post.created_utc < day_cutoffs[i],
Submission.created_utc > day_cutoffs[i + 1], Post.created_utc > day_cutoffs[i + 1],
Submission.is_banned == False).count() Post.is_banned == False).count()
for i in range(len(day_cutoffs) - 1)][::-1] for i in range(len(day_cutoffs) - 1)][::-1]
comment_stats = [g.db.query(Comment).filter( comment_stats = [g.db.query(Comment).filter(
@ -89,7 +89,7 @@ def stats():
now = time.time() now = time.time()
day = int(now) - 86400 day = int(now) - 86400
week = int(now) - 604800 week = int(now) - 604800
posters = g.db.query(Submission.author_id).distinct(Submission.author_id).filter(Submission.created_utc > week).all() posters = g.db.query(Post.author_id).distinct(Post.author_id).filter(Post.created_utc > week).all()
commenters = g.db.query(Comment.author_id).distinct(Comment.author_id).filter(Comment.created_utc > week).all() commenters = g.db.query(Comment.author_id).distinct(Comment.author_id).filter(Comment.created_utc > week).all()
voters = g.db.query(Vote.user_id).distinct(Vote.user_id).filter(Vote.created_utc > week).all() voters = g.db.query(Vote.user_id).distinct(Vote.user_id).filter(Vote.created_utc > week).all()
commentvoters = g.db.query(CommentVote.user_id).distinct(CommentVote.user_id).filter(CommentVote.created_utc > week).all() commentvoters = g.db.query(CommentVote.user_id).distinct(CommentVote.user_id).filter(CommentVote.created_utc > week).all()
@ -105,12 +105,12 @@ def stats():
"coins in circulation": "{:,}".format(g.db.query(func.sum(User.coins)).scalar()), "coins in circulation": "{:,}".format(g.db.query(func.sum(User.coins)).scalar()),
"total shop sales": "{:,}".format(g.db.query(func.sum(User.coins_spent)).scalar()), "total shop sales": "{:,}".format(g.db.query(func.sum(User.coins_spent)).scalar()),
"signups last 24h": "{:,}".format(g.db.query(User).filter(User.created_utc > day).count()), "signups last 24h": "{:,}".format(g.db.query(User).filter(User.created_utc > day).count()),
"total posts": "{:,}".format(g.db.query(Submission).count()), "total posts": "{:,}".format(g.db.query(Post).count()),
"posting users": "{:,}".format(g.db.query(Submission.author_id).distinct().count()), "posting users": "{:,}".format(g.db.query(Post.author_id).distinct().count()),
"listed posts": "{:,}".format(g.db.query(Submission).filter_by(is_banned=False).filter(Submission.deleted_utc == 0).count()), "listed posts": "{:,}".format(g.db.query(Post).filter_by(is_banned=False).filter(Post.deleted_utc == 0).count()),
"removed posts (by admins)": "{:,}".format(g.db.query(Submission).filter_by(is_banned=True).count()), "removed posts (by admins)": "{:,}".format(g.db.query(Post).filter_by(is_banned=True).count()),
"deleted posts (by author)": "{:,}".format(g.db.query(Submission).filter(Submission.deleted_utc > 0).count()), "deleted posts (by author)": "{:,}".format(g.db.query(Post).filter(Post.deleted_utc > 0).count()),
"posts last 24h": "{:,}".format(g.db.query(Submission).filter(Submission.created_utc > day).count()), "posts last 24h": "{:,}".format(g.db.query(Post).filter(Post.created_utc > day).count()),
"total comments": "{:,}".format(g.db.query(Comment).filter(Comment.author_id != AUTOJANNY_ID).count()), "total comments": "{:,}".format(g.db.query(Comment).filter(Comment.author_id != AUTOJANNY_ID).count()),
"commenting users": "{:,}".format(g.db.query(Comment.author_id).distinct().count()), "commenting users": "{:,}".format(g.db.query(Comment.author_id).distinct().count()),
"removed comments (by admins)": "{:,}".format(g.db.query(Comment).filter_by(is_banned=True).count()), "removed comments (by admins)": "{:,}".format(g.db.query(Comment).filter_by(is_banned=True).count()),
@ -121,7 +121,7 @@ def stats():
"total upvotes": "{:,}".format(g.db.query(Vote).filter_by(vote_type=1).count() + g.db.query(CommentVote).filter_by(vote_type=1).count()), "total upvotes": "{:,}".format(g.db.query(Vote).filter_by(vote_type=1).count() + g.db.query(CommentVote).filter_by(vote_type=1).count()),
"total downvotes": "{:,}".format(g.db.query(Vote).filter_by(vote_type=-1).count() + g.db.query(CommentVote).filter_by(vote_type=-1).count()), "total downvotes": "{:,}".format(g.db.query(Vote).filter_by(vote_type=-1).count() + g.db.query(CommentVote).filter_by(vote_type=-1).count()),
"total awards": "{:,}".format(g.db.query(AwardRelationship).count()), "total awards": "{:,}".format(g.db.query(AwardRelationship).count()),
"awards given": "{:,}".format(g.db.query(AwardRelationship).filter(or_(AwardRelationship.submission_id != None, AwardRelationship.comment_id != None)).count()), "awards given": "{:,}".format(g.db.query(AwardRelationship).filter(or_(AwardRelationship.post_id != None, AwardRelationship.comment_id != None)).count()),
"users who posted, commented, or voted in the past 7 days": "{:,}".format(len(active_users)), "users who posted, commented, or voted in the past 7 days": "{:,}".format(len(active_users)),
"users online in the past 7 days": "{:,}".format(g.db.query(User).filter(User.last_active > week).count()), "users online in the past 7 days": "{:,}".format(g.db.query(User).filter(User.last_active > week).count()),
} }

View File

@ -163,7 +163,7 @@ def distribute(v:User, kind, option_id):
try: option_id = int(option_id) try: option_id = int(option_id)
except: abort(400) except: abort(400)
if kind == 'post': cls = SubmissionOption if kind == 'post': cls = PostOption
else: cls = CommentOption else: cls = CommentOption
option = g.db.get(cls, option_id) option = g.db.get(cls, option_id)
@ -203,11 +203,11 @@ def distribute(v:User, kind, option_id):
for uid in losing_voters: for uid in losing_voters:
add_notif(cid, uid, text) add_notif(cid, uid, text)
if isinstance(parent, Submission): if isinstance(parent, Post):
ma = ModAction( ma = ModAction(
kind="distribute", kind="distribute",
user_id=v.id, user_id=v.id,
target_submission_id=parent.id target_post_id=parent.id
) )
else: else:
ma = ModAction( ma = ModAction(
@ -241,8 +241,8 @@ def revert_actions(v:User, username):
cutoff = int(time.time()) - 86400 cutoff = int(time.time()) - 86400
posts = [x[0] for x in g.db.query(ModAction.target_submission_id).filter(ModAction.user_id == revertee.id, ModAction.created_utc > cutoff, ModAction.kind == 'ban_post').all()] posts = [x[0] for x in g.db.query(ModAction.target_post_id).filter(ModAction.user_id == revertee.id, ModAction.created_utc > cutoff, ModAction.kind == 'ban_post').all()]
posts = g.db.query(Submission).filter(Submission.id.in_(posts)).all() posts = g.db.query(Post).filter(Post.id.in_(posts)).all()
comments = [x[0] for x in g.db.query(ModAction.target_comment_id).filter(ModAction.user_id == revertee.id, ModAction.created_utc > cutoff, ModAction.kind == 'ban_comment').all()] comments = [x[0] for x in g.db.query(ModAction.target_comment_id).filter(ModAction.user_id == revertee.id, ModAction.created_utc > cutoff, ModAction.kind == 'ban_comment').all()]
comments = g.db.query(Comment).filter(Comment.id.in_(comments)).all() comments = g.db.query(Comment).filter(Comment.id.in_(comments)).all()
@ -299,9 +299,9 @@ def image_posts_listing(v):
try: page = int(request.values.get('page', 1)) try: page = int(request.values.get('page', 1))
except: page = 1 except: page = 1
posts = g.db.query(Submission).options( posts = g.db.query(Post).options(
load_only(Submission.id, Submission.url) load_only(Post.id, Post.url)
).order_by(Submission.id.desc()) ).order_by(Post.id.desc())
posts = [x.id for x in posts if x.is_image] posts = [x.id for x in posts if x.is_image]
@ -323,15 +323,15 @@ def image_posts_listing(v):
def reported_posts(v): def reported_posts(v):
page = get_page() page = get_page()
listing = g.db.query(Submission).options(load_only(Submission.id)).filter_by( listing = g.db.query(Post).options(load_only(Post.id)).filter_by(
is_approved=None, is_approved=None,
is_banned=False, is_banned=False,
deleted_utc=0 deleted_utc=0
).join(Submission.flags) ).join(Post.flags)
total = listing.count() total = listing.count()
listing = listing.order_by(Submission.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE) listing = listing.order_by(Post.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE)
listing = [p.id for p in listing] listing = [p.id for p in listing]
listing = get_posts(listing, v=v) listing = get_posts(listing, v=v)
@ -566,11 +566,11 @@ def alt_votes_get(v):
u2 = get_user(u2) u2 = get_user(u2)
u1_post_ups = g.db.query( u1_post_ups = g.db.query(
Vote.submission_id).filter_by( Vote.post_id).filter_by(
user_id=u1.id, user_id=u1.id,
vote_type=1).all() vote_type=1).all()
u1_post_downs = g.db.query( u1_post_downs = g.db.query(
Vote.submission_id).filter_by( Vote.post_id).filter_by(
user_id=u1.id, user_id=u1.id,
vote_type=-1).all() vote_type=-1).all()
u1_comment_ups = g.db.query( u1_comment_ups = g.db.query(
@ -582,11 +582,11 @@ def alt_votes_get(v):
user_id=u1.id, user_id=u1.id,
vote_type=-1).all() vote_type=-1).all()
u2_post_ups = g.db.query( u2_post_ups = g.db.query(
Vote.submission_id).filter_by( Vote.post_id).filter_by(
user_id=u2.id, user_id=u2.id,
vote_type=1).all() vote_type=1).all()
u2_post_downs = g.db.query( u2_post_downs = g.db.query(
Vote.submission_id).filter_by( Vote.post_id).filter_by(
user_id=u2.id, user_id=u2.id,
vote_type=-1).all() vote_type=-1).all()
u2_comment_ups = g.db.query( u2_comment_ups = g.db.query(
@ -735,11 +735,11 @@ def admin_delink_relink_alt(v:User, username, other):
def admin_removed(v): def admin_removed(v):
page = get_page() page = get_page()
listing = g.db.query(Submission).options(load_only(Submission.id)).join(Submission.author).filter( listing = g.db.query(Post).options(load_only(Post.id)).join(Post.author).filter(
or_(Submission.is_banned==True, User.shadowbanned != None)) or_(Post.is_banned==True, User.shadowbanned != None))
total = listing.count() total = listing.count()
listing = listing.order_by(Submission.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() listing = listing.order_by(Post.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all()
listing = [x.id for x in listing] listing = [x.id for x in listing]
posts = get_posts(listing, v=v) posts = get_posts(listing, v=v)
@ -786,7 +786,7 @@ def unagendaposter(id, v):
if id.startswith('p_'): if id.startswith('p_'):
post_id = id.split('p_')[1] post_id = id.split('p_')[1]
post = g.db.get(Submission, post_id) post = g.db.get(Post, post_id)
user = post.author user = post.author
elif id.startswith('c_'): elif id.startswith('c_'):
comment_id = id.split('c_')[1] comment_id = id.split('c_')[1]
@ -942,7 +942,7 @@ def ban_user(id, v):
if id.startswith('p_'): if id.startswith('p_'):
post_id = id.split('p_')[1] post_id = id.split('p_')[1]
post = g.db.get(Submission, post_id) post = g.db.get(Post, post_id)
user = post.author user = post.author
elif id.startswith('c_'): elif id.startswith('c_'):
comment_id = id.split('c_')[1] comment_id = id.split('c_')[1]
@ -1037,7 +1037,7 @@ def agendaposter(id, v):
if id.startswith('p_'): if id.startswith('p_'):
post_id = id.split('p_')[1] post_id = id.split('p_')[1]
post = g.db.get(Submission, post_id) post = g.db.get(Post, post_id)
user = post.author user = post.author
elif id.startswith('c_'): elif id.startswith('c_'):
comment_id = id.split('c_')[1] comment_id = id.split('c_')[1]
@ -1140,7 +1140,7 @@ def unban_user(id, v):
if id.startswith('p_'): if id.startswith('p_'):
post_id = id.split('p_')[1] post_id = id.split('p_')[1]
post = g.db.get(Submission, post_id) post = g.db.get(Post, post_id)
user = post.author user = post.author
elif id.startswith('c_'): elif id.startswith('c_'):
comment_id = id.split('c_')[1] comment_id = id.split('c_')[1]
@ -1236,7 +1236,7 @@ def progstack_post(post_id, v):
ma=ModAction( ma=ModAction(
kind="progstack_post", kind="progstack_post",
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
) )
g.db.add(ma) g.db.add(ma)
@ -1257,7 +1257,7 @@ def unprogstack_post(post_id, v):
ma=ModAction( ma=ModAction(
kind="unprogstack_post", kind="unprogstack_post",
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
) )
g.db.add(ma) g.db.add(ma)
@ -1324,7 +1324,7 @@ def remove_post(post_id, v):
ma=ModAction( ma=ModAction(
kind="ban_post", kind="ban_post",
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
) )
g.db.add(ma) g.db.add(ma)
@ -1352,7 +1352,7 @@ def approve_post(post_id, v):
ma=ModAction( ma=ModAction(
kind="unban_post", kind="unban_post",
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
) )
g.db.add(ma) g.db.add(ma)
@ -1391,7 +1391,7 @@ def distinguish_post(post_id, v):
ma = ModAction( ma = ModAction(
kind=kind, kind=kind,
user_id=v.id, user_id=v.id,
target_submission_id=post.id target_post_id=post.id
) )
g.db.add(ma) g.db.add(ma)
@ -1416,7 +1416,7 @@ def sticky_post(post_id, v):
if FEATURES['AWARDS'] and post.stickied and post.stickied.endswith(PIN_AWARD_TEXT) and v.admin_level < PERMS["UNDO_AWARD_PINS"]: if FEATURES['AWARDS'] and post.stickied and post.stickied.endswith(PIN_AWARD_TEXT) and v.admin_level < PERMS["UNDO_AWARD_PINS"]:
abort(403, "Can't pin award pins!") abort(403, "Can't pin award pins!")
pins = g.db.query(Submission).filter(Submission.stickied != None, Submission.is_banned == False).count() pins = g.db.query(Post).filter(Post.stickied != None, Post.is_banned == False).count()
if not post.stickied_utc: if not post.stickied_utc:
post.stickied_utc = int(time.time()) + 3600 post.stickied_utc = int(time.time()) + 3600
@ -1438,7 +1438,7 @@ def sticky_post(post_id, v):
ma=ModAction( ma=ModAction(
kind="pin_post", kind="pin_post",
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
_note=pin_time _note=pin_time
) )
g.db.add(ma) g.db.add(ma)
@ -1470,7 +1470,7 @@ def unsticky_post(post_id, v):
ma=ModAction( ma=ModAction(
kind="unpin_post", kind="unpin_post",
user_id=v.id, user_id=v.id,
target_submission_id=post.id target_post_id=post.id
) )
g.db.add(ma) g.db.add(ma)
@ -1711,7 +1711,7 @@ def admin_nuke_user(v):
user=get_user(request.values.get("user")) user=get_user(request.values.get("user"))
for post in g.db.query(Submission).filter_by(author_id=user.id).all(): for post in g.db.query(Post).filter_by(author_id=user.id).all():
if post.is_banned: if post.is_banned:
continue continue
@ -1747,7 +1747,7 @@ def admin_nunuke_user(v):
user=get_user(request.values.get("user")) user=get_user(request.values.get("user"))
for post in g.db.query(Submission).filter_by(author_id=user.id).all(): for post in g.db.query(Post).filter_by(author_id=user.id).all():
if not post.is_banned: if not post.is_banned:
continue continue

View File

@ -39,7 +39,7 @@ def shop(v:User):
for val in AWARDS.values(): val["owned"] = 0 for val in AWARDS.values(): val["owned"] = 0
for useraward in g.db.query(AwardRelationship).filter(AwardRelationship.user_id == v.id, AwardRelationship.submission_id == None, AwardRelationship.comment_id == None).all(): for useraward in g.db.query(AwardRelationship).filter(AwardRelationship.user_id == v.id, AwardRelationship.post_id == None, AwardRelationship.comment_id == None).all():
if useraward.kind in AWARDS: AWARDS[useraward.kind]["owned"] += 1 if useraward.kind in AWARDS: AWARDS[useraward.kind]["owned"] += 1
for val in AWARDS.values(): for val in AWARDS.values():
@ -160,13 +160,13 @@ def award_thing(v, thing_type, id):
award = g.db.query(AwardRelationship).filter( award = g.db.query(AwardRelationship).filter(
AwardRelationship.kind == kind, AwardRelationship.kind == kind,
AwardRelationship.user_id == v.id, AwardRelationship.user_id == v.id,
AwardRelationship.submission_id == None, AwardRelationship.post_id == None,
AwardRelationship.comment_id == None AwardRelationship.comment_id == None
).first() ).first()
if not award: abort(404, "You don't have that award") if not award: abort(404, "You don't have that award")
if thing_type == 'post': award.submission_id = thing.id if thing_type == 'post': award.post_id = thing.id
else: award.comment_id = thing.id else: award.comment_id = thing.id
award.awarded_utc = int(time.time()) award.awarded_utc = int(time.time())

View File

@ -76,8 +76,8 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
if v and v.client: return top_comment.json(db=g.db) if v and v.client: return top_comment.json(db=g.db)
else: else:
if post.is_banned and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or post.author_id == v.id)): template = "submission_banned.html" if post.is_banned and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or post.author_id == v.id)): template = "post_banned.html"
else: template = "submission.html" else: template = "post.html"
return render_template(template, v=v, p=post, sort=sort, comment_info=comment_info, render_replies=True, sub=post.subr) return render_template(template, v=v, p=post, sort=sort, comment_info=comment_info, render_replies=True, sub=post.subr)
@app.post("/comment") @app.post("/comment")
@ -128,20 +128,20 @@ def comment(v:User):
post_target = get_post(parent.parent_submission, v=v, graceful=True) or get_account(parent.wall_user_id, v=v, include_blocks=True) post_target = get_post(parent.parent_submission, v=v, graceful=True) or get_account(parent.wall_user_id, v=v, include_blocks=True)
parent_comment_id = parent.id parent_comment_id = parent.id
if parent.author_id == v.id: rts = True if parent.author_id == v.id: rts = True
if not v.can_post_in_ghost_threads and isinstance(post_target, Submission) and post_target.ghost: if not v.can_post_in_ghost_threads and isinstance(post_target, Post) and post_target.ghost:
abort(403, f"You need {TRUESCORE_GHOST_MINIMUM} truescore to post in ghost threads") abort(403, f"You need {TRUESCORE_GHOST_MINIMUM} truescore to post in ghost threads")
ghost = parent.ghost ghost = parent.ghost
else: abort(404) else: abort(404)
level = 1 if isinstance(parent, (Submission, User)) else int(parent.level) + 1 level = 1 if isinstance(parent, (Post, User)) else int(parent.level) + 1
parent_user = parent if isinstance(parent, User) else parent.author parent_user = parent if isinstance(parent, User) else parent.author
posting_to_submission = isinstance(post_target, Submission) posting_to_submission = isinstance(post_target, Post)
if not User.can_see(v, parent): abort(403) if not User.can_see(v, parent): abort(403)
if not isinstance(parent, User) and parent.deleted_utc != 0: if not isinstance(parent, User) and parent.deleted_utc != 0:
if isinstance(parent, Submission): if isinstance(parent, Post):
abort(403, "You can't reply to deleted posts!") abort(403, "You can't reply to deleted posts!")
else: else:
abort(403, "You can't reply to deleted comments!") abort(403, "You can't reply to deleted comments!")
@ -333,7 +333,7 @@ def comment(v:User):
push_notif(notify_users, f'New mention of you by @{c.author_name}', c.body, c) push_notif(notify_users, f'New mention of you by @{c.author_name}', c.body, c)
if c.level == 1 and posting_to_submission: if c.level == 1 and posting_to_submission:
subscriber_ids = [x[0] for x in g.db.query(Subscription.user_id).filter(Subscription.submission_id == post_target.id, Subscription.user_id != v.id).all()] subscriber_ids = [x[0] for x in g.db.query(Subscription.user_id).filter(Subscription.post_id == post_target.id, Subscription.user_id != v.id).all()]
notify_users.update(subscriber_ids) notify_users.update(subscriber_ids)

View File

@ -2,7 +2,7 @@
from sqlalchemy import or_, not_ from sqlalchemy import or_, not_
from sqlalchemy.orm import load_only from sqlalchemy.orm import load_only
from files.classes.submission import Submission from files.classes.post import Post
from files.classes.votes import Vote from files.classes.votes import Vote
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.get import * from files.helpers.get import *
@ -72,48 +72,48 @@ LIMITED_WPD_HOLES = ('gore', 'aftermath', 'selfharm', 'meta', 'discussion', 'soc
@cache.memoize() @cache.memoize()
def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='', gt=0, lt=0, sub=None, pins=True): def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='', gt=0, lt=0, sub=None, pins=True):
posts = g.db.query(Submission) posts = g.db.query(Post)
if v and v.hidevotedon: if v and v.hidevotedon:
posts = posts.outerjoin(Vote, posts = posts.outerjoin(Vote,
and_(Vote.submission_id == Submission.id, Vote.user_id == v.id) and_(Vote.post_id == Post.id, Vote.user_id == v.id)
).filter(Vote.submission_id == None) ).filter(Vote.post_id == None)
if sub: posts = posts.filter(Submission.sub == sub.name) if sub: posts = posts.filter(Post.sub == sub.name)
elif v: posts = posts.filter(or_(Submission.sub == None, Submission.sub.notin_(v.all_blocks))) elif v: posts = posts.filter(or_(Post.sub == None, Post.sub.notin_(v.all_blocks)))
if gt: posts = posts.filter(Submission.created_utc > gt) if gt: posts = posts.filter(Post.created_utc > gt)
if lt: posts = posts.filter(Submission.created_utc < lt) if lt: posts = posts.filter(Post.created_utc < lt)
if not gt and not lt: if not gt and not lt:
posts = apply_time_filter(t, posts, Submission) posts = apply_time_filter(t, posts, Post)
posts = posts.filter( posts = posts.filter(
Submission.is_banned == False, Post.is_banned == False,
Submission.private == False, Post.private == False,
Submission.deleted_utc == 0, Post.deleted_utc == 0,
) )
if pins and not gt and not lt: if pins and not gt and not lt:
if sub: posts = posts.filter(Submission.hole_pinned == None) if sub: posts = posts.filter(Post.hole_pinned == None)
else: posts = posts.filter(Submission.stickied == None) else: posts = posts.filter(Post.stickied == None)
if v: if v:
posts = posts.filter(Submission.author_id.notin_(v.userblocks)) posts = posts.filter(Post.author_id.notin_(v.userblocks))
if v and filter_words: if v and filter_words:
for word in filter_words: for word in filter_words:
word = word.replace('\\', '').replace('_', '\_').replace('%', '\%').strip() word = word.replace('\\', '').replace('_', '\_').replace('%', '\%').strip()
posts=posts.filter(not_(Submission.title.ilike(f'%{word}%'))) posts=posts.filter(not_(Post.title.ilike(f'%{word}%')))
total = posts.count() total = posts.count()
posts = sort_objects(sort, posts, Submission) posts = sort_objects(sort, posts, Post)
if v: size = v.frontsize or 0 if v: size = v.frontsize or 0
else: size = PAGE_SIZE else: size = PAGE_SIZE
posts = posts.options(load_only(Submission.id)).offset(size * (page - 1)) posts = posts.options(load_only(Post.id)).offset(size * (page - 1))
if SITE_NAME == 'WPD' and sort == "hot" and sub == None: if SITE_NAME == 'WPD' and sort == "hot" and sub == None:
posts = posts.limit(200).all() posts = posts.limit(200).all()
@ -128,12 +128,12 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='
if pins and page == 1 and not gt and not lt: if pins and page == 1 and not gt and not lt:
if sub: if sub:
pins = g.db.query(Submission).options(load_only(Submission.id)).filter(Submission.sub == sub.name, Submission.hole_pinned != None) pins = g.db.query(Post).options(load_only(Post.id)).filter(Post.sub == sub.name, Post.hole_pinned != None)
else: else:
pins = g.db.query(Submission).options(load_only(Submission.id)).filter(Submission.stickied != None, Submission.is_banned == False) pins = g.db.query(Post).options(load_only(Post.id)).filter(Post.stickied != None, Post.is_banned == False)
if v: if v:
pins = pins.filter(or_(Submission.sub == None, Submission.sub.notin_(v.all_blocks))) pins = pins.filter(or_(Post.sub == None, Post.sub.notin_(v.all_blocks)))
for pin in pins: for pin in pins:
if pin.stickied_utc and int(time.time()) > pin.stickied_utc: if pin.stickied_utc and int(time.time()) > pin.stickied_utc:
pin.stickied = None pin.stickied = None
@ -141,10 +141,10 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='
g.db.add(pin) g.db.add(pin)
if v: pins = pins.filter(Submission.author_id.notin_(v.userblocks)) if v: pins = pins.filter(Post.author_id.notin_(v.userblocks))
if SITE_NAME == 'rDrama': if SITE_NAME == 'rDrama':
pins = pins.order_by(Submission.author_id != LAWLZ_ID) pins = pins.order_by(Post.author_id != LAWLZ_ID)
pins = pins.order_by(Submission.created_utc.desc()).all() pins = pins.order_by(Post.created_utc.desc()).all()
posts = pins + posts posts = pins + posts
if v and (time.time() - v.created_utc) > (365 * 86400 - 1): if v and (time.time() - v.created_utc) > (365 * 86400 - 1):
@ -163,7 +163,7 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words='
@auth_required @auth_required
def random_post(v:User): def random_post(v:User):
p = g.db.query(Submission.id).filter(Submission.deleted_utc == 0, Submission.is_banned == False, Submission.private == False).order_by(func.random()).first() p = g.db.query(Post.id).filter(Post.deleted_utc == 0, Post.is_banned == False, Post.private == False).order_by(func.random()).first()
if p: p = p[0] if p: p = p[0]
else: abort(404) else: abort(404)
@ -197,7 +197,7 @@ def comment_idlist(v=None, page=1, sort="new", t="day", gt=0, lt=0):
Comment.is_banned == False, Comment.is_banned == False,
Comment.deleted_utc == 0, Comment.deleted_utc == 0,
Comment.author_id.notin_(v.userblocks), Comment.author_id.notin_(v.userblocks),
or_(Comment.parent_submission == None, Submission.private == False), or_(Comment.parent_submission == None, Post.private == False),
) )
if gt: comments = comments.filter(Comment.created_utc > gt) if gt: comments = comments.filter(Comment.created_utc > gt)

View File

@ -30,7 +30,7 @@ def post_embed(id, v):
from files.helpers.get import get_post from files.helpers.get import get_post
p = get_post(id, v, graceful=True) p = get_post(id, v, graceful=True)
if p: return render_template("submission_listing.html", listing=[p], v=v) if p: return render_template("post_listing.html", listing=[p], v=v)
return '' return ''
@app.template_filter("asset") @app.template_filter("asset")

View File

@ -160,23 +160,23 @@ def notifications_messages(v:User):
def notifications_posts(v:User): def notifications_posts(v:User):
page = get_page() page = get_page()
listing = g.db.query(Submission).filter( listing = g.db.query(Post).filter(
or_( or_(
Submission.author_id.in_(v.followed_users), Post.author_id.in_(v.followed_users),
Submission.sub.in_(v.followed_subs) Post.sub.in_(v.followed_subs)
), ),
Submission.deleted_utc == 0, Post.deleted_utc == 0,
Submission.is_banned == False, Post.is_banned == False,
Submission.private == False, Post.private == False,
Submission.notify == True, Post.notify == True,
Submission.author_id != v.id, Post.author_id != v.id,
Submission.ghost == False, Post.ghost == False,
Submission.author_id.notin_(v.userblocks) Post.author_id.notin_(v.userblocks)
).options(load_only(Submission.id)) ).options(load_only(Post.id))
total = listing.count() total = listing.count()
listing = listing.order_by(Submission.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() listing = listing.order_by(Post.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all()
listing = [x.id for x in listing] listing = [x.id for x in listing]
listing = get_posts(listing, v=v, eager=True) listing = get_posts(listing, v=v, eager=True)

View File

@ -253,7 +253,7 @@ def admin_app_id_posts(v, aid):
page = get_page() page = get_page()
pids, total = oauth.idlist(Submission, page=page) pids, total = oauth.idlist(Post, page=page)
posts = get_posts(pids, v=v) posts = get_posts(pids, v=v)

View File

@ -16,7 +16,7 @@ def vote_option(option_id, v):
option_id = int(option_id) option_id = int(option_id)
except: except:
abort(404) abort(404)
option = g.db.get(SubmissionOption, option_id) option = g.db.get(PostOption, option_id)
if not option: abort(404) if not option: abort(404)
sub = option.parent.sub sub = option.parent.sub
@ -34,21 +34,21 @@ def vote_option(option_id, v):
g.db.add(autojanny) g.db.add(autojanny)
if option.exclusive: if option.exclusive:
vote = g.db.query(SubmissionOptionVote).join(SubmissionOption).filter( vote = g.db.query(PostOptionVote).join(PostOption).filter(
SubmissionOptionVote.user_id==v.id, PostOptionVote.user_id==v.id,
SubmissionOptionVote.submission_id==option.parent_id, PostOptionVote.post_id==option.parent_id,
SubmissionOption.exclusive==option.exclusive).all() PostOption.exclusive==option.exclusive).all()
if vote: if vote:
if option.exclusive == 2: abort(400, "You already voted on this bet!") if option.exclusive == 2: abort(400, "You already voted on this bet!")
for x in vote: for x in vote:
g.db.delete(x) g.db.delete(x)
existing = g.db.query(SubmissionOptionVote).filter_by(option_id=option_id, user_id=v.id).one_or_none() existing = g.db.query(PostOptionVote).filter_by(option_id=option_id, user_id=v.id).one_or_none()
if not existing: if not existing:
vote = SubmissionOptionVote( vote = PostOptionVote(
option_id=option_id, option_id=option_id,
user_id=v.id, user_id=v.id,
submission_id=option.parent_id, post_id=option.parent_id,
) )
g.db.add(vote) g.db.add(vote)
elif existing and not option.exclusive: elif existing and not option.exclusive:
@ -121,15 +121,15 @@ def option_votes(option_id, v):
option_id = int(option_id) option_id = int(option_id)
except: except:
abort(404) abort(404)
option = g.db.get(SubmissionOption, option_id) option = g.db.get(PostOption, option_id)
if not option: abort(404) if not option: abort(404)
if option.parent.ghost and v.admin_level < PERMS['SEE_GHOST_VOTES']: if option.parent.ghost and v.admin_level < PERMS['SEE_GHOST_VOTES']:
abort(403) abort(403)
ups = g.db.query(SubmissionOptionVote).filter_by(option_id=option_id).order_by(SubmissionOptionVote.created_utc).all() ups = g.db.query(PostOptionVote).filter_by(option_id=option_id).order_by(PostOptionVote.created_utc).all()
user_ids = [x[0] for x in g.db.query(SubmissionOptionVote.user_id).filter_by(option_id=option_id).all()] user_ids = [x[0] for x in g.db.query(PostOptionVote.user_id).filter_by(option_id=option_id).all()]
total_ts = g.db.query(func.sum(User.truescore)).filter(User.id.in_(user_ids)).scalar() total_ts = g.db.query(func.sum(User.truescore)).filter(User.id.in_(user_ids)).scalar()
total_ts = format(total_ts, ",") if total_ts else '0' total_ts = format(total_ts, ",") if total_ts else '0'

View File

@ -170,10 +170,10 @@ def post_id(pid, anything=None, v=None, sub=None):
if v and v.client: if v and v.client:
return p.json(g.db) return p.json(g.db)
template = "submission.html" template = "post.html"
if (p.is_banned or p.author.shadowbanned) \ if (p.is_banned or p.author.shadowbanned) \
and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or p.author_id == v.id)): and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or p.author_id == v.id)):
template = "submission_banned.html" template = "post_banned.html"
result = render_template(template, v=v, p=p, ids=list(ids), result = render_template(template, v=v, p=p, ids=list(ids),
sort=sort, render_replies=True, offset=offset, sub=p.subr, sort=sort, render_replies=True, offset=offset, sub=p.subr,
@ -276,11 +276,11 @@ def thumbnail_thread(pid:int, vid:int):
else: else:
return f"{post_url}/{fragment_url}" return f"{post_url}/{fragment_url}"
p = db.get(Submission, pid) p = db.get(Post, pid)
if not p or not p.url: if not p or not p.url:
time.sleep(5) time.sleep(5)
p = db.get(Submission, pid) p = db.get(Post, pid)
if not p or not p.url: return if not p or not p.url: return
@ -427,10 +427,10 @@ def is_repost(v):
url = url.rstrip('/') url = url.rstrip('/')
search_url = url.replace('%', '').replace('\\', '').replace('_', '\_').strip() search_url = url.replace('%', '').replace('\\', '').replace('_', '\_').strip()
repost = g.db.query(Submission).filter( repost = g.db.query(Post).filter(
Submission.url.ilike(search_url), Post.url.ilike(search_url),
Submission.deleted_utc == 0, Post.deleted_utc == 0,
Submission.is_banned == False Post.is_banned == False
).first() ).first()
if repost: return {'permalink': repost.permalink} if repost: return {'permalink': repost.permalink}
else: return not_a_repost else: return not_a_repost
@ -517,10 +517,10 @@ def submit_post(v:User, sub=None):
url = url.rstrip('/') url = url.rstrip('/')
search_url = url.replace('%', '').replace('\\', '').replace('_', '\_').strip() search_url = url.replace('%', '').replace('\\', '').replace('_', '\_').strip()
repost = g.db.query(Submission).filter( repost = g.db.query(Post).filter(
Submission.url.ilike(search_url), Post.url.ilike(search_url),
Submission.deleted_utc == 0, Post.deleted_utc == 0,
Submission.is_banned == False Post.is_banned == False
).first() ).first()
if repost and FEATURES['REPOST_DETECTION'] and not v.admin_level >= PERMS['POST_BYPASS_REPOST_CHECKING']: if repost and FEATURES['REPOST_DETECTION'] and not v.admin_level >= PERMS['POST_BYPASS_REPOST_CHECKING']:
return {"post_id": repost.id, "success": False} return {"post_id": repost.id, "success": False}
@ -550,12 +550,12 @@ def submit_post(v:User, sub=None):
abort(400, "Please enter a url or some text!") abort(400, "Please enter a url or some text!")
if not IS_LOCALHOST: if not IS_LOCALHOST:
dup = g.db.query(Submission).filter( dup = g.db.query(Post).filter(
Submission.author_id == v.id, Post.author_id == v.id,
Submission.deleted_utc == 0, Post.deleted_utc == 0,
Submission.title == title, Post.title == title,
Submission.url == url, Post.url == url,
Submission.body == body Post.body == body
).one_or_none() ).one_or_none()
if dup: if dup:
return {"post_id": dup.id, "success": False} return {"post_id": dup.id, "success": False}
@ -575,7 +575,7 @@ def submit_post(v:User, sub=None):
abort(400, "You can only type marseys!") abort(400, "You can only type marseys!")
if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT: if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT:
abort(400, "Submission body_html too long!") abort(400, "Post body_html too long!")
flag_notify = (request.values.get("notify", "on") == "on") flag_notify = (request.values.get("notify", "on") == "on")
flag_new = request.values.get("new", False, bool) or 'megathread' in title.lower() flag_new = request.values.get("new", False, bool) or 'megathread' in title.lower()
@ -591,7 +591,7 @@ def submit_post(v:User, sub=None):
if url == '': url = None if url == '': url = None
p = Submission( p = Post(
private=flag_private, private=flag_private,
notify=flag_notify, notify=flag_notify,
author_id=v.id, author_id=v.id,
@ -621,7 +621,7 @@ def submit_post(v:User, sub=None):
vote = Vote(user_id=v.id, vote = Vote(user_id=v.id,
vote_type=1, vote_type=1,
submission_id=p.id, post_id=p.id,
coins=0 coins=0
) )
g.db.add(vote) g.db.add(vote)
@ -701,7 +701,7 @@ def submit_post(v:User, sub=None):
if not p.private and not (p.sub and g.db.query(Exile.user_id).filter_by(user_id=SNAPPY_ID, sub=p.sub).one_or_none()): if not p.private and not (p.sub and g.db.query(Exile.user_id).filter_by(user_id=SNAPPY_ID, sub=p.sub).one_or_none()):
execute_snappy(p, v) execute_snappy(p, v)
v.post_count = g.db.query(Submission).filter_by(author_id=v.id, deleted_utc=0).count() v.post_count = g.db.query(Post).filter_by(author_id=v.id, deleted_utc=0).count()
g.db.add(v) g.db.add(v)
execute_lawlz_actions(v, p) execute_lawlz_actions(v, p)
@ -744,7 +744,7 @@ def delete_post_pid(pid, v):
cache.delete_memoized(frontlist) cache.delete_memoized(frontlist)
cache.delete_memoized(userpagelisting) cache.delete_memoized(userpagelisting)
v.post_count = g.db.query(Submission).filter_by(author_id=v.id, deleted_utc=0).count() v.post_count = g.db.query(Post).filter_by(author_id=v.id, deleted_utc=0).count()
g.db.add(v) g.db.add(v)
return {"message": "Post deleted!"} return {"message": "Post deleted!"}
@ -766,7 +766,7 @@ def undelete_post_pid(pid, v):
cache.delete_memoized(frontlist) cache.delete_memoized(frontlist)
cache.delete_memoized(userpagelisting) cache.delete_memoized(userpagelisting)
v.post_count = g.db.query(Submission).filter_by(author_id=v.id, deleted_utc=0).count() v.post_count = g.db.query(Post).filter_by(author_id=v.id, deleted_utc=0).count()
g.db.add(v) g.db.add(v)
return {"message": "Post undeleted!"} return {"message": "Post undeleted!"}
@ -796,7 +796,7 @@ def mark_post_nsfw(pid, v):
ma = ModAction( ma = ModAction(
kind = "set_nsfw", kind = "set_nsfw",
user_id = v.id, user_id = v.id,
target_submission_id = p.id, target_post_id = p.id,
) )
g.db.add(ma) g.db.add(ma)
else: else:
@ -804,7 +804,7 @@ def mark_post_nsfw(pid, v):
sub = p.sub, sub = p.sub,
kind = "set_nsfw", kind = "set_nsfw",
user_id = v.id, user_id = v.id,
target_submission_id = p.id, target_post_id = p.id,
) )
g.db.add(ma) g.db.add(ma)
send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has marked [{p.title}](/post/{p.id}) as +18") send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has marked [{p.title}](/post/{p.id}) as +18")
@ -835,7 +835,7 @@ def unmark_post_nsfw(pid, v):
ma = ModAction( ma = ModAction(
kind = "unset_nsfw", kind = "unset_nsfw",
user_id = v.id, user_id = v.id,
target_submission_id = p.id, target_post_id = p.id,
) )
g.db.add(ma) g.db.add(ma)
else: else:
@ -843,7 +843,7 @@ def unmark_post_nsfw(pid, v):
sub = p.sub, sub = p.sub,
kind = "unset_nsfw", kind = "unset_nsfw",
user_id = v.id, user_id = v.id,
target_submission_id = p.id, target_post_id = p.id,
) )
g.db.add(ma) g.db.add(ma)
send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has unmarked [{p.title}](/post/{p.id}) as +18") send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has unmarked [{p.title}](/post/{p.id}) as +18")
@ -860,10 +860,10 @@ def save_post(pid, v):
p = get_post(pid) p = get_post(pid)
save = g.db.query(SaveRelationship).filter_by(user_id=v.id, submission_id=p.id).one_or_none() save = g.db.query(SaveRelationship).filter_by(user_id=v.id, post_id=p.id).one_or_none()
if not save: if not save:
new_save=SaveRelationship(user_id=v.id, submission_id=p.id) new_save=SaveRelationship(user_id=v.id, post_id=p.id)
g.db.add(new_save) g.db.add(new_save)
return {"message": "Post saved!"} return {"message": "Post saved!"}
@ -878,7 +878,7 @@ def unsave_post(pid, v):
p = get_post(pid) p = get_post(pid)
save = g.db.query(SaveRelationship).filter_by(user_id=v.id, submission_id=p.id).one_or_none() save = g.db.query(SaveRelationship).filter_by(user_id=v.id, post_id=p.id).one_or_none()
if save: if save:
g.db.delete(save) g.db.delete(save)
@ -916,7 +916,7 @@ def set_new_sort(post_id:int, v:User):
ma = ModAction( ma = ModAction(
kind = "set_new", kind = "set_new",
user_id = v.id, user_id = v.id,
target_submission_id = p.id, target_post_id = p.id,
) )
g.db.add(ma) g.db.add(ma)
send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has changed the the default sorting of comments on [{p.title}](/post/{p.id}) to `new`") send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has changed the the default sorting of comments on [{p.title}](/post/{p.id}) to `new`")
@ -938,7 +938,7 @@ def unset_new_sort(post_id:int, v:User):
ma = ModAction( ma = ModAction(
kind = "set_hot", kind = "set_hot",
user_id = v.id, user_id = v.id,
target_submission_id = p.id, target_post_id = p.id,
) )
g.db.add(ma) g.db.add(ma)
send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has changed the the default sorting of comments on [{p.title}](/post/{p.id}) to `hot`") send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has changed the the default sorting of comments on [{p.title}](/post/{p.id}) to `hot`")
@ -1049,7 +1049,7 @@ def edit_post(pid, v):
if execute_blackjack(v, p, text, 'post'): break if execute_blackjack(v, p, text, 'post'): break
if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT: if len(body_html) > POST_BODY_HTML_LENGTH_LIMIT:
abort(400, "Submission body_html too long!") abort(400, "Post body_html too long!")
p.body_html = body_html p.body_html = body_html
@ -1065,7 +1065,7 @@ def edit_post(pid, v):
ma=ModAction( ma=ModAction(
kind="edit_post", kind="edit_post",
user_id=v.id, user_id=v.id,
target_submission_id=p.id target_post_id=p.id
) )
g.db.add(ma) g.db.add(ma)

View File

@ -37,7 +37,7 @@ def flag_post(pid, v):
ma=ModAction( ma=ModAction(
kind="flair_post", kind="flair_post",
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
_note=f'"{post.flair}"' _note=f'"{post.flair}"'
) )
g.db.add(ma) g.db.add(ma)
@ -47,7 +47,7 @@ def flag_post(pid, v):
sub=post.sub, sub=post.sub,
kind="flair_post", kind="flair_post",
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
_note=f'"{post.flair}"' _note=f'"{post.flair}"'
) )
g.db.add(ma) g.db.add(ma)
@ -125,7 +125,7 @@ def remove_report_post(v, pid, uid):
ma=ModAction( ma=ModAction(
kind="delete_report", kind="delete_report",
user_id=v.id, user_id=v.id,
target_submission_id=pid target_post_id=pid
) )
g.db.add(ma) g.db.add(ma)
@ -157,7 +157,7 @@ def remove_report_comment(v, cid, uid):
g.db.add(ma) g.db.add(ma)
return {"message": "Report removed successfully!"} return {"message": "Report removed successfully!"}
def move_post(post:Submission, v:User, reason:str) -> Union[bool, str]: def move_post(post:Post, v:User, reason:str) -> Union[bool, str]:
if not reason.startswith('/h/') and not reason.startswith('h/'): if not reason.startswith('/h/') and not reason.startswith('h/'):
return False return False
@ -207,7 +207,7 @@ def move_post(post:Submission, v:User, reason:str) -> Union[bool, str]:
ma = ModAction( ma = ModAction(
kind='move_hole', kind='move_hole',
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
_note=f'{sub_from_str}{sub_to_str}', _note=f'{sub_from_str}{sub_to_str}',
) )
g.db.add(ma) g.db.add(ma)
@ -216,7 +216,7 @@ def move_post(post:Submission, v:User, reason:str) -> Union[bool, str]:
sub=sub_from, sub=sub_from,
kind='move_hole', kind='move_hole',
user_id=v.id, user_id=v.id,
target_submission_id=post.id, target_post_id=post.id,
_note=f'{sub_from_str}{sub_to_str}', _note=f'{sub_from_str}{sub_to_str}',
) )
g.db.add(ma) g.db.add(ma)

View File

@ -8,7 +8,7 @@ from sqlalchemy.sql.expression import or_
from flask import g, session from flask import g, session
from files.classes import Alt, Comment, User, Submission from files.classes import Alt, Comment, User, Post
from files.helpers.config.const import * from files.helpers.config.const import *
from files.helpers.security import generate_hash, validate_hash from files.helpers.security import generate_hash, validate_hash
from files.__main__ import cache from files.__main__ import cache
@ -105,7 +105,7 @@ def check_for_alts(current:User, include_current_session=False):
u.blacklisted_by = current.blacklisted_by u.blacklisted_by = current.blacklisted_by
g.db.add(u) g.db.add(u)
def execute_shadowban_viewers_and_voters(v:Optional[User], target:Union[Submission, Comment]): def execute_shadowban_viewers_and_voters(v:Optional[User], target:Union[Post, Comment]):
if not v or not v.shadowbanned: return if not v or not v.shadowbanned: return
if not target: return if not target: return
if v.id != target.author_id: return if v.id != target.author_id: return
@ -120,6 +120,6 @@ def execute_shadowban_viewers_and_voters(v:Optional[User], target:Union[Submissi
amount = randint(0, 3) amount = randint(0, 3)
target.upvotes += amount target.upvotes += amount
if isinstance(target, Submission): if isinstance(target, Post):
target.views += amount*randint(3, 5) target.views += amount*randint(3, 5)
g.db.add(target) g.db.add(target)

View File

@ -62,18 +62,18 @@ def searchposts(v:User):
criteria=searchparse(query) criteria=searchparse(query)
posts = g.db.query(Submission).options(load_only(Submission.id)) \ posts = g.db.query(Post).options(load_only(Post.id)) \
.join(Submission.author) \ .join(Post.author) \
.filter(Submission.author_id.notin_(v.userblocks)) .filter(Post.author_id.notin_(v.userblocks))
if v.admin_level < PERMS['POST_COMMENT_MODERATION']: if v.admin_level < PERMS['POST_COMMENT_MODERATION']:
posts = posts.filter( posts = posts.filter(
Submission.deleted_utc == 0, Post.deleted_utc == 0,
Submission.is_banned == False, Post.is_banned == False,
Submission.private == False) Post.private == False)
if 'author' in criteria: if 'author' in criteria:
posts = posts.filter(Submission.ghost == False) posts = posts.filter(Post.ghost == False)
author = get_user(criteria['author'], v=v) author = get_user(criteria['author'], v=v)
if not author.is_visible_to(v): if not author.is_visible_to(v):
if v.client: if v.client:
@ -90,28 +90,28 @@ def searchposts(v:User):
domain_obj=None, domain_obj=None,
error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them." error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them."
), 403 ), 403
posts = posts.filter(Submission.author_id == author.id) posts = posts.filter(Post.author_id == author.id)
if 'exact' in criteria and 'full_text' in criteria: if 'exact' in criteria and 'full_text' in criteria:
regex_str = '[[:<:]]'+criteria['full_text']+'[[:>:]]' # https://docs.oracle.com/cd/E17952_01/mysql-5.5-en/regexp.html "word boundaries" regex_str = '[[:<:]]'+criteria['full_text']+'[[:>:]]' # https://docs.oracle.com/cd/E17952_01/mysql-5.5-en/regexp.html "word boundaries"
if 'title' in criteria: if 'title' in criteria:
words = [Submission.title.regexp_match(regex_str)] words = [Post.title.regexp_match(regex_str)]
else: else:
words = [or_(Submission.title.regexp_match(regex_str), Submission.body.regexp_match(regex_str))] words = [or_(Post.title.regexp_match(regex_str), Post.body.regexp_match(regex_str))]
posts = posts.filter(*words) posts = posts.filter(*words)
elif 'q' in criteria: elif 'q' in criteria:
if('title' in criteria): if('title' in criteria):
words = [or_(Submission.title.ilike('%'+x+'%')) \ words = [or_(Post.title.ilike('%'+x+'%')) \
for x in criteria['q']] for x in criteria['q']]
else: else:
words = [or_( words = [or_(
Submission.title.ilike('%'+x+'%'), Post.title.ilike('%'+x+'%'),
Submission.body.ilike('%'+x+'%'), Post.body.ilike('%'+x+'%'),
Submission.url.ilike('%'+x+'%'), Post.url.ilike('%'+x+'%'),
) for x in criteria['q']] ) for x in criteria['q']]
posts = posts.filter(*words) posts = posts.filter(*words)
if 'over18' in criteria: posts = posts.filter(Submission.over_18==True) if 'over18' in criteria: posts = posts.filter(Post.over_18==True)
if 'domain' in criteria: if 'domain' in criteria:
domain=criteria['domain'] domain=criteria['domain']
@ -120,23 +120,23 @@ def searchposts(v:User):
posts=posts.filter( posts=posts.filter(
or_( or_(
Submission.url.ilike("https://"+domain+'/%'), Post.url.ilike("https://"+domain+'/%'),
Submission.url.ilike("https://"+domain+'/%'), Post.url.ilike("https://"+domain+'/%'),
Submission.url.ilike("https://"+domain), Post.url.ilike("https://"+domain),
Submission.url.ilike("https://"+domain), Post.url.ilike("https://"+domain),
Submission.url.ilike("https://www."+domain+'/%'), Post.url.ilike("https://www."+domain+'/%'),
Submission.url.ilike("https://www."+domain+'/%'), Post.url.ilike("https://www."+domain+'/%'),
Submission.url.ilike("https://www."+domain), Post.url.ilike("https://www."+domain),
Submission.url.ilike("https://www."+domain), Post.url.ilike("https://www."+domain),
Submission.url.ilike("https://old." + domain + '/%'), Post.url.ilike("https://old." + domain + '/%'),
Submission.url.ilike("https://old." + domain + '/%'), Post.url.ilike("https://old." + domain + '/%'),
Submission.url.ilike("https://old." + domain), Post.url.ilike("https://old." + domain),
Submission.url.ilike("https://old." + domain) Post.url.ilike("https://old." + domain)
) )
) )
if search_operator_hole in criteria: if search_operator_hole in criteria:
posts = posts.filter(Submission.sub == criteria[search_operator_hole]) posts = posts.filter(Post.sub == criteria[search_operator_hole])
if 'after' in criteria: if 'after' in criteria:
after = criteria['after'] after = criteria['after']
@ -144,7 +144,7 @@ def searchposts(v:User):
except: except:
try: after = timegm(time.strptime(after, "%Y-%m-%d")) try: after = timegm(time.strptime(after, "%Y-%m-%d"))
except: abort(400) except: abort(400)
posts = posts.filter(Submission.created_utc > after) posts = posts.filter(Post.created_utc > after)
if 'before' in criteria: if 'before' in criteria:
before = criteria['before'] before = criteria['before']
@ -152,16 +152,16 @@ def searchposts(v:User):
except: except:
try: before = timegm(time.strptime(before, "%Y-%m-%d")) try: before = timegm(time.strptime(before, "%Y-%m-%d"))
except: abort(400) except: abort(400)
posts = posts.filter(Submission.created_utc < before) posts = posts.filter(Post.created_utc < before)
posts = apply_time_filter(t, posts, Submission) posts = apply_time_filter(t, posts, Post)
if not v.can_see_shadowbanned: if not v.can_see_shadowbanned:
posts = posts.join(Submission.author).filter(User.shadowbanned == None) posts = posts.join(Post.author).filter(User.shadowbanned == None)
total = posts.count() total = posts.count()
posts = sort_objects(sort, posts, Submission) posts = sort_objects(sort, posts, Post)
posts = posts.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() posts = posts.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all()
@ -234,12 +234,12 @@ def searchcomments(v:User):
if 'over18' in criteria: comments = comments.filter(Comment.over_18 == True) if 'over18' in criteria: comments = comments.filter(Comment.over_18 == True)
if search_operator_hole in criteria: if search_operator_hole in criteria:
comments = comments.filter(Submission.sub == criteria[search_operator_hole]) comments = comments.filter(Post.sub == criteria[search_operator_hole])
comments = apply_time_filter(t, comments, Comment) comments = apply_time_filter(t, comments, Comment)
if v.admin_level < PERMS['POST_COMMENT_MODERATION']: if v.admin_level < PERMS['POST_COMMENT_MODERATION']:
private = [x[0] for x in g.db.query(Submission.id).filter(Submission.private == True).all()] private = [x[0] for x in g.db.query(Post.id).filter(Post.private == True).all()]
comments = comments.filter( comments = comments.filter(
Comment.is_banned==False, Comment.is_banned==False,

View File

@ -11,16 +11,16 @@ from files.__main__ import app, cache, limiter
_special_leaderboard_query = text(""" _special_leaderboard_query = text("""
WITH bet_options AS ( WITH bet_options AS (
SELECT p.id AS parent_id, so.id AS option_id, so.exclusive, cnt.count SELECT p.id AS parent_id, so.id AS option_id, so.exclusive, cnt.count
FROM submission_options so FROM post_options so
JOIN submissions p ON so.parent_id = p.id JOIN posts p ON so.parent_id = p.id
JOIN ( JOIN (
SELECT option_id, COUNT(*) FROM submission_option_votes SELECT option_id, COUNT(*) FROM post_option_votes
GROUP BY option_id GROUP BY option_id
) AS cnt ON so.id = cnt.option_id ) AS cnt ON so.id = cnt.option_id
WHERE p.author_id in (30,152) AND p.created_utc > 1668953400 WHERE p.author_id in (30,152) AND p.created_utc > 1668953400
AND so.exclusive IN (2, 3) AND so.exclusive IN (2, 3)
), ),
submission_payouts AS ( post_payouts AS (
SELECT SELECT
sq_total.parent_id, sq_total.parent_id,
sq_winners.sum AS bettors, sq_winners.sum AS bettors,
@ -41,13 +41,13 @@ bet_votes AS (
sov.user_id, sov.user_id,
CASE CASE
WHEN opt.exclusive = 2 THEN -200 WHEN opt.exclusive = 2 THEN -200
WHEN opt.exclusive = 3 THEN (submission_payouts.winner_payout - 200) WHEN opt.exclusive = 3 THEN (post_payouts.winner_payout - 200)
END payout END payout
FROM submission_option_votes sov FROM post_option_votes sov
LEFT OUTER JOIN bet_options AS opt LEFT OUTER JOIN bet_options AS opt
ON opt.option_id = sov.option_id ON opt.option_id = sov.option_id
LEFT OUTER JOIN submission_payouts LEFT OUTER JOIN post_payouts
ON opt.parent_id = submission_payouts.parent_id ON opt.parent_id = post_payouts.parent_id
WHERE opt.option_id IS NOT NULL WHERE opt.option_id IS NOT NULL
), ),
bettors AS ( bettors AS (

View File

@ -419,7 +419,7 @@ def kick(v:User, pid):
sub=old, sub=old,
kind='kick_post', kind='kick_post',
user_id=v.id, user_id=v.id,
target_submission_id=post.id target_post_id=post.id
) )
g.db.add(ma) g.db.add(ma)
@ -674,7 +674,7 @@ def sub_marsey(v:User, sub):
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@auth_required @auth_required
def subs(v:User): def subs(v:User):
subs = g.db.query(Sub, func.count(Submission.sub)).outerjoin(Submission, Sub.name == Submission.sub).group_by(Sub.name).order_by(func.count(Submission.sub).desc()).all() subs = g.db.query(Sub, func.count(Post.sub)).outerjoin(Post, Sub.name == Post.sub).group_by(Sub.name).order_by(func.count(Post.sub).desc()).all()
total_users = g.db.query(User).count() total_users = g.db.query(User).count()
return render_template('sub/subs.html', v=v, subs=subs, total_users=total_users) return render_template('sub/subs.html', v=v, subs=subs, total_users=total_users)
@ -691,7 +691,7 @@ def hole_pin(v:User, pid):
if not v.mods(p.sub): abort(403) if not v.mods(p.sub): abort(403)
num = g.db.query(Submission).filter(Submission.sub == p.sub, Submission.hole_pinned != None).count() num = g.db.query(Post).filter(Post.sub == p.sub, Post.hole_pinned != None).count()
if num >= 2: if num >= 2:
abort(403, f"You can only pin 2 posts to /h/{p.sub}") abort(403, f"You can only pin 2 posts to /h/{p.sub}")
@ -706,7 +706,7 @@ def hole_pin(v:User, pid):
sub=p.sub, sub=p.sub,
kind='pin_post', kind='pin_post',
user_id=v.id, user_id=v.id,
target_submission_id=p.id target_post_id=p.id
) )
g.db.add(ma) g.db.add(ma)
@ -738,7 +738,7 @@ def hole_unpin(v:User, pid):
sub=p.sub, sub=p.sub,
kind='unpin_post', kind='unpin_post',
user_id=v.id, user_id=v.id,
target_submission_id=p.id target_post_id=p.id
) )
g.db.add(ma) g.db.add(ma)

View File

@ -52,7 +52,7 @@ def upvoters_downvoters(v, username, uid, cls, vote_cls, vote_dir, template, sta
listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all()
listing = [x.id for x in listing] listing = [x.id for x in listing]
if cls == Submission: if cls == Post:
listing = get_posts(listing, v=v, eager=True) listing = get_posts(listing, v=v, eager=True)
elif cls == Comment: elif cls == Comment:
listing = get_comments(listing, v=v) listing = get_comments(listing, v=v)
@ -66,7 +66,7 @@ def upvoters_downvoters(v, username, uid, cls, vote_cls, vote_dir, template, sta
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@auth_required @auth_required
def upvoters_posts(v:User, username, uid): def upvoters_posts(v:User, username, uid):
return upvoters_downvoters(v, username, uid, Submission, Vote, 1, "userpage/voted_posts.html", None) return upvoters_downvoters(v, username, uid, Post, Vote, 1, "userpage/voted_posts.html", None)
@app.get("/@<username>/upvoters/<int:uid>/comments") @app.get("/@<username>/upvoters/<int:uid>/comments")
@ -82,7 +82,7 @@ def upvoters_comments(v:User, username, uid):
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@auth_required @auth_required
def downvoters_posts(v:User, username, uid): def downvoters_posts(v:User, username, uid):
return upvoters_downvoters(v, username, uid, Submission, Vote, -1, "userpage/voted_posts.html", None) return upvoters_downvoters(v, username, uid, Post, Vote, -1, "userpage/voted_posts.html", None)
@app.get("/@<username>/downvoters/<int:uid>/comments") @app.get("/@<username>/downvoters/<int:uid>/comments")
@ -118,7 +118,7 @@ def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, sta
listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all()
listing = [x.id for x in listing] listing = [x.id for x in listing]
if cls == Submission: if cls == Post:
listing = get_posts(listing, v=v, eager=True) listing = get_posts(listing, v=v, eager=True)
elif cls == Comment: elif cls == Comment:
listing = get_comments(listing, v=v) listing = get_comments(listing, v=v)
@ -132,7 +132,7 @@ def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, sta
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@auth_required @auth_required
def upvoting_posts(v:User, username, uid): def upvoting_posts(v:User, username, uid):
return upvoting_downvoting(v, username, uid, Submission, Vote, 1, "userpage/voted_posts.html", None) return upvoting_downvoting(v, username, uid, Post, Vote, 1, "userpage/voted_posts.html", None)
@app.get("/@<username>/upvoting/<int:uid>/comments") @app.get("/@<username>/upvoting/<int:uid>/comments")
@ -148,7 +148,7 @@ def upvoting_comments(v:User, username, uid):
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@auth_required @auth_required
def downvoting_posts(v:User, username, uid): def downvoting_posts(v:User, username, uid):
return upvoting_downvoting(v, username, uid, Submission, Vote, -1, "userpage/voted_posts.html", None) return upvoting_downvoting(v, username, uid, Post, Vote, -1, "userpage/voted_posts.html", None)
@app.get("/@<username>/downvoting/<int:uid>/comments") @app.get("/@<username>/downvoting/<int:uid>/comments")
@ -178,7 +178,7 @@ def user_voted(v, username, cls, vote_cls, template, standalone):
listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all()
listing = [x.id for x in listing] listing = [x.id for x in listing]
if cls == Submission: if cls == Post:
listing = get_posts(listing, v=v, eager=True) listing = get_posts(listing, v=v, eager=True)
elif cls == Comment: elif cls == Comment:
listing = get_comments(listing, v=v) listing = get_comments(listing, v=v)
@ -192,7 +192,7 @@ def user_voted(v, username, cls, vote_cls, template, standalone):
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@auth_required @auth_required
def user_voted_posts(v:User, username): def user_voted_posts(v:User, username):
return user_voted(v, username, Submission, Vote, "userpage/voted_posts.html", None) return user_voted(v, username, Post, Vote, "userpage/voted_posts.html", None)
@app.get("/@<username>/voted/comments") @app.get("/@<username>/voted/comments")
@ -263,10 +263,10 @@ def all_upvoters_downvoters(v:User, username:str, vote_dir:int, is_who_simps_hat
votes = [] votes = []
votes2 = [] votes2 = []
if is_who_simps_hates: if is_who_simps_hates:
votes = g.db.query(Submission.author_id, func.count(Submission.author_id)).join(Vote).filter(Submission.ghost == False, Submission.is_banned == False, Submission.deleted_utc == 0, Vote.vote_type==vote_dir, Vote.user_id==id).group_by(Submission.author_id).order_by(func.count(Submission.author_id).desc()).all() votes = g.db.query(Post.author_id, func.count(Post.author_id)).join(Vote).filter(Post.ghost == False, Post.is_banned == False, Post.deleted_utc == 0, Vote.vote_type==vote_dir, Vote.user_id==id).group_by(Post.author_id).order_by(func.count(Post.author_id).desc()).all()
votes2 = g.db.query(Comment.author_id, func.count(Comment.author_id)).join(CommentVote).filter(Comment.ghost == False, Comment.is_banned == False, Comment.deleted_utc == 0, CommentVote.vote_type==vote_dir, CommentVote.user_id==id).group_by(Comment.author_id).order_by(func.count(Comment.author_id).desc()).all() votes2 = g.db.query(Comment.author_id, func.count(Comment.author_id)).join(CommentVote).filter(Comment.ghost == False, Comment.is_banned == False, Comment.deleted_utc == 0, CommentVote.vote_type==vote_dir, CommentVote.user_id==id).group_by(Comment.author_id).order_by(func.count(Comment.author_id).desc()).all()
else: else:
votes = g.db.query(Vote.user_id, func.count(Vote.user_id)).join(Submission).filter(Submission.ghost == False, Submission.is_banned == False, Submission.deleted_utc == 0, Vote.vote_type==vote_dir, Submission.author_id==id).group_by(Vote.user_id).order_by(func.count(Vote.user_id).desc()).all() votes = g.db.query(Vote.user_id, func.count(Vote.user_id)).join(Post).filter(Post.ghost == False, Post.is_banned == False, Post.deleted_utc == 0, Vote.vote_type==vote_dir, Post.author_id==id).group_by(Vote.user_id).order_by(func.count(Vote.user_id).desc()).all()
votes2 = g.db.query(CommentVote.user_id, func.count(CommentVote.user_id)).join(Comment).filter(Comment.ghost == False, Comment.is_banned == False, Comment.deleted_utc == 0, CommentVote.vote_type==vote_dir, Comment.author_id==id).group_by(CommentVote.user_id).order_by(func.count(CommentVote.user_id).desc()).all() votes2 = g.db.query(CommentVote.user_id, func.count(CommentVote.user_id)).join(Comment).filter(Comment.ghost == False, Comment.is_banned == False, Comment.deleted_utc == 0, CommentVote.vote_type==vote_dir, Comment.author_id==id).group_by(CommentVote.user_id).order_by(func.count(CommentVote.user_id).desc()).all()
votes = Counter(dict(votes)) + Counter(dict(votes2)) votes = Counter(dict(votes)) + Counter(dict(votes2))
total_items = sum(votes.values()) total_items = sum(votes.values())
@ -504,9 +504,9 @@ def usersong(username:str):
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@auth_required @auth_required
def subscribe(v, post_id): def subscribe(v, post_id):
existing = g.db.query(Subscription).filter_by(user_id=v.id, submission_id=post_id).one_or_none() existing = g.db.query(Subscription).filter_by(user_id=v.id, post_id=post_id).one_or_none()
if not existing: if not existing:
new_sub = Subscription(user_id=v.id, submission_id=post_id) new_sub = Subscription(user_id=v.id, post_id=post_id)
g.db.add(new_sub) g.db.add(new_sub)
return {"message": "Subscribed to post successfully!"} return {"message": "Subscribed to post successfully!"}
@ -517,7 +517,7 @@ def subscribe(v, post_id):
@limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID)
@auth_required @auth_required
def unsubscribe(v, post_id): def unsubscribe(v, post_id):
existing = g.db.query(Subscription).filter_by(user_id=v.id, submission_id=post_id).one_or_none() existing = g.db.query(Subscription).filter_by(user_id=v.id, post_id=post_id).one_or_none()
if existing: if existing:
g.db.delete(existing) g.db.delete(existing)
return {"message": "Unsubscribed from post successfully!"} return {"message": "Unsubscribed from post successfully!"}
@ -818,12 +818,12 @@ def visitors(v:User, username:str):
@cache.memoize() @cache.memoize()
def userpagelisting(user:User, v=None, page:int=1, sort="new", t="all"): def userpagelisting(user:User, v=None, page:int=1, sort="new", t="all"):
posts = g.db.query(Submission).filter_by(author_id=user.id, is_pinned=False).options(load_only(Submission.id)) posts = g.db.query(Post).filter_by(author_id=user.id, is_pinned=False).options(load_only(Post.id))
if not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == user.id)): if not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or v.id == user.id)):
posts = posts.filter_by(is_banned=False, private=False, ghost=False, deleted_utc=0) posts = posts.filter_by(is_banned=False, private=False, ghost=False, deleted_utc=0)
posts = apply_time_filter(t, posts, Submission) posts = apply_time_filter(t, posts, Post)
total = posts.count() total = posts.count()
posts = sort_objects(sort, posts, Submission) posts = sort_objects(sort, posts, Post)
posts = posts.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() posts = posts.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all()
return [x.id for x in posts], total return [x.id for x in posts], total
@ -959,7 +959,7 @@ def u_username(v:Optional[User], username:str):
if page == 1 and sort == 'new': if page == 1 and sort == 'new':
sticky = [] sticky = []
sticky = g.db.query(Submission).filter_by(is_pinned=True, author_id=u.id, is_banned=False).all() sticky = g.db.query(Post).filter_by(is_pinned=True, author_id=u.id, is_banned=False).all()
if sticky: if sticky:
for p in sticky: for p in sticky:
ids = [p.id] + ids ids = [p.id] + ids
@ -970,7 +970,7 @@ def u_username(v:Optional[User], username:str):
if v and v.client: if v and v.client:
return {"data": [x.json(g.db) for x in listing]} return {"data": [x.json(g.db) for x in listing]}
return render_template("userpage/submissions.html", return render_template("userpage/posts.html",
unban=u.unban_string, unban=u.unban_string,
u=u, u=u,
v=v, v=v,
@ -984,7 +984,7 @@ def u_username(v:Optional[User], username:str):
if v and v.client: if v and v.client:
return {"data": [x.json(g.db) for x in listing]} return {"data": [x.json(g.db) for x in listing]}
return render_template("userpage/submissions.html", return render_template("userpage/posts.html",
u=u, u=u,
v=v, v=v,
listing=listing, listing=listing,
@ -1029,7 +1029,7 @@ def u_username_comments(username, v=None):
comment_post_author = aliased(User) comment_post_author = aliased(User)
comments = g.db.query(Comment).options(load_only(Comment.id)) \ comments = g.db.query(Comment).options(load_only(Comment.id)) \
.outerjoin(Comment.post) \ .outerjoin(Comment.post) \
.outerjoin(comment_post_author, Submission.author) \ .outerjoin(comment_post_author, Post.author) \
.filter( .filter(
Comment.author_id == u.id, Comment.author_id == u.id,
or_(Comment.parent_submission != None, Comment.wall_user_id != None), or_(Comment.parent_submission != None, Comment.wall_user_id != None),
@ -1188,9 +1188,9 @@ def user_profile_name(username):
def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone=False): def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone=False):
if relationship_cls in {SaveRelationship, Subscription}: if relationship_cls in {SaveRelationship, Subscription}:
query = relationship_cls.submission_id query = relationship_cls.post_id
join = relationship_cls.post join = relationship_cls.post
cls = Submission cls = Post
elif relationship_cls is CommentSaveRelationship: elif relationship_cls is CommentSaveRelationship:
query = relationship_cls.comment_id query = relationship_cls.comment_id
join = relationship_cls.comment join = relationship_cls.comment
@ -1210,12 +1210,12 @@ def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone
if not v.admin_level >= PERMS['POST_COMMENT_MODERATION']: if not v.admin_level >= PERMS['POST_COMMENT_MODERATION']:
extra = lambda q:q.filter(cls.is_banned == False, cls.deleted_utc == 0) extra = lambda q:q.filter(cls.is_banned == False, cls.deleted_utc == 0)
if cls is Submission: if cls is Post:
listing = get_posts(ids, v=v, eager=True, extra=extra) listing = get_posts(ids, v=v, eager=True, extra=extra)
elif cls is Comment: elif cls is Comment:
listing = get_comments(ids, v=v, extra=extra) listing = get_comments(ids, v=v, extra=extra)
else: else:
raise TypeError("Only supports Submissions and Comments. This is probably the result of a bug with *this* function") raise TypeError("Only supports Posts and Comments. This is probably the result of a bug with *this* function")
if v.client: return {"data": [x.json(g.db) for x in listing]} if v.client: return {"data": [x.json(g.db) for x in listing]}
return render_template(template, u=v, v=v, listing=listing, page=page, total=total, standalone=standalone) return render_template(template, u=v, v=v, listing=listing, page=page, total=total, standalone=standalone)
@ -1227,7 +1227,7 @@ def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone
def saved_posts(v:User, username): def saved_posts(v:User, username):
page = get_page() page = get_page()
return get_saves_and_subscribes(v, "userpage/submissions.html", SaveRelationship, page, False) return get_saves_and_subscribes(v, "userpage/posts.html", SaveRelationship, page, False)
@app.get("/@<username>/saved/comments") @app.get("/@<username>/saved/comments")
@limiter.limit(DEFAULT_RATELIMIT) @limiter.limit(DEFAULT_RATELIMIT)
@ -1245,7 +1245,7 @@ def saved_comments(v:User, username):
def subscribed_posts(v:User, username): def subscribed_posts(v:User, username):
page = get_page() page = get_page()
return get_saves_and_subscribes(v, "userpage/submissions.html", Subscription, page, False) return get_saves_and_subscribes(v, "userpage/posts.html", Subscription, page, False)
@app.post("/fp/<fp>") @app.post("/fp/<fp>")
@limiter.limit('1/second', scope=rpath) @limiter.limit('1/second', scope=rpath)

View File

@ -25,9 +25,9 @@ def vote_info_get(v, link):
if thing.author.shadowbanned and not (v and v.admin_level >= PERMS['USER_SHADOWBAN']): if thing.author.shadowbanned and not (v and v.admin_level >= PERMS['USER_SHADOWBAN']):
abort(500) abort(500)
if isinstance(thing, Submission): if isinstance(thing, Post):
query = g.db.query(Vote).join(Vote.user).filter( query = g.db.query(Vote).join(Vote.user).filter(
Vote.submission_id == thing.id, Vote.post_id == thing.id,
).order_by(Vote.created_utc) ).order_by(Vote.created_utc)
ups = query.filter(Vote.vote_type == 1).all() ups = query.filter(Vote.vote_type == 1).all()
@ -56,7 +56,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
if v.client and v.id not in PRIVILEGED_USER_BOTS: abort(403) if v.client and v.id not in PRIVILEGED_USER_BOTS: abort(403)
new = int(new) new = int(new)
target = None target = None
if cls == Submission: if cls == Post:
target = get_post(target_id) target = get_post(target_id)
elif cls == Comment: elif cls == Comment:
target = get_comment(target_id) target = get_comment(target_id)
@ -79,7 +79,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
existing = g.db.query(vote_cls).filter_by(user_id=v.id) existing = g.db.query(vote_cls).filter_by(user_id=v.id)
if vote_cls == Vote: if vote_cls == Vote:
existing = existing.filter_by(submission_id=target.id) existing = existing.filter_by(post_id=target.id)
elif vote_cls == CommentVote: elif vote_cls == CommentVote:
existing = existing.filter_by(comment_id=target.id) existing = existing.filter_by(comment_id=target.id)
else: else:
@ -121,7 +121,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
if vote_cls == Vote: if vote_cls == Vote:
vote = Vote(user_id=v.id, vote = Vote(user_id=v.id,
vote_type=new, vote_type=new,
submission_id=target_id, post_id=target_id,
app_id=v.client.application.id if v.client else None, app_id=v.client.application.id if v.client else None,
real=real, real=real,
coins=coin_value coins=coin_value
@ -146,7 +146,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
votes = votes.filter(vote_cls.vote_type == dir) votes = votes.filter(vote_cls.vote_type == dir)
if vote_cls == Vote: if vote_cls == Vote:
votes = votes.filter(vote_cls.submission_id == target.id) votes = votes.filter(vote_cls.post_id == target.id)
elif vote_cls == CommentVote: elif vote_cls == CommentVote:
votes = votes.filter(vote_cls.comment_id == target.id) votes = votes.filter(vote_cls.comment_id == target.id)
else: else:
@ -164,12 +164,12 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
mul = 1 mul = 1
if target.is_approved == PROGSTACK_ID: if target.is_approved == PROGSTACK_ID:
mul = PROGSTACK_MUL mul = PROGSTACK_MUL
elif cls == Submission and (any(i in target.title.lower() for i in ENCOURAGED) or any(i in str(target.url).lower() for i in ENCOURAGED2)): elif cls == Post and (any(i in target.title.lower() for i in ENCOURAGED) or any(i in str(target.url).lower() for i in ENCOURAGED2)):
mul = PROGSTACK_MUL mul = PROGSTACK_MUL
send_notification(AEVANN_ID, target.permalink) send_notification(AEVANN_ID, target.permalink)
elif target.author.progressivestack or (target.author.admin_level and target.author.id not in {CARP_ID, SCHIZO_ID}): elif target.author.progressivestack or (target.author.admin_level and target.author.id not in {CARP_ID, SCHIZO_ID}):
mul = 2 mul = 2
elif SITE == 'rdrama.net' and cls == Submission: elif SITE == 'rdrama.net' and cls == Post:
if (target.domain.endswith('.win') or 'forum' in target.domain or 'chan' in target.domain if (target.domain.endswith('.win') or 'forum' in target.domain or 'chan' in target.domain
or (target.domain in BOOSTED_SITES and not target.url.startswith('/'))): or (target.domain in BOOSTED_SITES and not target.url.startswith('/'))):
mul = 2 mul = 2
@ -195,7 +195,7 @@ def vote_post_comment(target_id, new, v, cls, vote_cls):
@limiter.limit("60/minute;1000/hour;2000/day", key_func=get_ID) @limiter.limit("60/minute;1000/hour;2000/day", key_func=get_ID)
@is_not_permabanned @is_not_permabanned
def vote_post(post_id, new, v): def vote_post(post_id, new, v):
return vote_post_comment(post_id, new, v, Submission, Vote) return vote_post_comment(post_id, new, v, Post, Vote)
@app.post("/vote/comment/<int:comment_id>/<new>") @app.post("/vote/comment/<int:comment_id>/<new>")
@limiter.limit('1/second', scope=rpath) @limiter.limit('1/second', scope=rpath)

View File

@ -55,7 +55,7 @@
</ul> </ul>
{% if listing %} {% if listing %}
{% include "submission_listing.html" %} {% include "post_listing.html" %}
{% elif comments %} {% elif comments %}
{% include "comments.html" %} {% include "comments.html" %}
{% endif %} {% endif %}

View File

@ -9,7 +9,7 @@
<div class="col"> <div class="col">
{% block listing %} {% block listing %}
<div class="posts"> <div class="posts">
{% include "submission_listing.html" %} {% include "post_listing.html" %}
</div> </div>
{% endblock %} {% endblock %}
</div> </div>

View File

@ -21,7 +21,7 @@
<div class="col"> <div class="col">
{% block listing %} {% block listing %}
<div class="posts"> <div class="posts">
{% include "submission_listing.html" %} {% include "post_listing.html" %}
</div> </div>
{% endblock %} {% endblock %}
</div> </div>

View File

@ -22,7 +22,7 @@
<div class="col"> <div class="col">
{% block listing %} {% block listing %}
<div class="posts"> <div class="posts">
{% include "submission_listing.html" %} {% include "post_listing.html" %}
</div> </div>
{% endblock %} {% endblock %}
</div> </div>

View File

@ -785,7 +785,7 @@
<script defer src="{{'js/admin/comments.js' | asset}}"></script> <script defer src="{{'js/admin/comments.js' | asset}}"></script>
{% endif %} {% endif %}
<script defer src="{{'js/comments+submission_listing.js' | asset}}"></script> <script defer src="{{'js/comments+post_listing.js' | asset}}"></script>
<script defer src="{{'js/comments.js' | asset}}"></script> <script defer src="{{'js/comments.js' | asset}}"></script>
<script defer src="{{'js/more_comments.js' | asset}}"></script> <script defer src="{{'js/more_comments.js' | asset}}"></script>
{% endif %} {% endif %}

View File

@ -146,7 +146,7 @@
<div class="row no-gutters {% if listing %}mt-md-3{% elif not listing %}my-md-3{% endif %}"> <div class="row no-gutters {% if listing %}mt-md-3{% elif not listing %}my-md-3{% endif %}">
<div class="col-12"> <div class="col-12">
<div class="posts" id="posts"> <div class="posts" id="posts">
{% include "submission_listing.html" %} {% include "post_listing.html" %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -57,7 +57,7 @@
{% if request.path == '/notifications/posts' %} {% if request.path == '/notifications/posts' %}
{% with listing=notifications %} {% with listing=notifications %}
<div class="mt-4"> <div class="mt-4">
{% include "submission_listing.html" %} {% include "post_listing.html" %}
</div> </div>
{% endwith %} {% endwith %}
{% elif request.path == '/notifications/modactions' %} {% elif request.path == '/notifications/modactions' %}

View File

@ -356,14 +356,14 @@
<input hidden class="twoattrs" value="{{p.id}},{{p.comment_count}}"> <input hidden class="twoattrs" value="{{p.id}},{{p.comment_count}}">
<script defer src="{{'js/new_comments.js' | asset}}"></script> <script defer src="{{'js/new_comments.js' | asset}}"></script>
<script defer src="{{'js/submission.js' | asset}}"></script> <script defer src="{{'js/post.js' | asset}}"></script>
{% if fart and not (v and v.has_badge(128)) %} {% if fart and not (v and v.has_badge(128)) %}
<script defer src="{{'js/fart.js' | asset}}"></script> <script defer src="{{'js/fart.js' | asset}}"></script>
{% endif %} {% endif %}
{% if v and v.admin_level >= PERMS['POST_COMMENT_MODERATION'] %} {% if v and v.admin_level >= PERMS['POST_COMMENT_MODERATION'] %}
<script defer src="{{'js/admin/submission.js' | asset}}"></script> <script defer src="{{'js/admin/post.js' | asset}}"></script>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -1,4 +1,4 @@
{% extends "submission.html" %} {% extends "post.html" %}
{% set score=p.score %} {% set score=p.score %}
{% if v %} {% if v %}

View File

@ -280,10 +280,10 @@
{% endif %} {% endif %}
<script defer src="{{'js/vendor/clipboard.js' | asset}}"></script> <script defer src="{{'js/vendor/clipboard.js' | asset}}"></script>
<script defer src="{{'js/comments+submission_listing.js' | asset}}"></script> <script defer src="{{'js/comments+post_listing.js' | asset}}"></script>
<script defer src="{{'js/submission_listing.js' | asset}}"></script> <script defer src="{{'js/post_listing.js' | asset}}"></script>
{% if v and v.admin_level >= PERMS['POST_COMMENT_MODERATION'] %} {% if v and v.admin_level >= PERMS['POST_COMMENT_MODERATION'] %}
<script defer src="{{'js/admin/submission.js' | asset}}"></script> <script defer src="{{'js/admin/post.js' | asset}}"></script>
{% endif %} {% endif %}
<script defer src="{{'js/new_comments.js' | asset}}"></script> <script defer src="{{'js/new_comments.js' | asset}}"></script>

View File

@ -198,7 +198,7 @@
<div class="col-12"> <div class="col-12">
<div class="posts" id="posts"> <div class="posts" id="posts">
{% block listing_template %} {% block listing_template %}
{% include "submission_listing.html" %} {% include "post_listing.html" %}
{% endblock %} {% endblock %}
</div> </div>
</div> </div>

View File

@ -1,9 +1,9 @@
{%- extends 'userpage/userpage.html' -%} {%- extends 'userpage/userpage.html' -%}
{% block userpage_content %} {% block userpage_content %}
<div class="row no-gutters {% if listing %}mt-md-3{% elif not listing %}my-md-3{% endif %} userpage-submissions" style="margin-top: 10px;"> <div class="row no-gutters {% if listing %}mt-md-3{% elif not listing %}my-md-3{% endif %} userpage-posts" style="margin-top: 10px;">
<div class="col"> <div class="col">
<div class="posts"> <div class="posts">
{% include "submission_listing.html" %} {% include "post_listing.html" %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -21,7 +21,7 @@
<div class="col"> <div class="col">
{% block listing %} {% block listing %}
<div class="posts"> <div class="posts">
{% include "submission_listing.html" %} {% include "post_listing.html" %}
</div> </div>
{% endblock %} {% endblock %}
</div> </div>

View File

@ -0,0 +1,12 @@
alter table submissions rename to posts;
alter table submission_options rename to post_options;
alter table submission_option_votes rename to post_option_votes;
alter table award_relationships rename column submission_id to post_id;
alter table save_relationship rename column submission_id to post_id;
alter table post_option_votes rename column submission_id to post_id;
alter table subscriptions rename column submission_id to post_id;
alter table votes rename column submission_id to post_id;
alter table modactions rename column target_submission_id to target_post_id;
alter table subactions rename column target_submission_id to target_post_id;