- Restructure score_breakdown from flat dict to grouped by category:
{technical_health: {flag: pts}, modernity: {...}, ...}
- Each category row shows score/max with progress bar + per-flag detail
(e.g. Technical Health 15/40 → "very slow: 15 pts")
- Color-coded: green for positive flags, orange for issues
- "No issues detected" shown for clean categories
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
43 lines
1.0 KiB
Python
43 lines
1.0 KiB
Python
# app/modules/prospecting/schemas/score.py
|
|
"""Pydantic schemas for opportunity scoring."""
|
|
|
|
import json
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, field_validator
|
|
|
|
|
|
class ProspectScoreResponse(BaseModel):
|
|
"""Schema for prospect score response."""
|
|
|
|
id: int
|
|
prospect_id: int
|
|
score: int
|
|
technical_health_score: int
|
|
modernity_score: int
|
|
business_value_score: int
|
|
engagement_score: int
|
|
reason_flags: list[str] = []
|
|
score_breakdown: dict[str, dict[str, int]] | None = None
|
|
lead_tier: str | None = None
|
|
notes: str | None = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
@field_validator("reason_flags", mode="before")
|
|
@classmethod
|
|
def parse_reason_flags(cls, v):
|
|
if isinstance(v, str):
|
|
return json.loads(v)
|
|
return v
|
|
|
|
@field_validator("score_breakdown", mode="before")
|
|
@classmethod
|
|
def parse_score_breakdown(cls, v):
|
|
if isinstance(v, str):
|
|
return json.loads(v)
|
|
return v
|
|
|
|
class Config:
|
|
from_attributes = True
|