from sqlalchemy import Column, String, DateTime, Date, Enum, Float, Boolean, Integer
from sqlalchemy.orm import relationship
from datetime import datetime
import enum
from src.data.models.database import Base
class ContractType(str, enum.Enum):
CRYPTO = "crypto"
EQUITY = "equity"
COMMODITY = "commodity"
FX = "fx"
EVENT = "event"
OTHER = "other"
class Contract(Base):
__tablename__ = "contracts"
id = Column(Integer, primary_key=True, index=True)
symbol = Column(String(100), unique=True, index=True, nullable=False)
description = Column(String(500), nullable=False)
contract_type = Column(Enum(ContractType), nullable=False, index=True)
# CME-specific fields
instrument_guid_long = Column(String(100), unique=True, index=True, nullable=True)
instrument_long_name = Column(String(500), nullable=True)
settlement_date = Column(Date, nullable=False, index=True)
is_yes_contract = Column(Boolean, default=True)
paired_contract_symbol = Column(String(100), nullable=True)
# Metadata
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
is_active = Column(Boolean, default=True, index=True)
is_settled = Column(Boolean, default=False, index=True)
# Relationships
trades = relationship("Trade", back_populates="contract", cascade="all, delete-orphan")
settlement = relationship("Settlement", back_populates="contract", uselist=False)
def __repr__(self):
return f"<Contract(symbol='{self.symbol}', type='{self.contract_type}')>"