diff --git a/files/classes/award.py b/files/classes/award.py index 9671b106c..b5e7e9afb 100644 --- a/files/classes/award.py +++ b/files/classes/award.py @@ -70,17 +70,21 @@ class AwardRelationship(Base): comment = relationship("Comment", primaryjoin="AwardRelationship.comment_id==Comment.id", lazy="joined", viewonly=True) @property + @lazy def given(self): return bool(self.submission_id) or bool(self.comment_id) @property + @lazy def type(self): return AWARDS[self.kind] @property + @lazy def title(self): return self.type['title'] @property + @lazy def class_list(self): return self.type['icon']+' '+self.type['color'] diff --git a/files/classes/badges.py b/files/classes/badges.py index 2c939d7e2..661ab6602 100644 --- a/files/classes/badges.py +++ b/files/classes/badges.py @@ -22,11 +22,13 @@ class BadgeDef(Base): return f"" @property + @lazy def path(self): return f"/assets/images/{site_name}/badges/{self.icon}" @property + @lazy def json_core(self): return { "name": self.name, @@ -53,6 +55,7 @@ class Badge(Base): return f"" @property + @lazy def text(self): if self.description: return self.description @@ -60,18 +63,22 @@ class Badge(Base): return self.badge.description @property + @lazy def type(self): return self.badge.id @property + @lazy def name(self): return self.badge.name @property + @lazy def path(self): return self.badge.path @property + @lazy def json_core(self): return {'text': self.text, diff --git a/files/classes/clients.py b/files/classes/clients.py index 922197d12..9187f24ce 100644 --- a/files/classes/clients.py +++ b/files/classes/clients.py @@ -1,10 +1,10 @@ from flask import * from sqlalchemy import * from sqlalchemy.orm import relationship, lazyload - from .submission import Submission from .comment import Comment from files.__main__ import Base +from files.helpers.lazy import lazy class OauthApp(Base): @@ -32,6 +32,7 @@ class OauthApp(Base): return str(time.strftime("%d/%B/%Y %H:%M:%S UTC", time.gmtime(self.created_utc))) @property + @lazy def permalink(self): return f"/admin/app/{self.id}" @@ -55,6 +56,8 @@ class OauthApp(Base): return [x[0] for x in posts.all()] + + class ClientAuth(Base): __tablename__ = "client_auths" diff --git a/files/classes/comment.py b/files/classes/comment.py index 94fa4538b..3ff050116 100644 --- a/files/classes/comment.py +++ b/files/classes/comment.py @@ -2,7 +2,7 @@ import re from urllib.parse import urlencode, urlparse, parse_qs from flask import * from sqlalchemy import * -from sqlalchemy.orm import relationship, deferred +from sqlalchemy.orm import relationship from files.helpers.lazy import lazy from files.helpers.const import SLURS from files.__main__ import Base @@ -187,6 +187,7 @@ class Comment(Base): self.__dict__["replies"] = value @property + @lazy def replies2(self): return self.__dict__.get("replies2", []) @@ -215,6 +216,7 @@ class Comment(Base): else: return f"/comment/{self.id}/" @property + @lazy def json_raw(self): flags = {} for f in self.flags: flags[f.user.username] = f.reason @@ -252,6 +254,7 @@ class Comment(Base): return len([x for x in self.awards if x.kind == kind]) @property + @lazy def json_core(self): if self.is_banned: data= {'is_banned': True, @@ -280,6 +283,7 @@ class Comment(Base): return data @property + @lazy def json(self): data=self.json_core @@ -297,14 +301,17 @@ class Comment(Base): return data @property + @lazy def is_blocking(self): return self.__dict__.get('_is_blocking', 0) @property + @lazy def is_blocked(self): return self.__dict__.get('_is_blocked', 0) @property + @lazy def body(self): if self.comment_aux: return self.comment_aux.body else: return "" @@ -315,6 +322,7 @@ class Comment(Base): g.db.add(self.comment_aux) @property + @lazy def body_html(self): return self.comment_aux.body_html @@ -349,6 +357,7 @@ class Comment(Base): return body @property + @lazy def ban_reason(self): return self.comment_aux.ban_reason diff --git a/files/classes/flags.py b/files/classes/flags.py index 51eec2e17..53161f5e4 100644 --- a/files/classes/flags.py +++ b/files/classes/flags.py @@ -1,6 +1,7 @@ from sqlalchemy import * from sqlalchemy.orm import relationship from files.__main__ import Base +from files.helpers.lazy import lazy class Flag(Base): diff --git a/files/classes/mod_logs.py b/files/classes/mod_logs.py index 29067e20f..97d07c630 100644 --- a/files/classes/mod_logs.py +++ b/files/classes/mod_logs.py @@ -2,6 +2,7 @@ from sqlalchemy import * from sqlalchemy.orm import relationship from files.__main__ import Base import time +from files.helpers.lazy import lazy class ModAction(Base): __tablename__ = "modactions" @@ -35,6 +36,7 @@ class ModAction(Base): return f"" @property + @lazy def age_string(self): age = self.age @@ -68,6 +70,7 @@ class ModAction(Base): @property + @lazy def note(self): if self.kind=="ban_user": @@ -84,6 +87,7 @@ class ModAction(Base): self._note=x @property + @lazy def string(self): output = ACTIONTYPES[self.kind]["str"].format(self=self) @@ -93,6 +97,7 @@ class ModAction(Base): return output @property + @lazy def target_link(self): if self.target_user: return f'{self.target_user.username}' @@ -104,14 +109,17 @@ class ModAction(Base): return "" @property + @lazy def icon(self): return ACTIONTYPES[self.kind]['icon'] @property + @lazy def color(self): return ACTIONTYPES[self.kind]['color'] @property + @lazy def permalink(self): return f"/log/{self.id}" diff --git a/files/classes/submission.py b/files/classes/submission.py index 364a32c54..b3806d319 100644 --- a/files/classes/submission.py +++ b/files/classes/submission.py @@ -313,6 +313,7 @@ class Submission(Base): return data @property + @lazy def json_core(self): if self.is_banned: @@ -334,6 +335,7 @@ class Submission(Base): return self.json_raw @property + @lazy def json(self): data=self.json_core @@ -357,6 +359,7 @@ class Submission(Base): return len([x for x in self.awards if x.kind == kind]) @property + @lazy def title(self): return self.submission_aux.title @@ -366,6 +369,7 @@ class Submission(Base): g.db.add(self.submission_aux) @property + @lazy def url(self): return self.submission_aux.url @@ -390,6 +394,7 @@ class Submission(Base): else: return "" @property + @lazy def body(self): return self.submission_aux.body @@ -399,6 +404,7 @@ class Submission(Base): g.db.add(self.submission_aux) @property + @lazy def body_html(self): return self.submission_aux.body_html @@ -420,6 +426,7 @@ class Submission(Base): return body @property + @lazy def title_html(self): return self.submission_aux.title_html @@ -439,6 +446,7 @@ class Submission(Base): return title @property + @lazy def ban_reason(self): return self.submission_aux.ban_reason @@ -448,6 +456,7 @@ class Submission(Base): g.db.add(self.submission_aux) @property + @lazy def embed_url(self): return self.submission_aux.embed_url @@ -457,10 +466,12 @@ class Submission(Base): g.db.add(self.submission_aux) @property + @lazy def is_blocked(self): return self.__dict__.get('_is_blocked', False) @property + @lazy def is_blocking(self): return self.__dict__.get('_is_blocking', False) @@ -469,11 +480,13 @@ class Submission(Base): #return len(self.awards) @property + @lazy def is_image(self): if self.url: return self.url.lower().endswith('.webp') or self.url.lower().endswith('.jpg') or self.url.lower().endswith('.png') or self.url.lower().endswith('.gif') or self.url.lower().endswith('.jpeg') or self.url.lower().endswith('?maxwidth=9999') else: return False @property + @lazy def is_video(self) -> bool: if self.url: return self.url.startswith("https://i.imgur.com") and self.url.lower().endswith('.mp4') diff --git a/files/classes/user.py b/files/classes/user.py index 273ccfaf5..438cbca18 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -210,6 +210,7 @@ class User(Base): user_id=self.id, target_id=target.id).first() @property + @lazy def paid_dues(self): return self.admin_level == 6 or self.club_allowed or (self.truecoins > int(environ.get("DUES").strip()) and not self.club_banned) @@ -225,10 +226,12 @@ class User(Base): return x.verify(token, valid_window=1) @property + @lazy def age(self): return int(time.time()) - self.created_utc @property + @lazy def strid(self): return str(self.id) @@ -277,10 +280,12 @@ class User(Base): return listing @property + @lazy def fullname(self): return f"t1_{self.id}" @property + @lazy def banned_by(self): if not self.is_suspended: return None return g.db.query(User).filter_by(id=self.is_banned).first() @@ -296,6 +301,7 @@ class User(Base): return check_password_hash(self.passhash, password) @property + @lazy def formkey(self): if "session_id" not in session: @@ -310,6 +316,7 @@ class User(Base): return validate_hash(f"{session['session_id']}+{self.id}+{self.login_nonce}", formkey) @property + @lazy def url(self): return f"/@{self.username}" @@ -317,6 +324,7 @@ class User(Base): return f"" @property + @lazy def unban_string(self): if self.unban_utc == 0: return "permanently banned" @@ -445,6 +453,7 @@ class User(Base): return g.db.query(Follow).options(lazyload('*')).filter_by(target_id=self.id, user_id=user.id).first() @property + @lazy def banner_url(self): if self.bannerurl: return self.bannerurl else: return f"https://{site}/assets/images/{site_name}/preview.webp" @@ -455,12 +464,14 @@ class User(Base): return f"https://{site}/assets/images/defaultpictures/{pic}.webp" @property + @lazy def profile_url(self): if self.profileurl: return self.profileurl elif "rdrama" in site: return self.defaultpicture() else: return f"https://{site}/assets/images/default-profile-pic.webp" @property + @lazy def json_raw(self): data = {'username': self.username, 'url': self.url, @@ -478,6 +489,7 @@ class User(Base): return data @property + @lazy def json_core(self): now = int(time.time()) @@ -492,6 +504,7 @@ class User(Base): return self.json_raw @property + @lazy def json(self): data = self.json_core @@ -528,19 +541,23 @@ class User(Base): @property + @lazy def is_suspended(self): return (self.is_banned and (not self.unban_utc or self.unban_utc > time.time())) @property + @lazy def is_blocking(self): return self.__dict__.get('_is_blocking', 0) @property + @lazy def is_blocked(self): return self.__dict__.get('_is_blocked', 0) @property + @lazy def applications(self): return [x for x in self._applications.order_by( OauthApp.id.asc()).all()] @@ -600,6 +617,7 @@ class User(Base): return [x[0] for x in comments.offset(25 * (page - 1)).limit(26).all()] @property + @lazy def filter_words(self): l = [i.strip() for i in self.custom_filter_list.split('\n')] if self.custom_filter_list else [] l = [i for i in l if i] @@ -625,11 +643,13 @@ class ViewerRelationship(Base): super().__init__(**kwargs) @property + @lazy def last_view_since(self): return int(time.time()) - self.last_view_utc @property + @lazy def last_view_string(self): age = self.last_view_since diff --git a/files/classes/userblock.py b/files/classes/userblock.py index b7954dea4..43d33fbc1 100644 --- a/files/classes/userblock.py +++ b/files/classes/userblock.py @@ -1,6 +1,7 @@ from sqlalchemy import * from sqlalchemy.orm import relationship from files.__main__ import Base +from files.helpers.lazy import lazy class UserBlock(Base): @@ -12,11 +13,11 @@ class UserBlock(Base): user = relationship("User", innerjoin=True, primaryjoin="User.id==UserBlock.user_id", viewonly=True) target = relationship("User", innerjoin=True, primaryjoin="User.id==UserBlock.target_id", viewonly=True) - @property - @lazy - def created_date(self): - return time.strftime("%d %b %Y", time.gmtime(self.created_utc)) - def __repr__(self): return f"" + + @property + @lazy + def created_date(self): + return time.strftime("%d %b %Y", time.gmtime(self.created_utc)) \ No newline at end of file diff --git a/files/classes/votes.py b/files/classes/votes.py index d20343c08..a2b651030 100644 --- a/files/classes/votes.py +++ b/files/classes/votes.py @@ -24,6 +24,7 @@ class Vote(Base): return f"" @property + @lazy def json_core(self): data={ "user_id": self.user_id, @@ -33,6 +34,7 @@ class Vote(Base): return data @property + @lazy def json(self): data=self.json_core data["user"]=self.user.json_core @@ -62,6 +64,7 @@ class CommentVote(Base): return f"" @property + @lazy def json_core(self): data={ "user_id": self.user_id, @@ -71,6 +74,7 @@ class CommentVote(Base): return data @property + @lazy def json(self): data=self.json_core data["user"]=self.user.json_core