from sqlalchemy import Column, Integer, String, ForeignKey, Double, Table from sqlalchemy.orm import relationship, mapped_column, Mapped import enums.service from models import BaseModel services_kit_services = Table( 'services_kit_services', BaseModel.metadata, Column('services_kit_id', ForeignKey('services_kits.id')), Column('service_id', ForeignKey('services.id')), ) class Service(BaseModel): __tablename__ = 'services' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False, comment='Название услуги') category_id: Mapped[int] = mapped_column( ForeignKey('service_categories.id'), nullable=False, comment='ID категории услуги', ) category: Mapped['ServiceCategory'] = relationship('ServiceCategory', lazy='joined') is_deleted: Mapped[bool] = mapped_column( nullable=False, server_default='0', comment='Удалена ли услуга' ) price = Column( Double, nullable=False, comment='Стоимость услуги' ) cost = Column( Double, nullable=False, server_default='0', comment='Себестоимость услуги' ) service_type: Mapped[int] = mapped_column( server_default=f'{enums.service.ServiceType.DEAL_SERVICE}', nullable=False, comment='Тип услуги', ) price_ranges: Mapped[list['ServicePriceRange']] = relationship( 'ServicePriceRange', back_populates='service', lazy='selectin', order_by="asc(ServicePriceRange.from_quantity)", cascade="all, delete-orphan", ) rank: Mapped[str] = mapped_column( nullable=False, server_default='', comment='Ранг услуги' ) class ServicePriceRange(BaseModel): __tablename__ = 'service_price_ranges' id: Mapped[int] = mapped_column(primary_key=True) service_id: Mapped[int] = mapped_column(ForeignKey('services.id'), nullable=False, comment='ID услуги') service: Mapped['Service'] = relationship('Service', back_populates='price_ranges') from_quantity: Mapped[int] = mapped_column(nullable=False, comment='От количества') to_quantity: Mapped[int] = mapped_column(nullable=False, comment='До количества') price: Mapped[float] = mapped_column(Double, nullable=False, comment='Цена') class ServiceCategory(BaseModel): __tablename__ = 'service_categories' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) is_deleted: Mapped[bool] = mapped_column( nullable=False, server_default='0', comment='Удалена ли категория' ) card_service_rank: Mapped[str] = mapped_column( nullable=False, server_default='', comment='Ранг услуги для сделки' ) product_service_rank: Mapped[str] = mapped_column( nullable=False, server_default='', comment='Ранг услуги для товара' ) class ServicesKit(BaseModel): __tablename__ = 'services_kits' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) service_type: Mapped[int] = mapped_column( server_default=f'{enums.service.ServiceType.DEAL_SERVICE}', nullable=False, comment='Тип услуги' ) services: Mapped[list["Service"]] = relationship( secondary=services_kit_services, lazy='selectin' )