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.
This commit is contained in:
Xevion
2022-03-29 22:45:59 -05:00
parent 58861acd3d
commit 1a323a8349
3 changed files with 51 additions and 5 deletions

View File

@@ -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)

View File

@@ -11,7 +11,7 @@
<span class="user-box-username">
<a href="{{ url_for('main.view_user', username=user.username) }}">{{ user.name }}</a>
</span>
{% with seen_text = user.get_last_seen() %}
{% with seen_text = user.get_last_seen_text() %}
{% if seen_text == 'Online now!' %}
<span class="user-box-timestamp online">{{ seen_text }}</span>
{% else %}

View File

@@ -6,7 +6,7 @@
{% if current_user.is_admin or current_user == user %}
<a href="{{ url_for('main.edit_user', username=current_user.username) }}"><i class="fas fa-pencil-alt fa-sm" style="padding-bottom: 3px; padding-left: 0.5em;"></i></a>
{% endif %}
{% with seen_text = user.get_last_seen() %}
{% with seen_text = user.get_last_seen_text() %}
{% if seen_text == 'Online now!' %}
<span class="profile-timestamp online">{{ seen_text }}</span>
{% else %}