barker/barker/barker/models/user.py

60 lines
1.9 KiB
Python

import uuid
from hashlib import md5
from barker.models.login_history import LoginHistory
from barker.models.meta import Base
from barker.models.user_roles import user_roles
from sqlalchemy import Boolean, Column, Unicode, desc, select, text
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Session, relationship, synonym
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")
login_history = relationship("LoginHistory", order_by=desc(LoginHistory.date), backref="user")
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.execute(select(User).where(User.name.ilike(name))).scalars().one_or_none()
if not user:
return None
if user.password != encrypt(password) or user.locked_out:
return None
else:
return user
def encrypt(val):
return md5(val.encode("utf-8") + "v2".encode("utf-8")).hexdigest()