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

71
app/schemas/submission.py Normal file
View File

@@ -0,0 +1,71 @@
# 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)