from sqlalchemy import Column, Integer, DateTime, ForeignKey, String, Float, Boolean, Index from sqlalchemy.orm import relationship from sqlalchemy.dialects.postgresql import JSONB, UUID from datetime import datetime import uuid from app.models.base import BaseModel class Submission(BaseModel): __tablename__ = "submissions" form_id = Column(Integer, ForeignKey("forms.id", ondelete="CASCADE")) submission_uuid = Column(UUID(as_uuid=True), default=uuid.uuid4, unique=True, nullable=False, index=True) submission_data = Column(JSONB, nullable=False) # переименовано с data submission_metadata = Column(JSONB, default={}) # переименовано с metadata status = Column(String(50), default="completed") submitted_at = Column(DateTime, default=datetime.utcnow, index=True) submitted_by = Column(Integer, nullable=True) # Для аналитики completion_time_seconds = Column(Float, nullable=True) referrer = Column(String(500)) # Relationships form = relationship("Form", back_populates="submissions") audit_logs = relationship("SubmissionAuditLog", back_populates="submission") __table_args__ = ( Index('ix_submissions_data_gin', submission_data, postgresql_using='gin'), Index('ix_submissions_metadata_gin', submission_metadata, postgresql_using='gin'), Index('ix_submissions_form_status', 'form_id', 'status'), Index('ix_submissions_date_status', 'submitted_at', 'status'), Index('ix_submissions_created_at', 'created_at'), ) class SubmissionAuditLog(BaseModel): __tablename__ = "submission_audit_logs" submission_id = Column(Integer, ForeignKey("submissions.id", ondelete="CASCADE")) action = Column(String(50)) changed_data = Column(JSONB) ip_address = Column(String(45)) user_agent = Column(String(500)) submission = relationship("Submission", back_populates="audit_logs") __table_args__ = ( Index('ix_audit_submission', 'submission_id'), Index('ix_audit_created_at', 'created_at'), )