mirror of
https://github.com/Xevion/runnerspace.git
synced 2025-12-06 11:16:17 -06:00
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:
52
models.py
52
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)
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user