From e8de7e21f2b0074b85b8365e96f14ab72b683917 Mon Sep 17 00:00:00 2001 From: proDream Date: Fri, 10 Jan 2025 19:22:32 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D1=8B=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=B8=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Создан файл `__init__.py` в папке `lkeep/database/models` для инициализации модуля. - Создан класс `Base` в `base.py` как базовый класс для всех ORM-моделей. - Добавлена модель `User` в `user.py`, представляющая пользователя с необходимыми атрибутами. --- lkeep/database/__init__.py | 7 ++++++ lkeep/database/models/__init__.py | 13 +++++++++++ lkeep/database/models/base.py | 25 +++++++++++++++++++++ lkeep/database/models/user.py | 37 +++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 lkeep/database/__init__.py create mode 100644 lkeep/database/models/__init__.py create mode 100644 lkeep/database/models/base.py create mode 100644 lkeep/database/models/user.py 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)