Example #1
0
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
Example #2
0
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
Example #3
0
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')
Example #4
0
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')
Example #5
0
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')
Example #6
0
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()
Example #7
0
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'),