# /opt/docker/dev/service_finder/backend/app/models/vehicle/vehicle.py """ TCO (Total Cost of Ownership) alapmodelljei a 'vehicle' sémában. - CostCategory és VehicleCost áthelyezve a fleet_finance sémába. - Itt marad: VehicleUserRating, GbCatalogDiscovery """ from __future__ import annotations import uuid from datetime import datetime from typing import Optional from sqlalchemy import Column, String, Integer, Boolean, DateTime, ForeignKey, Text, Numeric, UniqueConstraint, CheckConstraint from sqlalchemy.dialects.postgresql import UUID as PG_UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql import func from app.database import Base class VehicleUserRating(Base): """ Jármű értékelési rendszer - User -> Vehicle kapcsolat. Egy felhasználó csak egyszer értékelhet egy adott járművet. Értékelés 4 dimenzióban 1-10 skálán. """ __tablename__ = "vehicle_user_ratings" __table_args__ = ( UniqueConstraint("vehicle_id", "user_id", name="uq_vehicle_user_rating_unique"), CheckConstraint("driving_experience BETWEEN 1 AND 10", name="ck_driving_experience_range"), CheckConstraint("reliability BETWEEN 1 AND 10", name="ck_reliability_range"), CheckConstraint("comfort BETWEEN 1 AND 10", name="ck_comfort_range"), CheckConstraint("consumption_satisfaction BETWEEN 1 AND 10", name="ck_consumption_satisfaction_range"), {"schema": "vehicle"} ) id: Mapped[uuid.UUID] = mapped_column( PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, server_default=func.gen_random_uuid() ) vehicle_id: Mapped[int] = mapped_column( Integer, ForeignKey("vehicle.vehicle_model_definitions.id", ondelete="CASCADE"), nullable=False, index=True ) user_id: Mapped[int] = mapped_column( Integer, ForeignKey("identity.users.id", ondelete="CASCADE"), nullable=False, index=True ) driving_experience: Mapped[int] = mapped_column(Integer, nullable=False) reliability: Mapped[int] = mapped_column(Integer, nullable=False) comfort: Mapped[int] = mapped_column(Integer, nullable=False) consumption_satisfaction: Mapped[int] = mapped_column(Integer, nullable=False) comment: Mapped[Optional[str]] = mapped_column(Text, nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), onupdate=func.now(), server_default=func.now()) # Kapcsolatok vehicle: Mapped["VehicleModelDefinition"] = relationship("VehicleModelDefinition", back_populates="ratings") user: Mapped["User"] = relationship("User", back_populates="vehicle_ratings") def __repr__(self) -> str: return f"VehicleUserRating(id={self.id}, vehicle_id={self.vehicle_id}, user_id={self.user_id})" @property def average_score(self) -> float: """Számított átlagpontszám a 4 dimenzióból.""" scores = [self.driving_experience, self.reliability, self.comfort, self.consumption_satisfaction] return sum(scores) / 4.0 class GbCatalogDiscovery(Base): __tablename__ = "gb_catalog_discovery" __table_args__ = {"schema": "vehicle"} id: Mapped[int] = mapped_column(Integer, primary_key=True) vrm: Mapped[str] = mapped_column(String(20), unique=True) make: Mapped[Optional[str]] = mapped_column(String(100), nullable=True) model: Mapped[Optional[str]] = mapped_column(String(100), nullable=True) status: Mapped[str] = mapped_column(String(20), default='pending') created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())