From 3e2839e7257fb9a2aa31d23cc62fb3f953453b69 Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Tue, 5 Aug 2025 15:48:03 +0400 Subject: [PATCH] feat: mixins --- models/board.py | 23 +++++------------------ models/deal.py | 13 ++++--------- models/mixins.py | 18 ++++++++++++++++++ models/project.py | 8 ++------ models/status.py | 12 ++++-------- 5 files changed, 33 insertions(+), 41 deletions(-) create mode 100644 models/mixins.py diff --git a/models/board.py b/models/board.py index 3b5410b..80a052d 100644 --- a/models/board.py +++ b/models/board.py @@ -1,37 +1,24 @@ -from datetime import datetime from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from models.base import BaseModel +from models.mixins import SoftDeleteMixin, CreatedAtMixin, IdMixin if TYPE_CHECKING: from models import Project, Status, Deal -class Board(BaseModel): +class Board(BaseModel, IdMixin, SoftDeleteMixin, CreatedAtMixin): __tablename__ = "boards" - id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) lexorank: Mapped[str] = mapped_column(nullable=False) - created_at: Mapped[datetime] = mapped_column(nullable=False) - is_deleted: Mapped[bool] = mapped_column(default=False) - project_id: Mapped[int] = mapped_column(ForeignKey("projects.id"), nullable=False) - project: Mapped["Project"] = relationship( - "Project", - back_populates="boards", - ) + project: Mapped["Project"] = relationship(back_populates="boards") - statuses: Mapped[list["Status"]] = relationship( - "Status", - back_populates="board", - ) + statuses: Mapped[list["Status"]] = relationship(back_populates="board") - deals: Mapped[list["Deal"]] = relationship( - "Deal", - back_populates="board", - ) + deals: Mapped[list["Deal"]] = relationship(back_populates="board") diff --git a/models/deal.py b/models/deal.py index 3338bbf..0fcad99 100644 --- a/models/deal.py +++ b/models/deal.py @@ -4,15 +4,15 @@ from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from models.base import BaseModel +from models.mixins import SoftDeleteMixin, CreatedAtMixin, IdMixin if TYPE_CHECKING: from models import Status, Board -class Deal(BaseModel): +class Deal(BaseModel, IdMixin, SoftDeleteMixin, CreatedAtMixin): __tablename__ = "deals" - id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) lexorank: Mapped[str] = mapped_column(nullable=False) @@ -21,14 +21,9 @@ class Deal(BaseModel): nullable=False, comment="Текущий статус", ) - status: Mapped["Status"] = relationship(lazy="selectin") - - is_deleted: Mapped[bool] = mapped_column(default=False) + status: Mapped["Status"] = relationship(lazy="noload") board_id: Mapped[int] = mapped_column( ForeignKey("boards.id"), nullable=True, server_default="1" ) - board: Mapped["Board"] = relationship( - "Board", - back_populates="deals", - ) + board: Mapped["Board"] = relationship(back_populates="deals") diff --git a/models/mixins.py b/models/mixins.py new file mode 100644 index 0000000..3aa7c21 --- /dev/null +++ b/models/mixins.py @@ -0,0 +1,18 @@ +from datetime import datetime + +from sqlalchemy.orm import Mapped, mapped_column + + +class IdMixin: + id: Mapped[int] = mapped_column(primary_key=True) + + +class SoftDeleteMixin: + is_deleted: Mapped[bool] = mapped_column( + default=False, + nullable=False, + ) + + +class CreatedAtMixin: + created_at: Mapped[datetime] = mapped_column(nullable=False) diff --git a/models/project.py b/models/project.py index c2b86de..c43c59a 100644 --- a/models/project.py +++ b/models/project.py @@ -1,24 +1,20 @@ -from datetime import datetime from typing import TYPE_CHECKING from sqlalchemy.orm import Mapped, mapped_column, relationship from models.base import BaseModel +from models.mixins import SoftDeleteMixin, CreatedAtMixin, IdMixin if TYPE_CHECKING: from models import Board -class Project(BaseModel): +class Project(BaseModel, IdMixin, SoftDeleteMixin, CreatedAtMixin): __tablename__ = "projects" - id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) - created_at: Mapped[datetime] = mapped_column(nullable=False) - is_deleted: Mapped[bool] = mapped_column(default=False) boards: Mapped[list["Board"]] = relationship( - "Board", back_populates="project", lazy="noload", ) diff --git a/models/status.py b/models/status.py index a1f5e88..cb38ca8 100644 --- a/models/status.py +++ b/models/status.py @@ -3,22 +3,18 @@ from typing import TYPE_CHECKING from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship -from models import BaseModel +from models.base import BaseModel +from models.mixins import SoftDeleteMixin, IdMixin if TYPE_CHECKING: from models import Board -class Status(BaseModel): +class Status(BaseModel, IdMixin, SoftDeleteMixin): __tablename__ = "statuses" - id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) lexorank: Mapped[str] = mapped_column(nullable=False) - is_deleted: Mapped[bool] = mapped_column(default=False, nullable=False) board_id: Mapped[int] = mapped_column(ForeignKey("boards.id"), nullable=False) - board: Mapped["Board"] = relationship( - "Board", - back_populates="statuses", - ) + board: Mapped["Board"] = relationship(back_populates="statuses")