예제 #1
0
class UserSubscription(db.Model):
    __tablename__ = 'user_subscriptions'

    following_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    follower_id = db.Column(db.Integer, db.ForeignKey("users.id"))

    following = db.relationship("User", foreign_keys=[following_id], backref='follower_subscriptions')
    follower = db.relationship("User", foreign_keys=[follower_id], backref='following_subscriptions')

    __mapper_args__ = {'primary_key': [following_id, follower_id]}
    __table_args__ = (UniqueConstraint('following_id', 'follower_id', name='one_subscription_for_same_user'),)
예제 #2
0
class TimeStampedModel(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    created_at = db.Column(db.DateTime(), default=datetime.utcnow, index=True)
    updated_at = db.Column(db.DateTime())

    @classmethod
    def get_by_id(cls, record_id):
        """Get record by ID."""
        if any((isinstance(record_id, basestring)
                and record_id.isdigit(), isinstance(record_id,
                                                    (int, float))), ):
            return cls.query.get(int(record_id))
예제 #3
0
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)
    user = relationship('User', backref=db.backref('likes'))

    article_id = db.Column(db.Integer,
                           db.ForeignKey('articles.id'),
                           nullable=False)
    article = relationship('Article', backref=db.backref('likes'))

    __mapper_args__ = {'primary_key': [user_id, article_id]}
    __table_args__ = (UniqueConstraint('user_id',
                                       'article_id',
                                       name='one_like_per_article_and_user'), )
예제 #4
0
class Article(db.Model):
    __tablename__ = 'articles'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    description = db.Column(db.Text, nullable=False)
    slug = db.Column(db.Text, unique=True)
    body = db.Column(db.Text)

    created_at = db.Column(db.DateTime(), default=datetime.utcnow, index=True)
    updated_at = db.Column(db.DateTime(), onupdate=datetime.utcnow)
    publish_on = db.Column(db.DateTime,
                           index=True,
                           default=datetime.utcnow,
                           nullable=False)

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    user = relationship('User', backref=db.backref('articles'))
    '''
    liked_by = relationship(
        'user',
        secondary=likesModel,
        backref='likes',
        lazy='dynamic')
    '''

    tags = relationship('Tag', secondary=articles_tags, backref='articles')

    categories = relationship('Category',
                              secondary=articles_categories,
                              backref='articles')

    # comments = relationship('Comment', backref='article', lazy='dynamic')

    def add_tag(self, tag):
        if tag not in self.tags:
            self.tags.append(tag)
            return True
        return False

    def remove_tag(self, tag):
        if tag in self.tags:
            self.tags.remove(tag)
            return True
        return False

    def __repr__(self):
        return '<Article %r>' % self.body

    def __str__(self):
        return '<Article {}>'.format(self.body)
예제 #5
0
class Comment(db.Model):
    __tablename__ = 'comments'

    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text)
    created_at = db.Column(db.DateTime,
                           nullable=False,
                           default=dt.datetime.utcnow)
    updated_at = db.Column(db.DateTime,
                           nullable=False,
                           default=dt.datetime.utcnow)

    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
    user = relationship('User', backref='comments')

    article_id = db.Column(db.Integer,
                           db.ForeignKey('articles.id'),
                           nullable=False)
    article = relationship('Article', backref=db.backref('comments'))

    replied_comment_id = db.Column(db.Integer,
                                   db.ForeignKey('comments.id'),
                                   nullable=True)
    replies = relationship("Comment",
                           backref=db.backref('reply', remote_side=[id]))
예제 #6
0
class UserRole(db.Model):
    __tablename__ = 'users_roles'

    user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))

    # users = db.relationship("User", foreign_keys=[user_id], backref='roles')
    user = db.relationship("User",
                           foreign_keys=[user_id],
                           backref='users_roles')
    role = db.relationship("Role",
                           foreign_keys=[role_id],
                           backref='users_roles')

    __mapper_args__ = {'primary_key': [user_id, role_id]}
    __table_args__ = (UniqueConstraint('user_id',
                                       'role_id',
                                       name='same_role_for_same_user'), )
예제 #7
0
class Tag(db.Model):
    __tablename__ = 'tags'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    slug = db.Column(db.String(), index=True)
    description = db.Column(db.String())
    created_at = db.Column(db.DateTime(), default=datetime.utcnow, index=True)
    updated_at = db.Column(db.DateTime())

    def __repr__(self):
        return self.name
예제 #8
0
from sqlalchemy import UniqueConstraint
from sqlalchemy.orm import relationship

from blog_api.factory import db


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)
    user = relationship('User', backref=db.backref('likes'))

    article_id = db.Column(db.Integer,
                           db.ForeignKey('articles.id'),
                           nullable=False)
    article = relationship('Article', backref=db.backref('likes'))

    __mapper_args__ = {'primary_key': [user_id, article_id]}
    __table_args__ = (UniqueConstraint('user_id',
                                       'article_id',
                                       name='one_like_per_article_and_user'), )


likesTable = db.Table('likes',
                      db.Column('user_id', db.Integer,
                                db.ForeignKey('user.id')),
                      db.Column('article_id', db.Integer,
                                db.ForeignKey('articles.id')),
                      keep_existing=True)
예제 #9
0
from datetime import datetime

from slugify import slugify
from sqlalchemy import event

from blog_api.factory import db


class Tag(db.Model):
    __tablename__ = 'tags'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    slug = db.Column(db.String(), index=True)
    description = db.Column(db.String())
    created_at = db.Column(db.DateTime(), default=datetime.utcnow, index=True)
    updated_at = db.Column(db.DateTime())

    def __repr__(self):
        return self.name


articles_tags = db.Table("articles_tags",
                         db.Column("tag_id", db.Integer, db.ForeignKey("tags.id")),
                         db.Column("article_id", db.Integer, db.ForeignKey("articles.id")))


@event.listens_for(Tag.name, 'set')
def receive_set(target, value, oldvalue, initiator):
    target.slug = slugify(unicode(value))
예제 #10
0
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(100), unique=True, nullable=False)
    password = db.Column(db.Binary(128), nullable=True)
    created_at = db.Column(db.DateTime,
                           nullable=False,
                           default=datetime.utcnow)
    updated_at = db.Column(db.DateTime,
                           nullable=False,
                           default=datetime.utcnow)
    first_name = db.Column(db.String(300), nullable=False)
    last_name = db.Column(db.String(300), nullable=False)

    roles = db.relationship('Role', secondary=users_roles, backref='users')
    '''
    articles = db.relationship('Article',
                               foreign_keys='articles.user_id',
                               backref='user', lazy='dynamic')
    
    comments = db.relationship('Comment',
                               foreign_keys='comments.user_id',
                               backref='user', lazy='dynamic')
    '''
    '''
        following = db.relationship(
            'User', secondary=user_subscriptions,
            primaryjoin=(user_subscriptions.c.follower_id == id),
            secondaryjoin=(user_subscriptions.c.following_id == id),
            backref=db.backref('followers', lazy='dynamic'), lazy='dynamic')
    '''
    def __repr__(self):
        return '<User {}>'.format(self.username)

    def check_password(self, password):
        return bcrypt.check_password_hash(self.password, password)

    def follow(self, user):
        if not self.is_following(user):
            self.followed.append(user)

    def unfollow(self, user):
        if self.is_following(user):
            self.following.remove(user)

    def is_following(self, user):
        return self.followed.filter(
            user_subscriptions.c.followed_id == user.id).count() > 0

    def is_admin_or_author(self):
        return db.session.query(
            User.id).filter(((User.roles.any(name='ROLE_AUTHOR')) |
                             (User.roles.any(name='ROLE_ADMIN')))
                            & (User.id == self.id)).count() > 0
        # User.query.filter(User.roles.any(name='ROLE_ADMIN')).all()
        # User.query.join(User.roles).filter_by(genre_id=genre.id).all()

    def is_admin(self):
        return 'ROLE_ADMIN' in [r.name for r in self.roles]

    def is_not_admin(self):
        return not self.is_admin()

    def is_author(self):
        return 'ROLE_AUTHOR' in [r.name for r in self.roles]

    def is_not_author(self):
        return not self.is_author()
예제 #11
0
class SiteSubscription(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id'), nullable=False)
예제 #12
0
from sqlalchemy import UniqueConstraint

from blog_api.factory import db


class UserSubscription(db.Model):
    __tablename__ = 'user_subscriptions'

    following_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    follower_id = db.Column(db.Integer, db.ForeignKey("users.id"))

    following = db.relationship("User", foreign_keys=[following_id], backref='follower_subscriptions')
    follower = db.relationship("User", foreign_keys=[follower_id], backref='following_subscriptions')

    __mapper_args__ = {'primary_key': [following_id, follower_id]}
    __table_args__ = (UniqueConstraint('following_id', 'follower_id', name='one_subscription_for_same_user'),)


user_subscriptions = db.Table(
    'user_subscriptions',
    db.Column('follower_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('following_id', db.Integer, db.ForeignKey('users.id')),
    keep_existing=True
)


class SiteSubscription(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id'), nullable=False)
예제 #13
0
class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)
    description = db.Column(db.String(100), nullable=True)
예제 #14
0
    name = db.Column(db.String(80), unique=True, nullable=False)
    description = db.Column(db.String(100), nullable=True)


class UserRole(db.Model):
    __tablename__ = 'users_roles'

    user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))

    # users = db.relationship("User", foreign_keys=[user_id], backref='roles')
    user = db.relationship("User",
                           foreign_keys=[user_id],
                           backref='users_roles')
    role = db.relationship("Role",
                           foreign_keys=[role_id],
                           backref='users_roles')

    __mapper_args__ = {'primary_key': [user_id, role_id]}
    __table_args__ = (UniqueConstraint('user_id',
                                       'role_id',
                                       name='same_role_for_same_user'), )


users_roles = db.Table('users_roles',
                       db.Column('user_id', db.Integer,
                                 db.ForeignKey('users.id')),
                       db.Column('role_id', db.Integer,
                                 db.ForeignKey('roles.id')),
                       keep_existing=True)
예제 #15
0
from slugify import slugify
from sqlalchemy import event

from blog_api.factory import db


class Category(db.Model):
    __tablename__ = 'categories'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    slug = db.Column(db.String(), index=True)
    description = db.Column(db.String())
    created_at = db.Column(db.DateTime(), default=datetime.utcnow, index=True)
    updated_at = db.Column(db.DateTime(), onupdate=datetime.utcnow)

    def __repr__(self):
        return self.name


articles_categories = db.Table(
    "articles_categories",
    db.Column("category_id", db.Integer, db.ForeignKey("categories.id")),
    db.Column("article_id", db.Integer, db.ForeignKey("articles.id")))


@event.listens_for(Category.name, 'set')
def receive_set(target, value, oldvalue, initiator):
    target.slug = slugify(unicode(value))