diff --git a/files/routes/posts.py b/files/routes/posts.py index 78accba45..807d5dda7 100644 --- a/files/routes/posts.py +++ b/files/routes/posts.py @@ -38,32 +38,32 @@ titleheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWe @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @auth_required def publish(pid, v): - post = get_post(pid) - if not post.private: return {"message": "Post published!"} + p = get_post(pid) + if not p.private: return {"message": "Post published!"} - if post.author_id != v.id: abort(403) - post.private = False - post.created_utc = int(time.time()) - g.db.add(post) + if p.author_id != v.id: abort(403) + p.private = False + p.created_utc = int(time.time()) + g.db.add(p) - if not post.ghost: - notify_users = NOTIFY_USERS(f'{post.title} {post.body}', v) + if not p.ghost: + notify_users = NOTIFY_USERS(f'{p.title} {p.body}', v) if notify_users: - cid, text = notif_comment2(post) + cid, text = notif_comment2(p) for x in notify_users: - add_notif(cid, x, text, pushnotif_url=post.permalink) + add_notif(cid, x, text, pushnotif_url=p.permalink) cache.delete_memoized(frontlist) cache.delete_memoized(userpagelisting) - execute_snappy(post, v) + execute_snappy(p, v) if is_site_url(request.referrer): return redirect(request.referrer) - return redirect(post.permalink) + return redirect(p.permalink) @app.get("/submit") @app.get("/h//submit") @@ -85,32 +85,32 @@ def submit_get(v:User, sub=None): @limiter.limit(DEFAULT_RATELIMIT) @auth_desired_with_logingate def post_id(pid, anything=None, v=None, sub=None): - post = get_post(pid, v=v) - if not User.can_see(v, post): abort(403) + p = get_post(pid, v=v) + if not User.can_see(v, p): abort(403) - if post.over_18 and not (v and v.over_18) and session.get('over_18', 0) < int(time.time()): + if p.over_18 and not (v and v.over_18) and session.get('over_18', 0) < int(time.time()): if g.is_api_or_xhr: abort(451, "Must be 18+ to view") return render_template("errors/nsfw.html", v=v) - if post.new: defaultsortingcomments = 'new' + if p.new: defaultsortingcomments = 'new' elif v: defaultsortingcomments = v.defaultsortingcomments else: defaultsortingcomments = "hot" sort = request.values.get("sort", defaultsortingcomments) if v: - execute_shadowban_viewers_and_voters(v, post) + execute_shadowban_viewers_and_voters(v, p) # shadowban check is done in sort_objects # output is needed: see comments.py - comments, output = get_comments_v_properties(v, None, Comment.parent_submission == post.id, Comment.level < 10) + comments, output = get_comments_v_properties(v, None, Comment.parent_submission == p.id, Comment.level < 10) pinned = [c[0] for c in comments.filter(Comment.stickied != None).order_by(Comment.created_utc.desc()).all()] comments = comments.filter(Comment.level == 1, Comment.stickied == None) comments = sort_objects(sort, comments, Comment) comments = [c[0] for c in comments.all()] else: - pinned = g.db.query(Comment).filter(Comment.parent_submission == post.id, Comment.stickied != None).order_by(Comment.created_utc.desc()).all() + pinned = g.db.query(Comment).filter(Comment.parent_submission == p.id, Comment.stickied != None).order_by(Comment.created_utc.desc()).all() comments = g.db.query(Comment).filter( - Comment.parent_submission == post.id, + Comment.parent_submission == p.id, Comment.level == 1, Comment.stickied == None ) @@ -124,20 +124,20 @@ def post_id(pid, anything=None, v=None, sub=None): threshold = 100 - if post.comment_count > threshold+25 and not (v and v.client): + if p.comment_count > threshold+25 and not (v and v.client): comments2 = [] count = 0 - if post.created_utc > 1638672040: # TODO: migrate old comments to use top_comment_id + if p.created_utc > 1638672040: # TODO: migrate old comments to use top_comment_id for comment in comments: comments2.append(comment) ids.add(comment.id) - count += g.db.query(Comment).filter_by(parent_submission=post.id, top_comment_id=comment.id).count() + 1 + count += g.db.query(Comment).filter_by(parent_submission=p.id, top_comment_id=comment.id).count() + 1 if count > threshold: break else: for comment in comments: comments2.append(comment) ids.add(comment.id) - count += g.db.query(Comment).filter_by(parent_submission=post.id, parent_comment_id=comment.id).count() + 1 + count += g.db.query(Comment).filter_by(parent_submission=p.id, parent_comment_id=comment.id).count() + 1 if count > 20: break if len(comments) == len(comments2): offset = 0 @@ -157,28 +157,28 @@ def post_id(pid, anything=None, v=None, sub=None): else: pinned2[pin] = '' - post.replies = list(pinned2.keys()) + comments + p.replies = list(pinned2.keys()) + comments - post.views += 1 - g.db.add(post) + p.views += 1 + g.db.add(p) if v and v.client: - return post.json(g.db) + return p.json(g.db) template = "submission.html" - if (post.is_banned or post.author.shadowbanned) \ - and not (v and (v.admin_level >= PERMS['POST_COMMENT_MODERATION'] or post.author_id == v.id)): + 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)): template = "submission_banned.html" - return render_template(template, v=v, p=post, ids=list(ids), - sort=sort, render_replies=True, offset=offset, sub=post.subr, + return render_template(template, v=v, p=p, ids=list(ids), + sort=sort, render_replies=True, offset=offset, sub=p.subr, fart=get_setting('fart_mode')) @app.get("/view_more///") @limiter.limit(DEFAULT_RATELIMIT) @auth_desired_with_logingate def view_more(v, pid, sort, offset): - post = get_post(pid, v=v) + p = get_post(pid, v=v) try: offset = int(offset) except: abort(400) @@ -207,24 +207,24 @@ def view_more(v, pid, sort, offset): comments2 = [] count = 0 - if post.created_utc > 1638672040: # TODO: migrate old comments to use top_comment_id + if p.created_utc > 1638672040: # TODO: migrate old comments to use top_comment_id for comment in comments: comments2.append(comment) ids.add(comment.id) - count += g.db.query(Comment).filter_by(parent_submission=post.id, top_comment_id=comment.id).count() + 1 + count += g.db.query(Comment).filter_by(parent_submission=p.id, top_comment_id=comment.id).count() + 1 if count > 100: break else: for comment in comments: comments2.append(comment) ids.add(comment.id) - count += g.db.query(Comment).filter_by(parent_submission=post.id, parent_comment_id=comment.id).count() + 1 + count += g.db.query(Comment).filter_by(parent_submission=p.id, parent_comment_id=comment.id).count() + 1 if count > 20: break if len(comments) == len(comments2): offset = 0 else: offset += 1 comments = comments2 - return render_template("comments.html", v=v, comments=comments, p=post, ids=list(ids), render_replies=True, pid=pid, sort=sort, offset=offset) + return render_template("comments.html", v=v, comments=comments, p=p, ids=list(ids), render_replies=True, pid=pid, sort=sort, offset=offset) @app.get("/more_comments/") @@ -266,15 +266,15 @@ def thumbnail_thread(pid:int, vid:int): else: return f"{post_url}/{fragment_url}" - post = db.get(Submission, pid) + p = db.get(Submission, pid) - if not post or not post.url: + if not p or not p.url: time.sleep(5) - post = db.get(Submission, pid) + p = db.get(Submission, pid) - if not post or not post.url: return + if not p or not p.url: return - fetch_url = post.url + fetch_url = p.url if fetch_url.startswith('/') and '\\' not in fetch_url: fetch_url = f"{SITE_FULL}{fetch_url}" @@ -322,10 +322,10 @@ def thumbnail_thread(pid:int, vid:int): } ) if tag: - thumb_candidate_urls.append(expand_url(post.url, tag['content'])) + thumb_candidate_urls.append(expand_url(p.url, tag['content'])) for tag in soup.find_all("img", attrs={'src':True}): - thumb_candidate_urls.append(expand_url(post.url, tag['src'])) + thumb_candidate_urls.append(expand_url(p.url, tag['src'])) for url in thumb_candidate_urls: @@ -370,10 +370,10 @@ def thumbnail_thread(pid:int, vid:int): file.write(chunk) v = db.get(User, vid) - url = process_image(name, v, resize=99, uploader_id=post.author_id, db=db) + url = process_image(name, v, resize=99, uploader_id=p.author_id, db=db) if url: - post.thumburl = url - db.add(post) + p.thumburl = url + db.add(p) db.commit() db.close() stdout.flush() @@ -582,7 +582,7 @@ def submit_post(v:User, sub=None): elif url.startswith(BAN_EVASION_FULL): url = url.split(BAN_EVASION_FULL, 1)[1] - post = Submission( + p = Submission( private=flag_private, notify=flag_notify, author_id=v.id, @@ -600,17 +600,17 @@ def submit_post(v:User, sub=None): ghost=flag_ghost ) - g.db.add(post) + g.db.add(p) g.db.flush() - process_poll_options(v, post) + process_poll_options(v, p) - for text in {post.body, post.title, post.url}: - if execute_blackjack(v, post, text, 'submission'): break + for text in {p.body, p.title, p.url}: + if execute_blackjack(v, p, text, 'submission'): break vote = Vote(user_id=v.id, vote_type=1, - submission_id=post.id + submission_id=p.id ) g.db.add(vote) @@ -620,37 +620,37 @@ def submit_post(v:User, sub=None): if file.content_type.startswith('image/'): name = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(name) - post.url = process_image(name, v) + p.url = process_image(name, v) name2 = name.replace('.webp', 'r.webp') copyfile(name, name2) - post.thumburl = process_image(name2, v, resize=99) + p.thumburl = process_image(name2, v, resize=99) elif file.content_type.startswith('video/'): - post.url = process_video(file, v) + p.url = process_video(file, v) name = f'/images/{time.time()}'.replace('.','') + '.webp' subprocess.run(['ffmpeg', '-y', '-loglevel', 'warning', - '-i', post.url, '-vf', "scale='min(500,iw)':-2", + '-i', p.url, '-vf', "scale='min(500,iw)':-2", '-q:v', '3', '-frames:v', '1', name], check=True) - post.thumburl = name + p.thumburl = name elif file.content_type.startswith('audio/'): - post.url = process_audio(file, v) + p.url = process_audio(file, v) else: abort(415) - if not post.thumburl and post.url: - gevent.spawn(thumbnail_thread, post.id, v.id) + if not p.thumburl and p.url: + gevent.spawn(thumbnail_thread, p.id, v.id) - if not post.private and not post.ghost: + if not p.private and not p.ghost: notify_users = NOTIFY_USERS(f'{title} {body}', v) if notify_users: - cid, text = notif_comment2(post) + cid, text = notif_comment2(p) for x in notify_users: - add_notif(cid, x, text, pushnotif_url=post.permalink) + add_notif(cid, x, text, pushnotif_url=p.permalink) - if v.agendaposter and not v.marseyawarded and AGENDAPOSTER_PHRASE not in f'{post.body}{post.title}'.lower() and sub != 'chudrama': - post.is_banned = True - post.ban_reason = "AutoJanny" + if v.agendaposter and not v.marseyawarded and AGENDAPOSTER_PHRASE not in f'{p.body}{p.title}'.lower() and sub != 'chudrama': + p.is_banned = True + p.ban_reason = "AutoJanny" body = AGENDAPOSTER_MSG.format(username=v.username, type='post', AGENDAPOSTER_PHRASE=AGENDAPOSTER_PHRASE) @@ -658,7 +658,7 @@ def submit_post(v:User, sub=None): c_jannied = Comment(author_id=AUTOJANNY_ID, - parent_submission=post.id, + parent_submission=p.id, level=1, over_18=False, is_bot=True, @@ -666,42 +666,42 @@ def submit_post(v:User, sub=None): distinguish_level=6, body=body, body_html=body_jannied_html, - ghost=post.ghost + ghost=p.ghost ) g.db.add(c_jannied) g.db.flush() - post.comment_count += 1 - g.db.add(post) + p.comment_count += 1 + g.db.add(p) c_jannied.top_comment_id = c_jannied.id n = Notification(comment_id=c_jannied.id, user_id=v.id) g.db.add(n) - if not post.private and not (post.sub and g.db.query(Exile.user_id).filter_by(user_id=SNAPPY_ID, sub=post.sub).one_or_none()): - execute_snappy(post, v) + 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) v.post_count = g.db.query(Submission).filter_by(author_id=v.id, deleted_utc=0).count() g.db.add(v) - execute_lawlz_actions(v, post) + execute_lawlz_actions(v, p) if (SITE == 'rdrama.net' and v.id in (IMPASSIONATA_ID, TGTW_ID, SNALLY_ID) - and not (post.sub and post.subr.stealth)): - post.stickied_utc = int(time.time()) + 3600 - post.stickied = "AutoJanny" + and not (p.sub and p.subr.stealth)): + p.stickied_utc = int(time.time()) + 3600 + p.stickied = "AutoJanny" cache.delete_memoized(frontlist) cache.delete_memoized(userpagelisting) g.db.commit() - if v.client: return post.json(g.db) + if v.client: return p.json(g.db) else: - post.voted = 1 - return {"post_id": post.id} + p.voted = 1 + return {"post_id": p.id} @app.post("/delete_post/") @limiter.limit('1/second', scope=rpath) @@ -709,18 +709,18 @@ def submit_post(v:User, sub=None): @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @auth_required def delete_post_pid(pid, v): - post = get_post(pid) - if post.author_id != v.id: abort(403) + p = get_post(pid) + if p.author_id != v.id: abort(403) # Temporary special logic by Carp request for events of 2022-10-10 - if SITE_NAME == 'rDrama' and post.author_id == 3161: abort(403) + if SITE_NAME == 'rDrama' and p.author_id == 3161: abort(403) - if not post.deleted_utc: - post.deleted_utc = int(time.time()) - post.is_pinned = False - post.stickied = None + if not p.deleted_utc: + p.deleted_utc = int(time.time()) + p.is_pinned = False + p.stickied = None - g.db.add(post) + g.db.add(p) cache.delete_memoized(frontlist) cache.delete_memoized(userpagelisting) @@ -737,12 +737,12 @@ def delete_post_pid(pid, v): @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @auth_required def undelete_post_pid(pid, v): - post = get_post(pid) - if post.author_id != v.id: abort(403) + p = get_post(pid) + if p.author_id != v.id: abort(403) - if post.deleted_utc: - post.deleted_utc = 0 - g.db.add(post) + if p.deleted_utc: + p.deleted_utc = 0 + g.db.add(p) cache.delete_memoized(frontlist) cache.delete_memoized(userpagelisting) @@ -761,34 +761,34 @@ def undelete_post_pid(pid, v): @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @auth_required def mark_post_nsfw(pid, v): - post = get_post(pid) + p = get_post(pid) - if post.author_id != v.id and not v.admin_level >= PERMS['POST_COMMENT_MODERATION'] and not (post.sub and v.mods(post.sub)): + if p.author_id != v.id and not v.admin_level >= PERMS['POST_COMMENT_MODERATION'] and not (p.sub and v.mods(p.sub)): abort(403) - if post.over_18 and v.is_suspended_permanently: + if p.over_18 and v.is_suspended_permanently: abort(403) - post.over_18 = True - g.db.add(post) + p.over_18 = True + g.db.add(p) - if post.author_id != v.id: + if p.author_id != v.id: if v.admin_level >= PERMS['POST_COMMENT_MODERATION']: ma = ModAction( kind = "set_nsfw", user_id = v.id, - target_submission_id = post.id, + target_submission_id = p.id, ) g.db.add(ma) else: ma = SubAction( - sub = post.sub, + sub = p.sub, kind = "set_nsfw", user_id = v.id, - target_submission_id = post.id, + target_submission_id = p.id, ) g.db.add(ma) - send_repeatable_notification(post.author_id, f"@{v.username} (a site admin) has marked [{post.title}](/post/{post.id}) as +18") + send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has marked [{p.title}](/post/{p.id}) as +18") return {"message": "Post has been marked as +18!"} @@ -799,34 +799,34 @@ def mark_post_nsfw(pid, v): @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @auth_required def unmark_post_nsfw(pid, v): - post = get_post(pid) + p = get_post(pid) - if post.author_id != v.id and not v.admin_level >= PERMS['POST_COMMENT_MODERATION'] and not (post.sub and v.mods(post.sub)): + if p.author_id != v.id and not v.admin_level >= PERMS['POST_COMMENT_MODERATION'] and not (p.sub and v.mods(p.sub)): abort(403) - if post.over_18 and v.is_suspended_permanently: + if p.over_18 and v.is_suspended_permanently: abort(403) - post.over_18 = False - g.db.add(post) + p.over_18 = False + g.db.add(p) - if post.author_id != v.id: + if p.author_id != v.id: if v.admin_level >= PERMS['POST_COMMENT_MODERATION']: ma = ModAction( kind = "unset_nsfw", user_id = v.id, - target_submission_id = post.id, + target_submission_id = p.id, ) g.db.add(ma) else: ma = SubAction( - sub = post.sub, + sub = p.sub, kind = "unset_nsfw", user_id = v.id, - target_submission_id = post.id, + target_submission_id = p.id, ) g.db.add(ma) - send_repeatable_notification(post.author_id, f"@{v.username} (a site admin) has unmarked [{post.title}](/post/{post.id}) as +18") + send_repeatable_notification(p.author_id, f"@{v.username} (a site admin) has unmarked [{p.title}](/post/{p.id}) as +18") return {"message": "Post has been unmarked as +18!"} @@ -837,12 +837,12 @@ def unmark_post_nsfw(pid, v): @auth_required def save_post(pid, v): - post=get_post(pid) + p = get_post(pid) - save = g.db.query(SaveRelationship).filter_by(user_id=v.id, submission_id=post.id).one_or_none() + save = g.db.query(SaveRelationship).filter_by(user_id=v.id, submission_id=p.id).one_or_none() if not save: - new_save=SaveRelationship(user_id=v.id, submission_id=post.id) + new_save=SaveRelationship(user_id=v.id, submission_id=p.id) g.db.add(new_save) return {"message": "Post saved!"} @@ -854,9 +854,9 @@ def save_post(pid, v): @auth_required def unsave_post(pid, v): - post=get_post(pid) + p = get_post(pid) - save = g.db.query(SaveRelationship).filter_by(user_id=v.id, submission_id=post.id).one_or_none() + save = g.db.query(SaveRelationship).filter_by(user_id=v.id, submission_id=p.id).one_or_none() if save: g.db.delete(save) @@ -869,13 +869,13 @@ def unsave_post(pid, v): @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @auth_required def pin_post(post_id, v): - post = get_post(post_id) - if post: - if v.id != post.author_id: abort(403, "Only the post author can do that!") - post.is_pinned = not post.is_pinned - g.db.add(post) + p = get_post(post_id) + if p: + if v.id != p.author_id: abort(403, "Only the post author can do that!") + p.is_pinned = not p.is_pinned + g.db.add(p) cache.delete_memoized(userpagelisting) - if post.is_pinned: return {"message": "Post pinned!"} + if p.is_pinned: return {"message": "Post pinned!"} else: return {"message": "Post unpinned!"} return abort(404, "Post not found!") @@ -884,19 +884,19 @@ def pin_post(post_id, v): @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @auth_required def set_new_sort(post_id:int, v:User): - post = get_post(post_id) - if not v.can_edit(post): abort(403, "Only the post author can do that!") - post.new = True - g.db.add(post) + p = get_post(post_id) + if not v.can_edit(p): abort(403, "Only the post author can do that!") + p.new = True + g.db.add(p) - if v.id != post.author_id: + if v.id != p.author_id: ma = ModAction( kind = "set_new", user_id = v.id, - target_submission_id = post.id, + target_submission_id = p.id, ) g.db.add(ma) - send_repeatable_notification(post.author_id, f"@{v.username} (a site admin) has changed the the default sorting of comments on [{post.title}](/post/{post.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`") return {"message": "Changed the the default sorting of comments on this post to 'new'"} @@ -906,19 +906,19 @@ def set_new_sort(post_id:int, v:User): @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @auth_required def unset_new_sort(post_id:int, v:User): - post = get_post(post_id) - if not v.can_edit(post): abort(403, "Only the post author can do that!") - post.new = None - g.db.add(post) + p = get_post(post_id) + if not v.can_edit(p): abort(403, "Only the post author can do that!") + p.new = None + g.db.add(p) - if v.id != post.author_id: + if v.id != p.author_id: ma = ModAction( kind = "set_hot", user_id = v.id, - target_submission_id = post.id, + target_submission_id = p.id, ) g.db.add(ma) - send_repeatable_notification(post.author_id, f"@{v.username} (a site admin) has changed the the default sorting of comments on [{post.title}](/post/{post.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`") return {"message": "Changed the the default sorting of comments on this post to 'hot'"}