56 lines
2.1 KiB
Python
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 |