from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey, Text, JSON from sqlalchemy.orm import relationship from datetime import datetime from database import Base class User(Base): """Модель пользователя""" __tablename__ = "users" id = Column(Integer, primary_key=True) telegram_id = Column(Integer, unique=True, nullable=False, index=True) username = Column(String(255)) first_name = Column(String(255)) last_name = Column(String(255)) created_at = Column(DateTime, default=datetime.utcnow) is_admin = Column(Boolean, default=False) # Клиентский счет в формате: XX-XX-XX-XX-XX-XX-XX-XX (8 пар цифр через дефис) account_number = Column(String(23), unique=True, nullable=True, index=True) # Связи participations = relationship("Participation", back_populates="user") def __repr__(self): return f"" class Lottery(Base): """Модель розыгрыша""" __tablename__ = "lotteries" id = Column(Integer, primary_key=True) title = Column(String(500), nullable=False) description = Column(Text) created_at = Column(DateTime, default=datetime.utcnow) start_date = Column(DateTime) end_date = Column(DateTime) is_active = Column(Boolean, default=True) is_completed = Column(Boolean, default=False) prizes = Column(JSON) # Список призов в формате JSON creator_id = Column(Integer, ForeignKey("users.id"), nullable=False) # Настройки для ручного управления победителями manual_winners = Column(JSON, default=lambda: {}) # {место: telegram_id} draw_results = Column(JSON) # Результаты розыгрыша # Тип отображения победителей: "username", "chat_id", "account_number" winner_display_type = Column(String(20), default="username") # Связи creator = relationship("User") participations = relationship("Participation", back_populates="lottery") def __repr__(self): return f"" class Participation(Base): """Модель участия в розыгрыше""" __tablename__ = "participations" id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) lottery_id = Column(Integer, ForeignKey("lotteries.id"), nullable=False) created_at = Column(DateTime, default=datetime.utcnow) # Связи user = relationship("User", back_populates="participations") lottery = relationship("Lottery", back_populates="participations") def __repr__(self): return f"" class Winner(Base): """Модель победителя розыгрыша""" __tablename__ = "winners" id = Column(Integer, primary_key=True) lottery_id = Column(Integer, ForeignKey("lotteries.id"), nullable=False) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) place = Column(Integer, nullable=False) # Место (1, 2, 3...) prize = Column(String(500)) # Описание приза is_manual = Column(Boolean, default=False) # Был ли установлен вручную created_at = Column(DateTime, default=datetime.utcnow) # Связи user = relationship("User") lottery = relationship("Lottery") def __repr__(self): return f""