reduce query volume #1

remotes/1693045480750635534/spooky-22
Aevann1 2022-06-26 02:50:47 +02:00
parent f184351d5d
commit d83d47e280
10 changed files with 74 additions and 79 deletions

View File

@ -27,7 +27,7 @@ services:
postgres: postgres:
image: postgres:12.3 image: postgres:12.3
# command: ["postgres", "-c", "log_statement=all"] command: ["postgres", "-c", "log_statement=all"]
# uncomment this if u wanna output all SQL queries to the console # uncomment this if u wanna output all SQL queries to the console
volumes: volumes:
- "./schema.sql:/docker-entrypoint-initdb.d/00-schema.sql" - "./schema.sql:/docker-entrypoint-initdb.d/00-schema.sql"

View File

@ -107,13 +107,6 @@ class Comment(Base):
flags.remove(flag) flags.remove(flag)
return flags return flags
@lazy
def poll_voted(self, v):
if v:
vote = g.db.query(CommentVote.vote_type).filter_by(user_id=v.id, comment_id=self.id).one_or_none()
if vote: return vote[0]
return None
@property @property
@lazy @lazy
def options(self): def options(self):
@ -128,13 +121,13 @@ class Comment(Base):
def total_poll_voted(self, v): def total_poll_voted(self, v):
if v: if v:
for option in self.options: for option in self.options:
if option.poll_voted(v): return True if option.voted: return True
return False return False
@lazy @lazy
def total_choice_voted(self, v): def total_choice_voted(self, v):
if v: if v:
return g.db.query(CommentVote).filter(CommentVote.user_id == v.id, CommentVote.comment_id.in_([x.id for x in self.choices])).all() return g.db.query(CommentVote).filter(CommentVote.user_id == v.id, CommentVote.comment_id.in_([x.id for x in self.choices])).count()
return False return False
@property @property
@ -247,7 +240,7 @@ class Comment(Base):
if not self.parent_submission: if not self.parent_submission:
return [x for x in self.child_comments.order_by(Comment.id) if not x.author.shadowbanned] return [x for x in self.child_comments.order_by(Comment.id) if not x.author.shadowbanned]
comments = self.child_comments.filter(Comment.author_id.notin_((AUTOPOLLER_ID, AUTOBETTER_ID, AUTOCHOICE_ID))) comments = self.child_comments.filter(Comment.author_id.notin_(poll_bots))
comments = sort_comments(sort, comments) comments = sort_comments(sort, comments)
return [x for x in comments if not x.author.shadowbanned] return [x for x in comments if not x.author.shadowbanned]
@ -258,7 +251,7 @@ class Comment(Base):
if not self.parent_submission: if not self.parent_submission:
return self.child_comments.order_by(Comment.id).all() return self.child_comments.order_by(Comment.id).all()
comments = self.child_comments.filter(Comment.author_id.notin_((AUTOPOLLER_ID, AUTOBETTER_ID, AUTOCHOICE_ID))) comments = self.child_comments.filter(Comment.author_id.notin_(poll_bots))
return sort_comments(sort, comments).all() return sort_comments(sort, comments).all()
@ -415,7 +408,7 @@ class Comment(Base):
for c in self.options: for c in self.options:
body += f'<div class="custom-control"><input type="checkbox" class="custom-control-input" id="{c.id}" name="option"' body += f'<div class="custom-control"><input type="checkbox" class="custom-control-input" id="{c.id}" name="option"'
if c.poll_voted(v): body += " checked" if c.voted: body += " checked"
if v: body += f''' onchange="poll_vote('{c.id}', '{self.id}')"''' if v: body += f''' onchange="poll_vote('{c.id}', '{self.id}')"'''
else: body += f''' onchange="poll_vote_no_v('{c.id}', '{self.id}')"''' else: body += f''' onchange="poll_vote_no_v('{c.id}', '{self.id}')"'''
body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html}<span class="presult-{self.id}''' body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html}<span class="presult-{self.id}'''
@ -430,7 +423,7 @@ class Comment(Base):
for c in self.choices: for c in self.choices:
body += f'''<div class="custom-control"><input name="choice-{self.id}" autocomplete="off" class="custom-control-input" type="radio" id="{c.id}" onchange="choice_vote('{c.id}','{self.id}')"''' body += f'''<div class="custom-control"><input name="choice-{self.id}" autocomplete="off" class="custom-control-input" type="radio" id="{c.id}" onchange="choice_vote('{c.id}','{self.id}')"'''
if c.poll_voted(v): body += " checked " if c.voted: body += " checked "
body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html}<span class="presult-{self.id}''' body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html}<span class="presult-{self.id}'''
if not self.total_choice_voted(v): body += ' d-none' if not self.total_choice_voted(v): body += ' d-none'
body += f'"> - <a href="/votes?link=t3_{c.id}"><span id="choice-{c.id}">{c.upvotes}</span> votes</a></span></label></div>' body += f'"> - <a href="/votes?link=t3_{c.id}"><span id="choice-{c.id}">{c.upvotes}</span> votes</a></span></label></div>'

View File

@ -122,13 +122,13 @@ class Submission(Base):
def total_poll_voted(self, v): def total_poll_voted(self, v):
if v: if v:
for option in self.options: for option in self.options:
if option.poll_voted(v): return True if option.voted: return True
return False return False
@lazy @lazy
def total_choice_voted(self, v): def total_choice_voted(self, v):
if v and self.choices: if v and self.choices:
return g.db.query(CommentVote).filter(CommentVote.user_id == v.id, CommentVote.comment_id.in_([x.id for x in self.choices])).all() return g.db.query(CommentVote).filter(CommentVote.user_id == v.id, CommentVote.comment_id.in_([x.id for x in self.choices])).count()
return False return False
@lazy @lazy
@ -136,7 +136,7 @@ class Submission(Base):
if "closed" in self.body.lower(): return True if "closed" in self.body.lower(): return True
if v: if v:
for option in self.bet_options: for option in self.bet_options:
if option.poll_voted(v): return True if option.voted: return True
return False return False
@property @property
@ -387,7 +387,7 @@ class Submission(Base):
return url return url
@lazy @lazy
def realbody(self, v): def realbody(self, v, show_polls=False):
if self.club and not (v and (v.paid_dues or v.id == self.author_id)): return f"<p>{CC} ONLY</p>" if self.club and not (v and (v.paid_dues or v.id == self.author_id)): return f"<p>{CC} ONLY</p>"
body = self.body_html or "" body = self.body_html or ""
@ -408,43 +408,43 @@ class Submission(Base):
g.db.add(self) g.db.add(self)
g.db.commit() g.db.commit()
for c in self.options: if show_polls:
body += f'<div class="custom-control"><input type="checkbox" class="custom-control-input" id="{c.id}" name="option"' for c in self.options:
if c.poll_voted(v): body += " checked" body += f'<div class="custom-control"><input type="checkbox" class="custom-control-input" id="{c.id}" name="option"'
if v: body += f''' onchange="poll_vote('{c.id}', '{self.id}')"''' if c.voted: body += " checked"
else: body += f''' onchange="poll_vote_no_v('{c.id}', '{self.id}')"''' if v: body += f''' onchange="poll_vote('{c.id}', '{self.id}')"'''
body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html}<span class="presult-{self.id}''' else: body += f''' onchange="poll_vote_no_v('{c.id}', '{self.id}')"'''
if not self.total_poll_voted(v): body += ' d-none' body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html}<span class="presult-{self.id}'''
body += f'"> - <a href="/votes?link=t3_{c.id}"><span id="poll-{c.id}">{c.upvotes}</span> votes</a></span></label></div>' if not self.total_poll_voted(v): body += ' d-none'
body += f'"> - <a href="/votes?link=t3_{c.id}"><span id="poll-{c.id}">{c.upvotes}</span> votes</a></span></label></div>'
if self.choices: if self.choices:
curr = self.total_choice_voted(v) curr = self.total_choice_voted(v)
if curr: curr = " value=" + str(curr[0].comment_id) if curr: curr = " value=" + str(curr[0].comment_id)
else: curr = '' else: curr = ''
body += f'<input class="d-none" id="current-{self.id}"{curr}>' body += f'<input class="d-none" id="current-{self.id}"{curr}>'
for c in self.choices: for c in self.choices:
body += f'''<div class="custom-control"><input name="choice-{self.id}" autocomplete="off" class="custom-control-input" type="radio" id="{c.id}" onchange="choice_vote('{c.id}','{self.id}')"''' body += f'''<div class="custom-control"><input name="choice-{self.id}" autocomplete="off" class="custom-control-input" type="radio" id="{c.id}" onchange="choice_vote('{c.id}','{self.id}')"'''
if c.poll_voted(v): body += " checked " if c.voted: body += " checked "
body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html}<span class="presult-{self.id}''' body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html}<span class="presult-{self.id}'''
if not self.total_choice_voted(v): body += ' d-none' if not self.total_choice_voted(v): body += ' d-none'
body += f'"> - <a href="/votes?link=t3_{c.id}"><span id="choice-{c.id}">{c.upvotes}</span> votes</a></span></label></div>' body += f'"> - <a href="/votes?link=t3_{c.id}"><span id="choice-{c.id}">{c.upvotes}</span> votes</a></span></label></div>'
for c in self.bet_options: for c in self.bet_options:
body += f'''<div class="custom-control mt-3"><input autocomplete="off" class="custom-control-input bet" type="radio" id="{c.id}" onchange="bet_vote('{c.id}')"''' body += f'''<div class="custom-control mt-3"><input autocomplete="off" class="custom-control-input bet" type="radio" id="{c.id}" onchange="bet_vote('{c.id}')"'''
if c.poll_voted(v): body += " checked " if c.voted: body += " checked "
if not (v and v.coins > 200) or self.total_bet_voted(v) or not v.can_gamble: body += " disabled " if not (v and v.coins > 200) or self.total_bet_voted(v) or not v.can_gamble: body += " disabled "
body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html} - <a href="/votes?link=t3_{c.id}"><span id="bet-{c.id}">{c.upvotes}</span> bets</a>''' body += f'''><label class="custom-control-label" for="{c.id}">{c.body_html} - <a href="/votes?link=t3_{c.id}"><span id="bet-{c.id}">{c.upvotes}</span> bets</a>'''
if not self.total_bet_voted(v): if not self.total_bet_voted(v):
body += '''<span class="cost"> (cost of entry: 200 coins)</span>''' body += '''<span class="cost"> (cost of entry: 200 coins)</span>'''
body += "</label>" body += "</label>"
if v and v.admin_level > 2: if v and v.admin_level > 2:
body += f'''<button class="btn btn-primary px-2 mx-2" style="font-size:10px;padding:2px" onclick="post_toast(this,'/distribute/{c.id}')">Declare winner</button>''' body += f'''<button class="btn btn-primary px-2 mx-2" style="font-size:10px;padding:2px" onclick="post_toast(this,'/distribute/{c.id}')">Declare winner</button>'''
body += "</div>" body += "</div>"
if self.author.sig_html and (self.author_id == MOOSE_ID or (not self.ghost and not (v and v.sigs_disabled))):
if self.author.sig_html and (self.author_id == MOOSE_ID or (not self.ghost and not (v and v.sigs_disabled))): body += f"<hr>{self.author.sig_html}"
body += f"<hr>{self.author.sig_html}"
return body return body

View File

@ -474,6 +474,7 @@ class User(Base):
@property @property
@lazy @lazy
def modaction_notifications_count(self): def modaction_notifications_count(self):
if not self.admin_level: return 0
return g.db.query(Notification).join(Comment).filter( return g.db.query(Notification).join(Comment).filter(
Notification.user_id == self.id, Notification.read == False, Notification.user_id == self.id, Notification.read == False,
Comment.is_banned == False, Comment.deleted_utc == 0, Comment.is_banned == False, Comment.deleted_utc == 0,
@ -483,6 +484,7 @@ class User(Base):
@property @property
@lazy @lazy
def reddit_notifications_count(self): def reddit_notifications_count(self):
if not self.can_view_offsitementions: return 0
return g.db.query(Notification).join(Comment).filter( return g.db.query(Notification).join(Comment).filter(
Notification.user_id == self.id, Notification.read == False, Notification.user_id == self.id, Notification.read == False,
Comment.is_banned == False, Comment.deleted_utc == 0, Comment.is_banned == False, Comment.deleted_utc == 0,
@ -697,6 +699,9 @@ class User(Base):
def saved_idlist(self, page=1): def saved_idlist(self, page=1):
saved = [x[0] for x in g.db.query(SaveRelationship.submission_id).filter_by(user_id=self.id).all()] saved = [x[0] for x in g.db.query(SaveRelationship.submission_id).filter_by(user_id=self.id).all()]
if not saved: return []
posts = g.db.query(Submission.id).filter(Submission.id.in_(saved), Submission.is_banned == False, Submission.deleted_utc == 0) posts = g.db.query(Submission.id).filter(Submission.id.in_(saved), Submission.is_banned == False, Submission.deleted_utc == 0)
if self.admin_level < 2: if self.admin_level < 2:
@ -708,6 +713,9 @@ class User(Base):
def saved_comment_idlist(self, page=1): def saved_comment_idlist(self, page=1):
saved = [x[0] for x in g.db.query(CommentSaveRelationship.comment_id).filter_by(user_id=self.id).all()] saved = [x[0] for x in g.db.query(CommentSaveRelationship.comment_id).filter_by(user_id=self.id).all()]
if not saved: return []
comments = g.db.query(Comment.id).filter(Comment.id.in_(saved), Comment.is_banned == False, Comment.deleted_utc == 0) comments = g.db.query(Comment.id).filter(Comment.id.in_(saved), Comment.is_banned == False, Comment.deleted_utc == 0)
if self.admin_level < 2: if self.admin_level < 2:

View File

@ -120,8 +120,8 @@ def get_post(i, v=None, graceful=False):
else: abort(404) else: abort(404)
if v: if v:
vt = g.db.query(Vote).filter_by( vt = g.db.query(Vote.vote_type, Vote.submission_id).filter_by(user_id=v.id, submission_id=i).subquery()
user_id=v.id, submission_id=i).subquery()
blocking = v.blocking.subquery() blocking = v.blocking.subquery()
post = g.db.query( post = g.db.query(
@ -166,7 +166,7 @@ def get_posts(pids, v=None):
return [] return []
if v: if v:
vt = g.db.query(Vote).filter( vt = g.db.query(Vote.vote_type, Vote.submission_id).filter(
Vote.submission_id.in_(pids), Vote.submission_id.in_(pids),
Vote.user_id==v.id Vote.user_id==v.id
).subquery() ).subquery()
@ -228,8 +228,7 @@ def get_comment(i, v=None, graceful=False):
) )
).first() ).first()
vts = g.db.query(CommentVote).filter_by(user_id=v.id, comment_id=comment.id) vt = g.db.query(CommentVote.vote_type).filter_by(user_id=v.id, comment_id=comment.id).one_or_none()
vt = g.db.query(CommentVote).filter_by(user_id=v.id, comment_id=comment.id).one_or_none()
comment.is_blocking = block and block.user_id == v.id comment.is_blocking = block and block.user_id == v.id
comment.is_blocked = block and block.target_id == v.id comment.is_blocked = block and block.target_id == v.id
comment.voted = vt.vote_type if vt else 0 comment.voted = vt.vote_type if vt else 0
@ -242,7 +241,7 @@ def get_comments(cids, v=None, load_parent=False):
if not cids: return [] if not cids: return []
if v: if v:
votes = g.db.query(CommentVote).filter_by(user_id=v.id).subquery() votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
blocking = v.blocking.subquery() blocking = v.blocking.subquery()

View File

@ -118,7 +118,7 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
sort=request.values.get("sort", defaultsortingcomments) sort=request.values.get("sort", defaultsortingcomments)
if v: if v:
votes = g.db.query(CommentVote).filter_by(user_id=v.id).subquery() votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
blocking = v.blocking.subquery() blocking = v.blocking.subquery()
@ -135,8 +135,7 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
comments = comments.join(User, User.id == Comment.author_id).filter(User.shadowbanned == None) comments = comments.join(User, User.id == Comment.author_id).filter(User.shadowbanned == None)
comments=comments.filter( comments=comments.filter(
Comment.parent_submission == post.id, Comment.top_comment_id == c.top_comment_id
Comment.author_id.notin_((AUTOPOLLER_ID, AUTOBETTER_ID, AUTOCHOICE_ID))
).join( ).join(
votes, votes,
votes.c.comment_id == Comment.id, votes.c.comment_id == Comment.id,

View File

@ -149,7 +149,7 @@ def post_id(pid, anything=None, v=None, sub=None):
if post.club and not (v and (v.paid_dues or v.id == post.author_id)): abort(403) if post.club and not (v and (v.paid_dues or v.id == post.author_id)): abort(403)
if v: if v:
votes = g.db.query(CommentVote).filter_by(user_id=v.id).subquery() votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
blocking = v.blocking.subquery() blocking = v.blocking.subquery()
@ -165,7 +165,7 @@ def post_id(pid, anything=None, v=None, sub=None):
if not (v and v.shadowbanned) and not (v and v.admin_level >= 2): if not (v and v.shadowbanned) and not (v and v.admin_level >= 2):
comments = comments.join(User, User.id == Comment.author_id).filter(User.shadowbanned == None) comments = comments.join(User, User.id == Comment.author_id).filter(User.shadowbanned == None)
comments=comments.filter(Comment.parent_submission == post.id, Comment.author_id.notin_((AUTOPOLLER_ID, AUTOBETTER_ID, AUTOCHOICE_ID))).join( comments=comments.filter(Comment.parent_submission == post.id).join(
votes, votes,
votes.c.comment_id == Comment.id, votes.c.comment_id == Comment.id,
isouter=True isouter=True
@ -189,7 +189,7 @@ def post_id(pid, anything=None, v=None, sub=None):
pinned = [c[0] for c in comments.filter(Comment.stickied != None).all()] pinned = [c[0] for c in comments.filter(Comment.stickied != None).all()]
comments = comments.filter(Comment.level == 1, Comment.stickied == None) comments = comments.filter(Comment.level == 1, Comment.stickied == None, Comment.author_id.notin_(poll_bots))
comments = sort_comments(sort, comments) comments = sort_comments(sort, comments)
@ -199,7 +199,7 @@ def post_id(pid, anything=None, v=None, sub=None):
else: else:
pinned = g.db.query(Comment).filter(Comment.parent_submission == post.id, Comment.stickied != None).all() pinned = g.db.query(Comment).filter(Comment.parent_submission == post.id, Comment.stickied != None).all()
comments = g.db.query(Comment).join(User, User.id == Comment.author_id).filter(User.shadowbanned == None, Comment.parent_submission == post.id, Comment.author_id.notin_((AUTOPOLLER_ID, AUTOBETTER_ID, AUTOCHOICE_ID)), Comment.level == 1, Comment.stickied == None) comments = g.db.query(Comment).join(User, User.id == Comment.author_id).filter(User.shadowbanned == None, Comment.parent_submission == post.id, Comment.author_id.notin_(poll_bots), Comment.level == 1, Comment.stickied == None)
comments = sort_comments(sort, comments) comments = sort_comments(sort, comments)
@ -262,7 +262,7 @@ def viewmore(v, pid, sort, offset):
except: abort(400) except: abort(400)
if v: if v:
votes = g.db.query(CommentVote).filter_by(user_id=v.id).subquery() votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
blocking = v.blocking.subquery() blocking = v.blocking.subquery()
@ -273,7 +273,7 @@ def viewmore(v, pid, sort, offset):
votes.c.vote_type, votes.c.vote_type,
blocking.c.target_id, blocking.c.target_id,
blocked.c.target_id, blocked.c.target_id,
).filter(Comment.parent_submission == pid, Comment.author_id.notin_((AUTOPOLLER_ID, AUTOBETTER_ID, AUTOCHOICE_ID)), Comment.stickied == None, Comment.id.notin_(ids)) ).filter(Comment.parent_submission == pid, Comment.stickied == None, Comment.id.notin_(ids))
if not (v and v.shadowbanned) and not (v and v.admin_level >= 2): if not (v and v.shadowbanned) and not (v and v.admin_level >= 2):
comments = comments.join(User, User.id == Comment.author_id).filter(User.shadowbanned == None) comments = comments.join(User, User.id == Comment.author_id).filter(User.shadowbanned == None)
@ -300,7 +300,7 @@ def viewmore(v, pid, sort, offset):
comment.is_blocked = c[3] or 0 comment.is_blocked = c[3] or 0
output.append(comment) output.append(comment)
comments = comments.filter(Comment.level == 1) comments = comments.filter(Comment.level == 1, Comment.author_id.notin_(poll_bots))
comments = sort_comments(sort, comments) comments = sort_comments(sort, comments)
@ -308,7 +308,7 @@ def viewmore(v, pid, sort, offset):
second = [c[0] for c in comments.filter(or_(Comment.slots_result != None, Comment.blackjack_result != None, Comment.wordle_result != None), func.length(Comment.body_html) <= 100).all()] second = [c[0] for c in comments.filter(or_(Comment.slots_result != None, Comment.blackjack_result != None, Comment.wordle_result != None), func.length(Comment.body_html) <= 100).all()]
comments = first + second comments = first + second
else: else:
comments = g.db.query(Comment).join(User, User.id == Comment.author_id).filter(User.shadowbanned == None, Comment.parent_submission == pid, Comment.author_id.notin_((AUTOPOLLER_ID, AUTOBETTER_ID, AUTOCHOICE_ID)), Comment.level == 1, Comment.stickied == None, Comment.id.notin_(ids)) comments = g.db.query(Comment).join(User, User.id == Comment.author_id).filter(User.shadowbanned == None, Comment.parent_submission == pid, Comment.author_id.notin_(poll_bots), Comment.level == 1, Comment.stickied == None, Comment.id.notin_(ids))
comments = sort_comments(sort, comments) comments = sort_comments(sort, comments)
@ -349,7 +349,7 @@ def morecomments(v, cid):
tcid = g.db.query(Comment.top_comment_id).filter_by(id=cid).one_or_none()[0] tcid = g.db.query(Comment.top_comment_id).filter_by(id=cid).one_or_none()[0]
if v: if v:
votes = g.db.query(CommentVote).filter_by(user_id=v.id).subquery() votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
blocking = v.blocking.subquery() blocking = v.blocking.subquery()

View File

@ -877,7 +877,7 @@
lastCount = comments['{{p.id}}'] lastCount = comments['{{p.id}}']
if (lastCount) if (lastCount)
{ {
{% for c in p.comments %} {% for c in p.replies %}
{% if not (v and v.id==c.author_id) and not c.voted %} {% if not (v and v.id==c.author_id) and not c.voted %}
if ({{c.created_utc*1000}} > lastCount.t) if ({{c.created_utc*1000}} > lastCount.t)
try {document.getElementById("comment-{{c.id}}-only").classList.add('unread')} try {document.getElementById("comment-{{c.id}}-only").classList.add('unread')}
@ -908,7 +908,7 @@
lastCount = comments['{{p.id}}'] lastCount = comments['{{p.id}}']
if (lastCount) if (lastCount)
{ {
{% for c in p.comments %} {% for c in p.replies %}
{% if not (v and v.id==c.author_id) and not c.voted %} {% if not (v and v.id==c.author_id) and not c.voted %}
if ({{c.created_utc*1000}} > lastCount.t) if ({{c.created_utc*1000}} > lastCount.t)
try {document.getElementById("comment-{{c.id}}-only").classList.add('unread')} try {document.getElementById("comment-{{c.id}}-only").classList.add('unread')}

View File

@ -733,10 +733,6 @@
{% if p.private %}<span class="badge border-warning border-1 text-small-extra">Draft</span>{% endif %} {% if p.private %}<span class="badge border-warning border-1 text-small-extra">Draft</span>{% endif %}
{% if p.active_flags(v) %}<a class="btn btn-primary" role="button" style="padding:1px 5px; font-size:10px"onclick="document.getElementById('flaggers').classList.toggle('d-none')">{{p.active_flags(v)}} Report{{ help.plural(p.active_flags(v)) }}</a>{% endif %} {% if p.active_flags(v) %}<a class="btn btn-primary" role="button" style="padding:1px 5px; font-size:10px"onclick="document.getElementById('flaggers').classList.toggle('d-none')">{{p.active_flags(v)}} Report{{ help.plural(p.active_flags(v)) }}</a>{% endif %}
{% if not p.author %}
{{p.print()}}
{% endif %}
{% if p.ghost %} {% if p.ghost %}
<span {% if p.distinguish_level %}class="mod"{% endif %}>👻</span> <span {% if p.distinguish_level %}class="mod"{% endif %}>👻</span>
{% else %} {% else %}
@ -795,7 +791,7 @@
{% if p.realurl(v) %} {% if p.realurl(v) %}
{% if not p.embed_url and not p.is_image and not p.is_video and not p.is_audio %} {% if not p.embed_url and not p.is_image and not p.is_video and not p.is_audio %}
<a rel="nofollow noopener noreferrer" href="{{p.realurl(v)}}" {% if not v or v.newtabexternal %}target="_blank"{% endif %}> <a rel="nofollow noopener noreferrer" href="{{p.realurl(v)}}" {% if not v or v.newtabexternal %}target="_blank"{% endif %}>
<div class="d-flex d-md-none justify-content-between align-items-center border rounded p-2{% if p.realbody(v) %} mb-3{% endif %}"> <div class="d-flex d-md-none justify-content-between align-items-center border rounded p-2{% if p.realbody(v, show_pols=True) %} mb-3{% endif %}">
<span>{{p.domain|truncate(30, True)}}</span> <span>{{p.domain|truncate(30, True)}}</span>
<i class="fas fa-external-link-alt text-small"></i> <i class="fas fa-external-link-alt text-small"></i>
</div> </div>
@ -845,7 +841,7 @@
</div> </div>
<pre></pre> <pre></pre>
{% endif %} {% endif %}
{{p.realbody(v) | safe}} {{p.realbody(v, show_polls=True) | safe}}
{% if p.is_banned and p.ban_reason %} {% if p.is_banned and p.ban_reason %}
<div class="text-removed mb-0">removed by @{{p.ban_reason}}</div> <div class="text-removed mb-0">removed by @{{p.ban_reason}}</div>
@ -1127,7 +1123,7 @@
lastCount = comments['{{p.id}}'] lastCount = comments['{{p.id}}']
if (lastCount) if (lastCount)
{ {
{% for c in p.comments %} {% for c in p.replies %}
{% if not (v and v.id==c.author_id) and not c.voted %} {% if not (v and v.id==c.author_id) and not c.voted %}
if ({{c.created_utc*1000}} > lastCount.t) if ({{c.created_utc*1000}} > lastCount.t)
try {document.getElementById("comment-{{c.id}}-only").classList.add('unread')} try {document.getElementById("comment-{{c.id}}-only").classList.add('unread')}

View File

@ -94,7 +94,7 @@
lastCount = comments['{{p.id}}'] lastCount = comments['{{p.id}}']
if (lastCount) if (lastCount)
{ {
{% for c in p.comments %} {% for c in p.replies %}
{% if not (v and v.id==c.author_id) and not c.voted %} {% if not (v and v.id==c.author_id) and not c.voted %}
if ({{c.created_utc*1000}} > lastCount.t) if ({{c.created_utc*1000}} > lastCount.t)
try {document.getElementById("comment-{{c.id}}-only").classList.add('unread')} try {document.getElementById("comment-{{c.id}}-only").classList.add('unread')}