Files
forms/app/schemas/response.py
2026-04-09 19:28:41 +03:00

66 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from pydantic import BaseModel, Field
from typing import Optional, Any, Dict, List, Generic, TypeVar
from datetime import datetime
from app.schemas.common import BaseSchema, PaginatedResponse
T = TypeVar('T')
class HealthResponse(BaseSchema):
"""Health check ответ"""
status: str = "healthy"
timestamp: datetime = Field(default_factory=datetime.utcnow)
version: str = "1.0.0"
database: str
class ValidationErrorDetail(BaseSchema):
"""Детали ошибки валидации"""
field: str
message: str
value: Optional[Any] = None
class ValidationErrorResponse(BaseSchema):
"""Ответ с ошибками валидации"""
error: str = "Validation Error"
details: List[ValidationErrorDetail] = Field(default_factory=list)
status_code: int = 422
class ExportResponse(BaseSchema):
"""Ответ на экспорт данных"""
download_url: str
file_name: str
file_size: int
expires_at: datetime
format: str # csv, xlsx, json
class AnalyticsFieldStats(BaseSchema):
"""Статистика по полю формы"""
field_name: str
field_label: str
field_type: str
total_responses: int
filled_count: int
empty_count: int
fill_rate: float # процент заполнения
unique_values: int
distribution: Dict[str, int] # значение -> количество
class AnalyticsDailyStats(BaseSchema):
"""Ежедневная статистика"""
date: str
count: int
avg_completion_time: Optional[float] = None
class FormAnalyticsResponse(BaseSchema):
"""Аналитика по форме"""
form_id: int
form_name: str
total_submissions: int
unique_submitters: int
avg_completion_time: Optional[float]
completion_rate: float # процент завершенных
fields_stats: List[AnalyticsFieldStats]
daily_stats: List[AnalyticsDailyStats]
peak_hours: Dict[int, int] # час -> количество
trend: str # increasing, decreasing, stable
last_submission_at: Optional[datetime]
first_submission_at: Optional[datetime]