diff --git a/files/classes/comment.py b/files/classes/comment.py index efbb09e44..b2de17581 100644 --- a/files/classes/comment.py +++ b/files/classes/comment.py @@ -31,7 +31,6 @@ class Comment(CreatedBase): ghost = Column(Boolean, default=False, nullable=False) bannedfor = Column(Boolean) distinguish_level = Column(Integer, default=0, nullable=False) - deleted_utc = Column(Integer, default=0, nullable=False) is_approved = Column(Integer, ForeignKey("users.id")) level = Column(Integer, default=1, nullable=False) parent_comment_id = Column(Integer, ForeignKey("comments.id")) @@ -52,6 +51,12 @@ class Comment(CreatedBase): filter_state = Column(String, nullable=False) volunteer_janitor_badness = Column(Float, default=0.5, nullable=False) + # Visibility states here + state_user_deleted_utc = Column(DateTime, nullable=True) # null if it hasn't been deleted by the user + # TBD: state_mod + # TBD: state_mod_set_by + # TBD: state_report + Index('comment_parent_index', parent_comment_id) Index('comment_post_id_index', parent_submission) Index('comments_user_index', author_id) @@ -230,7 +235,7 @@ class Comment(CreatedBase): 'created_utc': self.created_utc, 'edited_utc': self.edited_utc or 0, 'is_banned': bool(self.is_banned), - 'deleted_utc': self.deleted_utc, + 'state_user_deleted_utc': self.state_user_deleted_utc, 'is_nsfw': self.over_18, 'permalink': f'/comment/{self.id}', 'is_pinned': self.is_pinned, @@ -263,8 +268,8 @@ class Comment(CreatedBase): 'level': self.level, 'parent': self.parent_fullname } - elif self.deleted_utc: - data = {'deleted_utc': self.deleted_utc, + elif self.state_user_deleted_utc: + data = {'state_user_deleted_utc': self.state_user_deleted_utc, 'id': self.id, 'post': self.post.id if self.post else 0, 'level': self.level, @@ -282,7 +287,7 @@ class Comment(CreatedBase): @lazy def json(self): data = self.json_core - if self.deleted_utc or self.is_banned: return data + if self.state_user_deleted_utc or self.is_banned: return data data["author"] = '👻' if self.ghost else self.author.json_core data["post"] = self.post.json_core if self.post else '' return data diff --git a/files/classes/cron/submission.py b/files/classes/cron/submission.py index 8022b8f50..a29c720ab 100644 --- a/files/classes/cron/submission.py +++ b/files/classes/cron/submission.py @@ -80,8 +80,8 @@ class ScheduledSubmissionTask(RepeatableTask): # HTML template for previewing a submitted task @property - def deleted_utc(self) -> int: - return int(not self.task.enabled) + def state_user_deleted_utc(self) -> int: + return self.task.enabled and 1 or None @functools.cached_property def title_html(self) -> str: diff --git a/files/classes/submission.py b/files/classes/submission.py index d24bf205c..c3cc7f881 100644 --- a/files/classes/submission.py +++ b/files/classes/submission.py @@ -27,7 +27,6 @@ class Submission(CreatedBase): bannedfor = Column(Boolean) ghost = Column(Boolean, default=False, nullable=False) views = Column(Integer, default=0, nullable=False) - deleted_utc = Column(Integer, default=0, nullable=False) distinguish_level = Column(Integer, default=0, nullable=False) stickied = Column(String) stickied_utc = Column(Integer) @@ -53,15 +52,21 @@ class Submission(CreatedBase): filter_state = Column(String, nullable=False) task_id = Column(Integer, ForeignKey("tasks_repeatable_scheduled_submissions.id")) + # Visibility states here + state_user_deleted_utc = Column(DateTime, nullable=True) # null if it hasn't been deleted by the user + # TBD: state_mod + # TBD: state_mod_set_by + # TBD: state_report + Index('fki_submissions_approver_fkey', is_approved) Index('post_app_id_idx', app_id) - Index('subimssion_binary_group_idx', is_banned, deleted_utc, over_18) + Index('subimssion_binary_group_idx', is_banned, state_user_deleted_utc, over_18) Index('submission_isbanned_idx', is_banned) - Index('submission_isdeleted_idx', deleted_utc) + Index('submission_isdeleted_idx', state_user_deleted_utc) @declared_attr def submission_new_sort_idx(self): - return Index('submission_new_sort_idx', self.is_banned, self.deleted_utc, self.created_utc.desc(), self.over_18) + return Index('submission_new_sort_idx', self.is_banned, self.state_user_deleted_utc, self.created_utc.desc(), self.over_18) Index('submission_pinned_idx', is_pinned) Index('submissions_author_index', author_id) @@ -103,7 +108,7 @@ class Submission(CreatedBase): author.post_count = db.query(Submission.id).filter_by( author_id=self.author_id, is_banned=False, - deleted_utc=0).count() + state_user_deleted_utc=None).count() db.add(author) def publish(self): @@ -231,7 +236,7 @@ class Submission(CreatedBase): 'permalink': self.permalink, 'shortlink': self.shortlink, 'is_banned': bool(self.is_banned), - 'deleted_utc': self.deleted_utc, + 'state_user_deleted_utc': self.state_user_deleted_utc, 'created_utc': self.created_utc, 'id': self.id, 'title': self.title, @@ -266,15 +271,15 @@ class Submission(CreatedBase): def json_core(self): if self.is_banned: return {'is_banned': True, - 'deleted_utc': self.deleted_utc, + 'state_user_deleted_utc': self.state_user_deleted_utc, 'ban_reason': self.ban_reason, 'id': self.id, 'title': self.title, 'permalink': self.permalink, } - elif self.deleted_utc: + elif self.state_user_deleted_utc: return {'is_banned': bool(self.is_banned), - 'deleted_utc': True, + 'state_user_deleted_utc': self.state_user_deleted_utc, 'id': self.id, 'title': self.title, 'permalink': self.permalink, @@ -287,7 +292,7 @@ class Submission(CreatedBase): def json(self): data=self.json_core - if self.deleted_utc or self.is_banned: + if self.state_user_deleted_utc or self.is_banned: return data data["author"]='👻' if self.ghost else self.author.json_core diff --git a/files/classes/user.py b/files/classes/user.py index 0ed209d0d..11f2bfbcb 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -335,7 +335,7 @@ class User(CreatedBase): @property @lazy def notifications_count(self): - notifs = g.db.query(Notification.user_id).join(Comment).filter(Notification.user_id == self.id, Notification.read == False, Comment.is_banned == False, Comment.deleted_utc == 0) + notifs = g.db.query(Notification.user_id).join(Comment).filter(Notification.user_id == self.id, Notification.read == False, Comment.is_banned == False, Comment.state_user_deleted_utc == None) if not self.shadowbanned and self.admin_level < 3: notifs = notifs.join(User, User.id == Comment.author_id).filter(User.shadowbanned == None) @@ -350,7 +350,7 @@ class User(CreatedBase): @property @lazy def reddit_notifications_count(self): - return g.db.query(Notification.user_id).join(Comment).filter(Notification.user_id == self.id, Notification.read == False, Comment.is_banned == False, Comment.deleted_utc == 0, Comment.body_html.like('%