This commit is contained in:
2026-04-09 19:28:41 +03:00
commit 9fa723bb4c
43 changed files with 2804 additions and 0 deletions

51
app/models/submission.py Normal file
View File

@@ -0,0 +1,51 @@
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'),
)