summer/summer/models/auth.py

138 lines
3.8 KiB
Python

__author__ = 'tanshu'
import uuid
from hashlib import md5
from sqlalchemy.schema import ForeignKey, Table
from sqlalchemy import Column, Boolean, Unicode
from sqlalchemy.orm import synonym, relationship
from summer.models.guidtype import GUID
from summer.models import Base
def encrypt(val):
return md5(val.encode('utf-8') + "Salt".encode('utf-8')).hexdigest()
user_role = Table(
'auth_user_roles', Base.metadata,
Column('user_role_id', GUID(), primary_key=True, default=uuid.uuid4),
Column('user_id', GUID(), ForeignKey('auth_users.user_id')),
Column('role_id', GUID(), ForeignKey('auth_roles.role_id'))
)
role_group = Table(
'auth_permission_roles', Base.metadata,
Column('permission_role_id', GUID(), primary_key=True, default=uuid.uuid4),
Column('permission_id', GUID(), ForeignKey('auth_permissions.permission_id')),
Column('role_id', GUID(), ForeignKey('auth_roles.role_id'))
)
class User(Base):
__tablename__ = 'auth_users'
id = Column('user_id', GUID(), primary_key=True, default=uuid.uuid4)
name = Column('name', Unicode(255), unique=True)
_password = Column('password', Unicode(60))
locked_out = Column('locked_out', Boolean)
roles = relationship('Role', secondary=user_role)
def _get_password(self):
return self._password
def _set_password(self, password):
self._password = encrypt(password)
password = property(_get_password, _set_password)
password = synonym('_password', descriptor=password)
@property
def __name__(self):
return self.name
def __init__(self, name=None, password=None, locked_out=None, id=None):
self.name = name
self.password = password
self.locked_out = locked_out
self.id = id
@classmethod
def by_name(cls, name, *, session=None):
return session.query(cls).filter(cls.name.ilike(name)).first()
@classmethod
def by_id(cls, id, *, session=None):
if not isinstance(id, uuid.UUID):
id = uuid.UUID(id)
return session.query(cls).filter(cls.id == id).one()
@classmethod
def auth(cls, name, password):
user = cls.by_name(name)
if not user:
return False, None
if user.password != encrypt(password) or user.locked_out:
return False, None
else:
return True, user
@classmethod
def list(cls, *, session=None):
return session.query(cls).order_by(cls.name).all()
@classmethod
def query(cls, *, session=None):
return session.query(cls)
@classmethod
def filtered_list(cls, name, *, session=None):
query = session.query(cls)
for item in name.split():
query = query.filter(cls.name.ilike('%' + item + '%'))
return query.order_by(cls.name)
class Role(Base):
__tablename__ = 'auth_roles'
id = Column('role_id', GUID(), primary_key=True, default=uuid.uuid4)
name = Column('name', Unicode(255), unique=True)
def __init__(self, name=None, id=None):
self.name = name
self.id = id
@classmethod
def by_id(cls, id, *, session=None):
return session.query(cls).filter(cls.id == id).one()
@classmethod
def list(cls, *, session=None):
return session.query(cls).order_by(cls.name).all()
class Permission(Base):
__tablename__ = 'auth_permissions'
id = Column('permission_id', GUID(), primary_key=True, default=uuid.uuid4)
name = Column('name', Unicode(255), unique=True)
groups = relationship('Role', secondary=role_group, backref='permissions')
def __init__(self, name=None, id=None):
self.name = name
self.id = id
@classmethod
def list(cls, *, session=None):
return session.query(cls).order_by(cls.name).all()
@classmethod
def by_id(cls, id, *, session=None):
return session.query(cls).filter(cls.id == id).one()