Refactor code for improved readability and consistency
Test / test (push) Successful in 15s

- Reformatted function signatures in `organization_service.py` and `task_service.py` for better alignment.
- Updated import statements across multiple files for consistency and organization.
- Enhanced test files by improving formatting and ensuring consistent use of async session factories.
- Added type hints and improved type safety in various service and test files.
- Adjusted `pyproject.toml` to include configuration for isort, mypy, and ruff for better code quality checks.
- Cleaned up unused imports and organized existing ones in several test files.
This commit is contained in:
Artem Kashaev
2025-12-01 16:18:03 +05:00
parent eecb74c523
commit 5fcb574aca
62 changed files with 765 additions and 476 deletions
+13 -12
View File
@@ -1,4 +1,5 @@
"""Model exports for Alembic discovery."""
from app.models.activity import Activity, ActivityType
from app.models.base import Base
from app.models.contact import Contact
@@ -9,16 +10,16 @@ from app.models.task import Task
from app.models.user import User
__all__ = [
"Activity",
"ActivityType",
"Base",
"Contact",
"Deal",
"DealStage",
"DealStatus",
"Organization",
"OrganizationMember",
"OrganizationRole",
"Task",
"User",
"Activity",
"ActivityType",
"Base",
"Contact",
"Deal",
"DealStage",
"DealStatus",
"Organization",
"OrganizationMember",
"OrganizationRole",
"Task",
"User",
]
+12 -5
View File
@@ -1,4 +1,5 @@
"""Activity timeline ORM model and schemas."""
from __future__ import annotations
from datetime import datetime
@@ -6,10 +7,12 @@ from enum import StrEnum
from typing import Any
from pydantic import BaseModel, ConfigDict, Field
from sqlalchemy import DateTime, Enum as SqlEnum, ForeignKey, Integer, func, text
from sqlalchemy import DateTime, ForeignKey, Integer, func, text
from sqlalchemy import Enum as SqlEnum
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.types import JSON as GenericJSON, TypeDecorator
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.types import JSON as GenericJSON
from sqlalchemy.types import TypeDecorator
from app.models.base import Base, enum_values
@@ -44,10 +47,12 @@ class Activity(Base):
id: Mapped[int] = mapped_column(Integer, primary_key=True)
deal_id: Mapped[int] = mapped_column(ForeignKey("deals.id", ondelete="CASCADE"))
author_id: Mapped[int | None] = mapped_column(
ForeignKey("users.id", ondelete="SET NULL"), nullable=True
ForeignKey("users.id", ondelete="SET NULL"),
nullable=True,
)
type: Mapped[ActivityType] = mapped_column(
SqlEnum(ActivityType, name="activity_type", values_callable=enum_values), nullable=False
SqlEnum(ActivityType, name="activity_type", values_callable=enum_values),
nullable=False,
)
payload: Mapped[dict[str, Any]] = mapped_column(
JSONBCompat().with_variant(GenericJSON(), "sqlite"),
@@ -55,7 +60,9 @@ class Activity(Base):
server_default=text("'{}'"),
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
deal = relationship("Deal", back_populates="activities")
+1
View File
@@ -1,4 +1,5 @@
"""Declarative base for SQLAlchemy models."""
from __future__ import annotations
from enum import StrEnum
+4 -1
View File
@@ -1,4 +1,5 @@
"""Contact ORM model and schemas."""
from __future__ import annotations
from datetime import datetime
@@ -22,7 +23,9 @@ class Contact(Base):
email: Mapped[str | None] = mapped_column(String(320), nullable=True)
phone: Mapped[str | None] = mapped_column(String(64), nullable=True)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
organization = relationship("Organization", back_populates="contacts")
+10 -3
View File
@@ -1,4 +1,5 @@
"""Deal ORM model and schemas."""
from __future__ import annotations
from datetime import datetime
@@ -6,7 +7,8 @@ from decimal import Decimal
from enum import StrEnum
from pydantic import BaseModel, ConfigDict
from sqlalchemy import DateTime, Enum as SqlEnum, ForeignKey, Integer, Numeric, String, func
from sqlalchemy import DateTime, ForeignKey, Integer, Numeric, String, func
from sqlalchemy import Enum as SqlEnum
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import Base, enum_values
@@ -49,10 +51,15 @@ class Deal(Base):
default=DealStage.QUALIFICATION,
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
onupdate=func.now(),
nullable=False,
)
organization = relationship("Organization", back_populates="deals")
+4 -1
View File
@@ -1,4 +1,5 @@
"""Organization ORM model and schemas."""
from __future__ import annotations
from datetime import datetime
@@ -18,7 +19,9 @@ class Organization(Base):
id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
name: Mapped[str] = mapped_column(String(255), nullable=False, unique=True)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
members = relationship(
+6 -2
View File
@@ -1,11 +1,13 @@
"""Organization member ORM model."""
from __future__ import annotations
from datetime import datetime
from enum import StrEnum
from pydantic import BaseModel, ConfigDict
from sqlalchemy import DateTime, Enum as SqlEnum, ForeignKey, Integer, UniqueConstraint, func
from sqlalchemy import DateTime, ForeignKey, Integer, UniqueConstraint, func
from sqlalchemy import Enum as SqlEnum
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import Base, enum_values
@@ -39,7 +41,9 @@ class OrganizationMember(Base):
default=OrganizationRole.MEMBER,
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
organization = relationship("Organization", back_populates="members")
+4 -1
View File
@@ -1,4 +1,5 @@
"""Task ORM model and schemas."""
from __future__ import annotations
from datetime import datetime
@@ -22,7 +23,9 @@ class Task(Base):
due_date: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
is_done: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
deal = relationship("Deal", back_populates="tasks")
+1
View File
@@ -1,4 +1,5 @@
"""Token-related Pydantic schemas."""
from __future__ import annotations
from datetime import datetime
+11 -3
View File
@@ -1,4 +1,5 @@
"""User ORM model and Pydantic schemas."""
from __future__ import annotations
from datetime import datetime
@@ -25,13 +26,20 @@ class User(Base):
name: Mapped[str] = mapped_column(String(255), nullable=False)
is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False
DateTime(timezone=True),
server_default=func.now(),
onupdate=func.now(),
nullable=False,
)
memberships = relationship("OrganizationMember", back_populates="user", cascade="all, delete-orphan")
memberships = relationship(
"OrganizationMember", back_populates="user", cascade="all, delete-orphan"
)
owned_contacts = relationship("Contact", back_populates="owner")
owned_deals = relationship("Deal", back_populates="owner")
activities = relationship("Activity", back_populates="author")