Spaces:
Runtime error
Runtime error
File size: 1,930 Bytes
17847d4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | """
Validation schemas for form submissions
"""
from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any
from datetime import datetime
class FieldValidationError(BaseModel):
"""Individual field validation error"""
question_id: int
field: str
message: str
error_type: str # "required", "invalid_format", "out_of_range", "invalid_choice", etc.
class ValidationResponse(BaseModel):
"""Structured validation response"""
is_valid: bool
errors: List[FieldValidationError] = []
warnings: List[FieldValidationError] = []
class PartialSubmissionCreate(BaseModel):
"""Schema for auto-save partial submissions"""
session_id: str = Field(..., min_length=1, max_length=64)
form_version: Optional[int] = None
answers: List[Dict[str, Any]] # Flexible for partial data
metadata: Optional[Dict[str, Any]] = None
# UTM parameters
utm_source: Optional[str] = None
utm_medium: Optional[str] = None
utm_campaign: Optional[str] = None
class CompleteSubmissionCreate(BaseModel):
"""Schema for final submission (inherits from existing SubmissionCreate)"""
session_id: str = Field(..., min_length=1, max_length=64)
form_version: Optional[int] = None
answers: List[Dict[str, Any]]
metadata: Optional[Dict[str, Any]] = None
honeypot: Optional[str] = None # Should be empty
# UTM parameters
utm_source: Optional[str] = None
utm_medium: Optional[str] = None
utm_campaign: Optional[str] = None
class ValidationContext(BaseModel):
"""Context for validation including anti-tampering token"""
form_id: int
session_id: str
validation_token: str
timestamp: datetime
class AutoSaveResponse(BaseModel):
"""Response from auto-save endpoint"""
success: bool
submission_id: Optional[int] = None
validation: ValidationResponse
message: str = "Auto-saved successfully"
|