forked from rDrama/rDrama
get: use function to get voted and blocked properties (#425)
* get: comments and posts: use get function from get.py * fix prev commit * move filter to correct place * fix error and also log so i can figure out what's wrong * comments: add some more trace logging * should_keep_func always acts as return True if None is passed in * remove logging codemaster
parent
edbbc5b672
commit
35e2128dec
|
@ -1,4 +1,4 @@
|
||||||
from typing import Iterable, List, Optional, Union
|
from typing import Callable, Iterable, List, Optional, Union
|
||||||
from files.classes import *
|
from files.classes import *
|
||||||
from flask import g
|
from flask import g
|
||||||
|
|
||||||
|
@ -255,46 +255,53 @@ def add_vote_and_block_props(target:Union[Submission, Comment], v:Optional[User]
|
||||||
def get_comments(cids:Iterable[int], v:Optional[User]=None) -> List[Comment]:
|
def get_comments(cids:Iterable[int], v:Optional[User]=None) -> List[Comment]:
|
||||||
if not cids: return []
|
if not cids: return []
|
||||||
if v:
|
if v:
|
||||||
votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
|
output = get_comments_v_properties(v, True, None, Comment.id.in_(cids))[1]
|
||||||
|
|
||||||
blocking = v.blocking.subquery()
|
|
||||||
|
|
||||||
blocked = v.blocked.subquery()
|
|
||||||
|
|
||||||
comments = g.db.query(
|
|
||||||
Comment,
|
|
||||||
votes.c.vote_type,
|
|
||||||
blocking.c.target_id,
|
|
||||||
blocked.c.target_id,
|
|
||||||
).filter(Comment.id.in_(cids))
|
|
||||||
|
|
||||||
comments = comments.join(
|
|
||||||
votes,
|
|
||||||
votes.c.comment_id == Comment.id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocking,
|
|
||||||
blocking.c.target_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocked,
|
|
||||||
blocked.c.user_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
).all()
|
|
||||||
|
|
||||||
output = []
|
|
||||||
for c in comments:
|
|
||||||
comment = c[0]
|
|
||||||
comment.voted = c[1] or 0
|
|
||||||
comment.is_blocking = c[2] or 0
|
|
||||||
comment.is_blocked = c[3] or 0
|
|
||||||
output.append(comment)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
output = g.db.query(Comment).join(Comment.author).filter(User.shadowbanned == None, Comment.id.in_(cids)).all()
|
output = g.db.query(Comment).join(Comment.author).filter(User.shadowbanned == None, Comment.id.in_(cids)).all()
|
||||||
|
|
||||||
return sorted(output, key=lambda x: cids.index(x.id))
|
return sorted(output, key=lambda x: cids.index(x.id))
|
||||||
|
|
||||||
|
def get_comments_v_properties(v:User, include_shadowbanned=True, should_keep_func:Optional[Callable[[Comment], bool]]=None, *criterion):
|
||||||
|
if not v:
|
||||||
|
raise TypeError("A user is required")
|
||||||
|
votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
|
||||||
|
blocking = v.blocking.subquery()
|
||||||
|
blocked = v.blocked.subquery()
|
||||||
|
comments = g.db.query(
|
||||||
|
Comment,
|
||||||
|
votes.c.vote_type,
|
||||||
|
blocking.c.target_id,
|
||||||
|
blocked.c.target_id,
|
||||||
|
)
|
||||||
|
|
||||||
|
if not include_shadowbanned and not v.can_see_shadowbanned:
|
||||||
|
comments = comments.join(Comment.author).filter(User.shadowbanned == None)
|
||||||
|
|
||||||
|
comments = comments.filter(*criterion)
|
||||||
|
comments = comments.join(
|
||||||
|
votes,
|
||||||
|
votes.c.comment_id == Comment.id,
|
||||||
|
isouter=True
|
||||||
|
).join(
|
||||||
|
blocking,
|
||||||
|
blocking.c.target_id == Comment.author_id,
|
||||||
|
isouter=True
|
||||||
|
).join(
|
||||||
|
blocked,
|
||||||
|
blocked.c.user_id == Comment.author_id,
|
||||||
|
isouter=True
|
||||||
|
)
|
||||||
|
queried = comments.all()
|
||||||
|
output = []
|
||||||
|
dump = []
|
||||||
|
for c in queried:
|
||||||
|
comment = c[0]
|
||||||
|
comment.voted = c[1] or 0
|
||||||
|
comment.is_blocking = c[2] or 0
|
||||||
|
comment.is_blocked = c[3] or 0
|
||||||
|
if not should_keep_func or should_keep_func(c[0]): output.append(comment)
|
||||||
|
else: dump.append(comment)
|
||||||
|
return (comments, output)
|
||||||
|
|
||||||
def get_sub_by_name(sub:str, v:Optional[User]=None, graceful=False) -> Optional[Sub]:
|
def get_sub_by_name(sub:str, v:Optional[User]=None, graceful=False) -> Optional[Sub]:
|
||||||
if not sub:
|
if not sub:
|
||||||
if graceful: return None
|
if graceful: return None
|
||||||
|
|
|
@ -46,7 +46,6 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
|
||||||
g.db.add(notif)
|
g.db.add(notif)
|
||||||
|
|
||||||
if comment.post and comment.post.club and not (v and (v.paid_dues or v.id in [comment.author_id, comment.post.author_id])): abort(403)
|
if comment.post and comment.post.club and not (v and (v.paid_dues or v.id in [comment.author_id, comment.post.author_id])): abort(403)
|
||||||
|
|
||||||
if not comment.parent_submission and not (v and (comment.author.id == v.id or comment.sentto == v.id)) and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) : abort(403)
|
if not comment.parent_submission and not (v and (comment.author.id == v.id or comment.sentto == v.id)) and not (v and v.admin_level >= PERMS['POST_COMMENT_MODERATION']) : abort(403)
|
||||||
|
|
||||||
if not pid:
|
if not pid:
|
||||||
|
@ -73,46 +72,9 @@ 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.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
|
# this is required because otherwise the vote and block
|
||||||
|
# props won't save properly unless you put them in a list
|
||||||
blocking = v.blocking.subquery()
|
output = get_comments_v_properties(v, False, None, Comment.top_comment_id == c.top_comment_id)[1]
|
||||||
|
|
||||||
blocked = v.blocked.subquery()
|
|
||||||
|
|
||||||
comments = g.db.query(
|
|
||||||
Comment,
|
|
||||||
votes.c.vote_type,
|
|
||||||
blocking.c.target_id,
|
|
||||||
blocked.c.target_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
if not (v and v.can_see_shadowbanned):
|
|
||||||
comments = comments.join(Comment.author).filter(User.shadowbanned == None)
|
|
||||||
|
|
||||||
comments=comments.filter(
|
|
||||||
Comment.top_comment_id == c.top_comment_id
|
|
||||||
).join(
|
|
||||||
votes,
|
|
||||||
votes.c.comment_id == Comment.id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocking,
|
|
||||||
blocking.c.target_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocked,
|
|
||||||
blocked.c.user_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
)
|
|
||||||
|
|
||||||
output = []
|
|
||||||
for c in comments:
|
|
||||||
comment = c[0]
|
|
||||||
comment.voted = c[1] or 0
|
|
||||||
comment.is_blocking = c[2] or 0
|
|
||||||
comment.is_blocked = c[3] or 0
|
|
||||||
output.append(comment)
|
|
||||||
|
|
||||||
post.replies=[top_comment]
|
post.replies=[top_comment]
|
||||||
|
|
||||||
if v and v.client: return top_comment.json
|
if v and v.client: return top_comment.json
|
||||||
|
|
|
@ -151,47 +151,13 @@ 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.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
|
# shadowban check is done in sort_objects
|
||||||
|
# output is needed: see comments.py
|
||||||
blocking = v.blocking.subquery()
|
comments, output = get_comments_v_properties(v, True, None, Comment.parent_submission == post.id, Comment.level < 10)
|
||||||
|
|
||||||
blocked = v.blocked.subquery()
|
|
||||||
|
|
||||||
comments = g.db.query(
|
|
||||||
Comment,
|
|
||||||
votes.c.vote_type,
|
|
||||||
blocking.c.target_id,
|
|
||||||
blocked.c.target_id,
|
|
||||||
)
|
|
||||||
comments=comments.filter(Comment.parent_submission == post.id, Comment.level < 10).join(
|
|
||||||
votes,
|
|
||||||
votes.c.comment_id == Comment.id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocking,
|
|
||||||
blocking.c.target_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocked,
|
|
||||||
blocked.c.user_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
)
|
|
||||||
|
|
||||||
output = []
|
|
||||||
for c in comments.all():
|
|
||||||
comment = c[0]
|
|
||||||
comment.voted = c[1] or 0
|
|
||||||
comment.is_blocking = c[2] or 0
|
|
||||||
comment.is_blocked = c[3] or 0
|
|
||||||
output.append(comment)
|
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
comments = sort_objects(sort, comments, Comment,
|
comments = sort_objects(sort, comments, Comment,
|
||||||
include_shadowbanned=(v and v.can_see_shadowbanned))
|
include_shadowbanned=(v and v.can_see_shadowbanned))
|
||||||
|
|
||||||
comments = [c[0] for c in comments.all()]
|
comments = [c[0] for c in comments.all()]
|
||||||
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()
|
||||||
|
@ -275,42 +241,10 @@ def viewmore(v, pid, sort, offset):
|
||||||
except: abort(400)
|
except: abort(400)
|
||||||
|
|
||||||
if v:
|
if v:
|
||||||
votes = g.db.query(CommentVote.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
|
# shadowban check is done in sort_objects
|
||||||
|
# output is needed: see comments.py
|
||||||
blocking = v.blocking.subquery()
|
comments, output = get_comments_v_properties(v, True, None, Comment.parent_submission == pid, Comment.stickied == None, Comment.id.notin_(ids), Comment.level < 10)
|
||||||
|
|
||||||
blocked = v.blocked.subquery()
|
|
||||||
|
|
||||||
comments = g.db.query(
|
|
||||||
Comment,
|
|
||||||
votes.c.vote_type,
|
|
||||||
blocking.c.target_id,
|
|
||||||
blocked.c.target_id,
|
|
||||||
).filter(Comment.parent_submission == pid, Comment.stickied == None, Comment.id.notin_(ids), Comment.level < 10)
|
|
||||||
comments=comments.join(
|
|
||||||
votes,
|
|
||||||
votes.c.comment_id == Comment.id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocking,
|
|
||||||
blocking.c.target_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocked,
|
|
||||||
blocked.c.user_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
)
|
|
||||||
|
|
||||||
output = []
|
|
||||||
for c in comments.all():
|
|
||||||
comment = c[0]
|
|
||||||
comment.voted = c[1] or 0
|
|
||||||
comment.is_blocking = c[2] or 0
|
|
||||||
comment.is_blocked = c[3] or 0
|
|
||||||
output.append(comment)
|
|
||||||
|
|
||||||
comments = comments.filter(Comment.level == 1)
|
comments = comments.filter(Comment.level == 1)
|
||||||
|
|
||||||
comments = sort_objects(sort, comments, Comment,
|
comments = sort_objects(sort, comments, Comment,
|
||||||
include_shadowbanned=(v and v.can_see_shadowbanned))
|
include_shadowbanned=(v and v.can_see_shadowbanned))
|
||||||
|
|
||||||
|
@ -360,40 +294,9 @@ 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.vote_type, CommentVote.comment_id).filter_by(user_id=v.id).subquery()
|
# shadowban check is done in sort_objects i think
|
||||||
|
# output is needed: see comments.py
|
||||||
blocking = v.blocking.subquery()
|
comments, output = get_comments_v_properties(v, True, lambda c:bool(c.parent_comment_id == int(cid)), Comment.top_comment_id == tcid, Comment.level > 9)
|
||||||
|
|
||||||
blocked = v.blocked.subquery()
|
|
||||||
|
|
||||||
comments = g.db.query(
|
|
||||||
Comment,
|
|
||||||
votes.c.vote_type,
|
|
||||||
blocking.c.target_id,
|
|
||||||
blocked.c.target_id,
|
|
||||||
).filter(Comment.top_comment_id == tcid, Comment.level > 9).join(
|
|
||||||
votes,
|
|
||||||
votes.c.comment_id == Comment.id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocking,
|
|
||||||
blocking.c.target_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
).join(
|
|
||||||
blocked,
|
|
||||||
blocked.c.user_id == Comment.author_id,
|
|
||||||
isouter=True
|
|
||||||
)
|
|
||||||
|
|
||||||
output = []
|
|
||||||
dump = []
|
|
||||||
for c in comments.all():
|
|
||||||
comment = c[0]
|
|
||||||
comment.voted = c[1] or 0
|
|
||||||
comment.is_blocking = c[2] or 0
|
|
||||||
comment.is_blocked = c[3] or 0
|
|
||||||
if c[0].parent_comment_id == int(cid): output.append(comment)
|
|
||||||
else: dump.append(comment)
|
|
||||||
comments = output
|
comments = output
|
||||||
else:
|
else:
|
||||||
c = get_comment(cid)
|
c = get_comment(cid)
|
||||||
|
|
Loading…
Reference in New Issue