chore(quality): apply ruff autofixes and formatting (223 fixes, regression-free: 118/118 tests pass)

This commit is contained in:
Agent Zero
2026-06-10 21:24:24 +00:00
committed by leocrm-bot
parent 7104335334
commit b5f7a220fe
56 changed files with 459 additions and 528 deletions
+11 -12
View File
@@ -3,8 +3,7 @@
from __future__ import annotations
from datetime import datetime
from decimal import Decimal
from typing import Any, Optional
from typing import Any
from pydantic import BaseModel, ConfigDict, Field
@@ -15,10 +14,10 @@ class AccountBase(BaseModel):
"""Shared fields for create/update."""
name: str = Field(..., min_length=1, max_length=255)
website: Optional[str] = Field(None, max_length=512)
industry: Optional[Industry] = None
size: Optional[AccountSize] = None
address: Optional[dict[str, Any]] = None
website: str | None = Field(None, max_length=512)
industry: Industry | None = None
size: AccountSize | None = None
address: dict[str, Any] | None = None
class AccountCreate(AccountBase):
@@ -30,11 +29,11 @@ class AccountCreate(AccountBase):
class AccountUpdate(BaseModel):
"""Request body for PATCH /api/v1/accounts/{id}. All optional."""
name: Optional[str] = Field(None, min_length=1, max_length=255)
website: Optional[str] = Field(None, max_length=512)
industry: Optional[Industry] = None
size: Optional[AccountSize] = None
address: Optional[dict[str, Any]] = None
name: str | None = Field(None, min_length=1, max_length=255)
website: str | None = Field(None, max_length=512)
industry: Industry | None = None
size: AccountSize | None = None
address: dict[str, Any] | None = None
class AccountOut(AccountBase):
@@ -47,7 +46,7 @@ class AccountOut(AccountBase):
owner_id: int
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime] = None
deleted_at: datetime | None = None
class AccountListItem(AccountOut):
+17 -20
View File
@@ -3,7 +3,6 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field, model_validator
@@ -13,18 +12,16 @@ from app.models.activity import ActivityType
class ActivityBase(BaseModel):
type: ActivityType
subject: str = Field(..., min_length=1, max_length=255)
body: Optional[str] = None
due_date: Optional[datetime] = None
account_id: Optional[int] = None
contact_id: Optional[int] = None
deal_id: Optional[int] = None
body: str | None = None
due_date: datetime | None = None
account_id: int | None = None
contact_id: int | None = None
deal_id: int | None = None
@model_validator(mode="after")
def _check_at_least_one_parent(self) -> "ActivityBase":
def _check_at_least_one_parent(self) -> ActivityBase:
if self.account_id is None and self.contact_id is None and self.deal_id is None:
raise ValueError(
"At least one of account_id, contact_id, deal_id must be set"
)
raise ValueError("At least one of account_id, contact_id, deal_id must be set")
return self
@@ -33,13 +30,13 @@ class ActivityCreate(ActivityBase):
class ActivityUpdate(BaseModel):
type: Optional[ActivityType] = None
subject: Optional[str] = Field(None, min_length=1, max_length=255)
body: Optional[str] = None
due_date: Optional[datetime] = None
account_id: Optional[int] = None
contact_id: Optional[int] = None
deal_id: Optional[int] = None
type: ActivityType | None = None
subject: str | None = Field(None, min_length=1, max_length=255)
body: str | None = None
due_date: datetime | None = None
account_id: int | None = None
contact_id: int | None = None
deal_id: int | None = None
class ActivityOut(ActivityBase):
@@ -48,16 +45,16 @@ class ActivityOut(ActivityBase):
id: int
org_id: int
owner_id: int
completed_at: Optional[datetime] = None
completed_at: datetime | None = None
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime] = None
deleted_at: datetime | None = None
class ActivityCompleteRequest(BaseModel):
"""Body for PATCH /api/v1/activities/{id}/complete."""
outcome: Optional[str] = Field(None, max_length=2048)
outcome: str | None = Field(None, max_length=2048)
__all__ = [
+1 -3
View File
@@ -2,8 +2,6 @@
from __future__ import annotations
from typing import Optional
from pydantic import BaseModel, EmailStr, Field
from app.models.user import UserRole
@@ -49,7 +47,7 @@ class RegisterResponse(BaseModel):
Returns the user info (without password) plus an access token.
"""
user: "UserOut"
user: UserOut
access_token: str
token_type: str = "bearer"
expires_in: int
+2 -2
View File
@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import Generic, List, Optional, TypeVar
from typing import Generic, TypeVar
from pydantic import BaseModel, ConfigDict, Field
@@ -21,7 +21,7 @@ class PaginatedResponse(BaseModel, Generic[T]):
model_config = ConfigDict(from_attributes=True)
items: List[T] # type: ignore[valid-type]
items: list[T] # type: ignore[valid-type]
total: int
skip: int
limit: int
+9 -10
View File
@@ -3,7 +3,6 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, ConfigDict, EmailStr, Field
@@ -11,9 +10,9 @@ from pydantic import BaseModel, ConfigDict, EmailStr, Field
class ContactBase(BaseModel):
first_name: str = Field(..., min_length=1, max_length=128)
last_name: str = Field(..., min_length=1, max_length=128)
email: Optional[EmailStr] = None
phone: Optional[str] = Field(None, max_length=64)
account_id: Optional[int] = None
email: EmailStr | None = None
phone: str | None = Field(None, max_length=64)
account_id: int | None = None
class ContactCreate(ContactBase):
@@ -21,11 +20,11 @@ class ContactCreate(ContactBase):
class ContactUpdate(BaseModel):
first_name: Optional[str] = Field(None, min_length=1, max_length=128)
last_name: Optional[str] = Field(None, min_length=1, max_length=128)
email: Optional[EmailStr] = None
phone: Optional[str] = Field(None, max_length=64)
account_id: Optional[int] = None
first_name: str | None = Field(None, min_length=1, max_length=128)
last_name: str | None = Field(None, min_length=1, max_length=128)
email: EmailStr | None = None
phone: str | None = Field(None, max_length=64)
account_id: int | None = None
class ContactOut(ContactBase):
@@ -36,7 +35,7 @@ class ContactOut(ContactBase):
owner_id: int
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime] = None
deleted_at: datetime | None = None
class ContactListItem(ContactOut):
+6 -7
View File
@@ -3,7 +3,6 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, ConfigDict
@@ -27,13 +26,13 @@ class ActivityFeedItem(BaseModel):
id: int
type: ActivityType
subject: str
body: Optional[str] = None
account_id: Optional[int] = None
contact_id: Optional[int] = None
deal_id: Optional[int] = None
body: str | None = None
account_id: int | None = None
contact_id: int | None = None
deal_id: int | None = None
owner_id: int
completed_at: Optional[datetime] = None
due_date: Optional[datetime] = None
completed_at: datetime | None = None
due_date: datetime | None = None
created_at: datetime
+9 -10
View File
@@ -4,7 +4,6 @@ from __future__ import annotations
from datetime import date, datetime
from decimal import Decimal
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
@@ -16,9 +15,9 @@ class DealBase(BaseModel):
value: Decimal = Field(default=Decimal("0"), max_digits=12, decimal_places=2)
currency: str = Field(default="EUR", min_length=3, max_length=3)
stage: DealStage = DealStage.lead
close_date: Optional[date] = None
close_date: date | None = None
account_id: int
won_lost_reason: Optional[str] = Field(None, max_length=512)
won_lost_reason: str | None = Field(None, max_length=512)
class DealCreate(DealBase):
@@ -26,11 +25,11 @@ class DealCreate(DealBase):
class DealUpdate(BaseModel):
title: Optional[str] = Field(None, min_length=1, max_length=255)
value: Optional[Decimal] = Field(None, max_digits=12, decimal_places=2)
currency: Optional[str] = Field(None, min_length=3, max_length=3)
close_date: Optional[date] = None
won_lost_reason: Optional[str] = Field(None, max_length=512)
title: str | None = Field(None, min_length=1, max_length=255)
value: Decimal | None = Field(None, max_digits=12, decimal_places=2)
currency: str | None = Field(None, min_length=3, max_length=3)
close_date: date | None = None
won_lost_reason: str | None = Field(None, max_length=512)
class DealOut(DealBase):
@@ -41,7 +40,7 @@ class DealOut(DealBase):
owner_id: int
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime] = None
deleted_at: datetime | None = None
class DealListItem(DealOut):
@@ -52,7 +51,7 @@ class DealStageUpdate(BaseModel):
"""Body for PATCH /api/v1/deals/{id}/stage."""
stage: DealStage
reason: Optional[str] = Field(None, max_length=512)
reason: str | None = Field(None, max_length=512)
class DealPipelineOut(BaseModel):
+2 -3
View File
@@ -3,7 +3,6 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
@@ -21,7 +20,7 @@ class NoteCreate(BaseModel):
class NoteUpdate(BaseModel):
"""Body for PATCH /api/v1/notes/{id}."""
body: Optional[str] = Field(None, min_length=1)
body: str | None = Field(None, min_length=1)
class NoteOut(BaseModel):
@@ -37,7 +36,7 @@ class NoteOut(BaseModel):
parent_id: int
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime] = None
deleted_at: datetime | None = None
__all__ = ["NoteCreate", "NoteOut", "NoteUpdate"]
+2 -3
View File
@@ -3,7 +3,6 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field
@@ -28,7 +27,7 @@ class TagOut(BaseModel):
color: str
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime] = None
deleted_at: datetime | None = None
class TagLinkCreate(BaseModel):
@@ -51,7 +50,7 @@ class TagLinkOut(BaseModel):
parent_id: int
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime] = None
deleted_at: datetime | None = None
__all__ = ["TagCreate", "TagLinkCreate", "TagLinkOut", "TagOut"]
+5 -6
View File
@@ -3,7 +3,6 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, ConfigDict, EmailStr, Field
@@ -20,7 +19,7 @@ class UserOut(BaseModel):
name: str
role: UserRole
org_id: int
avatar_url: Optional[str] = None
avatar_url: str | None = None
email_notifications: bool = True
created_at: datetime
@@ -28,10 +27,10 @@ class UserOut(BaseModel):
class UserUpdate(BaseModel):
"""Request body for PATCH /api/v1/users/{id} (admin or self)."""
name: Optional[str] = Field(None, min_length=1, max_length=255)
avatar_url: Optional[str] = Field(None, max_length=1024)
email_notifications: Optional[bool] = None
role: Optional[UserRole] = None # admin-only
name: str | None = Field(None, min_length=1, max_length=255)
avatar_url: str | None = Field(None, max_length=1024)
email_notifications: bool | None = None
role: UserRole | None = None # admin-only
class UserCreateRequest(BaseModel):