- TaskRow: Replace tiny avatar-only display with proper assigned column showing avatar + name (single assignee) or avatar + "N people" (multi). Hidden on mobile, right-aligned, 96px width matching other columns. - Load options: Chain selectinload(ProjectTaskAssignment.user) so the user relationship is available for serialization. - TaskAssignmentResponse: Add model_validator to resolve user_name from eagerly loaded user relationship (same pattern as TaskCommentResponse). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
from datetime import datetime
|
|
|
|
|
|
class TaskAssignmentCreate(BaseModel):
|
|
model_config = ConfigDict(extra="forbid")
|
|
|
|
user_ids: list[int] = Field(min_length=1, max_length=20)
|
|
|
|
|
|
class TaskAssignmentResponse(BaseModel):
|
|
id: int
|
|
task_id: int
|
|
user_id: int
|
|
assigned_by: int
|
|
user_name: str | None = None
|
|
created_at: datetime
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
@model_validator(mode="before")
|
|
@classmethod
|
|
def resolve_user_name(cls, data): # type: ignore[override]
|
|
"""Populate user_name from eagerly loaded user relationship."""
|
|
if hasattr(data, "user") and data.user is not None:
|
|
if not getattr(data, "user_name", None):
|
|
data = dict(
|
|
id=data.id,
|
|
task_id=data.task_id,
|
|
user_id=data.user_id,
|
|
assigned_by=data.assigned_by,
|
|
user_name=data.user.username,
|
|
created_at=data.created_at,
|
|
)
|
|
return data
|