58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
import uuid
|
|
|
|
from sqlalchemy import Boolean, Column, Unicode, text
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
from sqlalchemy.orm import Session, relationship, synonym
|
|
|
|
from .meta import Base
|
|
from .user_role import user_roles
|
|
|
|
|
|
def encrypt(val):
|
|
return val
|
|
# return md5(val.encode("utf-8") + "v2".encode("utf-8")).hexdigest()
|
|
|
|
|
|
class User(Base):
|
|
__tablename__ = "users"
|
|
|
|
id = Column(
|
|
"id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4
|
|
)
|
|
name = Column("name", Unicode(255), unique=True, nullable=False)
|
|
_password = Column("password", Unicode(60), nullable=False)
|
|
locked_out = Column("locked_out", Boolean, nullable=False)
|
|
|
|
roles = relationship("Role", secondary=user_roles, order_by="Role.name")
|
|
|
|
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 auth(cls, name: str, password: str, db: Session):
|
|
if password is None:
|
|
return None
|
|
user = db.query(User).filter(User.name.ilike(name)).first()
|
|
if not user:
|
|
return None
|
|
if user.password != encrypt(password) or user.locked_out:
|
|
return None
|
|
else:
|
|
return user
|