Files
service-finder/backend/app/schemas/vehicle.py
2026-03-13 10:22:41 +00:00

56 lines
2.1 KiB
Python

"""
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