Files
service-finder/backend/app/models/vehicle/vehicle.py
2026-06-23 21:11:21 +00:00

84 lines
3.7 KiB
Python

# /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())