from datetime import datetime from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship Base = declarative_base() class Document(Base): __tablename__ = 'documents' id = Column(Integer, primary_key=True) file_id = Column(String(255), unique=True) title = Column(Text) category = Column(String(100)) gis_upload_date = Column(DateTime) scraped_at = Column(DateTime, default=datetime.utcnow) file_path = Column(Text) screenshot_path = Column(Text) is_downloaded = Column(Boolean, default=False) file_hash = Column(String(64)) contract_id = Column(Integer, ForeignKey('contracts.id')) class Contract(Base): __tablename__ = 'contracts' id = Column(Integer, primary_key=True) gis_id = Column(String(255), unique=True) # Внутренний ID договора в ГИС name = Column(Text) # Название/номер договора status = Column(String(50)) # Текущий статус обработки found_at = Column(DateTime, default=datetime.utcnow) processed_at = Column(DateTime, nullable=True) screenshot_main = Column(Text) # Скриншот страницы договора documents = relationship("Document", backref="contract") class ScraperLog(Base): __tablename__ = 'logs' id = Column(Integer, primary_key=True) timestamp = Column(DateTime, default=datetime.utcnow) action = Column(String(255)) status = Column(String(50)) message = Column(Text)