"""Удаление хоста и связанных events/problems (ручная очистка UI).""" from __future__ import annotations from dataclasses import dataclass from sqlalchemy import delete, or_, select from sqlalchemy.orm import Session from app.models import Event, Host, Problem, ProblemEvent @dataclass(frozen=True) class HostDeleteResult: host_id: int hostname: str deleted_events: int deleted_problems: int def delete_host_and_related(db: Session, host_id: int) -> HostDeleteResult | None: host = db.get(Host, host_id) if host is None: return None hostname = host.hostname event_ids = list(db.scalars(select(Event.id).where(Event.host_id == host_id)).all()) problem_ids = list(db.scalars(select(Problem.id).where(Problem.host_id == host_id)).all()) if event_ids or problem_ids: link_filter = [] if event_ids: link_filter.append(ProblemEvent.event_id.in_(event_ids)) if problem_ids: link_filter.append(ProblemEvent.problem_id.in_(problem_ids)) db.execute(delete(ProblemEvent).where(or_(*link_filter))) if problem_ids: db.execute(delete(Problem).where(Problem.id.in_(problem_ids))) if event_ids: db.execute(delete(Event).where(Event.id.in_(event_ids))) db.delete(host) db.flush() return HostDeleteResult( host_id=host_id, hostname=hostname, deleted_events=len(event_ids), deleted_problems=len(problem_ids), )