84 lines
3.7 KiB
Python
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())
|