diff --git a/files/classes/badges.py b/files/classes/badges.py index 0e79829f2..16479d799 100644 --- a/files/classes/badges.py +++ b/files/classes/badges.py @@ -33,7 +33,9 @@ class Badge(Base): Index('badges_badge_id_idx', badge_id) user = relationship("User", viewonly=True) - badge = relationship("BadgeDef", primaryjoin="foreign(Badge.badge_id) == remote(BadgeDef.id)", viewonly=True) + badge = relationship("BadgeDef", + primaryjoin="foreign(Badge.badge_id) == remote(BadgeDef.id)", + lazy="joined", innerjoin=True, viewonly=True) def __repr__(self): return f"" diff --git a/files/helpers/get.py b/files/helpers/get.py index 57f7079b2..c68679d3f 100644 --- a/files/helpers/get.py +++ b/files/helpers/get.py @@ -2,6 +2,7 @@ from typing import Iterable, List, Optional, Type, Union from flask import g from sqlalchemy import and_, any_, or_ +from sqlalchemy.orm import selectinload from files.classes import * from files.helpers.const import AUTOJANNY_ID @@ -148,7 +149,8 @@ def get_post( def get_posts( pids:Iterable[int], - v:Optional[User]=None) -> List[Submission]: + v:Optional[User]=None, + eager:bool=False) -> List[Submission]: if not pids: return [] if v: @@ -177,6 +179,16 @@ def get_posts( else: query = g.db.query(Submission).filter(Submission.id.in_(pids)) + if eager: + query = query.options( + selectinload(Submission.author).options( + selectinload(User.badges), + selectinload(User.notes), + ), + selectinload(Submission.reports), + selectinload(Submission.awards), + ) + results = query.all() if v: diff --git a/files/routes/front.py b/files/routes/front.py index 850c9b29f..8a14c3126 100644 --- a/files/routes/front.py +++ b/files/routes/front.py @@ -204,7 +204,7 @@ def front_all(v, sub=None, subdomain=None): site=SITE ) - posts = get_posts(ids, v=v) + posts = get_posts(ids, v=v, eager=True) if v: if v.hidevotedon: posts = [x for x in posts if not hasattr(x, 'voted') or not x.voted] diff --git a/files/routes/search.py b/files/routes/search.py index 62e1c478a..d67227084 100644 --- a/files/routes/search.py +++ b/files/routes/search.py @@ -160,7 +160,7 @@ def searchposts(v): next_exists = (len(ids) > 25) ids = ids[:25] - posts = get_posts(ids, v=v) + posts = get_posts(ids, v=v, eager=True) if request.headers.get("Authorization"): return {"total":total, "data":[x.json for x in posts]} diff --git a/files/routes/users.py b/files/routes/users.py index ceffb4942..e550f9ffc 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -90,7 +90,7 @@ def upvoters_posts(v, username, uid): next_exists = len(listing) > 25 listing = listing[:25] - listing = get_posts(listing, v=v) + listing = get_posts(listing, v=v, eager=True) return render_template("voted_posts.html", next_exists=next_exists, listing=listing, page=page, v=v) @@ -132,7 +132,7 @@ def downvoters_posts(v, username, uid): next_exists = len(listing) > 25 listing = listing[:25] - listing = get_posts(listing, v=v) + listing = get_posts(listing, v=v, eager=True) return render_template("voted_posts.html", next_exists=next_exists, listing=listing, page=page, v=v) @@ -173,7 +173,7 @@ def upvoting_posts(v, username, uid): next_exists = len(listing) > 25 listing = listing[:25] - listing = get_posts(listing, v=v) + listing = get_posts(listing, v=v, eager=True) return render_template("voted_posts.html", next_exists=next_exists, listing=listing, page=page, v=v) @@ -215,7 +215,7 @@ def downvoting_posts(v, username, uid): next_exists = len(listing) > 25 listing = listing[:25] - listing = get_posts(listing, v=v) + listing = get_posts(listing, v=v, eager=True) return render_template("voted_posts.html", next_exists=next_exists, listing=listing, page=page, v=v) @@ -824,7 +824,7 @@ def u_username(username, v=None): for p in sticky: ids = [p.id] + ids - listing = get_posts(ids, v=v) + listing = get_posts(ids, v=v, eager=True) if u.unban_utc: if request.headers.get("Authorization"): {"data": [x.json for x in listing]} @@ -1105,7 +1105,7 @@ def saved_posts(v, username): ids=ids[:25] - listing = get_posts(ids, v=v) + listing = get_posts(ids, v=v, eager=True) if request.headers.get("Authorization"): return {"data": [x.json for x in listing]} return render_template("userpage.html",