""" Jármű értékelési sémák a Social 1 modulhoz. """ from pydantic import BaseModel, Field, validator from typing import Optional from uuid import UUID from datetime import datetime class VehicleRatingCreate(BaseModel): """Értékelés beküldéséhez használt séma.""" driving_experience: int = Field(..., ge=1, le=10, description="Vezetési élmény 1-10 skálán") reliability: int = Field(..., ge=1, le=10, description="Megbízhatóság 1-10 skálán") comfort: int = Field(..., ge=1, le=10, description="Kényelem 1-10 skálán") consumption_satisfaction: int = Field(..., ge=1, le=10, description="Fogyasztás elégedettség 1-10 skálán") comment: Optional[str] = Field(None, max_length=1000, description="Opcionális megjegyzés") @validator('driving_experience', 'reliability', 'comfort', 'consumption_satisfaction') def validate_rating_range(cls, v): if not 1 <= v <= 10: raise ValueError('Értékelésnek 1 és 10 között kell lennie') return v class VehicleRatingResponse(BaseModel): """Értékelés válasza, tartalmazza a számított átlagpontszámot.""" id: UUID vehicle_id: int user_id: int driving_experience: int reliability: int comfort: int consumption_satisfaction: int comment: Optional[str] average_score: float = Field(..., description="Számított átlagpontszám (4 dimenzió átlaga)") created_at: datetime updated_at: datetime class Config: from_attributes = True @validator('average_score', pre=True, always=True) def calculate_average(cls, v, values): """Számolja ki az átlagpontszámot, ha nincs megadva.""" if v is not None: return v # Ha nincs megadva, számoljuk ki a 4 dimenzióból scores = [ values.get('driving_experience'), values.get('reliability'), values.get('comfort'), values.get('consumption_satisfaction') ] if any(score is None for score in scores): raise ValueError('Nem lehet kiszámolni az átlagot hiányzó értékelések miatt') return sum(scores) / 4.0