Validation_Suite/validation-suite/backend/mercury/app/modules/orion/context.py

64 lines
2.2 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from pathlib import Path
from fastapi import HTTPException, status
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.models.contact import Contact
from app.models.customer import Customer
from app.models.device import Device
from app.models.equipment import Equipment
from app.models.location import Location
from app.models.validation import Validation
@dataclass(frozen=True)
class ReportContext:
validation: Validation
customer: Customer
location: Location | None
contact: Contact | None
device: Device | None
equipment: list[Equipment]
generated_dir: Path
class OrionContextBuilder:
def __init__(self, session: Session, generated_dir: Path) -> None:
self.session = session
self.generated_dir = generated_dir
def build(self, validation_id: str) -> ReportContext:
validation = self.session.get(Validation, validation_id)
if validation is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Validation not found")
customer = self.session.get(Customer, validation.customer_id)
if customer is None:
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Validation has no customer")
location = self.session.get(Location, validation.location_id) if validation.location_id else None
contact = self.session.get(Contact, validation.contact_id) if validation.contact_id else None
device = self.session.get(Device, validation.device_id) if validation.device_id else None
equipment = []
if validation.equipment_ids:
equipment = list(
self.session.scalars(
select(Equipment).where(Equipment.id.in_(validation.equipment_ids))
)
)
self.generated_dir.mkdir(parents=True, exist_ok=True)
return ReportContext(
validation=validation,
customer=customer,
location=location,
contact=contact,
device=device,
equipment=equipment,
generated_dir=self.generated_dir,
)