From 92f0154e670a33bcb978b5cac2d75f9cd59854a1 Mon Sep 17 00:00:00 2001 From: Aevann Date: Sat, 6 May 2023 00:44:24 +0300 Subject: [PATCH] use new pagination system everywhere it isnt used --- files/classes/clients.py | 19 ++-- files/routes/admin.py | 24 ++-- files/routes/feeds.py | 2 +- files/routes/front.py | 18 +-- files/routes/hats.py | 11 +- files/routes/notifications.py | 24 ++-- files/routes/oauth.py | 21 +--- files/routes/search.py | 51 ++++----- files/routes/static.py | 18 +-- files/routes/subs.py | 8 +- files/routes/users.py | 127 +++++++++++++--------- files/templates/pagination.html | 2 +- files/templates/search.html | 13 +-- files/templates/user_cards.html | 19 +--- files/templates/userpage/voted_posts.html | 19 +--- files/templates/userpage/voters.html | 19 +--- 16 files changed, 167 insertions(+), 228 deletions(-) diff --git a/files/classes/clients.py b/files/classes/clients.py index 1fa447f30..c6427d053 100644 --- a/files/classes/clients.py +++ b/files/classes/clients.py @@ -37,18 +37,15 @@ class OauthApp(Base): return f"{SITE_FULL}/admin/app/{self.id}" @lazy - def idlist(self, db:scoped_session, page=1): - posts = db.query(Submission.id).filter_by(app_id=self.id) - posts=posts.order_by(Submission.created_utc.desc()) - posts=posts.offset(100*(page-1)).limit(101) - return [x[0] for x in posts.all()] + def idlist(self, cls, page=1): + items = db.query(cls).options(load_only(cls.id)).filter_by(app_id=self.id) + total = items.count() - @lazy - def comments_idlist(self, db:scoped_session, page=1): - posts = db.query(Comment.id).filter_by(app_id=self.id) - posts=posts.order_by(Comment.id.desc()) - posts=posts.offset(100*(page-1)).limit(101) - return [x[0] for x in posts.all()] + items = items.order_by(cls.created_utc.desc()) + items = items.offset(100*(page-1)).limit(100) + items = [x.id for x in items.all()] + + return items, total class ClientAuth(Base): diff --git a/files/routes/admin.py b/files/routes/admin.py index fbb368ec9..4af4f642f 100644 --- a/files/routes/admin.py +++ b/files/routes/admin.py @@ -50,7 +50,7 @@ def dm_images(v): with open(f"{LOG_DIRECTORY}/dm_images.log", "r", encoding="utf-8") as f: items=f.read().split("\n")[:-1] - next_exists = len(items) + total = len(items) items = [x.split(", ") for x in items] items.reverse() @@ -61,7 +61,7 @@ def dm_images(v): secondrange = firstrange + PAGE_SIZE items = items[firstrange:secondrange] - return render_template("admin/dm_images.html", v=v, items=items, next_exists=next_exists, page=page) + return render_template("admin/dm_images.html", v=v, items=items, total=total, page=page) @app.get('/admin/edit_rules') @limiter.limit(DEFAULT_RATELIMIT) @@ -305,7 +305,7 @@ def image_posts_listing(v): posts = [x.id for x in posts if x.is_image] - next_exists = len(posts) + total = len(posts) firstrange = PAGE_SIZE * (page - 1) secondrange = firstrange + PAGE_SIZE @@ -313,7 +313,7 @@ def image_posts_listing(v): posts = get_posts(posts, v=v) - return render_template("admin/image_posts.html", v=v, listing=posts, next_exists=next_exists, page=page, sort="new") + return render_template("admin/image_posts.html", v=v, listing=posts, total=total, page=page, sort="new") @app.get("/admin/reported/posts") @@ -329,14 +329,14 @@ def reported_posts(v): deleted_utc=0 ).join(Submission.flags) - next_exists = listing.count() + total = listing.count() listing = listing.order_by(Submission.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE) listing = [p.id for p in listing] listing = get_posts(listing, v=v) return render_template("admin/reported_posts.html", - next_exists=next_exists, listing=listing, page=page, v=v) + total=total, listing=listing, page=page, v=v) @app.get("/admin/reported/comments") @@ -352,14 +352,14 @@ def reported_comments(v): deleted_utc=0 ).join(Comment.flags) - next_exists = listing.count() + total = listing.count() listing = listing.order_by(Comment.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE) listing = [c.id for c in listing] listing = get_comments(listing, v=v) return render_template("admin/reported_comments.html", - next_exists=next_exists, + total=total, listing=listing, page=page, v=v, @@ -738,7 +738,7 @@ def admin_removed(v): listing = g.db.query(Submission).options(load_only(Submission.id)).join(Submission.author).filter( or_(Submission.is_banned==True, User.shadowbanned != None)) - next_exists = listing.count() + total = listing.count() listing = listing.order_by(Submission.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() listing = [x.id for x in listing] @@ -748,7 +748,7 @@ def admin_removed(v): v=v, listing=posts, page=page, - next_exists=next_exists + total=total ) @@ -762,7 +762,7 @@ def admin_removed_comments(v): listing = g.db.query(Comment).options(load_only(Comment.id)).join(Comment.author).filter( or_(Comment.is_banned==True, User.shadowbanned != None)) - next_exists = listing.count() + total = listing.count() listing = listing.order_by(Comment.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() listing = [x.id for x in listing] @@ -772,7 +772,7 @@ def admin_removed_comments(v): v=v, listing=comments, page=page, - next_exists=next_exists + total=total ) diff --git a/files/routes/feeds.py b/files/routes/feeds.py index ba774b6f2..1c9af1b55 100644 --- a/files/routes/feeds.py +++ b/files/routes/feeds.py @@ -15,7 +15,7 @@ from files.__main__ import app def feeds_user(sort='hot', t='all'): page = get_page() - ids, next_exists, size = frontlist( + ids, total, size = frontlist( sort=sort, page=page, t=t, diff --git a/files/routes/front.py b/files/routes/front.py index 4c3e4c65c..970621813 100644 --- a/files/routes/front.py +++ b/files/routes/front.py @@ -48,7 +48,7 @@ def front_all(v, sub=None, subdomain=None): pins = session.get(sort, default) - ids, next_exists, size = frontlist(sort=sort, + ids, total, size = frontlist(sort=sort, page=page, t=t, v=v, @@ -65,8 +65,8 @@ def front_all(v, sub=None, subdomain=None): if v.hidevotedon: posts = [x for x in posts if not hasattr(x, 'voted') or not x.voted] award_timers(v) - if v and v.client: return {"data": [x.json(g.db) for x in posts], "next_exists": next_exists} - return render_template("home.html", v=v, listing=posts, next_exists=next_exists, sort=sort, t=t, page=page, sub=sub, home=True, pins=pins, size=size) + if v and v.client: return {"data": [x.json(g.db) for x in posts], "total": total} + return render_template("home.html", v=v, listing=posts, total=total, sort=sort, t=t, page=page, sub=sub, home=True, pins=pins, size=size) LIMITED_WPD_HOLES = ('gore', 'aftermath', 'selfharm', 'meta', 'discussion', 'social', 'music', 'request') @@ -107,7 +107,7 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words=' word = word.replace('\\', '').replace('_', '\_').replace('%', '\%').strip() posts=posts.filter(not_(Submission.title.ilike(f'%{word}%'))) - next_exists = posts.count() + total = posts.count() posts = sort_objects(sort, posts, Submission) @@ -149,7 +149,7 @@ def frontlist(v=None, sort="hot", page=1, t="all", ids_only=True, filter_words=' posts = pins + posts if ids_only: posts = [x.id for x in posts] - return posts, next_exists, size + return posts, total, size @app.get("/random_post") @@ -201,11 +201,11 @@ def comment_idlist(v=None, page=1, sort="new", t="day", gt=0, lt=0): if not gt and not lt: comments = apply_time_filter(t, comments, Comment) - next_exists = comments.count() + total = comments.count() comments = sort_objects(sort, comments, Comment) comments = comments.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() - return [x.id for x in comments], next_exists + return [x.id for x in comments], total @app.get("/comments") @limiter.limit(DEFAULT_RATELIMIT) @@ -222,7 +222,7 @@ def all_comments(v:User): try: lt=int(request.values.get("before", 0)) except: lt=0 - idlist, next_exists = comment_idlist(v=v, + idlist, total = comment_idlist(v=v, page=page, sort=sort, t=t, @@ -233,4 +233,4 @@ def all_comments(v:User): comments = get_comments(idlist, v=v) if v.client: return {"data": [x.json(g.db) for x in comments]} - return render_template("home_comments.html", v=v, sort=sort, t=t, page=page, comments=comments, standalone=True, next_exists=next_exists, size = PAGE_SIZE) + return render_template("home_comments.html", v=v, sort=sort, t=t, page=page, comments=comments, standalone=True, total=total, size = PAGE_SIZE) diff --git a/files/routes/hats.py b/files/routes/hats.py index d88d9cdd2..c0e1decaf 100644 --- a/files/routes/hats.py +++ b/files/routes/hats.py @@ -65,7 +65,7 @@ def hats(v:User): sales = g.db.query(func.sum(User.coins_spent_on_hats)).scalar() num_of_hats = g.db.query(HatDef).filter(HatDef.submitter_id == None).count() - return render_template("hats.html", owned_hat_ids=owned_hat_ids, hats=hats, v=v, sales=sales, num_of_hats=num_of_hats, next_exists=num_of_hats, page=page, sort=sort) + return render_template("hats.html", owned_hat_ids=owned_hat_ids, hats=hats, v=v, sales=sales, num_of_hats=num_of_hats, total=num_of_hats, page=page, sort=sort) @app.post("/buy_hat/") @limiter.limit('1/second', scope=rpath) @@ -160,15 +160,16 @@ def hat_owners(v:User, hat_id): page = get_page() - users = g.db.query(User).join(Hat.owners).filter(Hat.hat_id == hat_id).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE+1).all() + users = g.db.query(User).join(Hat.owners).filter(Hat.hat_id == hat_id) - next_exists = (len(users) > PAGE_SIZE) - users = users[:PAGE_SIZE] + total = users.count() + + users = users.order_by(Hat.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() return render_template("user_cards.html", v=v, users=users, - next_exists=next_exists, + total=total, page=page, user_cards_title="Hat Owners", ) diff --git a/files/routes/notifications.py b/files/routes/notifications.py index c4a3de5a0..b9943ad41 100644 --- a/files/routes/notifications.py +++ b/files/routes/notifications.py @@ -65,7 +65,7 @@ def notifications_modmail(v): level=1, ) - next_exists = comments.count() + total = comments.count() listing = comments.order_by(Comment.id.desc()).offset(PAGE_SIZE*(page-1)).limit(PAGE_SIZE).all() g.db.flush() @@ -75,7 +75,7 @@ def notifications_modmail(v): return render_template("notifications.html", v=v, notifications=listing, - next_exists=next_exists, + total=total, page=page, standalone=True, render_replies=True, @@ -137,7 +137,7 @@ def notifications_messages(v:User): list_to_perserve_unread_attribute.append(c) - next_exists = message_threads.count() + total = message_threads.count() listing = message_threads.order_by(thread_order.c.created_utc.desc()) \ .offset(PAGE_SIZE*(page-1)).limit(PAGE_SIZE).all() @@ -146,7 +146,7 @@ def notifications_messages(v:User): return render_template("notifications.html", v=v, notifications=listing, - next_exists=next_exists, + total=total, page=page, standalone=True, render_replies=True, @@ -174,7 +174,7 @@ def notifications_posts(v:User): Submission.author_id.notin_(v.userblocks) ).options(load_only(Submission.id)) - next_exists = listing.count() + total = listing.count() listing = listing.order_by(Submission.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() listing = [x.id for x in listing] @@ -193,7 +193,7 @@ def notifications_posts(v:User): return render_template("notifications.html", v=v, notifications=listing, - next_exists=next_exists, + total=total, page=page, standalone=True, render_replies=True, @@ -225,7 +225,7 @@ def notifications_modactions(v:User): if cls == SubAction: listing = listing.filter(cls.sub.in_(v.moderated_subs)) - next_exists = listing.count() + total = listing.count() listing = listing.order_by(cls.id.desc()) listing = listing.offset(PAGE_SIZE*(page-1)).limit(PAGE_SIZE).all() @@ -239,7 +239,7 @@ def notifications_modactions(v:User): return render_template("notifications.html", v=v, notifications=listing, - next_exists=next_exists, + total=total, page=page, standalone=True, render_replies=True, @@ -262,7 +262,7 @@ def notifications_reddit(v:User): Comment.author_id == AUTOJANNY_ID ) - next_exists = listing.count() + total = listing.count() listing = listing.order_by(Comment.created_utc.desc()).offset(PAGE_SIZE*(page-1)).limit(PAGE_SIZE).all() for ma in listing: @@ -277,7 +277,7 @@ def notifications_reddit(v:User): return render_template("notifications.html", v=v, notifications=listing, - next_exists=next_exists, + total=total, page=page, standalone=True, render_replies=True, @@ -323,7 +323,7 @@ def notifications(v:User): Comment.deleted_utc == 0, ) - next_exists = comments.count() + total = comments.count() comments = comments.order_by(Notification.created_utc.desc(), Comment.id.desc()) comments = comments.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() @@ -413,7 +413,7 @@ def notifications(v:User): return render_template("notifications.html", v=v, notifications=listing, - next_exists=next_exists, + total=total, page=page, standalone=True, render_replies=True, diff --git a/files/routes/oauth.py b/files/routes/oauth.py index 941bccc34..539a79a68 100644 --- a/files/routes/oauth.py +++ b/files/routes/oauth.py @@ -248,24 +248,20 @@ def admin_app_reject(v, aid): @limiter.limit(DEFAULT_RATELIMIT, key_func=get_ID) @admin_level_required(PERMS['APPS_MODERATION']) def admin_app_id_posts(v, aid): - aid=aid oauth = g.db.get(OauthApp, aid) if not oauth: abort(404) page = get_page() - pids=oauth.idlist(g.db, page=page) + pids, total = oauth.idlist(Submission, page=page) - next_exists=len(pids)==101 - pids=pids[:100] - - posts=get_posts(pids, v=v) + posts = get_posts(pids, v=v) return render_template("admin/app.html", v=v, app=oauth, listing=posts, - next_exists=next_exists + total=total ) @app.get("/admin/app//comments") @@ -274,26 +270,21 @@ def admin_app_id_posts(v, aid): @admin_level_required(PERMS['APPS_MODERATION']) def admin_app_id_comments(v, aid): - aid=aid - oauth = g.db.get(OauthApp, aid) if not oauth: abort(404) page = get_page() - cids=oauth.comments_idlist(g.db, page=page) + cids, total = oauth.idlist(Comment, page=page) - next_exists=len(cids)==101 - cids=cids[:100] - - comments=get_comments(cids, v=v) + comments = get_comments(cids, v=v) return render_template("admin/app.html", v=v, app=oauth, comments=comments, - next_exists=next_exists, + total=total, standalone=True ) diff --git a/files/routes/search.py b/files/routes/search.py index 768e1fc21..2043956a2 100644 --- a/files/routes/search.py +++ b/files/routes/search.py @@ -3,6 +3,7 @@ import time from calendar import timegm from sqlalchemy import * +from sqlalchemy.orm import load_only from files.helpers.regex import * from files.helpers.sorting_and_time import * @@ -60,7 +61,7 @@ def searchposts(v:User): criteria=searchparse(query) - posts = g.db.query(Submission.id) \ + posts = g.db.query(Submission).options(load_only(Submission.id)) \ .join(Submission.author) \ .filter(Submission.author_id.notin_(v.userblocks)) @@ -84,7 +85,6 @@ def searchposts(v:User): listing=[], sort=sort, t=t, - next_exists=False, domain=None, domain_obj=None, error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them." @@ -148,16 +148,13 @@ def searchposts(v:User): posts = apply_time_filter(t, posts, Submission) - posts = sort_objects(sort, posts, Submission) - total = posts.count() - posts = posts.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE+1).all() + posts = sort_objects(sort, posts, Submission) - ids = [x[0] for x in posts] + posts = posts.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() - next_exists = (len(ids) > PAGE_SIZE) - ids = ids[:PAGE_SIZE] + ids = [x.id for x in posts] posts = get_posts(ids, v=v, eager=True) @@ -166,12 +163,11 @@ def searchposts(v:User): return render_template("search.html", v=v, query=query, - total=total, page=page, listing=posts, sort=sort, t=t, - next_exists=next_exists + total=total ) @app.get("/search/comments") @@ -190,7 +186,7 @@ def searchcomments(v:User): criteria = searchparse(query) - comments = g.db.query(Comment.id).outerjoin(Comment.post) \ + comments = g.db.query(Comment).options(load_only(Comment.id)).outerjoin(Comment.post) \ .filter( or_(Comment.parent_submission != None, Comment.wall_user_id != None), Comment.author_id.notin_(v.userblocks), @@ -210,7 +206,7 @@ def searchcomments(v:User): if v.client: abort(403, f"@{author.username}'s profile is private; You can't use the 'author' syntax on them") - return render_template("search_comments.html", v=v, query=query, total=0, page=page, comments=[], sort=sort, t=t, next_exists=False, error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them!"), 403 + return render_template("search_comments.html", v=v, query=query, total=0, page=page, comments=[], sort=sort, t=t, error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them!"), 403 else: comments = comments.filter(Comment.author_id == author.id) @@ -260,21 +256,18 @@ def searchcomments(v:User): except: abort(400) comments = comments.filter(Comment.created_utc < before) - comments = sort_objects(sort, comments, Comment) - total = comments.count() - comments = comments.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE+1).all() + comments = sort_objects(sort, comments, Comment) - ids = [x[0] for x in comments] + comments = comments.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() - next_exists = (len(ids) > PAGE_SIZE) - ids = ids[:PAGE_SIZE] + ids = [x.id for x in comments] comments = get_comments(ids, v=v) if v.client: return {"total":total, "data":[x.json(db=g.db) for x in comments]} - return render_template("search_comments.html", v=v, query=query, total=total, page=page, comments=comments, sort=sort, t=t, next_exists=next_exists, standalone=True) + return render_template("search_comments.html", v=v, query=query, page=page, comments=comments, sort=sort, t=t, total=total, standalone=True) @app.get("/search/messages") @@ -297,7 +290,7 @@ def searchmessages(v:User): if v.admin_level >= PERMS['VIEW_MODMAIL']: dm_conditions.append(Comment.sentto == MODMAIL_ID), - comments = g.db.query(Comment) \ + comments = g.db.query(Comment).options(load_only(Comment.id)) \ .filter( Comment.sentto != None, Comment.parent_submission == None, @@ -311,7 +304,7 @@ def searchmessages(v:User): if v.client: abort(403, f"@{author.username}'s profile is private; You can't use the 'author' syntax on them") - return render_template("search_comments.html", v=v, query=query, total=0, page=page, comments=[], sort=sort, t=t, next_exists=False, error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them!"), 403 + return render_template("search_comments.html", v=v, query=query, total=0, page=page, comments=[], sort=sort, t=t, error=f"@{author.username}'s profile is private; You can't use the 'author' syntax on them!"), 403 else: comments = comments.filter(Comment.author_id == author.id) @@ -350,21 +343,18 @@ def searchmessages(v:User): abort(400, "The `sentto` field must contain a user's username!") comments = comments.filter(Comment.sentto == sentto.id) - comments = sort_objects(sort, comments, Comment) - total = comments.count() - comments = comments.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE+1).all() + comments = sort_objects(sort, comments, Comment) - next_exists = (len(comments) > PAGE_SIZE) - comments = comments[:PAGE_SIZE] + comments = comments.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() for x in comments: x.unread = True comments = [x.top_comment for x in comments] if v.client: return {"total":total, "data":[x.json(db=g.db) for x in comments]} - return render_template("search_comments.html", v=v, query=query, total=total, page=page, comments=comments, sort=sort, t=t, next_exists=next_exists, standalone=True, render_replies=True) + return render_template("search_comments.html", v=v, query=query, page=page, comments=comments, sort=sort, t=t, total=total, standalone=True, render_replies=True) @app.get("/search/users") @limiter.limit(DEFAULT_RATELIMIT) @@ -411,10 +401,7 @@ def searchusers(v:User): total = users.count() - users = users.offset(PAGE_SIZE * (page-1)).limit(PAGE_SIZE+1).all() - - next_exists = (len(users)>PAGE_SIZE) - users = users[:PAGE_SIZE] + users = users.offset(PAGE_SIZE * (page-1)).limit(PAGE_SIZE).all() if v.client: return {"data": [x.json for x in users]} - return render_template("search_users.html", v=v, query=query, total=total, page=page, users=users, next_exists=next_exists) + return render_template("search_users.html", v=v, query=query, page=page, users=users, total=total) diff --git a/files/routes/static.py b/files/routes/static.py index 6a85aad51..607cb16dd 100644 --- a/files/routes/static.py +++ b/files/routes/static.py @@ -53,7 +53,7 @@ def marseys(v:User): marseys = g.db.query(Emoji, User).join(User, Emoji.author_id == User.id).filter(Emoji.kind == "Marsey", Emoji.submitter_id==None) - next_exists = marseys.count() + total = marseys.count() sort = request.values.get("sort", "usage") if sort == "author": @@ -79,7 +79,7 @@ def marseys(v:User): marsey.og = f'{marsey.name}.{x}' break - return render_template("marseys.html", v=v, marseys=marseys, page=page, next_exists=next_exists, sort=sort) + return render_template("marseys.html", v=v, marseys=marseys, page=page, total=total, sort=sort) @cache.cached(key_prefix="emojis") @@ -178,7 +178,7 @@ def log(v:User): if kind and kind not in types: kind = None actions = [] - next_exists = 0 + total = 0 else: actions = g.db.query(ModAction) if v.admin_level < PERMS['USER_SHADOWBAN']: @@ -194,12 +194,12 @@ def log(v:User): if k in kinds: types2[k] = val types = types2 if kind: actions = actions.filter_by(kind=kind) - next_exists = actions.count() + total = actions.count() actions = actions.order_by(ModAction.id.desc()).offset(PAGE_SIZE*(page-1)).limit(PAGE_SIZE).all() admins = [x[0] for x in g.db.query(User.username).filter(User.admin_level >= PERMS['ADMIN_MOP_VISIBLE']).order_by(User.username).all()] - return render_template("log.html", v=v, admins=admins, types=types, admin=admin, type=kind, actions=actions, next_exists=next_exists, page=page, single_user_url='admin') + return render_template("log.html", v=v, admins=admins, types=types, admin=admin, type=kind, actions=actions, total=total, page=page, single_user_url='admin') @app.get("/log/") @limiter.limit(DEFAULT_RATELIMIT) @@ -225,7 +225,7 @@ def log_item(id, v): types = MODACTION_TYPES__FILTERED else: types = MODACTION_TYPES_FILTERED - return render_template("log.html", v=v, actions=[action], next_exists=1, page=1, action=action, admins=admins, types=types, single_user_url='admin') + return render_template("log.html", v=v, actions=[action], total=1, page=1, action=action, admins=admins, types=types, single_user_url='admin') @app.get("/directory") @limiter.limit(DEFAULT_RATELIMIT) @@ -379,7 +379,7 @@ def transfers_id(id, v): if not transfer: abort(404) - return render_template("transfers.html", v=v, page=1, comments=[transfer], standalone=True, next_exists=1) + return render_template("transfers.html", v=v, page=1, comments=[transfer], standalone=True, total=1) @app.get("/transfers") @limiter.limit(DEFAULT_RATELIMIT) @@ -391,13 +391,13 @@ def transfers(v:User): page = get_page() - next_exists = comments.count() + total = comments.count() comments = comments.order_by(Comment.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() if v.client: return {"data": [x.json(g.db) for x in comments]} else: - return render_template("transfers.html", v=v, page=page, comments=comments, standalone=True, next_exists=next_exists) + return render_template("transfers.html", v=v, page=page, comments=comments, standalone=True, total=total) @app.get('/donate') diff --git a/files/routes/subs.py b/files/routes/subs.py index 7eaae1378..cee2bf5a9 100644 --- a/files/routes/subs.py +++ b/files/routes/subs.py @@ -866,7 +866,7 @@ def hole_log(v:User, sub): if kind and kind not in types: kind = None actions = [] - next_exists=0 + total=0 else: actions = g.db.query(SubAction).filter_by(sub=sub.name) @@ -878,13 +878,13 @@ def hole_log(v:User, sub): if k in kinds: types2[k] = val types = types2 if kind: actions = actions.filter_by(kind=kind) - next_exists = actions.count() + total = actions.count() actions = actions.order_by(SubAction.id.desc()).offset(PAGE_SIZE*(page-1)).limit(PAGE_SIZE).all() mods = [x[0] for x in g.db.query(Mod.user_id).filter_by(sub=sub.name).all()] mods = [x[0] for x in g.db.query(User.username).filter(User.id.in_(mods)).order_by(User.username).all()] - return render_template("log.html", v=v, admins=mods, types=types, admin=mod, type=kind, actions=actions, next_exists=next_exists, page=page, sub=sub, single_user_url='mod') + return render_template("log.html", v=v, admins=mods, types=types, admin=mod, type=kind, actions=actions, total=total, page=page, sub=sub, single_user_url='mod') @app.get("/h//log/") @limiter.limit(DEFAULT_RATELIMIT) @@ -906,4 +906,4 @@ def hole_log_item(id, v, sub): types = SUBACTION_TYPES - return render_template("log.html", v=v, actions=[action], next_exists=1, page=1, action=action, admins=mods, types=types, sub=sub, single_user_url='mod') + return render_template("log.html", v=v, actions=[action], total=1, page=1, action=action, admins=mods, types=types, sub=sub, single_user_url='mod') diff --git a/files/routes/users.py b/files/routes/users.py index e8edae7df..52a398e36 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -38,11 +38,19 @@ def upvoters_downvoters(v, username, uid, cls, vote_cls, vote_dir, template, sta page = get_page() - listing = g.db.query(cls).join(vote_cls).filter(cls.ghost == False, cls.is_banned == False, cls.deleted_utc == 0, vote_cls.vote_type==vote_dir, cls.author_id==id, vote_cls.user_id==uid).order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all() - - listing = [p.id for p in listing] - next_exists = len(listing) > PAGE_SIZE - listing = listing[:PAGE_SIZE] + listing = g.db.query(cls).options(load_only(cls.id)).join(vote_cls).filter( + cls.ghost == False, + cls.is_banned == False, + cls.deleted_utc == 0, + vote_cls.vote_type==vote_dir, + cls.author_id==id, + vote_cls.user_id==uid, + ) + + total = listing.count() + + listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() + listing = [x.id for x in listing] if cls == Submission: listing = get_posts(listing, v=v, eager=True) @@ -51,7 +59,7 @@ def upvoters_downvoters(v, username, uid, cls, vote_cls, vote_dir, template, sta else: listing = [] - return render_template(template, next_exists=next_exists, listing=listing, page=page, v=v, standalone=standalone) + return render_template(template, total=total, listing=listing, page=page, v=v, standalone=standalone) @app.get("/@/upvoters//posts") @limiter.limit(DEFAULT_RATELIMIT) @@ -96,11 +104,19 @@ def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, sta page = get_page() - listing = g.db.query(cls).join(vote_cls).filter(cls.ghost == False, cls.is_banned == False, cls.deleted_utc == 0, vote_cls.vote_type==vote_dir, vote_cls.user_id==id, cls.author_id==uid).order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all() - - listing = [p.id for p in listing] - next_exists = len(listing) > PAGE_SIZE - listing = listing[:PAGE_SIZE] + listing = g.db.query(cls).options(load_only(cls.id)).join(vote_cls).filter( + cls.ghost == False, + cls.is_banned == False, + cls.deleted_utc == 0, + vote_cls.vote_type==vote_dir, + vote_cls.user_id==id, + cls.author_id==uid, + ) + + total = listing.count() + + listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() + listing = [x.id for x in listing] if cls == Submission: listing = get_posts(listing, v=v, eager=True) @@ -109,7 +125,7 @@ def upvoting_downvoting(v, username, uid, cls, vote_cls, vote_dir, template, sta else: listing = [] - return render_template(template, next_exists=next_exists, listing=listing, page=page, v=v, standalone=standalone) + return render_template(template, total=total, listing=listing, page=page, v=v, standalone=standalone) @app.get("/@/upvoting//posts") @limiter.limit(DEFAULT_RATELIMIT) @@ -155,11 +171,13 @@ def user_voted(v, username, cls, vote_cls, template, standalone): cls.deleted_utc == 0, cls.author_id != u.id, vote_cls.user_id == u.id, - ).order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all() + ) + + total = listing.count() + + 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 = [i.id for i in listing] - next_exists = len(listing) > PAGE_SIZE - listing = listing[:PAGE_SIZE] if cls == Submission: listing = get_posts(listing, v=v, eager=True) elif cls == Comment: @@ -167,7 +185,7 @@ def user_voted(v, username, cls, vote_cls, template, standalone): else: listing = [] - return render_template(template, next_exists=next_exists, listing=listing, page=page, v=v, standalone=standalone) + return render_template(template, total=total, listing=listing, page=page, v=v, standalone=standalone) @app.get("/@/voted/posts") @limiter.limit(DEFAULT_RATELIMIT) @@ -271,10 +289,10 @@ def all_upvoters_downvoters(v:User, username:str, vote_dir:int, is_who_simps_hat page = get_page() users = users[PAGE_SIZE * (page-1):] - next_exists = (len(users) > PAGE_SIZE) + total = (len(users) > PAGE_SIZE) users = users[:PAGE_SIZE] - return render_template("userpage/voters.html", v=v, users=users, pos=pos, name=vote_name, name2=name2, total=total, page=page, next_exists=next_exists) + return render_template("userpage/voters.html", v=v, users=users, pos=pos, name=vote_name, name2=name2, page=page, total=total) @app.get("/@/upvoters") @limiter.limit(DEFAULT_RATELIMIT) @@ -730,12 +748,12 @@ def blockers(v:User, username:str): users = g.db.query(UserBlock, User).join(UserBlock, UserBlock.target_id == u.id) \ .filter(UserBlock.user_id == User.id) - next_exists = users.count() + total = users.count() users = users.order_by(UserBlock.created_utc.desc()) \ .offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE ).all() - return render_template("userpage/blockers.html", v=v, u=u, users=users, page=page, next_exists=next_exists) + return render_template("userpage/blockers.html", v=v, u=u, users=users, page=page, total=total) @app.get("/@/followers") @limiter.limit(DEFAULT_RATELIMIT) @@ -752,12 +770,12 @@ def followers(v:User, username:str): users = g.db.query(Follow, User).join(Follow, Follow.target_id == u.id) \ .filter(Follow.user_id == User.id) - next_exists = users.count() + total = users.count() users = users.order_by(Follow.created_utc.desc()) \ .offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() - return render_template("userpage/followers.html", v=v, u=u, users=users, page=page, next_exists=next_exists) + return render_template("userpage/followers.html", v=v, u=u, users=users, page=page, total=total) @app.get("/@/following") @limiter.limit(DEFAULT_RATELIMIT) @@ -773,12 +791,12 @@ def following(v:User, username:str): users = g.db.query(User).join(Follow, Follow.user_id == u.id) \ .filter(Follow.target_id == User.id) - next_exists = users.count() + total = users.count() users = users.order_by(Follow.created_utc.desc()) \ .offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() - return render_template("userpage/following.html", v=v, u=u, users=users, page=page, next_exists=next_exists) + return render_template("userpage/following.html", v=v, u=u, users=users, page=page, total=total) @app.get("/@/views") @limiter.limit(DEFAULT_RATELIMIT) @@ -790,10 +808,10 @@ def visitors(v:User, username:str): page = get_page() views = g.db.query(ViewerRelationship).filter_by(user_id=u.id) - next_exists = views.count() + total = views.count() views = views.order_by(ViewerRelationship.last_view_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() - return render_template("userpage/views.html", v=v, u=u, views=views, next_exists=next_exists, page=page) + return render_template("userpage/views.html", v=v, u=u, views=views, total=total, page=page) @cache.memoize() def userpagelisting(user:User, v=None, page:int=1, sort="new", t="all"): @@ -801,10 +819,10 @@ def userpagelisting(user:User, v=None, page:int=1, sort="new", t="all"): 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 = apply_time_filter(t, posts, Submission) - next_exists = posts.count() + total = posts.count() posts = sort_objects(sort, posts, Submission) posts = posts.offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() - return [x.id for x in posts], next_exists + return [x.id for x in posts], total @app.get("/@") @limiter.limit(DEFAULT_RATELIMIT) @@ -842,7 +860,7 @@ def u_username_wall(v:Optional[User], username:str): Comment.deleted_utc == 0 ) - next_exists = comments.count() + total = comments.count() comments = comments.order_by(Comment.created_utc.desc()) \ .offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() if v: @@ -851,7 +869,7 @@ def u_username_wall(v:Optional[User], username:str): if v and v.client: return {"data": [c.json(g.db) for c in comments]} - return render_template("userpage/wall.html", u=u, v=v, listing=comments, page=page, next_exists=next_exists, is_following=is_following, standalone=True, render_replies=True, wall=True) + return render_template("userpage/wall.html", u=u, v=v, listing=comments, page=page, total=total, is_following=is_following, standalone=True, render_replies=True, wall=True) @app.get("/@/wall/comment/") @@ -900,7 +918,7 @@ def u_username_wall_comment(v:User, username:str, cid): if v and v.client: return top_comment.json(db=g.db) - return render_template("userpage/wall.html", u=u, v=v, listing=[top_comment], page=1, is_following=is_following, standalone=True, render_replies=True, wall=True, comment_info=comment_info, next_exists=1) + return render_template("userpage/wall.html", u=u, v=v, listing=[top_comment], page=1, is_following=is_following, standalone=True, render_replies=True, wall=True, comment_info=comment_info, total=1) @app.get("/@/posts") @@ -934,7 +952,7 @@ def u_username(v:Optional[User], username:str): t = request.values.get("t", "all") page = get_page() - ids, next_exists = userpagelisting(u, v=v, page=page, sort=sort, t=t) + ids, total = userpagelisting(u, v=v, page=page, sort=sort, t=t) if page == 1 and sort == 'new': sticky = [] @@ -957,7 +975,7 @@ def u_username(v:Optional[User], username:str): page=page, sort=sort, t=t, - next_exists=next_exists, + total=total, is_following=is_following) if v and v.client: @@ -970,7 +988,7 @@ def u_username(v:Optional[User], username:str): page=page, sort=sort, t=t, - next_exists=next_exists, + total=total, is_following=is_following) @@ -1023,7 +1041,7 @@ def u_username_comments(username, v=None): comments = apply_time_filter(t, comments, Comment) - next_exists = comments.count() + total = comments.count() comments = sort_objects(sort, comments, Comment) @@ -1035,7 +1053,7 @@ def u_username_comments(username, v=None): if v and v.client: return {"data": [c.json(g.db) for c in listing]} - return render_template("userpage/comments.html", u=u, v=v, listing=listing, page=page, sort=sort, t=t,next_exists=next_exists, is_following=is_following, standalone=True) + return render_template("userpage/comments.html", u=u, v=v, listing=listing, page=page, sort=sort, t=t,total=total, is_following=is_following, standalone=True) @app.get("/@/info") @@ -1176,9 +1194,14 @@ def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone cls = Comment else: raise TypeError("Relationships supported is SaveRelationship, Subscription, CommentSaveRelationship") - ids = [x[0] for x in g.db.query(query).join(join).filter(relationship_cls.user_id == v.id).order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all()] - next_exists = len(ids) > PAGE_SIZE - ids = ids[:PAGE_SIZE] + + listing = g.db.query(query).join(join).filter(relationship_cls.user_id == v.id) + + total = listing.count() + + listing = listing.order_by(cls.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() + + ids = [x[0] for x in listing] extra = None if not v.admin_level >= PERMS['POST_COMMENT_MODERATION']: @@ -1192,7 +1215,7 @@ def get_saves_and_subscribes(v, template, relationship_cls, page:int, standalone raise TypeError("Only supports Submissions 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]} - return render_template(template, u=v, v=v, listing=listing, page=page, next_exists=next_exists, standalone=standalone) + return render_template(template, u=v, v=v, listing=listing, page=page, total=total, standalone=standalone) @app.get("/@/saved/posts") @limiter.limit(DEFAULT_RATELIMIT) @@ -1275,15 +1298,16 @@ def bid_list(v:User, bid): page = get_page() - users = g.db.query(User).join(User.badges).filter(Badge.badge_id==bid).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all() - - next_exists = (len(users) > PAGE_SIZE) - users = users[:PAGE_SIZE] + users = g.db.query(User).join(User.badges).filter(Badge.badge_id==bid) + + total = users.count() + + users = users.order_by(Badge.created_utc.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() return render_template("user_cards.html", v=v, users=users, - next_exists=next_exists, + total=total, page=page, user_cards_title="Badge Owners", ) @@ -1444,15 +1468,16 @@ def users_list(v): page = get_page() - users = g.db.query(User).order_by(User.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE + 1).all() - - next_exists = (len(users) > PAGE_SIZE) - users = users[:PAGE_SIZE] + users = g.db.query(User) + + total = users.count() + + users = users.order_by(User.id.desc()).offset(PAGE_SIZE * (page - 1)).limit(PAGE_SIZE).all() return render_template("user_cards.html", v=v, users=users, - next_exists=next_exists, + total=total, page=page, user_cards_title="Users Feed", ) diff --git a/files/templates/pagination.html b/files/templates/pagination.html index 96fc8b7d8..f0d47680f 100644 --- a/files/templates/pagination.html +++ b/files/templates/pagination.html @@ -4,7 +4,7 @@ {% if not size %} {% set size = PAGE_SIZE %} {% endif %} - {% set num_pages = (next_exists / size) | round(0, 'ceil') | int %} + {% set num_pages = (total / size) | round(0, 'ceil') | int %} {% set start_point = page - 2 %} {% if start_point < 1 %} diff --git a/files/templates/search.html b/files/templates/search.html index a2085e483..7558000c7 100644 --- a/files/templates/search.html +++ b/files/templates/search.html @@ -201,16 +201,5 @@ {% endblock %} {% block pagenav %} - + {% include "pagination.html" %} {% endblock %} diff --git a/files/templates/user_cards.html b/files/templates/user_cards.html index 40009a045..cd6879ff2 100644 --- a/files/templates/user_cards.html +++ b/files/templates/user_cards.html @@ -8,23 +8,6 @@ {% endblock %} {% block pagenav %} - +{% include "pagination.html" %} {% endblock %} {% block navbar %}{% endblock %} diff --git a/files/templates/userpage/voted_posts.html b/files/templates/userpage/voted_posts.html index 14d50d5ab..cbcb1379d 100644 --- a/files/templates/userpage/voted_posts.html +++ b/files/templates/userpage/voted_posts.html @@ -29,22 +29,5 @@ {% endblock %} {% block pagenav %} - +{% include "pagination.html" %} {% endblock %} diff --git a/files/templates/userpage/voters.html b/files/templates/userpage/voters.html index b0c2748fb..fbb0affaf 100644 --- a/files/templates/userpage/voters.html +++ b/files/templates/userpage/voters.html @@ -36,22 +36,5 @@ {% endblock %} {% block pagenav %} - +{% include "pagination.html" %} {% endblock %}