GeoIntel release gates / Compile, test, contracts and builds (push) Successful in 1m49s
GeoIntel release gates / Python and npm vulnerability policy (push) Successful in 21s
GeoIntel release gates / Production AI image, SBOM and container scan (push) Successful in 5m39s
GeoIntel release gates / Deploy exact gated revision to Unraid (push) Failing after 58m43s
48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from uuid import UUID
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models import Metric, QualityCheck
|
|
from app.schemas.qa import MetricRead, QualityCheckRead
|
|
|
|
|
|
class QualityCheckService:
|
|
@staticmethod
|
|
def list_quality_checks(
|
|
db: Session,
|
|
*,
|
|
project_id: UUID,
|
|
limit: int = 50,
|
|
offset: int = 0,
|
|
) -> tuple[list[QualityCheckRead], int]:
|
|
query = (
|
|
db.query(QualityCheck)
|
|
.filter(QualityCheck.project_id == project_id)
|
|
.order_by(QualityCheck.created_at.desc())
|
|
)
|
|
total = query.count()
|
|
rows = query.offset(offset).limit(limit).all()
|
|
if not rows:
|
|
return [], total
|
|
|
|
quality_check_ids = [row.id for row in rows]
|
|
metrics_by_quality_check: dict[UUID, list[MetricRead]] = {row.id: [] for row in rows}
|
|
metrics = (
|
|
db.query(Metric)
|
|
.filter(Metric.quality_check_id.in_(quality_check_ids))
|
|
.order_by(Metric.created_at.asc())
|
|
.all()
|
|
)
|
|
for metric in metrics:
|
|
if metric.quality_check_id in metrics_by_quality_check:
|
|
metrics_by_quality_check[metric.quality_check_id].append(MetricRead.model_validate(metric))
|
|
|
|
return [
|
|
QualityCheckRead.model_validate(row).model_copy(
|
|
update={"metrics": metrics_by_quality_check.get(row.id, [])}
|
|
)
|
|
for row in rows
|
|
], total
|