diff --git a/lkeep/database/__init__.py b/lkeep/database/__init__.py new file mode 100644 index 0000000..c30336a --- /dev/null +++ b/lkeep/database/__init__.py @@ -0,0 +1,7 @@ +""" +Проект: Lkeep +Автор: Иван Ашихмин +Год: 2025 +Специально для проекта "Код на салфетке" +https://pressanybutton.ru/category/servis-na-fastapi/ +""" diff --git a/lkeep/database/models/__init__.py b/lkeep/database/models/__init__.py new file mode 100644 index 0000000..65695bc --- /dev/null +++ b/lkeep/database/models/__init__.py @@ -0,0 +1,13 @@ +""" +Проект: Lkeep +Автор: Иван Ашихмин +Год: 2025 +Специально для проекта "Код на салфетке" +https://pressanybutton.ru/category/servis-na-fastapi/ +""" + +from lkeep.database.models.base import Base +from lkeep.database.models.user import User + + +__all__ = ("Base", "User") diff --git a/lkeep/database/models/base.py b/lkeep/database/models/base.py new file mode 100644 index 0000000..73e46e1 --- /dev/null +++ b/lkeep/database/models/base.py @@ -0,0 +1,25 @@ +""" +Проект: Lkeep +Автор: Иван Ашихмин +Год: 2025 +Специально для проекта "Код на салфетке" +https://pressanybutton.ru/category/servis-na-fastapi/ +""" + +from sqlalchemy.orm import DeclarativeBase, declared_attr + + +class Base(DeclarativeBase): + """ + Базовый класс для моделей ORM, использующих SQLAlchemy. + """ + + @declared_attr.directive + def __tablename__(cls) -> str: + """ + Определяет название таблицы в базе данных на основе имени класса. + + :return: Название таблицы в формате snake_case. + :rtype: str + """ + return cls.__name__.lower() diff --git a/lkeep/database/models/user.py b/lkeep/database/models/user.py new file mode 100644 index 0000000..3164bf8 --- /dev/null +++ b/lkeep/database/models/user.py @@ -0,0 +1,37 @@ +""" +Проект: Lkeep +Автор: Иван Ашихмин +Год: 2025 +Специально для проекта "Код на салфетке" +https://pressanybutton.ru/category/servis-na-fastapi/ +""" + +from sqlalchemy import Boolean, String, Text +from sqlalchemy.orm import Mapped, mapped_column + +from lkeep.database.mixins.id_mixins import IDMixin +from lkeep.database.mixins.timestamp_mixins import TimestampsMixin +from lkeep.database.models.base import Base + + +class User(IDMixin, TimestampsMixin, Base): + """ + Класс User представляет пользователя в системе. + + :ivar email: Email адрес пользователя. + :type email: str + :ivar hashed_password: Хэшированный пароль пользователя. + :type hashed_password: str + :ivar is_active: Флаг активности пользователя (True или False). + :type is_active: bool + :ivar is_superuser: Флаг суперпользователя (True или False). + :type is_superuser: bool + :ivar is_verified: Флаг подтверждения аккаунта (True или False). + :type is_verified: bool + """ + + email: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) + hashed_password: Mapped[str] = mapped_column(Text, unique=False, nullable=False) + is_active: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) + is_superuser: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) + is_verified: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)