chore(quality): apply ruff autofixes and formatting (223 fixes, regression-free: 118/118 tests pass)
This commit is contained in:
+11
-12
@@ -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
@@ -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
@@ -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,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
@@ -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):
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user