sqlalchemy-template/src/db/models/user.py
2025-08-03 20:41:56 +03:00

51 lines
1.5 KiB
Python

import uuid
import bcrypt
from sqlalchemy import Column, ForeignKey, String, func
from sqlalchemy.orm import relationship, validates
from sqlalchemy.sql.expression import select
from sqlalchemy.sql.sqltypes import UUID, BigInteger, Enum, DateTime
from helpers.admin.enums import AccessLevel
from .base import Base
from ..types.fields import Password
class User(Base):
__tablename__ = "users"
id = Column(BigInteger, primary_key=True, index=True, unique=True, nullable=False)
username = Column(String(50), nullable=False, unique=True)
password = Column(Password(length=156), nullable=False)
access_level = Column(Enum(AccessLevel))
sessions = relationship("UserSession", back_populates="user")
@validates("password")
def _validate_password(self, key, password):
return getattr(type(self), key).type.validator(password)
def verify_password(self, password):
return bcrypt.checkpw(password.encode(), self.password.hash.encode())
class UserSession(Base):
__tablename__ = "user_sessions"
token = Column(
UUID(as_uuid=True),
default=uuid.uuid4,
nullable=False,
index=True,
primary_key=True,
)
user_id = Column(BigInteger, ForeignKey("users.id"), index=True, nullable=False)
user = relationship("User", back_populates="sessions")
created_at = Column(DateTime, default=func.now(), nullable=False)
@classmethod
def _filter_session_by_user_id(cls, user_id: int):
query = select(cls).where(cls.user_id == user_id)
return query