rDrama/files/classes/comment.py

310 lines
8.5 KiB
Python
Raw Normal View History

2021-07-21 01:12:26 +00:00
from flask import *
from sqlalchemy import *
from sqlalchemy.orm import relationship, deferred
2021-08-04 15:35:10 +00:00
from files.helpers.lazy import lazy
from files.__main__ import Base
2021-07-31 13:55:49 +00:00
from .mix_ins import *
from .flags import CommentFlag
2021-07-21 01:12:26 +00:00
class CommentAux(Base):
__tablename__ = "comments_aux"
key_id = Column(Integer, primary_key=True)
id = Column(Integer, ForeignKey("comments.id"))
2021-07-25 23:49:53 +00:00
body = Column(String(10000))
2021-07-21 01:12:26 +00:00
body_html = Column(String(20000))
ban_reason = Column(String(256), default='')
class Comment(Base, Age_times, Scores, Stndrd, Fuzzing):
__tablename__ = "comments"
id = Column(Integer, primary_key=True)
comment_aux = relationship(
"CommentAux",
lazy="joined",
uselist=False,
innerjoin=True,
primaryjoin="Comment.id==CommentAux.id")
author_id = Column(Integer, ForeignKey("users.id"))
parent_submission = Column(Integer, ForeignKey("submissions.id"))
# this column is foreignkeyed to comment(id) but we can't do that yet as
# "comment" class isn't yet defined
created_utc = Column(Integer, default=0)
edited_utc = Column(Integer, default=0)
is_banned = Column(Boolean, default=False)
2021-07-22 11:00:18 +00:00
shadowbanned = Column(Boolean, default=False)
2021-07-21 01:12:26 +00:00
distinguish_level = Column(Integer, default=0)
deleted_utc = Column(Integer, default=0)
is_approved = Column(Integer, default=0)
level = Column(Integer, default=0)
parent_comment_id = Column(Integer, ForeignKey("comments.id"))
over_18 = Column(Boolean, default=False)
is_bot = Column(Boolean, default=False)
is_pinned = Column(Boolean, default=False)
2021-07-25 23:49:53 +00:00
sentto=Column(Integer)
2021-07-21 01:12:26 +00:00
2021-07-25 23:49:53 +00:00
app_id = Column(Integer, ForeignKey("oauth_apps.id"))
2021-07-21 01:12:26 +00:00
oauth_app=relationship("OauthApp")
post = relationship("Submission")
2021-08-06 12:57:37 +00:00
flags = relationship("CommentFlag", lazy="dynamic")
2021-07-21 01:12:26 +00:00
author = relationship(
"User",
lazy="joined",
innerjoin=True,
primaryjoin="User.id==Comment.author_id")
upvotes = Column(Integer, default=1)
downvotes = Column(Integer, default=0)
parent_comment = relationship("Comment", remote_side=[id])
child_comments = relationship("Comment", remote_side=[parent_comment_id])
2021-07-27 11:07:00 +00:00
awards = relationship("AwardRelationship", lazy="joined")
2021-07-21 01:12:26 +00:00
def __init__(self, *args, **kwargs):
if "created_utc" not in kwargs:
kwargs["created_utc"] = int(time.time())
super().__init__(*args, **kwargs)
def __repr__(self):
return f"<Comment(id={self.id})>"
2021-08-06 12:22:29 +00:00
@property
@lazy
def score(self):
return self.upvotes - self.downvotes
2021-07-25 23:23:21 +00:00
@property
@lazy
def fullname(self):
2021-07-30 05:31:38 +00:00
return f"t3_{self.id}"
2021-07-25 23:23:21 +00:00
2021-07-21 01:12:26 +00:00
@property
@lazy
def score_disputed(self):
return (self.upvotes+1) * (self.downvotes+1)
@property
@lazy
def parent(self):
2021-07-27 00:05:58 +00:00
if not self.parent_submission: return None
2021-07-21 01:12:26 +00:00
2021-07-27 00:05:58 +00:00
if self.level == 1: return self.post
2021-07-21 01:12:26 +00:00
2021-07-27 00:05:58 +00:00
else: return g.db.query(Comment).get(self.parent_comment_id)
2021-07-21 01:12:26 +00:00
2021-07-30 05:23:17 +00:00
@property
@lazy
def parent_fullname(self):
2021-07-30 05:34:04 +00:00
if self.parent_comment_id: return f"t3_{self.parent_comment_id}"
elif self.parent_submission: return f"t2_{self.parent_submission}"
2021-07-30 05:23:17 +00:00
2021-07-21 01:12:26 +00:00
@property
def replies(self):
r = self.__dict__.get("replies", None)
2021-08-07 15:53:09 +00:00
if not r and r != []: r = sorted([x for x in self.child_comments], key=lambda x: x.score, reverse=True)
2021-07-21 01:12:26 +00:00
return r
@replies.setter
def replies(self, value):
self.__dict__["replies"] = value
@property
def replies2(self):
return self.__dict__.get("replies2", [])
@replies2.setter
def replies2(self, value):
self.__dict__["replies2"] = value
@property
@lazy
def permalink(self):
if self.post: return f"{self.post.permalink}/{self.id}/"
else: return f"/comment/{self.id}/"
@property
def json_raw(self):
2021-07-28 03:55:47 +00:00
flags = {}
for f in self.flags: flags[f.user.username] = f.reason
2021-07-21 01:12:26 +00:00
data= {
2021-07-29 05:31:57 +00:00
'id': self.id,
2021-07-21 01:12:26 +00:00
'level': self.level,
2021-07-25 22:11:26 +00:00
'author_name': self.author.username,
2021-07-21 01:12:26 +00:00
'body': self.body,
'body_html': self.body_html,
'is_bot': self.is_bot,
'created_utc': self.created_utc,
'edited_utc': self.edited_utc or 0,
'is_banned': bool(self.is_banned),
2021-07-25 21:59:20 +00:00
'deleted_utc': self.deleted_utc,
2021-07-21 01:12:26 +00:00
'is_nsfw': self.over_18,
'permalink': self.permalink,
2021-07-28 03:29:06 +00:00
'is_pinned': self.is_pinned,
'distinguish_level': self.distinguish_level,
2021-07-30 05:31:38 +00:00
'post_id': self.post.id,
2021-07-21 01:12:26 +00:00
'score': self.score_fuzzed,
'upvotes': self.upvotes_fuzzed,
'downvotes': self.downvotes_fuzzed,
2021-07-25 01:17:28 +00:00
#'award_count': self.award_count,
2021-07-28 03:39:58 +00:00
'is_bot': self.is_bot,
2021-07-28 03:55:47 +00:00
'flags': flags,
2021-07-21 01:12:26 +00:00
}
if self.ban_reason:
data["ban_reason"]=self.ban_reason
return data
@property
def json_core(self):
if self.is_banned:
data= {'is_banned': True,
'ban_reason': self.ban_reason,
2021-07-30 05:31:38 +00:00
'id': self.id,
'post': self.post.id,
2021-07-21 01:12:26 +00:00
'level': self.level,
2021-07-25 23:23:21 +00:00
'parent': self.parent_fullname
2021-07-21 01:12:26 +00:00
}
elif self.deleted_utc > 0:
data= {'deleted_utc': self.deleted_utc,
2021-07-30 05:31:38 +00:00
'id': self.id,
'post': self.post.id,
2021-07-21 01:12:26 +00:00
'level': self.level,
2021-07-25 23:23:21 +00:00
'parent': self.parent_fullname
2021-07-21 01:12:26 +00:00
}
else:
data=self.json_raw
2021-07-30 05:31:38 +00:00
if self.level>=2: data['parent_comment_id']= self.parent_comment_id,
2021-07-21 01:12:26 +00:00
if "replies" in self.__dict__:
data['replies']=[x.json_core for x in self.replies]
return data
@property
def json(self):
data=self.json_core
if self.deleted_utc > 0 or self.is_banned:
return data
data["author"]=self.author.json_core
data["post"]=self.post.json_core
if self.level >= 2:
data["parent"]=self.parent.json_core
return data
@property
def is_blocking(self):
return self.__dict__.get('_is_blocking', 0)
@property
def is_blocked(self):
return self.__dict__.get('_is_blocked', 0)
@property
def body(self):
if self.comment_aux: return self.comment_aux.body
else: return ""
@body.setter
def body(self, x):
self.comment_aux.body = x
g.db.add(self.comment_aux)
@property
def body_html(self):
return self.comment_aux.body_html
@body_html.setter
def body_html(self, x):
self.comment_aux.body_html = x
g.db.add(self.comment_aux)
def realbody(self, v):
body = self.comment_aux.body_html
2021-07-29 05:06:04 +00:00
if not v or v.slurreplacer: body = body.replace(" nigger"," 🏀").replace(" Nigger"," 🏀").replace(" NIGGER"," 🏀").replace(" pedo"," libertarian").replace(" Pedo"," Libertarian ").replace(" PEDO"," LIBERTARIAN ").replace(" tranny"," 🚄").replace(" Tranny"," 🚄").replace(" TRANNY"," 🚄").replace(" fag"," cute twink").replace(" Fag"," Cute twink").replace(" FAG"," CUTE TWINK").replace(" faggot"," cute twink").replace(" Faggot"," Cute twink").replace(" FAGGOT"," CUTE TWINK").replace(" trump"," DDR").replace(" Trump"," DDR").replace(" TRUMP"," DDR").replace(" biden"," DDD").replace(" Biden"," DDD").replace(" BIDEN"," DDD").replace(" steve akins"," penny verity oaken").replace(" Steve Akins"," Penny Verity Oaken").replace(" STEVE AKINS"," PENNY VERITY OAKEN").replace(" RETARD"," RSLUR").replace(" rapist"," male feminist").replace(" Rapist"," Male feminist").replace(" RAPIST"," MALE FEMINIST").replace(" RETARD"," RSLUR").replace(" rapist"," male feminist").replace(" Rapist"," Male feminist").replace(" RAPIST"," MALE FEMINIST").replace(" RETARD"," RSLUR").replace(" rapist"," male feminist").replace(" Rapist"," Male feminist").replace(" RAPIST"," MALE FEMINIST").replace(" kill yourself"," keep yourself safe").replace(" KILL YOURSELF"," KEEP YOURSELF SAFE").replace(" trannie"," 🚄").replace(" Trannie"," 🚄").replace(" TRANNIE"," 🚄").replace(" troon"," 🚄").replace(" Troon"," 🚄").replace(" TROON"," 🚄")
2021-07-21 01:12:26 +00:00
if v and not v.oldreddit: body = body.replace("old.reddit.com", "reddit.com")
return body
@property
def ban_reason(self):
return self.comment_aux.ban_reason
@ban_reason.setter
def ban_reason(self, x):
self.comment_aux.ban_reason = x
g.db.add(self.comment_aux)
2021-07-25 01:17:28 +00:00
#@property
#def award_count(self):
#return len(self.awards)
2021-07-21 01:12:26 +00:00
def collapse_for_user(self, v):
if self.over_18 and not (v and v.over_18) and not self.post.over_18:
return True
if not v:
return False
if any([x in self.body for x in v.filter_words]):
return True
if self.is_banned: return True
return False
@property
@lazy
2021-07-31 13:55:49 +00:00
def is_op(self): return self.author_id==self.post.author_id
2021-07-21 01:12:26 +00:00
2021-07-27 00:16:30 +00:00
@property
@lazy
2021-08-06 12:57:37 +00:00
def active_flags(self): return self.flags.count()
2021-07-31 13:55:49 +00:00
@property
@lazy
2021-07-31 14:11:11 +00:00
def ordered_flags(self): return self.flags.order_by(CommentFlag.id).all()
2021-07-31 13:55:49 +00:00
2021-07-21 01:12:26 +00:00
class Notification(Base):
__tablename__ = "notifications"
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"))
comment_id = Column(Integer, ForeignKey("comments.id"))
read = Column(Boolean, default=False)
2021-07-25 23:49:53 +00:00
followsender = Column(Integer)
unfollowsender = Column(Integer)
blocksender = Column(Integer)
unblocksender = Column(Integer)
2021-07-21 01:12:26 +00:00
comment = relationship("Comment", lazy="joined", innerjoin=True)
user=relationship("User", innerjoin=True)
def __repr__(self):
2021-08-07 23:03:48 +00:00
return f"<Notification(id={self.id})>"