class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True, autoincrement=True) email = db.Column(db.String(128), index=True, nullable=False, unique=True) name = db.Column(db.String(128), index=True, nullable=False) password_hash = db.Column(db.String(128), nullable=False) subreddits = relationship('Subreddit') posts = relationship('Post') comments = relationship('Comment') def __init__(self, email, name, password): self.email = email self.name = name self.set_password(password) def check_password(self, password): return bcrypt.check_password_hash(self.password_hash, password) def set_password(self, password): self.password_hash = bcrypt.generate_password_hash(password).decode( 'utf-8') # Methods required by the flask-login def get_id(self): return self.email
class Subreddit(db.Model, CrudMixin): __tablename__ = 'subreddits' name = db.Column(db.String(64), unique=True, nullable=False) description = db.Column(db.Text, nullable=False) subscriber_count = db.Column(db.Integer, nullable=False, default=0) creator_id = db.Column(db.Integer, db.ForeignKey('user.id')) creator = db.relationship('User', backref=db.backref('created_subreddits', lazy='dynamic')) subscribers = db.relationship('User', secondary='subscriptions', backref=db.backref('subscribed_subreddits', lazy='dynamic'), lazy='subquery') def subscribe(self, user): try: self.subscribers.append(user) self.subscriber_count += 1 self.save() except Exception as ex: db.session.rollback() raise ex def unsubscribe(self, user): try: self.subscribers.remove(user) self.subscriber_count -= 1 self.save() except Exception as ex: db.session.rollback() raise ex
class Comment(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) content = db.Column(db.String(2048)) user_id = db.Column(db.Integer, ForeignKey('user.id')) post_id = db.Column(db.Integer, ForeignKey('post.id', ondelete='CASCADE')) user = relationship('User')
class Subreddit(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) user_id = db.Column(db.Integer, ForeignKey('user.id')) user = db.relationship('User', foreign_keys=user_id) title = db.Column(db.String(128), nullable=False) description = db.Column(db.String(256)) posts = relationship('Post', passive_deletes=True, backref='subreddit')
class Post(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) user_id = db.Column(db.Integer, ForeignKey('user.id')) user = db.relationship('User', foreign_keys=user_id) title = db.Column(db.String(128), nullable=False) content = db.Column(db.String(2048)) subreddit_id = db.Column(db.Integer, ForeignKey('subreddit.id', ondelete='CASCADE')) comments = relationship('Comment', passive_deletes=True, backref='post')
class Vote(db.Model): __tablename__ = "votes" voter_id = db.Column(db.Integer, primary_key=True) voted_thread_id = db.Column(db.Integer, primary_key=True) createdAt = db.Column(db.DateTime, default=datetime.utcnow) direction = db.Column(db.Boolean, nullable=False) def __init__(self, direction=None, **kwargs): super(Vote, self).__init__( direction=direction_to_bool(direction), **kwargs ) def update(self, direction, commit=True): new_direction = direction_to_bool(direction) if new_direction == self.direction: raise ValueError('New vote direction must be different.') self.direction = new_direction self.save(commit=commit) def delete(self, commit=True): db.session.delete(self) return commit and db.session.commit() def save(self, commit=True): db.session.add(self) return commit and db.session.commit() @classmethod def get(cls, voter, voted): vote = cls.query.filter_by(voter_id=voter, voted_thread_id=voted).first() return vote @classmethod def has_voted(cls, objects, user): object_ids = [o['id'] for o in objects] raise NotImplementedError() @classmethod def count_votes(cls, thread_id): """ SELECT DIRECTION, COUNT(id) FROM votes GROUP BY DIRECTION """ return cls.query\ .with_entities(cls.direction, sql_func.count(cls.voter_id))\ .group_by(cls.direction)\ .filter_by(voted_thread_id=thread_id)\ .all()
from datetime import datetime from sqlalchemy import exc from reddit.database import db, CrudMixin subscriptions = db.Table( 'subscriptions', db.Column('subscriber_id', db.Integer, db.ForeignKey('user.id'), primary_key=True), db.Column('subreddit_id', db.Integer, db.ForeignKey('subreddits.id'), primary_key=True), db.Column('createdAt', db.DateTime, default=datetime.utcnow)) class Subreddit(db.Model, CrudMixin): __tablename__ = 'subreddits' name = db.Column(db.String(64), unique=True, nullable=False) description = db.Column(db.Text, nullable=False) subscriber_count = db.Column(db.Integer, nullable=False, default=0) creator_id = db.Column(db.Integer, db.ForeignKey('user.id')) creator = db.relationship('User', backref=db.backref('created_subreddits', lazy='dynamic')) subscribers = db.relationship('User', secondary='subscriptions', backref=db.backref('subscribed_subreddits', lazy='dynamic'),