51 lines
2.0 KiB
Python
51 lines
2.0 KiB
Python
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'),
|
||
) |