ifixkart-backend/app/models/DeviceCatalogModel.py

89 lines
4.3 KiB
Python

from sqlalchemy import Column, String, Boolean, Integer, Numeric, ForeignKey, DateTime
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.core.database.db_session import Base
from app.models.BrandModel import Brand
from app.models.PartsModel import RepairVariantPart
class DeviceSeries(Base):
__tablename__ = "device_series"
series_id = Column(String(26), primary_key=True)
brand_id = Column(String(26), ForeignKey("brands.brand_id", ondelete="SET NULL"), nullable=True)
name = Column(String(100), nullable=False)
slug = Column(String(100), unique=True, nullable=False)
device_type = Column(String(50), nullable=True) # laptop, tablet, mobile
sort_order = Column(Integer, default=0)
is_active = Column(Boolean, default=True)
brand = relationship("Brand")
models = relationship("DeviceModel", back_populates="series")
class DeviceModel(Base):
__tablename__ = "device_models"
model_id = Column(String(26), primary_key=True)
series_id = Column(String(26), ForeignKey("device_series.series_id", ondelete="SET NULL"), nullable=True)
brand_id = Column(String(26), ForeignKey("brands.brand_id", ondelete="SET NULL"), nullable=True)
name = Column(String(100), nullable=False)
slug = Column(String(100), unique=True, nullable=False)
device_type = Column(String(50), nullable=True) # laptop, tablet, mobile
full_path = Column(String(500), nullable=False)
release_year = Column(Integer, nullable=True)
image_url = Column(String(500), nullable=True)
is_active = Column(Boolean, default=True)
series = relationship("DeviceSeries", back_populates="models")
brand = relationship("Brand")
services = relationship("RepairService", primaryjoin="DeviceModel.model_id == RepairService.model_id", foreign_keys="[RepairService.model_id]", back_populates="model", cascade="all, delete-orphan")
class ServiceType(Base):
__tablename__ = "service_types"
service_type_id = Column(String(26), primary_key=True)
name = Column(String(100), unique=True, nullable=False)
slug = Column(String(100), unique=True, nullable=False)
icon_url = Column(String(500), nullable=True)
description = Column(String(500), nullable=True)
is_active = Column(Boolean, default=True)
class RepairService(Base):
__tablename__ = "repair_services"
repair_service_id = Column(String(26), primary_key=True)
model_id = Column(String(26), nullable=False)
service_type_id = Column(String(26), ForeignKey("service_types.service_type_id", ondelete="RESTRICT"), nullable=False)
slug = Column(String(100), nullable=False)
full_path = Column(String(500), nullable=False)
description = Column(String(1000), nullable=True)
model = relationship("DeviceModel", primaryjoin="DeviceModel.model_id == RepairService.model_id", foreign_keys=[model_id], back_populates="services")
service_type = relationship("ServiceType")
variants = relationship("RepairVariant", back_populates="repair_service", cascade="all, delete-orphan")
class RepairVariant(Base):
__tablename__ = "repair_variants"
variant_id = Column(String(26), primary_key=True)
repair_service_id = Column(String(26), ForeignKey("repair_services.repair_service_id", ondelete="CASCADE"), nullable=False)
name = Column(String(100), nullable=False) # e.g. "Original OLED", "Premium OLED"
price = Column(Numeric(10, 2), nullable=False)
cost = Column(Numeric(10, 2), nullable=False)
duration_minutes = Column(Integer, default=45)
warranty_days = Column(Integer, default=90)
status = Column(String(20), default="active") # active, inactive
created_at = Column(DateTime, server_default=func.now())
repair_service = relationship("RepairService", back_populates="variants")
images = relationship("RepairVariantImage", back_populates="variant", cascade="all, delete-orphan")
bom_parts = relationship("RepairVariantPart", back_populates="variant", cascade="all, delete-orphan")
class RepairVariantImage(Base):
__tablename__ = "repair_variant_images"
image_id = Column(String(26), primary_key=True)
variant_id = Column(String(26), ForeignKey("repair_variants.variant_id", ondelete="CASCADE"), nullable=False)
image_url = Column(String(500), nullable=False)
sort_order = Column(Integer, default=0)
variant = relationship("RepairVariant", back_populates="images")