示例#1
0
class Role(db.Model):
    __tablename__ = 'role'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    role_name = db.Column(db.String(256, convert_unicode=True), nullable=True)
    users = relationship(
        "User",
        secondary=user_role_table,
        back_populates="roles")
示例#2
0
class Action(db.Model):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    __tablename__ = 'action'
    name = db.Column(db.String(256, collation='utf8mb4_general_ci', convert_unicode=True), primary_key=True)
    description = db.Column(db.Text(collation='utf8mb4_general_ci', convert_unicode=True), nullable=True)
    created_at = db.Column(db.TIMESTAMP, default=datetime.now)
示例#3
0
class HistoryWrongPass(db.Model):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    __tablename__ = 'history_wrong_password'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id',
                                                  ondelete='CASCADE'))
    created_at = db.Column(db.TIMESTAMP, default=datetime.now)
示例#4
0
class SocialLogin(db.Model):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    __tablename__ = 'social_login'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    social_id = db.Column(db.String(50), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id', ondelete='CASCADE'))
    created_at = db.Column(db.TIMESTAMP, default=datetime.now)
    social_name = db.Column(db.Enum(SocialName), nullable=False)
示例#5
0
class UserAction(db.Model):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    __tablename__ = 'user_action'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    action_name = db.Column(db.String(256, convert_unicode=True),
                            nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id',
                                                  ondelete='CASCADE'))
    created_at = db.Column(db.TIMESTAMP, default=datetime.now)
示例#6
0
class RevokedToken(db.Model):
    __tablename__ = 'revoked_token'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    jti = db.Column(db.String(255, convert_unicode=True), nullable=False)

    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    @classmethod
    def is_jti_blacklisted(cls, jti):
        query = cls.query.filter_by(jti=jti).first()
        return bool(query)
示例#7
0
class UserBookAction(db.Model):
    __tablename__ = 'book_log'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id',
                                                  ondelete='CASCADE'))
    book_id = db.Column(db.Integer, db.ForeignKey('book.id',
                                                  ondelete='CASCADE'))
    log_name = db.Column(db.Enum(LogAction),
                         nullable=False,
                         default=LogAction.UPDATED)
    created_at = db.Column(db.TIMESTAMP,
                           server_default=func.now(),
                           default=func.now(),
                           nullable=False)
    book = relationship("Book", back_populates="users")
    user = relationship("User", back_populates="books")
示例#8
0
class Book(db.Model, TimestampMixin):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    __tablename__ = 'book'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(255, convert_unicode=True),
                     nullable=False,
                     unique=True)
    author = db.Column(db.Text(convert_unicode=True), nullable=True)
    description = db.Column(db.Text(convert_unicode=True), nullable=True)
    is_active = db.Column(db.Boolean, default=True)
    star = db.Column(db.SmallInteger, default=5)
    price = db.Column(db.Float, nullable=False)
    quantity_in_stock = db.Column(db.Integer, nullable=False)
    quantity_sold = db.Column(db.Integer, default=0)
    users = relationship("UserBookAction", back_populates="book")
    categories = relationship("Category",
                              secondary=category_book_table,
                              back_populates="books")

    def update_attr(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
        self.updated_at = datetime.now()

    def to_dict(self):
        from ducttapp.models import User, UserBookAction

        user_created = db.session.query(User).filter(
            self.id == UserBookAction.book_id).filter(
                UserBookAction.log_name == LogAction.CREATED).filter(
                    User.id == UserBookAction.user_id).first().username or ""

        return {
            'id': self.id,
            'name': self.name,
            'description': self.description,
            'is_active': self.is_active,
            'created_at': self.created_at,
            'updated_at': self.updated_at,
            'quantity_in_stock': self.quantity_in_stock,
            'price': self.price,
            'user_created': user_created,
            'categories': [x.id for x in self.categories]
        }
示例#9
0
class Category(db.Model, TimestampMixin):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    __tablename__ = 'category'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(255, convert_unicode=True), nullable=False, unique=True)
    description = db.Column(db.Text(convert_unicode=True), nullable=True)
    is_active = db.Column(db.Boolean, default=True)
    users = relationship("UserCategoryAction", back_populates="category", cascade="all, delete-orphan")
    books = relationship(
        "Book",
        secondary=category_book_table,
        back_populates="categories")

    def update_attr(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
        self.updated_at = datetime.now()

    def to_dict(self):
        from ducttapp.models import User, UserCategoryAction
        return {
            'id': self.id,
            'name': self.name,
            'description': self.description,
            'is_active': self.is_active,
            'created_at': self.created_at,
            'updated_at': self.updated_at,
            'user_created': db.session.query(
                User
            ).filter(
                self.id == UserCategoryAction.category_id
            ).filter(
                UserCategoryAction.log_name == LogAction.CREATED
            ).filter(
                User.id == UserCategoryAction.user_id
            ).first().username or ""
        }
示例#10
0
class UserCategoryAction(db.Model):
    __tablename__ = 'category_log'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id', ondelete='CASCADE'))
    category_id = db.Column(db.Integer, db.ForeignKey('category.id', ondelete='CASCADE'))
    log_name = db.Column(db.Enum(LogAction), nullable=False, default=LogAction.UPDATED)
    created_at = db.Column(db.TIMESTAMP, server_default=func.now(), default=func.now(), nullable=False)
    category = relationship("Category", back_populates="users")
    user = relationship("User", back_populates="categories")

    def to_dict(self):
        from ducttapp.models import User
        return {
            'id': self.id,
            'log_name': self.log_name.value,
            'created_at': self.created_at,
            'username': db.session.query(
                User
            ).filter(
                self.user_id == User.id
            ).first().username or ""
        }
示例#11
0
class Signup_Request(db.Model):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
        self.expired_time = (datetime.now() + timedelta(minutes=30))

    __tablename__ = 'signup_request'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(128, convert_unicode=True),
                         nullable=False,
                         unique=True)
    email = db.Column(db.String(128, convert_unicode=True),
                      nullable=False,
                      unique=True)
    password_hash = db.Column(db.Text(convert_unicode=True), nullable=False)
    is_admin = db.Column(db.Boolean, default=False)
    expired_time = db.Column(db.TIMESTAMP,
                             default=(datetime.now() + timedelta(minutes=30)))
    user_token_confirm = db.Column(db.Text(), nullable=False)

    @property
    def password(self):
        raise AttributeError('password: write-only field')

    @password.setter
    def password(self, password):
        self.password_hash = bcrypt.generate_password_hash(password).decode(
            'utf-8')

    def token_verify_expired(self):
        return self.expired_time < datetime.now()

    def to_dict(self):
        return {
            "username": self.username,
            "email": self.email,
            "user_token_confirm": self.user_token_confirm
        }
示例#12
0
from ducttapp.models import db
from .base import TimestampMixin
from sqlalchemy.orm import relationship
from sqlalchemy import func
import enum
from datetime import datetime


category_book_table = db.Table(
    'category_book',
    db.Model.metadata,
    db.Column('category_id', db.Integer, db.ForeignKey('category.id', ondelete='CASCADE')),
    db.Column('book_id', db.Integer, db.ForeignKey('book.id', ondelete='CASCADE'))
)


class Category(db.Model, TimestampMixin):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    __tablename__ = 'category'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(255, convert_unicode=True), nullable=False, unique=True)
    description = db.Column(db.Text(convert_unicode=True), nullable=True)
    is_active = db.Column(db.Boolean, default=True)
    users = relationship("UserCategoryAction", back_populates="category", cascade="all, delete-orphan")
    books = relationship(
        "Book",
        secondary=category_book_table,
        back_populates="categories")
示例#13
0
from ducttapp.models import db
from flask_restplus import fields
from sqlalchemy.orm import relationship

user_role_table = db.Table(
    'user_role',
    db.Model.metadata,
    db.Column('user_id', db.Integer, db.ForeignKey('user.id', ondelete='CASCADE')),
    db.Column('role_id', db.Integer, db.ForeignKey('role.id', ondelete='CASCADE'))
)


class Role(db.Model):
    __tablename__ = 'role'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    role_name = db.Column(db.String(256, convert_unicode=True), nullable=True)
    users = relationship(
        "User",
        secondary=user_role_table,
        back_populates="roles")


class RoleSchema:
    role_res_schema = {
        'id': fields.Integer(),
        'role_name': fields.String()
    }
示例#14
0
class User(db.Model, TimestampMixin):
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(128, convert_unicode=True), nullable=False)
    email = db.Column(db.String(128, convert_unicode=True),
                      nullable=False,
                      unique=True)
    fullname = db.Column(db.String(128, convert_unicode=True), nullable=True)
    gender = db.Column(db.Boolean, nullable=True)
    phone_number = db.Column(db.String(20), nullable=True)
    birthday = db.Column(db.DateTime, nullable=True)
    avatar = db.Column(db.String(256), nullable=True)
    password_hash = db.Column(db.Text(convert_unicode=True), nullable=False)
    is_admin = db.Column(db.Boolean, default=False)
    is_active = db.Column(db.Boolean, default=True)
    time_unlock = db.Column(db.TIMESTAMP, default=datetime.now)
    history_pass_change = relationship("HistoryPassChange",
                                       cascade="save-update, merge, delete")
    history_wrong_pass = relationship("HistoryWrongPass",
                                      cascade="save-update, merge, delete")
    user_action = relationship("UserAction",
                               cascade="save-update, merge, delete")
    social_login = relationship("SocialLogin",
                                cascade="save-update, merge, delete")
    roles = relationship("Role",
                         secondary=user_role_table,
                         back_populates="users")
    categories = relationship("UserCategoryAction",
                              back_populates="user",
                              cascade="all, delete-orphan")
    books = relationship("UserBookAction",
                         back_populates="user",
                         cascade="all, delete-orphan")

    @property
    def password(self):
        raise AttributeError('password: write-only field')

    @password.setter
    def password(self, password):
        self.password_hash = bcrypt.generate_password_hash(password).decode(
            'utf-8')

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

    def update_attr(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
        self.updated_at = datetime.now()

    def to_dict(self):
        return {
            'id': self.id,
            'email': self.email,
            'username': self.username,
            'is_active': self.is_active,
            'updated_at': self.updated_at,
            'fullname': self.fullname,
            'phone_number': self.phone_number,
            'gender': self.gender,
            'birthday': self.birthday,
            'avatar': self.avatar,
            'roles': [r.id for r in self.roles]
        }