# app/schemas/submission.py from pydantic import BaseModel, Field, validator from typing import Optional, Dict, Any, List from datetime import datetime from app.schemas.common import BaseSchema class SubmissionMetadata(BaseModel): """Метаданные submission""" ip_address: Optional[str] = None user_agent: Optional[str] = None referrer: Optional[str] = None browser: Optional[str] = None os: Optional[str] = None device: Optional[str] = None location: Optional[Dict[str, Any]] = None class SubmissionCreate(BaseSchema): """Создание submission (отправка формы)""" form_id: int data: Dict[str, Any] = Field(..., description="Данные формы") metadata: Optional[SubmissionMetadata] = None @validator('data') def validate_data_not_empty(cls, v): if not v: raise ValueError('Data cannot be empty') return v class SubmissionUpdate(BaseSchema): """Обновление submission""" data: Optional[Dict[str, Any]] = None status: Optional[str] = Field(None, pattern='^(draft|completed|rejected)$') completion_time_seconds: Optional[float] = Field(None, ge=0) class SubmissionResponse(BaseSchema): """Ответ с данными submission - соответствует модели БД""" id: int submission_uuid: str form_id: int submission_data: Dict[str, Any] # ← изменено с data на submission_data submission_metadata: Dict[str, Any] = Field(default_factory=dict) # ← изменено с metadata status: str submitted_at: datetime created_at: datetime updated_at: datetime submitted_by: Optional[int] completion_time_seconds: Optional[float] referrer: Optional[str] class Config: from_attributes = True class SubmissionWithFormResponse(SubmissionResponse): """Submission с данными формы""" form_name: Optional[str] = None form_version: Optional[int] = None class SubmissionFilterParams(BaseSchema): """Параметры фильтрации submissions""" status: Optional[str] = None date_from: Optional[datetime] = None date_to: Optional[datetime] = None search: Optional[str] = None search_fields: Optional[List[str]] = None field_filters: Dict[str, Any] = Field(default_factory=dict)