forked from MarseyWorld/MarseyWorld
rename submissions to posts
parent
bf078e2f1a
commit
32fa466e6a
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 *
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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])
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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()
|
|
@ -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):
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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()),
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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())
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 (
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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' %}
|
||||||
|
|
|
@ -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 %}
|
|
@ -1,4 +1,4 @@
|
||||||
{% extends "submission.html" %}
|
{% extends "post.html" %}
|
||||||
|
|
||||||
{% set score=p.score %}
|
{% set score=p.score %}
|
||||||
{% if v %}
|
{% if v %}
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
Loading…
Reference in New Issue