| |
| from flask_sqlalchemy import SQLAlchemy |
| from flask_login import UserMixin |
| from werkzeug.security import generate_password_hash, check_password_hash |
| from datetime import datetime |
| from database import db |
|
|
| class User(UserMixin, db.Model): |
| __tablename__ = 'users' |
| |
| id = db.Column(db.Integer, primary_key=True) |
| username = db.Column(db.String(80), unique=True, nullable=False) |
| password_hash = db.Column(db.String(200), nullable=False) |
| is_admin = db.Column(db.Boolean, default=False) |
| created_at = db.Column(db.DateTime, default=datetime.utcnow) |
| |
| photos = db.relationship('Photo', backref='uploader', lazy=True) |
| likes = db.relationship('Like', backref='user', lazy=True) |
| |
| def set_password(self, password): |
| self.password_hash = generate_password_hash(password) |
| |
| def check_password(self, password): |
| return check_password_hash(self.password_hash, password) |
|
|
| class Photo(db.Model): |
| __tablename__ = 'photos' |
| |
| id = db.Column(db.Integer, primary_key=True) |
| filename = db.Column(db.String(200), nullable=False) |
| caption = db.Column(db.String(500)) |
| upload_date = db.Column(db.DateTime, default=datetime.utcnow) |
| uploader_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) |
| likes_count = db.Column(db.Integer, default=0) |
| |
| likes = db.relationship('Like', backref='photo', lazy=True, cascade='all, delete-orphan') |
|
|
| class Like(db.Model): |
| __tablename__ = 'likes' |
| |
| id = db.Column(db.Integer, primary_key=True) |
| user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) |
| photo_id = db.Column(db.Integer, db.ForeignKey('photos.id'), nullable=False) |
| created_at = db.Column(db.DateTime, default=datetime.utcnow) |
| |
| __table_args__ = (db.UniqueConstraint('user_id', 'photo_id', name='unique_user_photo_like'),) |