campus-connect / models.py
Bhuwan31's picture
Initial deploy
dc76e71
# models.py
# All SQLAlchemy database models
from extensions import db
from datetime import datetime
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(255), nullable=False, unique=True)
password = db.Column(db.String(255), nullable=False)
student_id = db.Column(db.String(50), nullable=False, unique=True)
bio = db.Column(db.Text, default=None)
department = db.Column(db.String(100), default=None)
profile_image = db.Column(db.String(255), default=None)
cover_image = db.Column(db.String(255), default=None)
is_admin = db.Column(db.Boolean, default=False)
location_city = db.Column(db.String(100), default=None)
location_country = db.Column(db.String(100), default=None)
location_lat = db.Column(db.Numeric(10,8), default=None)
location_lng = db.Column(db.Numeric(11,8), default=None)
feeling = db.Column(db.String(50), default=None)
feeling_emoji = db.Column(db.String(10), default=None)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def to_dict(self):
return {
"id": self.id,
"name": self.name,
"email": self.email,
"student_id": self.student_id,
"bio": self.bio,
"department": self.department,
"profile_image": self.profile_image,
"cover_image": self.cover_image,
"is_admin": self.is_admin,
"feeling": self.feeling,
"feeling_emoji": self.feeling_emoji,
"location_city": self.location_city,
"location_country": self.location_country,
}
class Post(db.Model):
__tablename__ = "posts"
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
content = db.Column(db.Text, nullable=False)
image = db.Column(db.String(255), default=None)
feeling = db.Column(db.String(50), default=None)
feeling_emoji = db.Column(db.String(10), default=None)
location_city = db.Column(db.String(100), default=None)
location_lat = db.Column(db.Numeric(10,8), default=None)
location_lng = db.Column(db.Numeric(11,8), default=None)
sentiment = db.Column(db.String(20), default=None) # POSITIVE | NEGATIVE | NEUTRAL
sentiment_score = db.Column(db.Float, default=None)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def to_dict(self, like_count=0, comment_count=0, user_liked=False, author=None):
return {
"id": self.id,
"user_id": self.user_id,
"author": author,
"content": self.content,
"image": self.image,
"feeling": self.feeling,
"feeling_emoji": self.feeling_emoji,
"sentiment": self.sentiment,
"sentiment_score": self.sentiment_score,
"likes": like_count,
"comments": comment_count,
"user_liked": user_liked,
"created_at": self.created_at.isoformat(),
}
class Comment(db.Model):
__tablename__ = "comments"
id = db.Column(db.Integer, primary_key=True)
post_id = db.Column(db.Integer, db.ForeignKey("posts.id", ondelete="CASCADE"), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
parent_id = db.Column(db.Integer, db.ForeignKey("comments.id", ondelete="CASCADE"), default=None)
content = db.Column(db.Text, nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class Like(db.Model):
__tablename__ = "likes"
id = db.Column(db.Integer, primary_key=True)
post_id = db.Column(db.Integer, db.ForeignKey("posts.id", ondelete="CASCADE"), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
__table_args__ = (db.UniqueConstraint("post_id", "user_id"),)
class FriendRequest(db.Model):
__tablename__ = "friend_requests"
id = db.Column(db.Integer, primary_key=True)
sender_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
receiver_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
status = db.Column(db.String(20), default="pending") # pending | accepted | rejected
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
__table_args__ = (db.UniqueConstraint("sender_id", "receiver_id"),)
class Friend(db.Model):
__tablename__ = "friends"
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
friend_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
__table_args__ = (db.UniqueConstraint("user_id", "friend_id"),)
class Announcement(db.Model):
__tablename__ = "announcements"
id = db.Column(db.Integer, primary_key=True)
admin_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
title = db.Column(db.String(255), nullable=False)
content = db.Column(db.Text, nullable=False)
priority = db.Column(db.String(20), default="normal") # low | normal | high
created_at = db.Column(db.DateTime, default=datetime.utcnow)
class Message(db.Model):
__tablename__ = "messages"
id = db.Column(db.Integer, primary_key=True)
sender_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
receiver_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
message = db.Column(db.Text, nullable=False)
is_read = db.Column(db.Boolean, default=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)