From 1a323a8349381563ddd1a31b3c88a6e84253197a Mon Sep 17 00:00:00 2001 From: Xevion Date: Tue, 29 Mar 2022 22:45:59 -0500 Subject: [PATCH] Add PostLike and CommentLike models - Also adjusted some User methods and added ones I believe may be wanted or needed in time. - Adjusted online time delta back to 3 minutes. - Started looking into how to sum 'likes' efficiently on a user's posts. --- models.py | 52 ++++++++++++++++++++++++++++++++++--- templates/pages/browse.html | 2 +- templates/pages/user.html | 2 +- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/models.py b/models.py index 379a2c9..c6cbc71 100644 --- a/models.py +++ b/models.py @@ -8,7 +8,8 @@ from sqlalchemy import func from database import db -MAXIMUM_ONLINE_DELTA = datetime.timedelta(minutes=1) +# Amount of time before a user is considered 'offline' +MAXIMUM_ONLINE_DELTA = datetime.timedelta(minutes=3) class User(UserMixin, db.Model): @@ -23,19 +24,48 @@ class User(UserMixin, db.Model): is_admin = db.Column(db.Boolean, default=False) posts = db.relationship("Post", backref='author') comments = db.relationship("Comment", backref='author') + posts_liked = db.relationship("PostLike", backref=db.backref('user', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') + comments_liked = db.relationship("CommentLike", backref=db.backref('user', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') - def get_last_seen(self) -> str: + def get_last_seen_text(self) -> str: delta: datetime.timedelta = datetime.datetime.utcnow() - self.last_seen if delta > MAXIMUM_ONLINE_DELTA: return f'Last seen {humanize.naturaldelta(delta)} ago' return 'Online now!' + def is_online(self) -> bool: + """Returns true if the user has used the website in the time delta specified.""" + delta: datetime.timedelta = datetime.datetime.utcnow() - self.last_seen + return delta < MAXIMUM_ONLINE_DELTA + + def is_offline(self) -> bool: + """Returns true if the user has not used the website in the time delta specified.""" + return not self.is_online() + def get_registration_delta(self) -> str: + """Returns a string describing how long ago the user registered.""" delta: datetime.timedelta = datetime.datetime.utcnow() - self.time_registered return humanize.naturaldelta(delta) def get_post_count(self) -> int: - return len(self.posts) + """Returns the number of posts this user has made.""" + return Post.query.filter_by(user_id=self.id).count() + + def get_comment_count(self) -> int: + """Returns the number of comments this user has made.""" + return Comment.query.filter_by(user_id=self.id).count() + + # def get_post_likes(self) -> int: + # """Returns the number of likes this user's posts have accumulated.""" + # return PostLike.query.filter_by().count() + # + # def get_comment_likes(self) -> int: + # """Returns the number of likes this user's comment shave accumulated""" + # return CommentLike.query(func.sum()).scalar() + + # def get_all_likes(self) -> int: + # """Returns the number of likes this user's posts and comments have accumulated""" + # return self.get_post_likes() + self.get_comment_likes() def display_about(self) -> str: return self.about_me or "This user hasn't written a bio yet." @@ -48,15 +78,31 @@ class Post(db.Model): date_posted = db.Column(db.DateTime, server_default=func.now()) date_updated = db.Column(db.DateTime, nullable=True) comments = db.relationship("Comment", backref='post') + liked_by = db.relationship("PostLike", backref=db.backref('post', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') def get_time_ago(self) -> str: delta: datetime.timedelta = datetime.datetime.utcnow() - self.date_posted return humanize.naturaldelta(delta) +class PostLike(db.Model): + id = db.Column(db.Integer, primary_key=True) + timestamp = db.Column(db.DateTime, server_default=func.now()) + post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + + class Comment(db.Model): id = db.Column(db.Integer, primary_key=True) text = db.Column(db.Text, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False) date_posted = db.Column(db.DateTime, server_default=func.now()) + liked_by = db.relationship("CommentLike", backref=db.backref('comment', lazy='joined'), lazy='dynamic', cascade='all, delete-orphan') + + +class CommentLike(db.Model): + id = db.Column(db.Integer, primary_key=True) + timestamp = db.Column(db.DateTime, server_default=func.now()) + comment_id = db.Column(db.Integer, db.ForeignKey('comment.id'), nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) diff --git a/templates/pages/browse.html b/templates/pages/browse.html index 495adf4..169b3dc 100644 --- a/templates/pages/browse.html +++ b/templates/pages/browse.html @@ -11,7 +11,7 @@ {{ user.name }} - {% with seen_text = user.get_last_seen() %} + {% with seen_text = user.get_last_seen_text() %} {% if seen_text == 'Online now!' %} {{ seen_text }} {% else %} diff --git a/templates/pages/user.html b/templates/pages/user.html index ae7fe3e..792fdad 100644 --- a/templates/pages/user.html +++ b/templates/pages/user.html @@ -6,7 +6,7 @@ {% if current_user.is_admin or current_user == user %} {% endif %} - {% with seen_text = user.get_last_seen() %} + {% with seen_text = user.get_last_seen_text() %} {% if seen_text == 'Online now!' %} {{ seen_text }} {% else %}