/
2madeira
/
nami
Обзор
Документация
Войти
/
2madeira
/
nami
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
src/models.py
75 строк
3 KB
Andrey Zhunev
feat(api): improve API endpoints typing and validation
07 фев 2026, 23:13
07 фев 2026, 23:13
bbd81c6
Код
Авторство
О чём код?
from sqlalchemy import ForeignKey, func, Index from sqlalchemy.orm import Mapped, mapped_column, relationship, DeclarativeBase from typing import List, Optional import datetime, enum from src.database import Base class FrequencyType(enum.Enum): """Freaquancy types for set habit rule""" DAILY = "daily" # Ежедневно WEEKLY = "weekly" # Еженедельно class DayPart(enum.Enum): """ DayPart tupes for set habit rule. Used for bot reminders """ MORNING = "morning" AFTERNOON = "afternoon" EVENING = "evening" class User(Base): __tablename__ = "users" id: Mapped[int] = mapped_column(primary_key=True) telegram_id: Mapped[int] reg_date: Mapped[datetime.date] = mapped_column(server_default=func.now()) #автоматическое заполнение поля в момент создания пользователя habits: Mapped[List["Habit"]] = relationship(back_populates="user") #связь с habit class Habit(Base): __tablename__ = "habits" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] description: Mapped[Optional[str]] current_streak: Mapped[int] = mapped_column(default=0) max_streak: Mapped[int] = mapped_column(default=0) user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False) #связь с таблицей users user: Mapped["User"] = relationship(back_populates="habits") #продолжение связи rule: Mapped["HabitRule"] = relationship( back_populates="habit", lazy="selectin", # нужно, чтобы всегда автоматически загружались правила вместе с habit cascade="all, delete-orphan", # убрать сиротку потомка uselist=False ) logs: Mapped[List["HabitLog"]] = relationship(back_populates="habit") #связь с habbit_log class HabitLog(Base): __tablename__ = "habit_log_entries" id: Mapped[int] = mapped_column(primary_key=True) habit_id: Mapped[int] = mapped_column(ForeignKey("habits.id")) #связь с habit habit: Mapped["Habit"] = relationship(back_populates="logs") completed: Mapped[bool] date: Mapped[datetime.date] = mapped_column(server_default=func.current_date()) #композитный индекс, для быстрого поиска за период __table_args__ = ( Index("ix_habit_log_habit_id_date", "habit_id", "date"), ) class HabitRule(Base): __tablename__ = "habit_rules" id: Mapped[int] = mapped_column(primary_key=True) habit_id: Mapped[int] = mapped_column( ForeignKey("habits.id"), unique=True, nullable=False ) habit: Mapped["Habit"] = relationship(back_populates="rule") #связь с habit frequency_type: Mapped[FrequencyType] = mapped_column(default=FrequencyType.DAILY) frequency_count: Mapped[int] = mapped_column(default=1) day_part: Mapped[DayPart]