mirror of
https://github.com/TronoSfera/Law.git
synced 2026-05-18 18:13:46 +03:00
48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from fastapi import HTTPException
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.topic_required_field import TopicRequiredField
|
|
|
|
|
|
def _is_missing_value(value) -> bool:
|
|
if value is None:
|
|
return True
|
|
if isinstance(value, str):
|
|
return not value.strip()
|
|
if isinstance(value, (list, tuple, dict, set)):
|
|
return len(value) == 0
|
|
return False
|
|
|
|
|
|
def validate_required_topic_fields_or_400(
|
|
db: Session,
|
|
topic_code: str | None,
|
|
extra_fields: dict | None,
|
|
) -> None:
|
|
topic = str(topic_code or "").strip()
|
|
if not topic:
|
|
return
|
|
|
|
required_rows = (
|
|
db.query(TopicRequiredField.field_key)
|
|
.filter(
|
|
TopicRequiredField.topic_code == topic,
|
|
TopicRequiredField.enabled.is_(True),
|
|
TopicRequiredField.required.is_(True),
|
|
)
|
|
.order_by(TopicRequiredField.sort_order.asc(), TopicRequiredField.field_key.asc())
|
|
.all()
|
|
)
|
|
required_keys = [str(field_key).strip() for (field_key,) in required_rows if field_key]
|
|
if not required_keys:
|
|
return
|
|
|
|
payload = extra_fields if isinstance(extra_fields, dict) else {}
|
|
missing = [key for key in required_keys if _is_missing_value(payload.get(key))]
|
|
if missing:
|
|
raise HTTPException(
|
|
status_code=400,
|
|
detail="Для выбранной темы обязательны поля: " + ", ".join(missing),
|
|
)
|