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