Example #1
0
class Role(ModelMixin, RoleMixin, db.Model):
    __tablename__ = 'role'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    parents = db.relationship('Role',
                              secondary=roles_parents,
                              primaryjoin=(id == roles_parents.c.role_id),
                              secondaryjoin=(id == roles_parents.c.parent_id),
                              backref=db.backref('children', lazy='dynamic'))
    users = db.relationship('User',
                            secondary=users_roles,
                            backref=db.backref('roles', lazy='dynamic'))

    def __init__(self, name):
        RoleMixin.__init__(self)
        self.name = name

    def add_parent(self, parent):
        # You don't need to add this role to parent's children set,
        # relationship between roles would do this work automatically
        self.parents.append(parent)

    def add_parents(self, *parents):
        for parent in parents:
            self.add_parent(parent)

    @staticmethod
    def get_by_name(name):
        return Role.query.filter_by(name=name).first()
Example #2
0
class Menu(db.Model):

    __tablename__ = 'menu'
    CATEGORY_STATE_VALUES = ['normal', 'deleted']
    mid = db.Column(db.Integer, primary_key=True)
    mname = db.Column(db.String(16))
    type = db.Column(db.Integer, default=1)  #默认为1,1为一级目录,2为二级目录,不支持更高级目录
    query_id = db.Column(db.Integer, default=0)
    father_mid = db.Column(db.Integer, default=0)  #区分二级目录归在哪个一级目录下
    url = db.Column(db.String(50))
    create_date = db.Column(db.DateTime, default=datetime.utcnow)
    state = db.Column(db.Enum(*CATEGORY_STATE_VALUES), default='normal')

    def __str__(self):
        return "%s" % self.mname

    def __repr__(self):
        return "<Category %s>" % self.mname

    def delete(self, commit=True):
        db.session.delete(self)
        if commit:
            db.session.commit()

    def jsonify(self):
        return {
            'mid': self.mid,
            'mname': self.mname,
            'type': self.type,
            'query_id': self.query_id,
            'father_mid': self.father_mid,
            'url': self.url
        }
Example #3
0
class Category(ModelMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    urlstr = db.Column(db.String(16))
    articles = db.relationship('Article', backref='category')

    def __str__(self):
        return "%s" % self.name

    def __repr__(self):
        return "<Category %s>" % self.name

    def delete(self, commit=True):
        for article in self.articles:
            article.delete(False)
        db.session.add(self)
        if commit:
            db.session.commit()
Example #4
0
class Article(ModelMixin, db.Model):

    __tablename__ = 'article'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30))
    description = db.Column(db.Text)
    create_date = db.Column(db.DateTime, default=datetime.utcnow)
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    deleted = db.Column(db.BOOLEAN, default=False)

    def delete(self, commit=True):
        self.deleted = True
        db.session.add(self)
        if commit:
            db.session.commit()

    def __str__(self):
        return ("%s" % self.name)

    def __repr__(self):
        return "<Article %s>" % self.name
Example #5
0
class Log(ModelMixin, db.Model):
    TYPE_TEXT = ('login', 'operation')
    LEVEL = ('danger', 'warn', 'normal')
    type = db.Column(db.Enum(*TYPE_TEXT))
    level = db.Column(db.Enum(*LEVEL))
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    time = db.Column(db.DATETIME, default=datetime.now())
    file = db.Column(db.String(250), default='none')
    module = db.Column(db.String(50))
    view_func = db.Column(db.String(50))
    method = db.Column(db.String(6))
    args = db.Column(db.String(250))
    ip = db.Column(db.String(30))
    user = db.relationship('User',
                           backref=db.backref('logs', lazy='dynamic'),
                           uselist=False)
Example #6
0
class User(ModelMixin, UserMixin, db.Model):
    """Model of user."""

    __tablename__ = 'user'
    query_class = UserQuery
    USER_STATE_VALUES = ('normal', 'frozen', 'deleted', 'unactivated')
    USER_STATE_TEXTS = ('Normal', 'Frozen', 'Deleted', 'Unactivated')

    id = db.Column(db.Integer, primary_key=True)
    loginname = db.Column(db.String(30), nullable=False)
    hashed_password = db.Column(db.String(64))
    nickname = db.Column(db.String(16), unique=True)
    email = db.Column(db.String(50), nullable=True)
    phone = db.Column(db.String(11), nullable=True)
    qq = db.Column(db.String(15), nullable=True)
    avatar = db.Column(db.String(250))
    create_date = db.Column(db.DateTime, default=datetime.now())
    salt = db.Column(db.String(32), nullable=False)
    state = db.Column(db.Enum(*USER_STATE_VALUES), default='normal')

    def __init__(self, **kwargs):
        self.salt = uuid4().hex

        if 'loginname' in kwargs:
            loginname = kwargs.pop('loginname')
            self.loginname = loginname.lower()

        if 'passwd' in kwargs:
            raw_passwd = kwargs.pop('passwd')
            self.change_password(raw_passwd)

        if 'nickname' in kwargs:
            nickname = kwargs.pop('nickname')
            self.nickname = nickname.lower()

        db.Model.__init__(self, **kwargs)

    def __unicode__(self):
        return self.loginname

    def __repr__(self):
        return "<User: %s>" % self.loginname

    def change_password(self, raw_passwd):
        self.salt = uuid4().hex
        self.hashed_password = self._hash_password(self.salt, raw_passwd)

    def check_password(self, raw_passwd):
        _hashed_password = self._hash_password(self.salt, raw_passwd)
        return self.hashed_password == _hashed_password

    def has_email(self):
        return not self.email is None

    def check_email(self, email):
        return self.email == email

    def is_active(self):
        return self.state == 'normal'

    def is_anonymous(self):
        return self.nickname is None

    def get_id(self):
        return self.id

    def get_role(self):
        if self.roles[0].name == u"superuser":
            return u"超级管理员"
        elif self.roles[0].name == u"manager":
            return u"管理员"

    def jsonify(self):
        return {
            'id': self.id,
            'loginname': self.loginname,
            'nickname': self.nickname,
            'email': self.email,
            'qq': self.qq,
            'phone': self.phone,
            'create_date': self.create_date,
            'state': self.state
        }

    def is_authenticated(self):
        return self.state in ('normal', 'unactivated')

    def active(self):
        self.state = 'normal'

    def get_avatar(self, size=70):
        if self.avatar:
            return self.avatar

        if not self.email:
            self.email = 'None'
        URL_PATTERN = "http://www.gravatar.com/avatar/%s?%s"
        gravatar_url = URL_PATTERN % (md5(self.email.lower()).hexdigest(),
                                      urllib.urlencode({'s': str(size)}))
        return gravatar_url

    def set_avatar(self, avatar_url):
        self.avatar = avatar_url

    @staticmethod
    def _hash_password(salt, password):
        hashed = sha256()
        hashed.update("<%s|%s>" % (salt, password))
        return hashed.hexdigest()
Example #7
0
from flask_rbac import RoleMixin, UserMixin
from flask.ext.sqlalchemy import BaseQuery

from cms.models import db, ModelMixin


class UserQuery(BaseQuery):
    def authenticate(self, loginname, raw_passwd):
        user = self.filter(User.loginname == loginname).first()
        if user and user.check_password(raw_passwd):
            return user
        return None


roles_parents = db.Table(
    'roles_parents', db.Column('role_id', db.Integer,
                               db.ForeignKey('role.id')),
    db.Column('parent_id', db.Integer, db.ForeignKey('role.id')))

users_roles = db.Table(
    'users_roles', db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer, db.ForeignKey('role.id')))


class Role(ModelMixin, RoleMixin, db.Model):
    __tablename__ = 'role'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    parents = db.relationship('Role',
                              secondary=roles_parents,
                              primaryjoin=(id == roles_parents.c.role_id),